此代码有问题吗?
有时我会在其中得到一个未处理的“无效的事务对象”异常:
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的驱动程序。
答案 0 :(得分:4)
如果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;
答案 1 :(得分:3)
问题是如果SQLConnection未连接到数据库,则SQLConnection.BeginTransaction返回nil。然后我得到了无效事务对象的异常。
我没想到。它应该尝试连接或引发异常。返回零对我没有意义。
答案 2 :(得分:1)
有时候你用cxdbmemo这样的组件执行varius程序并给你带来错误。你必须删除该组件(或类似的东西)并使你的交易正常。
答案 3 :(得分:0)
SQLConnection.DBXConnection.BeginTransaction(TDBXIsolations.ReadCommitted);