为什么有时我会遇到“无效的事务对象”异常?
问题描述:
这段代码有什么问题吗?
有时候,我在里面得到一个未处理的“无效的事务对象”异常:为什么有时我会遇到“无效的事务对象”异常?
procedure BlaBla;
var
TD: TDBXTransaction;
begin
TD := SQLConnection.BeginTransaction;
try
SQLConnection.ExecuteDirect('some sql command');
SQLConnection.ExecuteDirect('some sql command');
SQLConnection.CommitFreeAndNil(TD);
except
SQLConnection.RollbackFreeAndNil(TD);
end;
end;
此异常被提升到用户,所以我认为它是由RollbackFreeAndNil提出,因为所有剩下的就是try..except内。
我应该用另一个try..except包装RollbackFreeAndNil吗?真是一团糟。
我正在使用Delphi 2009,DBX与Firebird 2.1和Devart的驱动程序。
答
问题是,如果SQLConnection.BeginTransaction返回nil,如果SQLConnection没有连接到数据库。然后我得到无效事务对象的异常。
我从来没有料到过。它应该尝试连接或引发异常。返回零对我来说没有意义。
答
如果CommitFreeAndNil抛出异常会发生什么?
RollbackFreeAndNil将被调用。那么TD是否有效?
你正在吃例外,因此证据。不要那样做;重新抛出:
procedure BlaBla;
var
TD: TDBXTransaction;
begin
TD := SQLConnection.BeginTransaction;
try
SQLConnection.ExecuteDirect('some sql command');
SQLConnection.ExecuteDirect('some sql command');
except
SQLConnection.RollbackFreeAndNil(TD);
raise;
end;
SQLConnection.CommitFreeAndNil(TD);
end;
答
SQLConnection.DBXConnection.BeginTransaction(TDBXIsolations.ReadCommitted);
答
有些时候你会用像cxdbmemo这样的组件执行varius过程,并给你那个错误。你必须删除那个组件(或者像这样的东西)并且你的交易正常。
当重掷时,您可以使用新的内部异常功能,如CodeRage III上的Jim McKeeth所示。 – Vegar 2009-01-07 14:21:03