当前位置: 首页 > 图文教程 > 数据库 > MSSQL > 动态SQL语句的编程

MSSQL
精细讲述SQL Server数据库备份多种方法
让SQL Server也能使用2G以上内存
SQL Server数据库崩溃恢复之法
创建区分大小写的SQL Server 2000实例
SQL Server中易混淆的数据类型
如何优化SQL Server数据库查询
使用Robot连接SQL的例子
如何让你的SQL运行得更快
对Sql Server中的表添加级联更新和级联删除
常用SQL语句书写技巧
SQL Server与Oracle实施成本上的差异
解析SQL Server的数据类型 BLOB
SQL Server数据库和XML标识语言的集成
SQLServer 数据库还原和孤立用户的解决办法
SQL Server 2000/2005 分页SQL
Sql Server锁表
SQLServer2005实现远程数据库备份
SQL精妙语句
SQL Server 2008的逻辑查询处理步骤
如何让你的SQL运行得更快

MSSQL 中的 动态SQL语句的编程


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-17   浏览: 76 ::
收藏到网摘: n/a

动态SQL语句中的参数,我们可以通过两种途径来为它赋值:

1. 利用参数编辑器(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部件相连的数据浏览部件中会显示出查询结果,通过参数编辑器为参数赋值,这种方式缺乏应有的灵活性,在实际应用中用得较少,在实际应用中程序设计人员希望用更灵活方便的方式为参数赋值,那就是我们接下来要介绍的另一种途径:

2. 在运行过程中,通过程序为参数赋值

用这种方式为参数赋值有三种方法:

①根据参数在SQL语句中出现的顺序,设置TQuery部件的Params属性值为参数赋值。

②直接根据SQL语句中各参数的名字,调用ParamByName方法来为各参数赋值。

③将TQuery部件的DataSource属性设置为另一个数据源,这样将另一个数据源中与当前TQuery部件的SQL语句中的参数名相匹配的字段值赋给其对应的参数。

这三种方法我们将在下面的三小节中具体地介绍

17.4.1 使用Params属性为参数赋值

TQuery部件具有一个Params属性,它们在设计时不可用,在程序运行过程中可用,并且是动态建立的,当为TQuery部件编写动态SQL 语句时, Delphi 会自动地建立一个数组Params,数组Params是以0下标开始的,依次对应动态SQL 语句中的参数, 也就是说动态SQL语句中第一个参数对应Params[0],第二个参数对应params[1],依此类推。

例如:一个TQuery部件Query1,我们为它编写的动态SQL语句是:

对于上述这条动态SQL语句中的参数,我们可以利用TQuery部件的params 属性为参数赋值:

以下为引用的内容:

  Query1.params[0].AsString := "1988";

  Query1.params[1].AsString := "Lichtenstein";

  Query1.params[2].AsString := "USA";

上述语句将把"1988"赋给参数:Cuse_No,"Lichtenstein"赋给参数:Name,"USA"赋给参数:Country。

17.4.2 使用ParamByName方法为参数赋值

ParamByName是一个函数,用动态SQL语句中的参数作为调用ParamByName函数的参数,这样便可以为它们赋值,使用这种赋值方法,必须要知道动态SQL语句参数的名字。
例如在17.4.1节中的例子中,也可以用下述方法给参数赋值:

以下为引用的内容:

  Query1.ParamByName('CustNo').AsString := "1988";

  Query1.ParamByName('Name').AsString := "Lichtenstein";

  Query1.ParamByName('Country').AsString := "USA";

使用这种方法同样可以为各参数赋值,而且更加直观一些。

17.4.3 使用Datasource属性为参数赋值

上述两种方法的共同特点是:我们在为各参数赋值时,我们是知道各参数对应的具体参数值的。而在具体的应用程序中,有些参数值常常是无法确定的,例如参数值来自于另一个查询结果,对于这种情况,Delphi提供了使用Datasource属性为动态SQL 语句中尚存在没有赋值的参数时, Delphi 会自动检查 TQuery 部件的 Datasource 属性, 如果为Datasource属性设置了属性值(该属性的值是另一个TDatasource部件的名字),Delphi 会把没有赋值的参数与TDatasource部件中的各字段比较,Delphi 会将相应的字段值赋给与其相匹配的参数,利用这种方法也能实现所谓的连接查询,我们在学习使用TTable部件时,便会创建主要--明细型数据库应用,用TQuery部件创建的连接查询与主要- -明细型应用是相似的。

例如:在如图17.7所示的应用中,设置了下列部件:

● 一个TTable部件

名字为Cust,它的DatabaseName属性为DEMOS,TableName属性为Customer。

● 一个TDatasource部件

名字为Custsource,其Dataset属性被设置为Cust。

● 一个TQuery部件

名字为ORDERS,其DatabaseName被设置为DEMOS,SQL属性值为:

Select Orders.CustNo,Orders.OrderNo,Orders.SaleDate FROM Orders

WHERE Orders.CustNo =: 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语句会根据新的参数值重新查询,从数据库表中获取相应的订单数据,这样也变实现了类似于主要--明细型应用。即连接查询。