丁保国的博客

收集整理工作生活,点点滴滴

  :: :: :: :: :: 管理 ::

第5章 ADODataSet与ADOCommand组件

第1章             ADODataSet与ADOCommand组件

用过了ADOTable与ADOQuery组件后,可以总结出两者的不同之处:前者是直接从表中取得数据,而后者是通过执行SQL命令来从数据库中(可能来自一张表,也可能来来自多张表)取得数据。

本章介绍的第5章       ADODataSet组件,则是同时具备ADOTable与ADOQuery组件功能的另一个常用的数据集组件。

1.1             认识ADODataSet组件

ADODataSet组件与前面所讲的ADOTable与ADOQuery组件一样,既可以通过ADOConnection组件来连接数据库,也可以设置自身的ConnectionString来连接数据库。

数据库连接完成后,就可以通过CommandType属性来设置我们使用数据库的方式,共有6种:

 

CommandType属性

含  义

cmdFile

以持久的文件名(ADTG格式或XML文件)作为CommandType属性值

cmdStoredProc

以存储过程名作为CommandType属性值

cmdTable

CommandText使用“表名”连接(内部做了SQL 对各列的查询)

cmdTableDirect

CommandText使用“表名”连接(内部不做SQL而是真正通过表名连接)

cmdText

使用Select-SQL命令文本

cmdUnknow

不知道(默认为SQL)

 

选择不同的CommandType属性后,就必须设置相应的CommandText属性。如同ADOQuery组件的SQL命令一样,ADODataSet组件的CommandText属性也是既可在设计时指定,也可在程序中动态设置。

1.2             ADODataSet组件的使用

本节将通过几个例子来说明ADODataSet组件的使用。

例5‑1查询某个出生日期的学生记录。

 

 

图 5‑1  查询某个出生日期的学生记录

方法一:使用Parameters参数

 

 

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);

begin

    if key=#13 then

    begin

①    ADODataSet1.CommandText:='select * from students where 出生年月日=:csrq';

②    ADODataSet1.Parameters.ParamByName('csrq').Value:=edit1.Text;

      ADODataset1.Close;

      ADODataSet1.Open;

    end;

end;

方法二:用变量代替Parameter参数

 

 

 

procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char);

var csrq:string;

begin

    if key=#13 then

    begin

      csrq:='#'+edit2.Text+'#';

      ADODataset1.Close;

      ADODataSet1.CommandText:='select * from students where 出生年月日='+ csrq;

      ADODataSet1.Open;

    end;

end;

 

注意

 

 


    方法一中,无需用var csrq:string 语句来定义参数。参数csrq实际上是由语句①来定义的。因此,语句②必须放在语句①的下面,否则会出错。

另外,参数前必须加冒号,且与参数之间不能有空格!(等号与冒号之间可以有空格)!

 

ADOTable及ADODataSet构件不仅能连接数据库中的表,也能调用那些保存在Access数据库中的查询(相当于SQL  Server 中的视图――虚拟表)。

 

但查询往往会带有参数,对于这些带有参数的查询,在Delphi中又如何调用呢?

 

例5‑2 ADODataSet构件调用Access数据库中的带参数的查询。

 

先在Access中创建带有参数的查询,如:

 

图 5‑2  保存在Access数据库中的带参数的查

对应的Select-SQL命令为:

SELECT STUDENTS.*  FROM STUDENTS  WHERE  STUDENTS.出生年月日 =[csrq]

 

这里,csrq为参数。 如何在Delphi中给参数csrq 赋值呢?

 

答案:采用例5‑1中的方法一。

 

 

 

问:ADOTable、ADOQuery构件是否也能连接带有参数的查询呢?

 

 

 

ADOTable、ADOQuery、ADODataSet、ADOCommand构件之间的比较:

 

ADOTable

ADOQuery

ADODataSet

ADOCommand

是否属于数据集组件

√

√

√

×

通过表名来连接数据库中的表

√

×

√

×

返回数据集的SQL命令

×

√

√

×

不返回数据集的SQL命令

×

√

×

√

Open方法

√

√

√

×

ExecSQL方法

×

√

×

×

Execute方法

×

×

×

√

 

 

1.3             ADOCommand组件

ADOTable、ADOQuery、ADODataSet这三个组件都属于数据集组件(都是从TDataSet继承而来),都是用来存放数据的容器,这些数据来自于数据库。

与上述三个组件不同,ADOCommand并不是数据集组件(不是从TDataSet继承而来),该组件主要用来执行SQL命令,尤其是那些不返回数据的SQL命令,如:Insert into、Delete from、Update等。

 

图 5‑3  组件面板上的ADOCommand组件

ADOCommand组件使用举例:

要使用ADOCommand组件,首先要指定Connection或者ConnectionString属性以连接数据库,然后给CommandText属性设置一个SQL命令(字符串),最后调用ADOCommand组件的Execute方法,就会执行存储在CommandText属性中的SQL命令。

 

例5‑3向Student1.mdb数据库中的“成绩单”表中插入如下一条记录:

 

图 5‑4  所要插入的记录

 

 

图 5‑5  利用ADOCommand组件插入一条记录

先在窗体上放置一个ADOCommand组件,并设置好ConnectionString属性,如图 5‑5。

