服务器

位置:IT落伍者 >> 服务器 >> 浏览文章

DELPHI基础教程:Delphi客户服务器应用开发(三)[3]


发布日期:2024年08月01日
 
DELPHI基础教程:Delphi客户服务器应用开发(三)[3]

GetDatabaseNames方法

声明procedure GetDatabaseNames(List: TStrings)

GetDatabaseNames方法清除List的内容并将所有BDE别名和应用程序定义的别名的名字写入List

GetDriverNames方法

声明procedure GetDriverNames(List: TStrings)

GetDriverNames方法清除List中的内容并将BDE当前安装的驱动程序名写入List

GetDriverParams方法

声明procedure GetDriverParams(const DriverName: String; List: TStrings)

GetDriverParams方法消除List中的内容并将名为DriveName驱动程序缺省参数写入List

GetTableNames方法

声明procedure GetTableNames(const DatabaseName Pattern: Strings;

Extensions SystemTable: Boolean; List: TStrings)

GetTableNames方法消除List中的内容并将名为DatabaseName的数据库中的所有表的名字写入ListPattern参数将限制表名对于SQL服务器将SystemeTables设为True将获取系统表和用户表对非SQL数据库将Extensions设为True将在表名中包含扩展名

处理Client/Server事务控制

使用隐式控制和显示控制的数据库应用中有两种方法管理事务控制

● 运用TDatabase部件的属性和方法进行显式控制

● 运用TQuery部件的传递式SQL控制事务

Delphi还支持Paradox和dBASE表的局部事务处理

事务控制概述

当用Delphi创建数据库应用时Delphi提供了用为所有数据库访问的事务控制

事务是这样一组操作在被提交前它们对一个或多个数据库的操作必须全部执行成功如果其中一个操作失败则所有操作失败即事务具有原子性

即使发生硬件失败事务也要保证数据库一致性当允许多用户并发访问时事务还要维持数据完整性

例如一个应用程序可能更新ORDERS表以指明接受购买某一项目的定单那么也要更新INNENTORY表以反映库存的减少如果在第一个更新之后第二个更新之前发生硬件错误数据库就会处于不一致状态因为库存情况没有反映定单情况在事务控制下两个表达式将在同一时间提交如果其中一个表达式失败则被返转(Rolled Back)

使用隐式控制

在缺省情况下Delphi通过BDE为应用程序提供隐式事务控制当应用程序处于隐式事务控制时Delphi为DataSet中的写每个记录进行隐式事务控制它提交每一个独立的写操作如Post和Append Record

使用隐式事务控制是容易的它保证最小的记录更新沖突和数据库的一致性视图另一方面因为写入数据库的数据的每一行都要进行事务控制 所以隐式事务控制将导致网络过忙和应用程序性能下降

如果采用显式事务控制就能选择最有效的时机来开始提交和终止事务特别是在开发多用户环境下的客户应用程序运行访问远程SQL服务器就更应该采用显式控制

使用显式事务控制

有两种协作又独立的方式可运用于Delphi数据库应用的事务控制

● 使用TDatabase部件的方法和属性

● 使用TQuery部件中的传递式SQL这种方式只有在Delphi Client/Server Suite版中才有效SQL Links将SQL表达式直接传给过程SQL或ODBC服务器

使用TDatabase部件的方法和属性的好处是提供了清晰的轻便的与特定数据库或服务器无关的应用能力

使用传递式SQL的主要好处在于可以运用特定服务器的先进事务管理能力

使用TDatabase的方法和属性

下表中列出了TDatabase部件中用于事务管理的方法和属性以及它们的使用方法

TDatabase用于事务显式控制的方法表

━━━━━━━━━━━━━━━━━━━━━━━━

方法或属性 作 用

────────────────────────

Commit 提交数据的修改并终止事务

Rollback 取消数据的修改并终止事务

StartTransaction 开始一个事务

TransIsolation 表述事务的独立性级别

━━━━━━━━━━━━━━━━━━━━━━━━

StartTransactionCommit和Rollback是供应用程序在运行时调用开始事务控制事务并且保存或放弃所做数据修改的方法

TransIsolation是TDatabase部件的用于控制作用于相同表的不同事务之间如何交互的属性

⑴ 开始一个事务

当你开始一个事务时后来的所有读写数据库的表达式都发生在那次事务的环境中每个表达式都是其中一部分任何表达式所做的修改要么成功地提交给数据库要么每一个修改都被取消考虑一个在ATM上的银行传输问题当顾客决定将钱从存款帐户转到支付帐户时在银行数据库记录上必须发生两个修改

● 存款帐户必须记入借方

● 支付帐户必须记入贷方

如果出于某种原因其中的一个操作不能被完成那么任何一个操作都不应该发生因为这些操作是相关的它们应该发生在同一个事务中

为了开始Delphi应用程序中的一个事务需要调用TDatabase部件中的StartTransaction方法

DatabaseInterBaseStartTransaction;

此后的所有数据操作都发生在最近一个事务的环境中直到该次事务通过调用Commit或Rollback显式地终止为止

