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