1. 查询数据库
这部分介绍能够通过SQL语句访问数据库的TQuery构件。
    在客户端运行的封装了SQL语句的TQuery构件可以检索、插入、更新和删除数据。SQL是符合工业标准的关系数据库语言,可以用于远程的基于服务器的数据库,如SybaseOracleInterBaseMicrosoft SQL Server,也可以用于本地数据库如ParadoxdBASEFoxProAccess以及符合ODBC的数据库
    这部分主要包含以下的内容:
    1有效地使用查询
    2使用TQuey构件可以查询哪些数据库
    3如何使用使用TQuery构件
    4指定要执行的SQL语句
    5设置查询的参数
    6执行查询
    7准备查询
    8释放SQL语句占用的资源
    9异构查询
    10提高查询的效率
    11查询结果
2. 有效地使用查询
    要有效地使用查询,必须熟悉以下的内容
    1)标准的SQL语言以及所使用的服务器对SQL-92的限制和扩展
    2)熟悉BDE

    如果你已经是一个熟练的桌面数据库使用者,现在希望开发基于服务器的应用程序,可以参考基于桌面的查询。如果从来没有使用过SQL,需要学习这方面的知识。
    如果你已经是一个熟练的基于数据库服务器的开发者,现在想使用Delphi开发客户端应用程序。此时虽然你对SQL和服务器比较熟悉,但也许不熟悉BDE,那么就需要学习一些BDE方面的资料

    本部分包括以下内容
    1基于桌面的查询
    2查询远程数据库
2.1查询桌面数据库
    作为一个桌面开发者,已经对数据表、记录和字段的概念有所了解。可以使用TTable构件访问任何数据表中的任何记录和每一个字段。设置了TTable构件的TableName属性,就可以访问数据表中的数据了。
    还可以使用TTable的范围和过滤功能在数据表中选择一部分记录。范围用于选择一块记录的值在一个特定的范围内的记录,比如选择雇员的名字大于Boll小于Smith的记录;“过滤用于选择符合特定条件的非连续记录,比如选择客户编号的E-mail地址是California的。
    查询非常类似于过滤。不同的是,查询要用到TQuery构件和SQL属性,有时可能用到Params属性,来返回,增加,删除,修改数据。从功能上讲,查询比过滤功能更强大,主要体现在:
    1)可以同时查询几个数据表
    2)可以让查询结果中只返回部分字段,而过滤将返回所有字段。这样的话提高了查询的效率和安全。内存不再消耗在无用的数据上,也防止了访问那些不允许用户查看和修改的
数据。
    查询也可以带参数,此时称为参数化查询。所谓参数,类似于变量,它的实际的值由BDE在执行SQL语句之前赋值。参数化查询的好处是,不需要修改SQL语句,只要修改参数的值,就能执行不同的查询功能,因此查询具有很大的灵活性。大部分情况下,使用TQuery构件是为了在数据表中选择一部分字段和记录(这和TTable构件相似),但也可以使用SQL语句实现更新、插入和删除记录的功能,并且查询通常不返回记录,这是与TTable构件的一个区别。
    要了解使用SQL属性指定SQL语句,可参看指定要执行的SQL语句”.要了解使用参数化查询,可参看设置查询参数,要了解如何执行查询,可查看查询的执行
2.2查询远程数据库
    作为数据库的设计者,你对SQL已经很熟悉了。所谓的查询就是可以用来访问数据的SQL语句。
    SQL属性和其参数是TQuery语句中最重要的组成部分。TQuery构件的SQL属性用于指定要执行的SQL语句, Params属性用于提供参数。TQuery构件的功能并不只限于SQL语句和参数,它还是BDE与应用程序之间的接口。
    客户端应用程序使用TQuery构件形成SQL语句和参数,指定要查询的数据库,执行查询。TQuery构件调用BDE执行查询,与数据库服务器建立联系(主要是SQL Links,远程服务器把查询结果返回给BDE,再由BDE返回给客户端应用程序。
    当使用TQuey构件的时候,必须意识到用来描述BDE的一些术语可以造成错觉。比如说,BDE经常使用别名来描述数据库服务器的标准名称。其实,BDE别名是保存在一个配置文件中,是在TQuery构件的DatabaseName属性中设置
    同时,BDE的帮助文件(位于\Borland\Common Files\BDE\BDE32.HLP)中建议使用查询的时候最好使用参数查询。
    要了解使用SQL属性指定SQL语句,可参看指定要执行的SQL语句。要了解使用参数化查询,可参看设置查询参数;要了解如何准备查询,可参看查询的准备;要了解如何执行查询,可查看查询的执行
3. 使用TQuey构件可以查询哪些数据库

TQuery构件可以访问以下的数据库:
    1ParadoxdBASE,这是通过BDE内置的Local SQL实现的。Local SQLSQL-92
标准的一个子集,支持大部分DMLDDL。可参看“LOCALSQL.HLP”查询更详细的内容。
    2)本地InterBase Server(通过InterBase引擎实现)
    3)远程数据库,如OracleSybaseMS-SQL ServerInFormixDB2InterBase。但是,必须安装相应的SQL Links驱动程序和客户端软件。不同的服务器对标准SQL都有不同的限制和扩展,在查询远程数据库之前,务必要查阅它的相关文档。
    4Delphi 4还支持异构查询。可以同时查询几个不同类型的数据库(比如说,从OracleParadox数据表之间进行查询)。当创建了异构查询的时候,BDE使用本地的SQL执行查询。可参看创建异构查询
