Delphi 是具可视化界面的面向对象编程语言它以其功能强大简便易用等诸多特性深受编程人员的欢迎Delphi 中提供了数据库引擎 BDE(Borland Database Engine)并内含众多的数据库调用构件为编程人员开发客户/服务器应用程序提供了方便通常情况下利用 Delphi 开发数据库应用程序可以使用TTableTDataSourceTDBEditTDBNavigator等构件只要正确设置了构件的某些属性再编写必要的程序代码对一些特定事件进行处理就能够完成对多种数据库进行的数据处理例如记录的输入修改删除和查询等这样做虽然只需要编写极少量的程序代码就能达到很好的效果但如果在程序设计过程中某些数据表的结构发生了改变则必须修改与此数据表有关的所有构件的属性这将使程序员陷入繁琐的重复劳动中
为避免上述的麻烦我们可以在编写网络数据库应用程序时采用结构化查询语言 SQL(Structured Query Language)这样不仅可以更方便地与诸如 SQL ServerOracle 等各种后台数据库进行动态的数据交换而且可以使程序的修改和移植更加灵活我们以数据输入模块为例说明开发客户/服务器应用程序时如何采用 SQL 语句实现数据处理功能首先判断是否已经有事务处理程序在运行如果有将其回卷(rollback)如果没有则启动一个新的事务为数据的最终处理做准备其次是设置 SQL 语句并将其写入 TQuery 构件中最后将事务提交或回卷至此完成一条记录的数据输入
下面是以页面中的 TEdit 类型编辑框内容作为数据源向数据库输入记录的过程代码
procedure DataInsert(const qName:TQuery;
szDBName:string;iNum:Integer;
iMark:array of Integer;eName:array of TEdit);
var
i : Integer;
szSQL : string;
begin
if DataModuleDataBaseInTransaction=true then
DataModuleDataBaseRollBack;
DataModuleDataBaseStartTransaction;
szSQL := INSERT INTO +szDBName+ VALUES(
for i:= to iNum do
begin
if iMark[i]= then
szSQL := szSQL+eName[i]Text {非字符方式}
else
szSQL := szSQL++eName[i]Text+; {字符方式}
if i=iNum then
szSQL := szSQL+)
else
szSQL := szSQL+;
end;
qNameClose; {关闭查询}
qNameSQLClear; {清SQL特性内容}
qNameSQLADD(szSQL); {添加SQL内容}
szSQL := SELECT * FROM +szDBName;
qNameSQLADD(szSQL);
qNameOpen; {返回结果集}
DataModuleDataBaseCommit;
end;
以上过程包含五个参数实现从页面中的一系列编辑框中读取数据并向指定数据表输入的功能其中参数 qName 为页面中所使用的 TQuery 类构件的名称参数 szDBName 是数据表的名称参数eName 是 TEdit 类型的数组列出了页面中包含数据的各编辑框名称参数 iNum 是数据表中的字段个数也即编辑框的个数参数 iMark 是一个整数类型的数组该参数表明相应字段是以何种方式输入的如果是字符方式需要在数据前后两端加上引号需要注意的是在调用本过程之前应将数据库连接打开
DataModuleDataBaseConnected := true;
过程调用完成后将数据库连接断开
DataModuleDataBaseConnected := false;
另外开发网络数据库应用程序时还可以使用存储过程即将预先编译过的 SQL 语句存储在服务器上存储过程提前运行且不与程序代码一同存储和编译因此其对应主程序中的代码相对简洁运行速度也较快SQL 语句的集中存放使其修改更容易
要创建向数据表中输入数据的存储过程代码编写举例如下
CREATE PROC ProcTest
@inttest smallint
@strtest char() output
AS
INSERT INTO TEST_UserTRANS_TEST
VALUES(@inttest@strtest)
SELECT @strtest* FROM TEST_UserTRANS_TEST
以上代码向数据表 TEST_UserTRANS_TEST 添加数据该数据表包括两个字段第一个字段为 smallint 类型的数据参数类型定为 Input(在存储过程中可缺省)第二个字段数据为长度为 的字符类型参数类型为 Output
其模块程序的编写与 DataInsert 过程相似区别主要在于模块的中间部分对应的主要代码如下
StoredProcClose;
{关闭存储过程}
StoredProcParams[]ParamType := ptInput;
{设置存储过程的参数类型}
StoredProcParams[]AsInteger := ;
{设置存储过程中参数的数据}
StoredProcParams[]ParamType := ptOutput;
StoredProcParams[]AsString := abcd;
StoredProcOpen; {打开存储过程}
其中StoredProc 是 TStoredProc 类型的构件名称Params[] 是存储过程中的第一个参数对应存储过程 ProcTest 可以用ParamByName(@inttest)代替存储过程的第二个参数与其类似
实际上编写对网络数据库进行其他数据处理(如修改删除和查询等)的模块与数据的输入模块大体相似这里就不再赘述了