第十七章 SQL编程(一)
作者: 来源: 添加时间:2006-5-24 13:29:2117.2.2 在TQuery部件中编写简单的SQL查询命令
在这一节里我们将学习如何使用TQuery部件编写简单的SQL查询命令,并在Delphi 应用程序中实现SQL查询。
例如,如果我们想查询出表Customer.DB中客户的编号和公司名称,我们按下列步骤来实现:
①在应用窗体中放置一个TQuery部件、一个TDataSource部件一个TDataGrid部件,并将它们连接起来
②设置窗体TQuery 部件Query1的DatabaseName属性值为DBDEMOS
③双击Object Inspector窗口中Query1的SQL 属性, Delphi 将显示 String List Editor窗口。
④在图17.3中的窗口中输入SQL语句:
Select CustNo,Company From Custormer;
⑤单击OK按钮,关闭String List Editor窗口。
⑥设置Query的Open属性为True。
17.3 SQL语言编程概述
在Delphi应用程序中的SQL命令语句是包含在TQuery部件的SQL属性中,TQuery部件的SQL属性是TString类型的,也就是说SQL属性值是一个字符串列表,这个字符串列表非常类似于一个字符串类型的数组,有关TString类型的信息请参看联机帮助。在前一节里我们介绍了TQuery部件可以执行两种SQL语句:
● 静态SQL语句
● 动态SQL语句
静态SQL语句在程序设计时便已固定下来,它不包含任何参数和变量,例如下面的语句便是一条静态SQL语句:
Select * From Cusromer Where CustNo = 1234;
而动态SQL语句,也被称作参数化的语句,在其中间包含着表示字段名或表名的参数,例如下面的语句是一条动态SQL语句:
Select * From Customer Where CustNo =: Number;
其中的变量Number便是一个参数变量,它由一个冒号引导,在程序运行过程中,必须要为该参数赋值,该条SQL语句才能正确执行,每次运行应用程序时可以为该参数变量赋予不同的值。
17.3.1 SQL命令文本的编写
1. 使用String List Editor编写
我们要为TQuery部件的SQL属性设置SQL命令文本时,可以在应用窗体中选择TQuery部件且双击Object Inspector窗口中的SQL属性,这样便打开了String List Editor 窗口,在该窗口中我们便可以编写各种SQL命令,如图17.3所示。
在编写完适当的SQL语句之后,选择 OK 按钮便可以将编辑器中的 SQL 命令文装入到TQuery部件的SQL属性中,选择SAVE按钮可以将编写好的SQL命令保存到一个文件中供以后编程时使用。我们在编写SQL命令文本时还可以选择Load按钮从一个 SQL 命令文件中调入SQL命令。在程序运行过程中,要想设置TQuery部件的SQL属性,必须首先调用Close方法,关闭TQuery部件,然后再调用Clear方法清除SQL属性中现存的SQL命令语句,最后再调用Add方法为SQL属性设置新的SQL命令语句。例如:
Query1.Close {关闭Query1)
Query1.SQL.Clear {清除SQL属性中的SQL命令语句}
Query1.SQL.Add('Select * From Country');
Query1.SQL.Add('Where Name ="ARGENTINA" ');
在为TQuery部件设置SQL属性时调用Close方法总是很安全的,如果TQuery部件已经被关闭了,调用Close方法时不会产生任何影响。在应用程序中为SQL属性设置新的SQL 命令语句时,必须要调用Clear方法以清除SQL属性中现存的SQL命令语句,如果不调用Clear方法,便调用Add方法向SQL属性中设置SQL命令语句,那么新设置的SQL命令语句会追加在现存SQL命令语句后面,在程序运行时常常会出现出乎意料的查询结果甚至程序无法运行下去。
在这里要特别注意的,一般情况下TQuery部件的SQL属性只能包含一条完整的SQL语句,它不允许被设置成多条SQL语句。当然有些数据库服务器也支持在TQuery部件的SQL属性中设置多条SQL语句,只要数据库服务器允许这样,我们在编程时可以为 SQL 属性设置多条SQL语句。
2. 使用Visual Query Builder编写
客户/服务器版本的Delphi还包含一个可视化的查询构造器Visual Query Builder ,用这个可视化的工具我们只能编写Select语句。在应用程序窗体中选择TQuery部件后,单击鼠标右键,弹出一个弹出式菜单,从中选择Run Visual Query Builder后便会弹出一对话框提示你选择要访问的数据库,选择想要访问的数据库之后选择OK按钮,紧接着会出现一个弹出式对话框提示你选择要查询的数据库表,一次可以选择多个数据库表,若要选择多个数据库表,每选择一个表之后单击Add按钮,接着选择另一个表,选择完要查询的表之后单击Close按钮,这样,可视化的查询构造器中将会显示出用户选择的数据库表。
有关如何使用可视化的查询构造器Visual Query Builder 请参看联机帮助信息, 在Visual Query Builder中构造完一个查询并退出Visual Query Builder时,其中的SQL 命令语句会自动地写入相应的TQuery部件的SQL属性。
17.3.2 SQL程序的执行
在为TQuery部件设置完SQL属性的属性值之后,也即编写好适当的SQL程序之后,可以有多种方式来执行SQL程序。
在设计过程中,设置完TQuery部件的SQL属性之后将其Active属性的值置为True,这样便可以执行SQL属性中的SQL程序,如果应用中有与TQuery部件相连的数据浏览部件( 如TDDGrid TDBEdit等)那么在这些数据浏览部件中会显示SQL程序的执行结果。
在应用程序运行过程中,通过程序调用TQuery部件的Open方法或ExecSQL 方法可以执行其SQL属性中的SQL程序。Open方法和ExecSQL方法是不一样的。大家在程序设计过程中一定要注意。Open方法只能用来执行SQL语言的查询语句(Select命令),并返回一个查询结果集,而ExecSQL方法还可以用来执行其它常用的SQL语句(如Insert、UPDATE、 DELETE等命令)例如:
Query1.Open (这样会返回一个查询结果集)
如果调用Open方法,而没有查询结果时,会出错。此时应该调用ExecSQL 方法来代替Open方法。如:
Query1.ExecSQL (没有返回结果)
当然在设计应用程序时,程序设计人员是无法确定TQuery部件中的SQL 语句是否会返回一个查询结果的。对于这种情况应当用Try…Except模块来设计程序。在 Try 部分调用Open方法,而在Except部分调用ExceSQL方法,这样才能保证程序的正确运行。
例如:
Try
Query1.Open
Except
Query1.ExecSQL
End
在应用程序中使用TQuery部件时,还可以设置它的UniDirectional属性为True,这样会加快检索数据库表的速度,但是这样只能往一个方向移动记录指针, 在缺省情况下,UniDirectional属性的值为False。
17.3.3 通过TQuery部件如何获得活动的数据
我们在前面的章节里介绍TTable部件时,我们知道通过TTable部件从数据库中获得的数据都是活动的,也就是说用户可以直接通过数据浏览部件对这些数据进行编辑修改。而通过TQuery部件可以获得两种类型的数据:
● “活动”的数据
这种数据就跟通过TTable部件获得的数据一样,用户可以通过数据浏览部件来编辑修改这些数据,并且当调用Post方法或当焦点离开当前的数据浏览部件时,用户对数据的修改自动地被写回到数据库中,详细情况请参看第四章“数据浏览部件的应用及编程”。
● 非活动的数据(只读数据)
用户通过数据浏览部件是不能修改其中的数据。在缺省情况下,通过TQuery部件获得的查询结果数据是只读数据,要想获得“活动”的数据,在应用程序中必须要设置TQuery部件的RequestLive属性值为True,然而并不是在任何情况下(通过设置RequestLive的属值True)都可以获得“活动”的数据的,要想获得“活动”的数据,除了将TQuery部件的RequestLive属性为True外,BDE要能够返回“活动”的数据,相应的SQL命令语句还要满足附录C中的语法规则和下列的约束条件:
TQuery部件获得“活动”的查询结果数据的约束条件:
当查询Paradox或dBASE数据库中的表:
● 查询只能涉及到一个单独的表
● SQL语句中不能包含ORDER BY命令
● SQL语句中不能含聚集运算符SUM或AVG
● 在Select后的字段列表中不能有计算字段
● 在Select语句WHERE部分只能包含字段值与常量的比较运算,这些比较运算符是: Like,>,<,>=,<=,各比较运算之间可以有并和交运算:AND和OR。
第 2 页,共 2 页 [1] [2]
站内搜索