利用Delphi开发网络数据库应用

利用Delphi开发网络数据库应用,第1张

 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 DataModule DataBase InTransaction=true then DataModule DataBase RollBack; DataModule DataBase StartTransaction; 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; qName Close; {关闭查询} qName SQL Clear; {清SQL特性内容} qName SQL ADD(szSQL); {添加SQL内容} szSQL := SELECT FROM +szDBName; qName SQL ADD(szSQL); qName Open; {返回结果集} DataModule DataBase Commit; end; 以上过程包含五个参数 实现从页面中的一系列编辑框中读取数据 并向指定数据表输入的功能 其中 参数 qName 为页面中所使用的 TQuery 类构件的名称 参数 szDBName 是数据表的名称 参数eName 是 TEdit 类型的数组 列出了页面中包含数据的各编辑框名称 参数 iNum 是数据表中的字段个数 也即编辑框的个数 参数 iMark 是一个整数类型的数组 该参数表明相应字段是以何种方式输入的 如果是字符方式 需要在数据前后两端加上引号 需要注意的是 在调用本过程之前 应将数据库连接打开

DataModule DataBase Connected := true;

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

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

CREATE PROC ProcTest @inttest allint @strtest char( ) output AS INSERT INTO TEST_User TRANS_TEST VALUES(@inttest @strtest) SELECT @strtest FROM TEST_User TRANS_TEST 以上代码向数据表 TEST_User TRANS_TEST 添加数据 该数据表包括两个字段 第一个字段为 allint 类型的数据 参数类型定为 Input(在存储过程中可缺省) 第二个字段数据为长度为 的字符类型 参数类型为 Output

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

StoredProc Close; {关闭存储过程} StoredProc Params[ ] ParamType := ptInput; {设置存储过程的参数类型} StoredProc Params[ ] AsInteger := ; {设置存储过程中参数的数据} StoredProc Params[ ] ParamType := ptOutput; StoredProc Params[ ] AsString := abcd ; StoredProc Open; {打开存储过程} 其中 StoredProc 是 TStoredProc 类型的构件名称 Params[ ] 是存储过程中的第一个参数 对应存储过程 ProcTest 可以用ParamByName( @inttest )代替 存储过程的第二个参数与其类似

lishixinzhi/Article/program/Delphi/201311/25067

 现在网络的流行 使得服务器程序得到了广泛的应用 那么我们使用Delphi如何设计出强壮的服务器呢?

 有人说 如果要设计服务器的话 一定要使用VC来设计 其实这个人说的有一定道理 因为如果你要使用Delphi来设计服务器的话 要想设计高效的服务器就不要使用Delphi带来的大部分的控件(最好不要使用Delphi控件) 为什么呢?下面我会告诉大家 这样的话你全部使用API来设计服务器 就同VC没有太大的区别了

 使用Delphi来设计服务器程序 具体选择是使用窗体消息模式还是使用完成端口的模式 这主要看你的用户连接数量来决定 如果你的用户连接数量小于 人的话 并且处理的数据量不大的话 可以使用窗体的消息模式来进行服务器的开发 而如果大于 这样最好使用完成端口来开发服务器 我这里建议大家最好使用完成端口模式 因为你不可能保证你的用户数量不变化 同时由于你的服务器如果运行一段时间没有问题的话 最好做成WIN 的服务程序 这样可以保证后期的维护比较少

 现在介绍你在开发Delphi服务器的时候需要注意地方

  不要在程序中使用String变量

 这个也是在实际的开发过程中发现的 我最开始开发的时候 为了简单一些 就大量使用String变量来开发程序 但程序总是在运行一段时间后出现问题 后来查原因也不太清楚 到网上查资料 发现有人介绍不要使用String来做变量 将自己的程序全部修改成数组问题就基本解决了

  使用快速的加密算法如XOR 加密或DES加密等算法

 服务器在与客户端传递的时候一定要进行加密 但使用什么类型的加密算法呢?不要使用那种需要大量运算的算法如RSA等算法 最好使用XOR加密或DES换位加密算法 这样主要是满足普通的加密密文的要求 又保证服务器的运算速度 你也可以使用RSA加密密文 但这会造成服务器处理变慢 而如果遇到大量的处理时候 很容易服务器就拒绝服务器

  使用原ADO函数来连接数据库

 服务器程序通常都与数据库想结合 那么使用Delphi开发的时候 通常使用ADO的控件来制作 但如果你学习ADO手册会发现 对于服务器其实不需要控件来完成数据的操作 可以直接使用ADO相应的函数来完成 主要因为服务器程序与数据库通常都是比较简单的操作 没有很复杂的 所以使用原ADO模式就可以了 这样也减少由于ADO控件带来的问题

  应多使用 池

 服务器在设计的过程 一定要大量的变量支持 如果不使用池这个概念 你的程序将在创建和释放变量过程中浪费大量的时间 而且容易出现问题 设计过程中尽量不要创建和释放变量 如果能考虑到的变量 都在开始的运行的时候创建完毕 这样可以加快程序的运行速度 减少冲突 具体如何使用池这个技术 以后有时间再考虑写一篇介绍一下

  熟练使用指针操作

 如果你不熟悉指针操作 那么你几乎无法设计出高效的服务器 如果你要真正的理解指针的概念 对于设计服务器来说就是如虎添翼

 下面举个例子 如使用Recv接收数据到Buffer中后 你需要进行解密操作 你可以使用下面的方法进行

