美章网 资料文库 Delphi开发网络数据库应用范文

Delphi开发网络数据库应用范文

Delphi开发网络数据库应用

Delphi是具可视化界面的面向对象编程语言,它以其功能强大、简便易用等诸多特性,深受编程人员的欢迎。Delphi中提供了数据库引擎BDE(BorlandDatabaseEngine),并内含众多的数据库调用构件,为编程人员开发客户/服务器应用程序提供了方便。通常情况下,利用Delphi开发数据库应用程序,可以使用Tbr、TDataSource、TDBEdit、TDBNavigator等构件。只要正确设置了构件的某些属性,再编写必要的程序代码对一些特定事件进行处理,就能够完成对多种数据库进行的数据处理,例如:记录的输入、修改、删除和查询等。这样做虽然只需要编写极少量的程序代码就能达到很好的效果,但如果在程序设计过程中,某些数据表的结构发生了改变,则必须修改与此数据表有关的所有构件的属性,这将使程序员陷入繁琐的重复劳动中。

为避免上述的麻烦,我们可以在编写网络数据库应用程序时采用结构化查询语言SQL(StructuredQueryLanguage),这样不仅可以更方便地与诸如SQLServer、Oracle等各种后台数据库进行动态的数据交换,而且可以使程序的修改和移植更加灵活。我们以数据输入模块为例,说明开发客户/服务器应用程序时如何采用SQL语句实现数据处理功能。首先,判断是否已经有事务处理程序在运行,如果有,将其回卷(rollback);如果没有,则启动一个新的事务,为数据的最终处理做准备。其次,是设置SQL语句,并将其写入TQuery构件中。最后,将事务提交或回卷,至此完成一条记录的数据输入。

下面是以页面中的TEdit类型编辑框内容作为数据源,向数据库输入记录的过程代码:

procedureDataInsert(constqName:TQuery;

szDBName:string;iNum:Integer;

iMark:arrayofInteger;eName:arrayofTEdit);

var

i:Integer;

szSQL:string;

begin

ifDataModule1.DataBase1.InTransaction=truethen

DataModule1.DataBase1.RollBack;

DataModule1.DataBase1.StartTransaction;

szSQL:=''''INSERTINTO''''+szDBName+''''VALUES(''''

fori:=0toiNum-1do

begin

ifiMark[i]=0then

szSQL:=szSQL+eName[i].Text{非字符方式}

else

szSQL:=szSQL+''''"''''+eName[i].Text+''''"'''';{字符方式}

ifi=iNum-1then

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;{返回结果集}

mit;

end;

以上过程包含五个参数,实现从页面中的一系列编辑框中读取数据,并向指定数据表输入的功能。其中,参数qName为页面中所使用的TQuery类构件的名称;参数szDBName是数据表的名称;参数eName是TEdit类型的数组,列出了页面中包含数据的各编辑框名称;参数iNum是数据表中的字段个数,也即编辑框的个数;参数iMark是一个整数类型的数组,该参数表明相应字段是以何种方式输入的,如果是字符方式,需要在数据前后两端加上引号。需要注意的是:在调用本过程之前,应将数据库连接打开:

DataModule1.DataBase1.Connected:=true;

过程调用完成后,将数据库连接断开:

DataModule1.DataBase1.Connected:=false;

另外,开发网络数据库应用程序时,还可以使用存储过程,即:将预先编译过的SQL语句存储在服务器上。存储过程提前运行,且不与程序代码一同存储和编译,因此其对应主程序中的代码相对简洁,运行速度也较快。SQL语句的集中存放,使其修改更容易。

要创建向数据表中输入数据的存储过程,代码编写举例如下:

CREATEPROCProcTest1

@inttestsmallint

,@strtestchar(4)output

AS

INSERTINTOTEST_User.TRANS_TEST

VALUES(@inttest,@strtest)

SELECT@strtest,*FROMTEST_User.TRANS_TEST

以上代码向数据表TEST_User.TRANS_TEST添加数据,该数据表包括两个字段:第一个字段为smallint类型的数据,参数类型定为Input(在存储过程中可缺省);第二个字段数据为长度为4的字符类型,参数类型为Output。

其模块程序的编写与DataInsert过程相似,区别主要在于模块的中间部分,对应的主要代码如下:

StoredProc1.Close;

{关闭存储过程}

StoredProc1.Params[1].ParamType:=ptInput;

{设置存储过程的参数类型}

StoredProc1.Params[1].AsInteger:=1;

{设置存储过程中参数的数据}

StoredProc1.Params[2].ParamType:=ptOutput;

StoredProc1.Params[2].AsString:=''''abcd'''';

StoredProc1.Open;{打开存储过程}

其中,StoredProc1是TStoredProc类型的构件名称;Params[1]是存储过程中的第一个参数,对应存储过程ProcTest1可以用ParamByName(''''@inttest'''')代替;存储过程的第二个参数与其类似。

实际上,编写对网络数据库进行其他数据处理(如:修改、删除和查询等)的模块,与数据的输入模块大体相似,这里就不再赘述了。