delphi7 dbexpress 事务管理特大问题?(100分)

  • 主题发起人 主题发起人 xhhero
  • 开始时间 开始时间
X

xhhero

Unregistered / Unconfirmed
GUEST, unregistred user!
function Tqiwaitest.jinhhoProviderDataRequest(Sender: TObject;
Input: OleVariant): OleVariant;
var
atd:ttransactiondesc;
li_e1,li_e2:integer;
begin

if (not self.SQLConnection1.InTransaction) then
begin
atd.TransactionID:=1;
atd.IsolationLevel:=xilreadcommitted;
self.SQLConnection1.StartTransaction(atd);
try
if not varisnull(input[1]) then
begin
self.jinhhodetailProvider.ApplyUpdates(input[1],0,li_e2);
// if li_e2>0 then
// sysutils.Abort;
end;

if not varisnull(input[0]) then
begin
self.jinhhoprovider.ApplyUpdates(Input[0], 0, li_e1);
/// if li_e1>0 then
// sysutils.Abort;
end;

if li_e1+li_e2= 0 then
begin
SQLConnection1.Commit(atd);
result:='保存成功';
end else
begin
self.SQLConnection1.Rollback(atd);
result:='保存失败';
end;
except
on E : Exceptiondo
begin
self.SQLConnection1.Rollback(atd);
Raise Exception.Create(E.Message);
end;
end;
end;
end;

其中如果有一个表更新失败,第二个表也能更新成功, self.SQLConnection1.Rollback(atd);
这个语句不起作用。还有这个确认语句SQLConnection1.Commit(atd);也不起作用。要不要都一样。
以个情况直接影响我用dbexpress 开发多层结构程序的信心????????
这里有谁用dbexpress开发多层结构程序成功事例?
 
atd.TransactionID:=1;

这个不能都用 1
李维那B人害人不浅.
 
请问,哪怎么写呀?
 
经试验在这里没有产生同一事务。所以 function Tqiwaitest.jinhhoProviderDataRequest(Sender: TObject;
Input: OleVariant): OleVariant;
请大家一同讨论!
 
ApplyUpdates的时候,其内部就会自动开始一个事务,你这是事务嵌套了。具体的代码,你可以查看Provider.TDataSetProvider.InternalApplyUpdates函数,在它内部会起一个事务。在成功的事务1中,它已经commit了,虽然事务2不成功,但整体却不能回退了。如果后台数据库支持嵌套事务,那结果可能会不一样。
李维的一本书中(Delphi.5.X.ADO.MTS.COM+高级程序设计篇),也提到了这个问题,并且修改了InternalApplyUpdates的源代码做为一个解决方案。不过,他针对的是MTS/COM+环境而言,因为该环境本身已经提供事务,所以ApplyUpdates时就不要再事务了。你可以参考,再针对自己的实际环境进行方案修改了。
 
现在我在服务端写一个方法,在客户端调用,提示这个方法不支持自动化事务,请问这个方法哪儿不对,十分感谢!! method 'set_applyupdates' not upporte by automation object
In Server 方法
procedure Tqiwaitest.Set_applyupdates(input: OleVariant);
var
atd:ttransactiondesc;
errorcnt:integer;
begin
if (not self.SQLConnection1.InTransaction) then
begin
atd.TransactionID:=1;
atd.IsolationLevel:=xilreadcommitted;
self.SQLConnection1.StartTransaction(atd);
try
self.jinhhodetailProvider.ApplyUpdates(input[1],0,errorcnt);
self.jinhhoprovider.ApplyUpdates(Input[0], 0, errorcnt);
SQLConnection1.commit(atd);
except
SQLConnection1.rollback(atd);
end;
end;
end;

client
qidata.DCOMConnection1.AppServer.set_applyupdates(qidata.jinghoClient.Delta, qidata.jinghodetailclient.delta);
 
应该是服务器端的组件需要实现IDispatch接口吧。
 
方法我是在类型庫中写的。
修正一下。以下代码是正确的。原因是self.SQLConnection1 这个问题。都是我修改程序没有注意。原来是用sqlconnecton1. 后来 用 from1.sqlconnextion1 .在这里没有修改成
from1.sqlconnextion1 。所以事务没有提交。害的我搞了一天。累死我了。搞程序难呀。太花时间了。
function Tqiwaitest.jinhhoProviderDataRequest(Sender: TObject;
Input: OleVariant): OleVariant;
var
atd:ttransactiondesc;
li_e1,li_e2:integer;
begin

if (not self.SQLConnection1.InTransaction) then
begin
atd.TransactionID:=1;
atd.IsolationLevel:=xilreadcommitted;
self.SQLConnection1.StartTransaction(atd);
try
if not varisnull(input[1]) then
begin
self.jinhhodetailProvider.ApplyUpdates(input[1],0,li_e2);
// if li_e2>0 then
// sysutils.Abort;
end;

if not varisnull(input[0]) then
begin
self.jinhhoprovider.ApplyUpdates(Input[0], 0, li_e1);
/// if li_e1>0 then
// sysutils.Abort;
end;

if li_e1+li_e2= 0 then
begin
SQLConnection1.Commit(atd);
result:='保存成功';
end else
begin
self.SQLConnection1.Rollback(atd);
result:='保存失败';
end;
except
on E : Exceptiondo
begin
self.SQLConnection1.Rollback(atd);
Raise Exception.Create(E.Message);
end;
end;
end;
end;
 
接受答案了.
 

Similar threads

后退
顶部