4. 如何使用TQuery构件
要在设计期间使用TQuery构件,需要:
    1)把一个TQuery构件放到数据模块(TDataModule)上,设置它的Name属性
    2)设置TQuery构件的DatabaseName属性为指定要查询的数据库。对于ParadoxdBASE来说,DatabaseName属性可以设为BDE别名或者数据表所在的路径,或者是TDatabase构件的DatabaseName属性中设定的值。
    3)在SQL属性指定要执行的SQL语句,有必要的话还可以在Params属性设置相关的参
数。可查看在设计期间指定TQuery构件的SQL属性
    4db2数据库sql语句)如果要把查询的结果显示在数据控件上,需要把TDataSource构件放到数据模块上,设置它的DataSet属性为指定的TQuery构件。TDataSource构件是用来从查询构件中返回查询的结果,并且把查询的结果显示在数据控件中。最后,需要设置数据控件的DataSourceDataField属性。
    5)执行SQL语句。如果希望查询返回结果,需要把Active属性设为True,或者运行期调用Open;如果不需要返回查询结果,调用ExecSQL。在调用OpenExecSQL之前,最好先调用Prepare通知服务器作好准备。

在运行期间第一次执行查询,需要:
    1)关闭TQuery构件
    2)在SQL属性中提供SQL语句。如果在设计期间没有设置SQL属性或者在运行的时候需要修改SQL语句都必须这样做。如果要使用设计期间提供的SQL语句,此步可以忽略。要了解如何设置SQL属性,可参看指定要执行的SQL语句
    3)直接在Params属性中或者调用ParamByName方法设置相关的参数和参数的值。如
果查询不包含参数,或者不需要改变设计期间指定的参数和参数的值,那么此步可以忽略。可参看设置查询参数
    4)调用Prepare方法初始化BDE和把参数的值绑定到查询中。虽然是强烈建议这样做,但是此步也是可以忽略的。可参看准备查询
    5)调用Open执行查询并且返回结果,或者调用ExecSQL执行查询但不返回结果。可参看查询的执行
    在已经执行了一次查询后,只要不改变SQL语句,应用程序将在关闭查询和重新打开,重新执行查询执行之间循环,此时,不再需要准备查询。可参看查询的执行
5. 指定要执行的SQL语句
    设置SQL属性指定要执行的SQL语句。在设计期间,只要把Active属性设为True,就会自动执行SQL语句。在运行期间,首先要调用Prepare通知服务器,然后调用OpenExecSQL执行SQL语句。
    SQL属性本身是一个TStrings对象,是一个字符串数组和一系列属性,事件,方法的集合。SQL属性可以分成几行写,TQuery构件会自动把几行字符串合并成一条可执行的SQL语句。把SQL语句分成几行写的好处是,可以把SQL语句分割成几个逻辑单元,逻辑结构比
较清楚,有利于今后维护和调试。因此,SQL语句的SELECT部分和WHERE部分一般都不在同一行上。
    SQL语句可以不带参数,把字段名称和值固定在SQL语句中。SQL语句也可是一个参数化查询,其中包含有可在执行时指定替换值的参数。例如,下面这个SQL语句就是硬写(Hard-Coded)的:
    SELECT * FROM Customer WHERE CustNo = 1231

    “硬写语句对那些需要执行确定的,每次运行已知的查询是非常有用的。在设计期间或者运行期间,可以很容易地使用另外一个硬写语句或者参数化查询代替原来的硬写语句。每当SQL属性发生变化的时候,查询自动关闭。
    注意:如果要查询的是本地数据库(使用BDE引擎),并且SQL语句中的字段名包含空格或其他特殊符号,必须用引号括起来,前面还要加上数据表名称和小圆点。

    如果用参数的话,查询就灵活得多。使用参数查询,应用程序不需要改写SQL语句本身,只要修改参数的值,就能使SQL语句执行不同的查询功能。在执行SQL语句之前,TQuery
件会自动把实际的值替换SQL语句中的参数,即使并没有显式地调用Prepare函数。
    下面这条SQL语句是典型的参数化查询:
    SELECT * FROM Customer WHERE CustNo = :Number

    其中,Number就是一个参数,它的前面必须加冒号。在运行期间,应用程序必须提供Number参数的值,每次执行SQL语句时,Number参数的值可以不同。
    实际赋给Number参数的值是通过TQueryParams属性提供的。


    技巧:最好把参数的名称和实际字段的名称设置为相同

    可参看:
    在设计期间指定SQL属性
    在运行期间指定SQL属性