然后在命令按钮Button1的OnClick事件中添加如下事件处事程序:

 

procedure TForm1.Button1Click(Sender: TObject);

begin

  ADOCommand1.CommandText:='Insert into 成绩单 values("888888","赵小蕙",80,90,100)';

  ADOCommand1.Execute;

end;

 

运行程序,单击命令按钮Button1,即可向“成绩单”表中添加一条记录。

1.4             ADOConnection组件

 

在使用ADOTable、ADOQuery、ADODataSet、ADOCommand等组件时,都需要首先设置ConnectionString属性来实现与数据库的连接。然而,当一个应用系统甚至一个窗体上出现多个上述组件时,就需要多次设置ConnectionString属性。有没有办法只设置一次ConnectionString属性,而让上述多个组件共享这个数据库连接呢?

答案是:使用ADOConnection组件。

方法如下:

首先设置ADOConnection组件的ConnectionString属性,然后将ADOTable、ADOQuery、ADODataSet、ADOCommand等组件的Connection属性设置为ADOConnection1。

 

图 5‑6  利用ADOConnection组件实现共享连接

另外,还应将ADOConnection组件的LoginPrompt属性设置为False,否则程序运行时会跳出“Database Login”对话框,见图 5‑7。

 

图 5‑7  数据库登录对话框

 

例 5‑4 利用Northwind数据库,创建如下的订单查询窗体。

 

 

 

图 5‑8  订单查窗体

 

例 5‑5 连接带口令的Access数据库。

Access数据库以独占方式打开(见图 5‑9)后,可以设置口令加以保护,见图 5‑15。

 

图 5‑9  以独占方式打开数据库

 

图 5‑10  设置数据库密码

设置口令后,再次打开数据库时就需要输入口令,如果口令不正确则无法打开,这样可以起到一定的保护作用。(如果要更好的保护,则需要建立工作组信息文件,设置工作组保护)

对于加了口令的数据库,如何用ADOConnection组件来连接呢?

 

当我们在“数据链接属性”对话框中选择数据库驱动程序,然后选择所要连接的Access数据库后,测试连接时,就会出现图 5‑12所示的错误。

 

图 5‑11  数据链接属性对话框

 

图 5‑12  数据链接错误

原因就是没有提供正确的口令。那么如何提供口令呢?

 

方法如下:

 

单击“数据链接属性”对话框中的“所有”选项卡(见图 5‑13),选择:

 

Jet OLE DB:Database Password

 

图 5‑13  数据链接属性对话框

 

然后单击左下方的“编辑值(E)…”命令按钮,打开图 5‑14所示的对话框:

 

图 5‑14  输入口令

在“属性值(V)”下输入口令,最后确定。

 

经过上述操作后,再次单击“测试连接”按钮,就会看到:连接成功。

 

1.5             存取Excel文件

Excel工作簿(.XLS文件)由许多工作表组成,每张工作表中可以保存各种数据。一个Excel工作簿实际上也是一个数据库文件,而其中的工作表则相当于数据库中的表。

使用ADO组件不仅可以访问几乎所有的关系型数据库(如:Access、SQL Server、Oracle、Sybase、Informix等),还可以访问Excel工作簿中的工作表。

 

使用ADO组件访问Excel工作表,可以有以下两种方法:

方法一:

(1)、在窗体上放置一ADOTable构件,选择“Connection String”,打开“数据链接属性”对话框,建立连接到数据库的连接串。

(注意:只能用ADOTable构件,而无法使用ADODataSet或ADOQuery构件!)

 

(2)、与连接到Access数据库相同,选择“Microsoft  Jet 4.0 OLE  DB  Provider”,然后选择需要访问的Excel工作簿文件。

(3)、选择“所有”选项卡,设置Extended  Properties属性值为:Excel 8.0

(注意:“8”之前有一空格!)

 

 

图 5‑15  设置数据库驱动程序的扩展属性

 

 

图 5‑16  编辑属性值

 

 

(4)、将ADOTable构件的TableDirect属性设置为True。

(5)、设置ADOTable构件的TableName属性为所要访问的工作表

 

 

 

注意

 

 


TableDirect属性:用于指定是通过表名来访问数据库还是在后台运行SQL 命令访问数据库。有些数据提供者不支持通过表名对数据库的访问,这时ADOTable 就只能通过后台运行SQL的SELECT语句来访问数据库。如果设置为False 则ADOTable 组件在后台运行SQL 命令访问数据表,为True时,按表名访问数据库。TableDirect属性的缺省值为False。

 

 

方法二:

省略方法一中的第(4)步,但需要给工作表中的数据区域命名。命名后再将ADOTable构件的TableName属性指定为所命名的区域名称。

 

 

图 5‑17  命名工作表数据区域

 

 

 

 

 

课外练习:

1、    在Students.mdb数据库中创建一个查询,用于插入一条记录:

INSERT INTO 成绩单VALUES (xh, xm, math, chinese, english)

然后使用ADOCommand组件调用该查询,来实现记录的添加(见下图)。

 

 

2、    根据Northwind数据库创建如下查询窗体:

 

当选择某公司时,查询并显示该公司所订购的全部产品及货款合计。

 

 

 

 

 

 

 

posted on 2007-07-21 15:14  丁保国  阅读(3542)  评论(1)    收藏  举报