利用参数编辑器(Parameter Editor)来为参数赋值
具体方法是选中TQuery部件单击鼠标右键然后从中选择Define Parameters 便可以打开参数编辑器
例如在TQuery部件的SQL属性中我们设置如下的SQL语句
Setect * From Customer Where CustNO=:Number;
TQuery的DatabaseName属性为DBDEMOS其中Number为参数变量我们便可以为参数Number赋值在Datetype组合框中选择该参数的数据类型为整数Integer在Value编辑框中可以为参数Number赋一个值也可以单击Null Value检查框为参数Number赋一个空值Null给参数赋值之后单击OK按钮这样TQuery部件中的SQL 查询便准备好了而且参数值也被赋给了动态SQL语句中相应的参数此时当把TQuery 部件的Active属性设置成True时在与TQuery部件相连的数据浏览部件中会显示出查询结果通过参数编辑器为参数赋值这种方式缺乏应有的灵活性在实际应用中用得较少在实际应用中程序设计人员希望用更灵活方便的方式为参数赋值那就是我们接下来要介绍的另一种途径
在运行过程中通过程序为参数赋值
用这种方式为参数赋值有三种方法
①根据参数在SQL语句中出现的顺序设置TQuery部件的Params属性值为参数赋值
②直接根据SQL语句中各参数的名字调用ParamByName方法来为各参数赋值
③将TQuery部件的DataSource属性设置为另一个数据源这样将另一个数据源中与当前TQuery部件的SQL语句中的参数名相匹配的字段值赋给其对应的参数
这三种方法我们将在下面的三小节中具体地介绍
使用Params属性为参数赋值
TQuery部件具有一个Params属性它们在设计时不可用在程序运行过程中可用并且是动态建立的当为TQuery部件编写动态SQL 语句时 Delphi 会自动地建立一个数组Params数组Params是以下标开始的依次对应动态SQL 语句中的参数 也就是说动态SQL语句中第一个参数对应Params[]第二个参数对应params[]依此类推
例如一个TQuery部件Query我们为它编写的动态SQL语句是
Insert Into Customer(CustNoNameCountry)
Values(CustNo:Name : Country)
对于上述这条动态SQL语句中的参数我们可以利用TQuery部件的params 属性为参数赋值
Queryparams[]AsString := ;
Queryparams[]AsString := Lichtenstein;
Queryparams[]AsString := USA;
上述语句将把赋给参数Cuse_NoLichtenstein赋给参数NameUSA赋给参数Country
使用ParamByName方法为参数赋值
ParamByName是一个函数用动态SQL语句中的参数作为调用ParamByName函数的参数这样便可以为它们赋值使用这种赋值方法必须要知道动态SQL语句参数的名字
例如在节中的例子中也可以用下述方法给参数赋值
QueryParamByName(CustNo)AsString := ;
QueryParamByName(Name)AsString := Lichtenstein;
QueryParamByName(Country)AsString := USA;
使用这种方法同样可以为各参数赋值而且更加直观一些
使用Datasource属性为参数赋值
上述两种方法的共同特点是我们在为各参数赋值时我们是知道各参数对应的具体参数值的而在具体的应用程序中有些参数值常常是无法确定的例如参数值来自于另一个查询结果对于这种情况Delphi提供了使用Datasource属性为动态SQL 语句中尚存在没有赋值的参数时 Delphi 会自动检查 TQuery 部件的 Datasource 属性 如果为Datasource属性设置了属性值(该属性的值是另一个TDatasource部件的名字)Delphi 会把没有赋值的参数与TDatasource部件中的各字段比较Delphi 会将相应的字段值赋给与其相匹配的参数利用这种方法也能实现所谓的连接查询我们在学习使用TTable部件时便会创建主要明细型数据库应用用TQuery部件创建的连接查询与主要 明细型应用是相似的
例如在如图所示的应用中设置了下列部件
● 一个TTable部件
名字为Cust它的DatabaseName属性为DEMOSTableName属性为Customer
● 一个TDatasource部件
名字为Custsource其Dataset属性被设置为Cust
● 一个TQuery部件
名字为ORDERS其DatabaseName被设置为DEMOSSQL属性值为
Select OrdersCustNoOrdersOrderNoOrdersSaleDate FROM Orders
WHERE OrdersCustNo =: CustNo
ORDERS的DataSouce属性被设置为CustSource
● 一个TDatasource部件
名字为OrderSource其DataSet属性被设置为Orders
● 两个TDBGrid部件
它们分别连接CustSource和OrderSource
TQuery部件Orders中的动态SQL语句中的参数CustNo在程序设计过程中没有给它赋值当该应用程序运行时Delphi会自动地到其Datasource属性中说明的数据源CustSource中查找与参数CustNo匹配的字段而CustSource中正好有一个名字为 CustNo 的字段与参数CustNo匹配这样Customer表中的CustNo字段值被赋给了参数 : CustNo 而当每移动Customer表中的记录指针参数CustNo的值会随之改变而参数CustNo的值发生改变时Orders中的动态SQL语句会根据新的参数值重新查询从数据库表中获取相应的订单数据这样也变实现了类似于主要明细型应用即连接查询
Prepare方法的使用
在使用动态SQL语句编程时常常用到一个很重要的方法prepare调用prepare 方法之后Delphi会将带参数的SQL语句传送给与其对应的数据库引擎对动态SQL语句进行语法分析和优化虽然在用动态SQL语句编程时调用prepare方法并不是必须的但是这里我们要极力推荐调用prepare方法因为调用prepare方法后会大大提高动态SQL 语句的执行性能特别是当要反复多次执行同一条动态SQL语句时其优越性会更加明显如果在应用程序中执行一条SQL语句之前并没有显式地调用prepare方法每次在执行SQL 语句时Delphi会隐含地调用propare方法以准备这个查询
TQuery部件还有一个prepare属性这是一个布尔型属性当其属性值为True时表明该查询已被准备好了( SQL 语句已被传送到数据库引擎中 ) 当我们使用参数编辑器Parameters Editor来为动态SQL语句中的参数赋值时当设置完相应的参数值并退出参数编辑器时Delphi会隐含地调用prepare方法以准备好查询
当SQL语句执行完之后要想准备下一个查询首先必须调用close方法然后才能调用prepare方法准备下一个查询一般来说在一个应用程序中应该调用一次prepare方法常常在窗体的OnCreate事件处理过程中调用prepare方法然后用上述介绍的方法为参数赋值最后调用Open方法或ExecSQL方法执行SQL语句以完成查询
当然在调用prepare方法准备好一个查询时会消耗一些数据库资源因而每当一个查询执行完毕之后要养成调用Unprepare方法以撤消查询的好习惯在运行程序过程中通过程序改变TQuery部件的SQL属性值时Delphi会自动地调用Close方法和Unprepare 方法以撤消查询
返回目录DELPHI基础教程
编辑推荐
Java程序设计培训视频教程
JEE高级框架实战培训视频教程
Visual C++音频/视频技术开发与实战
Oracle索引技术
ORACLEG数据库开发优化指南
Java程序性能优化让你的Java程序更快更稳定
C嵌入式编程设计模式
Android游戏开发实践指南
[] [] [] []