2009-01-07 72 views
1

这段代码有什么问题吗?
有时候,我在里面得到一个未处理的“无效的事务对象”异常:为什么有时我会遇到“无效的事务对象”异常?

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.BeginTransaction返回nil,如果SQLConnection没有连接到数据库。然后我得到无效事务对象的异常。

我从来没有料到过。它应该尝试连接或引发异常。返回零对我来说没有意义。

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; 
+0

当重掷时,您可以使用新的内部异常功能,如CodeRage III上的Jim McKeeth所示。 – Vegar 2009-01-07 14:21:03

0
SQLConnection.DBXConnection.BeginTransaction(TDBXIsolations.ReadCommitted); 
1

有些时候你会用像cxdbmemo这样的组件执行varius过程,并给你那个错误。你必须删除那个组件(或者像这样的东西)并且你的交易正常。

相关问题