5.1在设计期间指定SQL属性
    在设计期间,要指定SQL语句,可以在对象观察器中单击SQL属性边上的省略号按钮,弹出一个字符串列表编辑器。
    SQL语句可以分成几行写,但同一单词不能分开。分成几行写的好处是易读,易改,易调试。
    一般情况下,SQL属性只能包含一条完整的SQL语句,虽然这些SQL语句是相当复杂的(比如:在Where语句中包含多个And Or逻辑编辑符)。但有些服务器允许同时执行几条SQL语句,这种情况下,可以输入多条SQL语句。
    提示:如果使用Delphi 4C/S版本或Enterprise版本,可以使用SQLBuilder这个可视化的工具来建立SQL语句。要使用SQL Builder,选中TQuery构件,单击鼠标右键,在弹出的菜单中选择“SQL Builder”。如何使用"SQL Builder",需要查在线帮助。
5.2在运行期间设置SQL属性
  在运行期间,要指定SQL属性有三种方式:
1直接设置SQL属性
2调用LoadFromFile从文件中读取SQL语句
3从另一个TStrings对象中获得SQL语句
5.3直接设置SQL属性(运行期间)
    1)调用Close函数。即使在改变SQL属性的时候会自动关闭查询,不过最好在修改SQL语句之前调用Close方法
    2)如果原来的SQL语句不再有用,调用Clear方法。
    3)如果创建新的SQL语句或者向SQL语句中增加一行,可以调用Add方法;如果要修改某行,需要使用使用SQL属性,并且把索引号设置为要修改的行号,给这行赋予新值。比如:
    CustomerQuery.SQL[1] := 'WHERE Company = "Light Shopp"';
CustomerQuerySQL语句的第2行内容修改为Light Shopp
    4)调用Open或者ExecSQL执行查询

举例:
with CustomerQuery do
begin
    Close; { close the query if it's active }
    with SQL
    do begin
        Clear; { delete the current SQL statement, if any }
        Add('SELECT * FROM Customer'); { add first line }
        Add('WHERE Company = Light Diver'); { ... and second line }
    end;
    Open; { activate the query }
end;

提示:
    如果带有参数查询,必须在打开或者执行查询之前调用Prepare方法设置这些参数的初始值。显式地调用Prepare方法对于同一个SQL语句被多次重复调用是非常有用的,否则的话这个SQL会自动由TQuery构件调用。
5.4调用LoadFromFile从文件中读取SQL语句
    也可以调用LoadFromFile从文件中获取SQL语句,这主要是因为TStrings对象支持文件操
作。LoadFromFile会自动把原来的SQL语句清掉。比如:

    CustomerQuery.Close;
    CustomerQuery.SQL.LoadFromFile('c:\');
    CustomerQuery.Open;
5.5从另一个TStrings对象中获得SQL语句
    还可以从另一个TStrings对象中获取SQL语句,需要调用TStringsAssign方法。Assign 会自动把原来的SQL语句清空。比如:

    CustomerQuery.Close;
    CustomerQuery.SQL.Assign(Memo1.Lines);
    CustomerQuery.Open
6.
设置查询的参数
    参数化查询的SQL语句中包含了参数(或者称为变量),而参数的值可以在设计期间或者运行期间指定。通常,参数代表传递到SQL语句中的数据的值(类同于函数或者过程中的参数的含义)。比如,
    INSERT INTO Country (Name, Capital, Population)
    VALUES (:Name, :Capital, :Population)
    其中,:Name:Capital:Population是三个参数。而这三个参数的实际值是在运行期间由应用程序来提供。在第一次执行查询之前,应用程序必须调用Prepare方法把参数的当前值绑定到SQL语句中。绑定意味着BDE和服务器预先为SQL语句及其参数分配好资源,以加快查询速度。比如:

with Query1 do
begin
    Close;
    Unprepare;
    ParamByName('Name').AsString := 'Japan';
    ParamByName('Capital').AsString := 'Tokyo';
    ParamByName('Population').AsInteger := 40000;
    Prepare;
    Open;
end;

可参看
  1在设计期间提供参数
  2在运行期间提供参数
  3从另一个数据表获得参数
6.1 在设计期间提供参数
    在设计期间,SQL语句中出现的参数(必须先在SQL语句中先指定参数)是在TQuery构件的Params属性中保存的,其本身是一个TParam对象。可以使用对象观察器设置其相关的属性。而如果SQL语句中没有任何参数的话,在Params属性中是没有任何内容的。但是
也可以运行期间动态增加参数。

    要在设计期间访问参数
    1)选中TQuery构件
    2)单击Params属性边上的省略号按钮,弹出如下图所示的参数编辑器

    3)在参数编辑器中,选中需要设置的参数
    4)在对象观察器中浏览或者修改参数的属性
    如果SQL语句中没有包含任何参数,则上图所示的编辑器就是空白的。这个编辑器的工具栏总是禁止的。如果在SQL中已经定义了参数,那么所有的参数都会出现在参数编辑器

    注意:当在参数编辑器中单击右键的时候,也会出现"Add""Delete",但是我们注意到
TQuery构件,永远也不可以选择这两项。也就是说,要在设计期间添加和删除参数必须通过SQL属性

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。