利用 Delphi 开发网络数据库应用 Delphi 是具可视化界面的面向对象编程语言,它以其功能强大、简便易用等诸多特性, 深受编程人员的欢迎。
Delphi 中提供了数据库引擎 BDE(Borland Database Engine),并内含 众多的数据库调用构件,为编程人员开发客户/服务器应用程序提供了方便。通常情况下, 利用 Delphi 开发数据库应用程序, 可以使用 TTable、 TDataSource、 TDBEdit、 TDBNavigator 等构件。 只要正确设置了构件的某些属性, 再编写必要的程序代码对一些特定事件进行处理, 就能够完成对多种数据库进行的数据处理,例如:记录的输入、修改、删除和查询等。这样 做虽然只需要编写极少量的程序代码就能达到很好的效果, 但如果在程序
设计过程中, 某些 数据表的结构发生了改变, 则必须修改与此数据表有关的所有构件的属性, 这将使程序员陷 入繁琐的重复劳动中。
为避免上述的麻烦,我们可以在编写网络数据库应用
程序时采用结构化查询语言 SQL(Structured Query Language), 这样不仅可以更方便地与诸如 SQL Server、 Oracle 等各种 后台数据库进行动态的数据交换, 而且可以使程序的修改和移植更加灵活。 我们以数据输入 模块为例,说明开发客户/服务器应用程序时如何采用 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 DataModule1.DataBase1.InTransaction=true then DataModule1.DataBase1.RollBack; DataModule1.DataBase1.StartTransaction; szSQL := ’INSERT INTO ’+szDBName+’ VALUES(’ for i:=0 to iNum-1 do begin if iMark[i]=0 then szSQL := szSQL+eName[i].Text {非字符方式} else szSQL := szSQL+’’+eName[i].Text+’’; {字符方式} ” ” if i=iNum-1 then szSQL := szSQL+’)’ else szSQL := szSQL+’,’; end; qName.Close; {关闭
查询}
qName.SQL.Clear; {清 SQL 特性内容} qName.SQL.ADD(szSQL); {添加 SQL 内容} szSQL := ’SELECT * FROM ’+szDBName; qName.SQL.ADD(szSQL); qName.Open; {返回结果集} DataModule1.DataBase1.Commit; end; 以上过程包含五个参数, 实现从页面中的一系列编辑框中读取数据, 并向指定数据表输 入的功能。其中,参数 qName 为页面中所使用的 TQuery 类构件的名称;参数 szDBName 是数据表的名称;参数 eName 是 TEdit 类型的数组,列出了
页面中包含数据的各编辑框名 称;参数 iNum 是数据表中的字段个数,也即编辑框的个数;参数 iMark 是一个整数类型 的数组,该参数表明相应字段是以何种方式输入的,如果是字符方式,需要在数据前后两端 加上引号。需要注意的是:在调用本过程之前,应将数据库连接打开: DataModule1.DataBase1.Connected := true;
过程调用完成后,将数据库连接断开: DataModule1.DataBase1.Connected := false; 另外, 开发
网络数据库应用程序时, 还可以使用存储过程, 将预先编译过的 SQL 语 即: 句存储在服务器上。存储过程提前运行,且不与程序代码一同存储和编译,因此其对应主程 序中的代码相对简洁,运行速度也较快。SQL 语句的集中存放,使其修改更容易。
要创建向数据表中输入数据的存储过程,代码编写举例如下: CREATE PROC ProcTest1 @inttest smallint ,@strtest char(4) output AS INSERT INTO TEST_User.TRANS_TEST VALU