使用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属性
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语句(如InsertUPDATE DELETE等命令)例如
QueryOpen (这样会返回一个查询结果集)
如果调用Open方法而没有查询结果时会出错此时应该调用ExecSQL 方法来代替Open方法如
QueryExecSQL (没有返回结果)
当然在设计应用程序时程序设计人员是无法确定TQuery部件中的SQL 语句是否会返回一个查询结果的对于这种情况应当用Try…Except模块来设计程序在 Try 部分调用Open方法而在Except部分调用ExceSQL方法这样才能保证程序的正确运行
例如
Try
QueryOpen
Except
QueryExecSQL
End
在应用程序中使用TQuery部件时还可以设置它的UniDirectional属性为True这样会加快检索数据库表的速度但是这样只能往一个方向移动记录指针 在缺省情况下UniDirectional属性的值为False
通过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
当通过SQL语句查询数据库服务器中的数据库表
● 查询只能涉及到一个单独的表
● SQL语句中不能包含ORDER BY命令
● SQL语句中不能含聚集运算符SUM或AVG运算
另外如果是查询Sybase数据库中的表那么被查询的表中只能有一个索引
如果在应用程序中要求TQuery部件返回一个活动的查询结果数据集但是SQL 命令语句不满足上述约束条件时对于本地数据库的SQL查询BDE只能返回只读的数据集对于数据库服务器中的SQL查询只能返回错误的代码当TQuery 部件返回一个活动的查询结果数据集时它的CanModify属性的值会被设置成True
表 TQuery部件返回查询结果数据的类型
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
RequestLive属性值 CanModify属性值 查询结果的类型
────────────────────────────────
False False 只读数据
True(SQL语句满足约束条件) True 活动数据
True(SQL语句不满足约束条件) False 只读数据
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
当TQuery部件返回只读的查询结果数据集而用户又希望修改这只读的数据集时一般这样来处理在应用程序中另外增加一个 TQuery 部件 Query( 假设获得只读结果的TQuery部件的名字是Query)在Query中设置修改语句UpDATE对Query 中的数据进行修改操作这样会实现对只读数据的修改
动态SQL语句的编程
在节中我们已经介绍了动态SQL语句(又被称为参数化的SQL语句)在其中包含在程序过程中可以变化的参数在实际的程序设计中使用得更多的是动态SQL语句因而在这一节里我们重点介绍如何给动态SQL语句的参数赋值以在应用程序中灵活地使用SQL语句动态SQL语句的编写执行等等与节中介绍的SQL语句的编写执行是一样的
动态SQL语句中的参数我们可以通过两种途径来为它赋值
[] [] [] []