[返回]
中国计算机报1999年第71期
徐 航
随着Internet/Intranet的日益普及以及电子商务的推广,传统的开发数据库应用的体系结构正逐步从C/S结构向多层体系结构转移。在这个转移过程中,并不是将原C/S结构中的数据访问链路部分放到应用服务器中,再加入TDataSetProvider或TProvider构件那么简单。
要清楚说明向多层体系结构转移的问题,应首先了解中间层和客户层之间的工作机制:
1.用户启动客户程序,客户程序在后台激活并连接到应用服务器,并从中获得IProvider接口。
2.客户程序通过接口请求数据,应用服务器收到客户程序请求后,就从远程数据库服务器中检索数据,并打包返回给客户程序。
3.客户程序解包,然后显示或进行处理。
4.用户对数据进行编辑修改,然后向应用服务器提请更新。
5.应用服务器收到客户程序的申请后,向远程数据库服务器更新数据。
在前面几步引入数据时,Delphi是通过应用服务器上的TTable或TQuery构件完成的,而在申请更新时却绕过应用服务器上的TTable或TQuery构件,直接以SQLUpdate、Insert或Delete语句将数据写到远程服务器中。
通过对商业规则实现的目标重新分析,可以运用以下三种方法实现多层体系结构中的商业规则。
1.更新数据库前编辑Delta数据包。
Delta数据包保存着客户机内存中数据发生改变的记录。当应用服务器端调用ApplyUpdates方法向远程数据库服务器申请更新数据时,将触发OnUpdateData事件。这样应用服务器就有机会实施商业规则。例如在数据录入应用中,数据提交时自动添加当前系统操作人员姓名和操作时间,就可以这样处理:
Procedure TServer.Provider1UpdateData(Sender:TObject;Data:TClientDataSet);
Begin
With DataSet Do
Begin
First;
While Not Eof Do
Begin
Edit;
If UpdateStatus=usInserted Then FieldByName('LRR').AsString:=Flrr;
FieldByName('CZSJ').AsDateTime:ΚDate;
Post;
End;
Next;
End;
End;
2.单条记录更新之前编辑Delta数据包。
在退出OnUpdateData事件后,TDataSetProvider或TProvider构件就会把数据更新到远程服务器上。每一条记录被更新前将触发BeforeUpdateRecord事件,这样就有最后一次修改数据的机会。例如对Id类字段自动赋值的规则,需要判断当前数据库后台中有没有重复的编号存在,防止发生主键冲突。具体用例请参考更新数据库之前编辑Delta数据包中的用例。
3.添加接口方法实现商业规则。
有些商业规则是以上方法无法实现的,例如对商品入库单的审核。按照业务规则,入库单审核后必须同时更新商品库存台账,操作涉及两个表,需要纳入事物处理之中。对于这种规则,就要采用添加接口中的方法来实现。
新方法可使用类型库编辑器生成,具体操作方法是在DelphiIDE中,执行View
TypeLibrary,打开类型库编辑器界面,选择当前使用的接口,按Method快捷键添加新方法,在参数页定义接口方法的参数类型,然后刷新类型库。
在远程数据模块的实现单元,找到新方法的代码段,完成其中的商业规则,如果应用服务器上有TDataBase构件,则可以完成以下事务控制:
DataBase1.TransactStart;
try
...
DataBase1.Commit;
Except
DataBase1.RollBack;
End;
如果没有TDataBase构件,那就只能使用SQL的Commit、RollBack。
最后还需要注意,在多层体系结构中,有些在C/S体系下由后台处理的方式要提到客户程序中来实现。例如发票信息分别存储在发票主表和商品明细从表中,发票主表中的总开票金额是由商品明细从表中各记录的金额在提交后由数据库触发器自动进行累加完成。在多层体系结构中,这种累计求和工作将由TClientDataSet的OnAfterPost事件完成。