第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 查询某个出生日期的学生记录
方法一:使用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 所要插入的记录
先在窗体上放置一个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‑4 利用Northwind数据库,创建如下的订单查询窗体。
图 5‑8 订单查窗体
例 5‑5 连接带口令的Access数据库。
Access数据库以独占方式打开(见图 5‑9)后,可以设置口令加以保护,见图 5‑15。
图 5‑10 设置数据库密码
设置口令后,再次打开数据库时就需要输入口令,如果口令不正确则无法打开,这样可以起到一定的保护作用。(如果要更好的保护,则需要建立工作组信息文件,设置工作组保护)
对于加了口令的数据库,如何用ADOConnection组件来连接呢?
当我们在“数据链接属性”对话框中选择数据库驱动程序,然后选择所要连接的Access数据库后,测试连接时,就会出现图 5‑12所示的错误。
图 5‑11 数据链接属性对话框
原因就是没有提供正确的口令。那么如何提供口令呢?
方法如下:
单击“数据链接属性”对话框中的“所有”选项卡(见图 5‑13),选择:
Jet OLE DB:Database Password
然后单击左下方的“编辑值(E)…”命令按钮,打开图 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‑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数据库创建如下查询窗体:
当选择某公司时,查询并显示该公司所订购的全部产品及货款合计。