multi-tier结构程序开发基础教程 (二.1)
作者:z33
| 这一节讲一下多层的事务处理,有些地方可能比较难理解,甚至根本就不明白,这没关系,只要多做几次,做的多些就会明白了,学delphi的这些东西不可能做一遍就会的,越是麻烦的东西越要多做几次才能记住。 |
一、什么是事务处理
据我理解(通过王晓敏同学的大力帮助,终于对事务处理有了一些理解,但不知道这个理解是否准确)
它就是在客户端上对服务器上的多个相互有关系的数据集同时发生多个相互有联系操作,当这些相关操作执行时,其中有一个操作失败,那么其它所有操作全部取消,数据集回滚到操作前的状态。所以这些操作就要做为一个事务来处理,去判断是否需要回滚。
比如主从表结构就是相关数据集,我们要删除主表数据必需要先删除从表的相关纪录,所以为它们的操作就需要用到事务处理。
二、
1.建一个新工程,并加入remote data module,remote data module的名字起一个有意义并且好记的。再放上datasetprovider,table,database这三个控件。对其属性进行设置:
database1.aliasname:=dbdemos ;
database1.databasename:=test ;
database1.handleshared:=true ; //可以让很多client共享数据库连接
database1.translsolation:=tidirtyread ; //因为paradox只支持dirtyread
database1.loginprompt:=false ; //不要login
database1.connected:=true ;
table1.databasename:=test ;
table1.tablename:=customer.db ;
table1.active:=true ;
datasetprovider1.dataset:=table1 ;
如图:

2.选view菜单中的type library项,打开type library编辑窗口。
点窗口的工具栏上面一个绿色箭头的铵钮,服务器对象栏上会多出一个结点,你可以输入一个名字,这里输入applydates,为服务器添加了一个applydates方法。
如图:

其中,attributes栏里的id设置为1,parameters栏里的name填custvar,type里选上variant,然后点一下上面的刷新铵钮,就可以把这个窗口关掉了。
如图:

这里说明一下,在parameters(参数)里设置的是服务器一个的接收变量的接口(interface),用来接收以后客户端传过来的一个事务,其中custvar是接收来的变量名,variant是变量类型。第三个是那个in,它是表示服务器的动作,我们这里只是in(接收变量),不out(返回变量)。
3.现在来编写服务器端的代码:
在代码区里找到刚才定义的方法过程的实现部分,就是这部分:
procedure tads.applydates(custvar: olevariant);
begin
end;
实现代码如下:
--------------------------
procedure tads.applydates(custvar: olevariant);
var
errcount:integer; //定义一个出错次数的整型变量。
begin
database1.starttransaction; //数据库开始事务。
try //这是异常处理,对应下面的except,如果有异常就执行except下面的指令。
if not varisnull(custvar) then //varisnull()是个函数,如果实参为空就返回true。
begin
//通过datasetprovider的的applyupadtes方法对其应用操作。
custvar:=datasetprovider1.applyupdates(custvar,0,errcount);
//如果出错次数大于0,就是有错误的话,中断事务。
if errcount > 0 then
sysutils.abort;
end;
database1.commit; //提交事务更新。
except
database1.rollback; //出错就会被回滚。
end;
end;
---------------------------
这样服务器端的设置就完成了。
今天因为看了部电影,所以没太多时间整理客户端的教程了,下一次写吧。
|
multi-tier结构程序开发基础教程 (二.1) |
下面我们做客户端
1.首先新建一个工程,并再填一个datamodule。在datamodule上放上dcomconnection,clientdataset,和datasource控件,各自属性设置如下:
|
控件名 |
属性 |
| dcomconnection1 | servername设为服务器名 connected:=true; loginprompt:=false; |
| clientdataset1 | remoteserver:=dcomconnect1 providername:=datasetprovider1 active:=true; |
| datasource1 | dataset:=clientdataset1 |