2009-01-07 73 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過程,並給你那個錯誤。你必須刪除那個組件(或者像這樣的東西)並且你的交易正常。

相關問題