COM+中间层的多表更新这么写怎么事务不能实现?代码见内(50分)

  • 主题发起人 主题发起人 gzssqx
  • 开始时间 开始时间
G

gzssqx

Unregistered / Unconfirmed
GUEST, unregistred user!
try
if not DM.sc.Connected then
DM.sc.Connected := True;
Obj := IDBAccessObjDisp(IDispatch(DM.sc.AppServer));
Obj.UpdateData(avData1, aiMaxError, aiErrorCount);
Obj.UpdateData(avData2, aiMaxError, aiErrorCount);
SetComplete;
except
SetAbort;
end;

其中avData1更新不成功,但系统将我的avData2更新进了数据库,请问应该怎么写?
上面代码在中间层更新协调对象中,avData1、avData2是客户端传入的数据包,该层事务为需要,rdm为支持
 
怎没人回复呢?
 
老兄,SetComplete和SetAbort怎么能在客户端调用呢?这样肯定是不行的。要保证事务,就在服务器端声明一个专门保存的接口方法,例如:
procedure UpdateMyData(var AData1, AData2: OleVariant;
var AMaxError, AErrorCount: Integer);
begin
try
DataSetProvider1.Data := AData1;
DataSetProvider1.ApplyUpdate(AMaxError, AErrorCount);
DataSetProvider2.Data := AData2;
DataSetProvider2.ApplyUpdate(AMaxError, AErrorCount);

SetComplete;
except
SetAbort;
end;

end;

然后客户端调用这个接口方法报存才行;
 
junior99介绍的方法很对,
你可以在客户端将几个表的DeltaData发给中间层,在中间层中启动事务,就可以了。
 
junior99:我上面写的测试代码是在中间层协调更新对象中写的,不是在客户端。
Obj.UpdateData(avData1, aiMaxError, aiErrorCount);
Obj.UpdateData(avData2, aiMaxError, aiErrorCount);
是中间层协调对象调用远程数据模块中的UpdateData方法,其avData1/2是客户端传入的,中间层协调对象只是转交给远程数据模块。
另外远程数据模块中只有一个公用的DataSetProvider

 
哪位能给我发个范例吗?
我的邮箱是:gzssqx@hotmail.com
非常感谢!!!!!!!!!!!!!!!!!!
 
下面的例子是使用DCOM实现事务处理的,MTS和这个应该差不多。
客户端
procedure TForm3.Button1Click(Sender: TObject);
var
ExecSucceed:boolean;
begin
if (ClientDataSet1.ChangeCount>0) and (ClientDataSet2.ChangeCount>0) then
begin
ExecSucceed:=DCOMConnection1.AppServer.TransCommit(ClientDataSet2.Delta,ClientDataSet2.Delta , Delta2);
if ExecSucceed then
ShowMessage('ok')
else
ShowMessage('error');
end;
end;

中间层
function TTransCom.TransCommit(Delta1, Delta2: OleVariant): OleVariant;
var
ErrorCount:integer;
begin
try
ADOConnection1.begin
Trans ;
DataSetProvider1.ApplyUpdates(Delta1,0,ErrorCount);
if ErrorCount>0 then
raise Exception.Create('error during Update Delta1');
DataSetProvider2.ApplyUpdates(Delta2,0,ErrorCount);
if ErrorCount>0 then
raise Exception.Create('error during Update Delta2');
ADOConnection1.CommitTrans ;
Result:=True;
except
ADOConnection1.RollbackTrans ;
Result:=False;
end;
end;
 
请两位兄弟在关注一下
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2013967
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部