那么应当将事务保持多久呢?理想状态下只要需要多久都行事务的活跃状态越长同时访问数据库的用户越多在你的事务的生命其中更多的并发同时的事务开始和终止于是当试图提交修改时与其它事务沖突的可能性更大

⑵ 提交一个事务

为了做永久性修改事务必须使用TDatabase部件的Commit方法提交执行提交表达式将保存数据库的修改并终止事务例如下列表达式将终止在上例中开始的事务

DatabaseInterBaseCommit

Commit的调用应当置于try…except表达式中如果一个事务不能成功提交你就能处理错误并重试操作

⑶ 返转一个事务

为了取消数据库修改必须用Rollback方法返转一个事务Rollback 复原一个事务的修改并终止事务例如下列表达式将返转一个事务

DatabaseInterBaseRollback;

Rollback通常发生在

● 异常处理代码

● 按钮或菜单事件代码如用户点按了Cancel按钮

⑷ 使用TransIsolation属性

TransIsolation属性描述TDatabase部件事务的独立级别事务的独立级别决定了事务与其它作用于相同表的事务是如何相互作用的在改变或设置TransIsolation 的值之前应当相当熟悉Delphi中的事务和事务管理

TransIsolation的缺省值是tiReadCommitted下表中总结了TransIsolation的可能值并描述了它们的含义

TransIsolation属性值的含义

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

独立级别 含 义

──────────────────────────────────────

tiDirtyRead 允许读由其它同时事务写入数据库的未提交的修改未提交的修改不是永久性的可能在任何时候被复原 在这个级别你的事务与其它事务所做的修改具有最低独立度

tiReadCommitted 只允许读由其它同时事务提交的数据库修改这是缺省的独立级别

iRepeatableRead 允许单个的数据库读事务无法看见其它同时事务对相同数据做的修改这个独立级别保证了你的事务一次读一个记录记录的视图不会改变 在这个级别你的事务与其它事务做的修改完全独立

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

各种数据库服务器不同程度地支持这些独立级别有的根本不支持 如果请求的隔离级别不被服务器支持Delphi将采用更高的独立级别各种服务器支持的独立级别请参见表

如果应用程序使用ODBC与服务器交互ODBC驱动程序必须支持独立级别

使用传递式SQL

为了能使用传递式SQL控制事物必须

● 使用Delphi Client/Server Suite

● 安装正确的SQL Links驱动程序

● 正确配置网络协议

● 访问远程服务器上数据库的能力

● 用BDE配置工具将SQLPASSTHROUGH MODE设置为NOT SHARED

通过传递式SQL你可以使用TQueryTStoredProc或TUpdateSQL部件直接发送一个SQL事务控制表达式给远程数据库服务器BDE本身并不处理SQL表达式采用传递式SQL可使用户直接获得SQL服务器提供了事务控制优点尤其是当那些控制是非标准的时

SQL PASS THROUGHMODE 描述BDE和传递式SQL是否共享相同的数据库联接在大多数情况下SQLPASSTHROUGHMODE被设置SHARED AUTOCOMMIT然而如果你想将SQL事务控制传递给服务器你就必须用BDE配置工具将BDE的SQLPASSTHROUGHMODE 设置为NOT SHARED此外还必须为传递SQL事务控制表达式的TQuery部件建立独立的TDatabase 部件

使用本地事务

BDE还支持Paradox和dBASE上的本地事务从代码角度而言在本地事务和远程数据库服务器的事务之间没有什么差别

当作用于本地数据库表的事务开始时更新操作被记录在日志中每个日志记录包含旧的记录缓沖区当事务处于活跃状态更新的记录被锁定直到事务被提交或返转在返转过程中旧的记录被应用于将更新的记录恢复到原先的状态

使用存储过程

TStoredProc部件概述

存储过程是以数据库服务器为基础的接受输入参数并将结果返回给应用程序的一段程序TStoredProc部件操作远程服务器上的数据库中的存储过程存储过程是一连串表达式的集合作为服务器的一部分存储存储过程在服务器上执行一系列重复性的与数据库相关的任务并将结果传给客户应用程序如Delphi数据库应用程序

TStaredProc部件使Delphi数据库应用程序能执行服务器上的存储过程

通常作用于数据库表中大量记录并且使用统计或数学函数的操作都是存储过程的首选对象通过将这些重复计算任务转移到服务器可以提高数据库应用程序的性能

● 充分利用服务器的处理能力和速度

● 减少网络传输的数量

例如考虑一个需要计算单个值的应用程序在大批记录中的标准差值如果在Delphi应用程序中执行这项功能就必须从服务器中得到所有在计算中用到的记录这必将导致网络拥塞因为应用程序所需的只是代表标准差的最终返回值因此由服务器上的存储过程来读数据执行计算和将值传给应用程序将更有效

[] [] [] []

               

上一篇:DELPHI基础教程:Delphi客户服务器应用开发(三)[4]

下一篇:DELPHI基础教程:Delphi客户服务器应用开发(三)[2]