丁保国的博客

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

  :: :: 博问 :: 闪存 :: :: :: :: 管理 ::

第1章             ADODataSetADOCommand组件

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

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

1.1             认识ADODataSet组件

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

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

 

CommandType属性

 

cmdFile

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

cmdStoredProc

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

cmdTable

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

cmdTableDirect

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

cmdText

使用SelectSQL命令文本

cmdUnknow

不知道(默认为SQL

 

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

1.2             ADODataSet组件的使用

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

51查询某个出生日期的学生记录。

 

 

51  查询某个出生日期的学生记录

方法一:使用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实际上是由语句来定义的。因此,语句必须放在语句①的下面,否则会出错。

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

 

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

 

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

 

52 ADODataSet构件调用Access数据库中的带参数的查询。

 

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

 

52  保存在Access数据库中的带参数的查

对应的SelectSQL命令为:

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

 

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

 

答案:采用51中的方法一。

 

 

 

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

 

 

 

ADOTableADOQueryADODataSetADOCommand构件之间的比较:

 

ADOTable

ADOQuery

ADODataSet

ADOCommand

是否属于数据集组件

×

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

×

×

返回数据集的SQL命令

×

×

不返回数据集的SQL命令

×

×

Open方法

×

ExecSQL方法

×

×

×

Execute方法

×

×

×

 

 

1.3             ADOCommand组件

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

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

 

53  组件面板上的ADOCommand组件

ADOCommand组件使用举例:

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

 

53Student1.mdb数据库中的“成绩单”表中插入如下一条记录:

 

54  所要插入的记录

 

 

55  利用ADOCommand组件插入一条记录

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

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

 

procedure TForm1.Button1Click(Sender: TObject);

begin

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

  ADOCommand1.Execute;

end;

 

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

1.4             ADOConnection组件

 

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

答案是:使用ADOConnection组件。

方法如下:

首先设置ADOConnection组件的ConnectionString属性,然后将ADOTableADOQueryADODataSetADOCommand等组件的Connection属性设置为ADOConnection1

 

56  利用ADOConnection组件实现共享连接

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

 

57  数据库登录对话框

 

54 利用Northwind数据库,创建如下的订单查询窗体。

 

 

 

58  订单查窗体

 

55 连接带口令的Access数据库。

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

 

59  以独占方式打开数据库

 

510  设置数据库密码

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

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

 

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

 

511  数据链接属性对话框

 

512  数据链接错误

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

 

方法如下:

 

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

 

Jet OLE DBDatabase Password

 

513  数据链接属性对话框

 

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

 

514  输入口令

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

 

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

 

1.5             存取Excel文件

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

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

 

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

方法一:

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

注意:只能用ADOTable构件,而无法使用ADODataSetADOQuery构件!

 

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

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

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

 

 

515  设置数据库驱动程序的扩展属性

 

 

516  编辑属性值

 

 

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

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

 

 

 

注意

 

 


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

 

 

方法二:

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

 

 

517  命名工作表数据区域

 

 

 

 

 

课外练习:

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

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

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

 

 

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

 

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

 

 

 

 

 

 

 

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