查看文章 |
多层数据库开发(九)---:查询数据库
2008-09-03 17:36
第九章 查询数据库 这一章介绍如何用TQuery构件查询数据库,如何通过SQL语句检索、插入、更新和删除数据。SQL是符合工业标准的关系数据库语言,既可以用于远程的基于服务器的数据库,如Sybase、Oracle、InterBase和Microsoft SQL Server,也可以用于本地数据库如Paradox、dBASE、FoxPro和Access以及符合ODBC的数据库。 9.1 有效地使用查询 要有效地使用查询,必须熟悉标准的SQL语言以及所使用的服务器对SQL-92的限制和扩展,同时还要熟悉BDE。 9.1.1 查询桌面数据库 作为一个桌面开发者,应对表格、记录和字段的概念有所了解,又能熟练地使用TTable构件访问数据集中的每一条记录和每一个字段。 还可以使用TTable的范围和过滤功能在数据集中选择一部分记录,前者用于选择一块连续的记录,这些记录的值在一个特定的范围内; 后者用于选择非连续的记录,这些记录符合特定的条件。 所谓查询,非常类似于过滤,不同的是,查询要用到TQuery构件和SQL属性,有时候可能还要用到Params属性。从功能上讲,查询要比过滤复杂和强大些,这主要体现在: .可以同时查询几个表格 .可以让查询结果中只包含部分字段,而过滤将返回所有字段。 查询也可以带参数,此时称为参数化查询。所谓参数,类似于变量,它的实际的值由BDE在执行SQL语句之前赋值。参数化查询的好处是,不需要修改SQL语句,只要修改参数的值,就能执行不同的查询功能。 大部分情况下,使用TQuery构件是为了在数据集中选择一部分字段和记录,但也可以使用SQL语句实现更新、插入和删除记录的功能,这是与TTable构件的一个区别。 9.1.2 查询远程数据库 要查询远程数据库,必须熟悉SQL语句以及服务器对标准SQL的限制和扩展。 TQuery构件的SQL属性用于指定要执行的SQL语句, Params属性用于提供参数。TQuery构件的功能并不只限于SQL语句和参数,它还是BDE与应用程序之间的接口。 应用程序可以通过TQuery构件的属性和方法来操纵SQL语句和参数。TQuery构件最终还是通过SQL Links与远程服务器进行通讯的,远程服务器把查询结果返回给BDE,再由BDE返回给应用程序。 9.2 可以查询哪些数据库 使用TQuery构件可以查询下列数据库: 一是Paradox或dBASE,这是通过BDE内置的Local SQL实现的。Local SQL是SQL-92标准的一个子集,支持大部分DML和DDL。 二是Local InterBase Server,这是通过InterBase引擎实现的。 三是远程数据库,如Oracle、Sybase、MS-SQL Server、InFormix、DB2和InterBase,不过,必须安装了相应的SQL Links驱动程序。不同的服务器对标准SQL都有不同的限制和扩展,要查询远程数据库之前,务必要查阅它的有关文档。 Delphi 4还支持异构查询,也就是说,可以同时查询几个不同类型的数据库。 9.3 使用TQuery构件的一般步骤 第一步是把一个TQuery构件放到数据模块上,设置它的DatabaseName属性指定要访问的数据库。对于Paradox和dBASE来说,DatabaseName属性可以设为BDE别名如DBEMOS、DefaultDD、IBLOCAL等,也可以是自定义的别名或者表所在的路径。 对于SQL表来说,DatabaseName属性只能设为BDE别名。如果应用程序使用TDatabase构件来连接数据库,DatabaseName属性也可以设为应用程序专用的别名。 第二步是设置SQL属性指定要执行的SQL语句,有必要的话还可以设置Params属性为SQL语句设置参数。 第三步是把TDataSource构件放到数据模块上,设置它的DataSet属性指定TQuery构件。再把TDBGrid构件放到窗体上,设置它的DataSource属性指定TDataSource构件。 第四步是执行SQL语句。要执行SQL语句有两种方式,一是在设计期把Active属性设为True,程序启动时将自动执行SQL语句。另一种方式是在运行期调用Open或ExecSQL执行SQL语句。如果希望返回查询结果,调用Open,如果不需要返回查询结果,调用ExecSQL。在调用Open或ExecSQL之前,最好先调用Prepare通知服务器作好准备。 执行SQL语句所返回的查询结果实际上是数据集中满足特定条件的记录所组成的子集,数据库栅格中只显示符合特定条件的记录。 9.4 指定要执行的SQL语句 可以设置SQL属性以指定要执行的SQL语句。在设计期,只要把Active属性设为True,就会自动执行SQL语句。在运行期,首先要调用Prepare通知服务器准备好,然后调用Open或ExecSQL执行SQL函数语句。 9.4.1 概述 SQL属性是一个典型的TStrings对象。SQL属性一般只包含一条完整的SQL语句,但可以分成几行写,TQuery构件会自动把几行字符串合并成一条SQL语句。 把SQL语句分成几行写的好处是,SQL语句的逻辑结构比较清楚,有利于今后维护和调试。所以,SQL语句的SELECT部分和WHERE部分一般都不在同一行上。 SQL语句可以不带参数,把字段名称和值固定在SQL语句中,例如,下面这个SQL语句就是硬写(Hard-Coded)的: SELECT * FROM Customer WHERE CustNo = 1231 注意:如果要查询的是本地数据库,如果SQL语句中的字段名包含空格或其他特殊符号,必须用引号括起来,前面还要加上表格名和小圆点。 如果用参数的话,查询就灵活得多,应用程序不需要改写SQL语句本身,只要修改参数的值,就能使SQL语句执行不同的查询功能。在执行SQL语句之前,TQuery构件会自动把实际的值替换SQL语句中的参数,即使并没有显式地调用Prepare函数。 下面这条SQL语句是典型的参数化查询: SELECT * FROM Customer WHERE CustNo = :Number 其中,Number就是一个参数,它的前面必须加冒号。在运行期,应用程序必须提供Number参数的值,每次执行SQL语句时,Number参数的值可以不同。 参数的值是通过TQuery的Params属性提供的。 9.4.2 在设计期指定SQL语句 在设计期,要指定SQL语句,可以在对象观察器中单击SQL属性边上的省略号按钮,弹出一个字符串列表编辑器,如图9.1所示。 图9.1 在设计期指定SQL语句 SQL语句可以分成几行写,但同一单词不能分开。一般情况下,SQL属性只能包含一条完整的SQL语句,但有些服务器允许同时执行几条SQL语句,这种情况下,可以输入多条SQL语句。 如果使用Delphi 4的Client/Server版本或Enterprise版本,也可以用SQLBuilder这个实用工具来建立SQL语句。要使用SQL Builder,在TQuery构件上单击鼠标右键,在弹出的菜单中选择“SQL Builder”命令。 9.4.3 在运行期指定SQL语句 在运行期,要指定SQL属性有三种方式,一是直接设置SQL属性,二是调用LoadFromFile从文件中读取SQL语句,或者从另一个TStrings对象中获得SQL语句。 在直接设置SQL属性之前,首先要调用Close函数。如果SQL属性中本来已经有了SQL语句,还要调用Clear把原来的SQL语句清除。 下面的代码演示了怎样在运行期直接设置SQL属性: With CustomerQuery Do Begin Close; With SQL Do Begin Clear; Add('SELECT * FROM Customer'); Add('WHERE Company = 'Light Diver'); End; Open; End; 有时候,可能想在原来的SQL语句的基础上修改或增加一行,这时候就不能调用Clear把原来的SQL语句清掉,例如: CustomerQuery.SQL[1] := 'WHERE Company = "Light Diver"'; 也可以调用LoadFromFile从文件中获取SQL语句,这主要是因为TStrings对象支持文件操作。LoadFromFile会自动把原来的SQL语句清掉。 下面的代码是调用LoadFromFile的例子: CustomerQuery.Close; CustomerQuery.SQL.LoadFromFile('c:orders.txt'); CustomerQuery.Open; 还可以从另一个TStrings对象中获取SQL语句,这就要调用TStrings的Assign函数。Assign 会自动把原来的SQL语句清空。 下面的代码是调用Assign的例子: CustomerQuery.Close; CustomerQuery.SQL.Assign(Memo1.Lines); CustomerQuery.Open; 9.5 参 数 要使用参数化查询,必须在SQL语句中加入参数,例如: INSERT INTO Country (Name, Capital, Population) VALUES (:Name, :Capital, :Population) 其中,Name、Capital和Population是三个参数。 在执行上述SQL语句之前,应用程序应当调用Prepare函数通知BDE和服务器预先分配好资源,以加快查询速度。程序示例如下: With Query1 Do Begin Close; Unprepare; ParamByName('Name').AsString := 'China'; ParamByName('Capital').AsString := 'Beijing'; ParamByName('Population').AsInteger := '120000'; Prepare; Open; End; 9.5.1 在设计期提供参数 要在设计期提供参数,单击Params属性边上的省略号按钮,弹出如图9.2所示的编辑器。 图9.2 在设计期设置Params属性 如果SQL语句中没有包含任何参数,图9.2所示的编辑器就是空白的。这个编辑器的工具栏总是禁止的,这意味着只能在SQL语句中加入参数。 选择其中一个参数(TParam对象),就可以在对象观察器中设置它的属性,或者建立事件句柄。TParam的主要属性有: DataType属性用于指定参数的数据类型,它的初始值总是ftUnknown,必须设置每个参数的数据类型。 ParamType属性用于指定参数的使用类型,它的初始值也是ptUnknown。 Value属性用于给出参数的值。当然,也可以在运行期给出参数的值。 9.5.2 在运行期提供参数 要在运行期访问参数,有三种方式: 一是通过ParamByName函数按名称访问参数。 二是通过Params属性按序号访问参数。 三是通过TParams对象的ParamValues属性按名称访问参数。 假设一条SQL语句有三个参数: INSERT INTO "COUNTRY.DB" (Na |
最近读者: