本节要展示的范例是让TSQLDataSet和TSQLQuery执行与2.2.1节一样的功能,只是本节的范例能够一次执行数个SQL语句,而无需一次执行一个SQL语句。
步骤1 建立数据模块和dbExpress控件
在Delphi集成开发环境中点击File|New|VCL Forms Application,再点击File|New|Other…菜单,选择建立Data Module图像,以建立一个数据模块。接着在此数据模块中加入TSQLConnection控件,连接到范例数据库D2006HDBP,加入TSimpleDataSet控件,设定它的DataSet\CommandText属性值为select * from MYESSAYS。加入TSQLDataSet控件和一个TSQLQuery控件,如图2-35所示。当然,这些控件都需要设定连接到数据模块中的TSQLConnection控件。

图2-35 范例应用程序的数据模块
本范例要执行的SQL Script如下:
CREATE TABLE MYESSAYS (
EID INTEGER NOT NULL,
ETITLE VARCHAR(60),
MAGAZINE VARCHAR(60),
PDATE DATE,
CONTENTS BLOB sub_type 0 segment size 80,
NOTES VARCHAR(100));
INSERT INTO
MYESSAYS (EID, ETITLE, MAGAZINE, PDATE, NOTES) VALUES (1, '2001
年软件巨星-Kylix', 'RUN!PC 2001/3', '03/05/2001', NULL);
INSERT INTO
MYESSAYS (EID, ETITLE, MAGAZINE, PDATE, NOTES) VALUES (2, 'Windows
原生开发工具的瑰宝-Delphi 7', 'RUN!PC 2001/6', '05/05/2001 ', NULL);
INSERT INTO
MYESSAYS (EID, ETITLE, MAGAZINE, PDATE, NOTES) VALUES (3, 'So much
fun, So many possibilities', 'RUN!PC 2001/7', '06/05/2001', NULL);
INSERT INTO
MYESSAYS (EID, ETITLE, MAGAZINE, PDATE, NOTES) VALUES (4, '肥皂的
战争与和平', 'RUN!PC 2001/8', '07/05/2001 00:00:00', NULL);
INSERT INTO
MYESSAYS (EID, ETITLE, MAGAZINE, PDATE, NOTES) VALUES (5, '.NET
的SOAP', 'RUN!PC 2001/9', '08/05/2001', NULL);
INSERT INTO
MYESSAYS (EID, ETITLE, MAGAZINE, PDATE, NOTES) VALUES (990, '我的
回忆和有趣的故事', 'Programmer 深度论坛', '03/01/2001', NULL);
INSERT INTO
MYESSAYS (EID, ETITLE, MAGAZINE, PDATE, NOTES) VALUES (991, '我的
回忆和有趣的故事续之一', 'Programmer 深度论坛', '04/01/2001', NULL);
ALTER TABLE MYESSAYS ADD PRIMARY KEY (EID);
CREATE INDEX MYESSAYS_IDX1 ON MYESSAYS (ETITLE);
CREATE INDEX MYESSAYS_IDX2 ON MYESSAYS (PDATE);
这个SQL Script会建立MyEssays数据表、新增数笔数据,再建立主键值以及数个索引对象。
步骤2 建立主窗体
回到范例应用程序的主窗体。在主窗体中加入一个TMemo控件以显示要执行的SQL Script。放入TDataSource连接到数据模块中的TSimpleDataSet控件,放入TDBNavigator和TDBGrid并且连接到TDataSource。放入一个TOpenDialog控件以便打开SQL Script文件。最后放入两个TButton控件,一个加载SQL Script文件,而另外一个则负责运行加载的SQL Script。这个范例应用程序的主窗体如图2-36所示。

图2-36 范例应用程序的主窗体
现在我们就可以开始实现这个范例应用程序了。
步骤3 加入实现程序代码
首先双击主窗体中【加载Script】按钮,在它的OnClick事件处理函数中使用TOpenDialog控件加载SQL Script文件,并且把Script的内容显示在TMemo之中:
procedure TForm1.bbtnLoadScriptClick(Sender: TObject);
begin
if (odlgScript.Execute) then
mmScript.Lines.LoadFromFile(odlgScript.FileName);
end;
接着双击【运行Script】按钮,在它的OnClick事件处理函数中撰写如下的程序代码:
procedure TForm1.bbtnRunScriptClick(Sender: TObject);
const
sTAG = ';';
var
sScript : String;
sSQL : String;
iPos : Integer;
begin
sScript := Trim(mmScript.Lines.Text);
while True do
begin
iPos := Pos(sTAG, sScript);
if (iPos > 0) then
begin
sSQL := Copy(sScript, 1, iPos - 1);
RunScript(sSQL);
Delete(sScript, 1, iPos);
end;
if (Length(sScript) = 0) then
break;
end;
dmRunScript.scdsMyEssays.Active := True;
end;
procedure TForm1.RunScript(const sSQL: String);
begin
{
dmRunScript.sdsScript.CommandText := sSQL;
dmRunScript.sdsScript.ExecSQL(True);
}
dmRunScript.sqlqScript.SQL.Text := sSQL;
dmRunScript.sqlqScript.ExecSQL(True);
end;
上面的程序代码首先从TMemo中取得SQL Script,然后使用Pos从SQL Script中一一地取得每一个SQL语句,再调用RunScript来执行这个SQL语句。在RunScript方法中,可以使用TSQLDataSet或是TSQLQuery控件来执行传入的SQL语句。请注意,在RunScript方法中调用TSQLDataSet或是TSQLQuery控件的ExecSQL方法时,传入了True作为参数。这代表我们要TSQLDataSet或是TSQLQuery控件直接执行SQL语句而不要先准备SQL语句再执行,因为对于SQL Script的应用来说,通常在SQL Script中的SQL语句只会执行一次,因此不需要先行准备SQL语句,这样可以增加效率。
当所有的SQL Script执行完毕之后,再调用数据模块中TSimpleDataSet的Refresh方法重新从MyEssays数据表中取得所有的数据,以显示在主窗体的TDBGrid之中。
步骤4 执行范例应用程序
现在可以编译和执行这个范例应用程序了,图2-37显示了范例应用程序加载一个SQL Script文件,动态建立MyEssays数据表,再新增数笔数据,最后建立主键值和索引对象。图2-38使用数据库管理工具也证明了这个范例应用程序果然成功地在数据库中建立了各种数据库对象。

图2-37 执行范例应用程序的画面
本节讨论了如何使用TSQLDataSet以及TSQLQuery控件的方法。虽然这两个控件都无法让用户变更它们存取的数据,但它们可以搭配TSimpleDataSet控件让开发人员一起开发数据库应用程序。对于一些执行DDL的应用或是新增、更新和删除大量数据的情形时,使用TSQLDataSet和TSQLQuery控件比使用TSimpleDataSet是来得适当的。在应用系统有这种需求时,开发人员便可以使用这两个控件来帮助TSimpleDataSet控件不足的地方。


图2-38 范例应用程序建立了数据表以及索引对象