var  a b:array [ ] of byte;  i :integer;  ResultBuffer :array [ Max] of byte;begin  for i := to Sizeof(Buffer) div do  begin    move(Buffer[(i ) + ] a );    Des(a b true);  //这里使用DES加解密处理    move(b ResultBuffer[(i ) + ] );  end;end

lishixinzhi/Article/program/Delphi/201311/24703

  TSoredProc的关键属性

 ⑴ DatabaseName属性

 DatabaseName属性描述要访问的数据库的名字 该属性可以为

 ● 已定义的BDE别名

 ● 本地型数据库的目录

 ● Local InterBase服务器的目录路径和文件名

 ● TDatabase定义的应用程序别名

 在改变DatabaseName之前要使用Close方法将Dataset部件置为非活跃状态

 ⑵ StoredProcName属性

 StoredProcName属性表示服务器上的存储过程名 Oracle服务器允许多个具有相同名字的存储过程 因此要设置Overload属性来描述执行在Oracle服务器上的存储过程名

 ⑶ Overload属性

 Oracle服务器允许Oracle软件包中存储过程的重载 就是说具有相同名字的不同过程 设置Overload属性用来描述执行在Oracle服务器上的存储过程 如果Overload值为零 则假定没有重载 如果Overload为 则Delphi执行具有同名的第一个存储过程 如果值为 则执行第二个存储过程

 ⑷ Params属性

 Params属性包含传给存储过程的参数

  关键方法

 ⑴ ParamByName方法

 声明 function ParamByName(const Value: String) TParam;

 ParamByName方法返回Params属性中具有名为Value的元素值 一般用该方法在动态查询中给参数赋值

 ⑵ Prepare方法

 PrePare方法准备要执行的存储过程 这允许服务器载入存储过程 否则准备处理异常

 ⑶ ExecProc方法

 ExecProc方法执行服务器上的存储过程

 ⑷ Open方法

 Open方法打开DataSet部件 并将其置于浏览状态 这相当于将Active属性置为True 对于TStoredProc如果存储过程返回一个结果集 则使用Open执行存储过程 如果存储过程返回单行 早使用ExecProc执行存储过程

  TStoreProc使用方法

  建立一个StoredProc部件

 为数据库服务器上的存储过程建立一个TStoredProc部件的步骤如下

 ⑴ 从Component Palette的Data Access页选择TStoredProc部件放在数据模块上

 ⑵ 将TStoredProc部件的DatabaseName属性设置为存储过程所在的数据库名

 DatabaseName必须是BDE别名

 ⑶ 将TStoredProc部件的StoredProcName属性设为所用的存储过程名 或者从下拉式

 列表框中选择

 ⑷ 在TStoredProc部件的Params属性中描述输入参数 可以使用参数编辑器来设置输

 入参数 参数编辑器也可让用户察看存储过程返回给应用程序的值

  设置存储过程的输入参数 察看输出结果参数

 许多存储过程需要给它们传入一系列的输入参数 以确定处理什么和怎样处理 在Params属性中描述这些参数 所描述的输入参数的顺序是很重要的 它由服务器上的存储过程来确定 在设计时 最容易和最安全的方法是激活TStoredProc参数编辑器 编辑输入参数 参数编辑器以正确的次序列出输入参数 让你给它们赋值

 要激活TStoredProc的参数编辑器

 ① 选择TStoredProc部件

 ② 按鼠标右键激活加速菜单(Speed Menu)

 ③ 选择Define Parameters

 参数名列表框显示过程的所有输入 输出和结果参数 有关输入 输出参数的信息从服务器中获得 对于某些服务器而方 参数信息是不可访问的 如Sybase 在这种情况下 列表框是空的 因此必须自己按过程要求的顺序增加输入输出参数

 参数类型复选框中描述所选的参数是输入 输出 还是结果参数 如果服务器支持参数可以既是输入又是输出 如果在列表框中增添参数 就必须设置参数类型

 数据类型复选框 列出列表框中所选参数的数据类型 如果给列表框真善美参数 必须设置数据类型

 在值编辑框中给输入参数赋值

 如果服务器不传递存储过程信息给Delphi 则可以用Add按钮给存储过程增添参数 Delete按钮则是将增添的参数删除 Clear按钮将清除列表框中所有参数

 设置完参数后 选择OK按钮

  在运行时建立参数和参数值

 在运行时建立参数 可直接访问Params属性 Params属性是参数字符串的数组 例如 下列代码将编辑框的文本赋给数组的第一个字串

 StaredProc Params[ ] Asstring := Edit Text

 也能够用ParamsByName方法通过名字访问参数

 StoredProc ParamsByName( Company ) Asstring := Edit Text;

  准备和执行存储过程

 要使用存储过程还必须准备并执行它 可以有两种方式准备一个存储过程

 ● 在设计时 通过选择参数编辑器的OK按钮

 ● 在运行时 通过调用TStoredProc的Prepare方法

 例如 下面的代码准备存储过程的执行

 StoredProc Prepare;

 要执行准备好的存储过程 调用TStroedProc部件的ExecProc方法 下列代码演示了准备和执行存储过程

 StoredProc Params[ ] Asstring := Edit Text;

 StoredProc prepare;

 StoredProc ExecProc;

 当你执行一个存储过程 它返回输出参数或结果集 有两种可能的返回类型 单个返回 如单值或值集 和一群结果集 返回很多值

  访问输出参数和结果集

 存储过程在输出参数数组中返回值 如果服务器支持返回值可以是单个结果或者结果集

 在运行时访问存储过程的输出参数 可以索引Params属性或者用ParamByName方法访问这些值 下列表达式都用输出参数设置了编辑框的值

 Edit Text := StoredProc Params[ ] AsString;

 Edit Text := StoredProc ParamsByName( Contact ) AsString;

 如果存储过程返回结果集 则用标准数据相关控制访问和显示值会更有用

 在某些服务器上如Sybase 存储过程能象查询语句那样返回结果集 应用程序可以使用数据相关控制一显示这些存储过程的输出

 用数据相关控制显示存储过程返回结果的方法如下

 ① 将DataSource部件放在数据模块上

 ② 将DataSource部件的DataSet属性设置为接收数据的TStoredProc部件的名字

 ③ 将数据相关控制的DataSource属性设为DataSource部件的名字

 这样 当用于TStoredProc部件和Active属性为True时 数据相关控制就能显示从存储过程返回的结果

  返回目录 DELPHI基础教程

       编辑推荐

       Java程序设计培训视频教程

       J EE高级框架实战培训视频教程

 Visual C++音频/视频技术开发与实战

 Oracle索引技术

 ORACLE G数据库开发优化指南

 Java程序性能优化 让你的Java程序更快 更稳定

 C嵌入式编程设计模式

 Android游戏开发实践指南

lishixinzhi/Article/program/Delphi/201311/25132

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » 利用Delphi开发网络数据库应用

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情