2011-11-02 85 views
1

即時嘗試從多個數據庫表中刪除記錄。對於錯誤處理,我使用了一個try/catch塊,如下所示。如何在C#中使用語句進行錯誤處理

try 
{ 
    using (SqlCeConnection oConn = new SqlCeConnection(ConnectionString)) 
    { 
     oConn.Open(); 
     using (SqlCeTransaction transaction = oConn.BeginTransaction()) 
     { 
      //delete from multiple tables using ADO.NET 
      transaction.Commit(); 
     } 
    } 
} 
catch 
{ 
    //error handling 
} 

問題是當引發異常事務沒有回滾。在閱讀多個論壇時,我的結論是'使用'語句應該處理事務和連接。處置時,未提交的事務應該回滾。

有人可以告訴我我做錯了什麼。

+0

將'try-catch'塊移到''using'內使用' –

+0

@ L.B只要異常發生在提交行之前,這應該沒什麼區別。在表面上,代碼看起來很好,但它取決於SqlCe DLLs中的處理代碼是如何實現的,我只能假定它執行常識並回滾事務。 –

+0

我討厭聽起來很愚蠢,但是......你怎麼知道你的交易正在承諾,儘管從來沒有碰到交易。提交? – sq33G

回答

5

我的猜測是,你不是要設置的Transaction財產您SqlCeCommand(你不顯示)。

try 
{ 
    using (SqlCeConnection oConn = new SqlCeConnection(ConnectionString)) 
    { 
     oConn.Open(); 
     using (SqlCeCommand command = oConn.CreateCommand()) 
     { 
      using (SqlCeTransaction transaction = oConn.BeginTransaction()) 
      { 
       command.Transaction = transaction; 
       //delete from multiple tables using ADO.NET using command 
       transaction.Commit(); 
      } 
     } 

    } 
} 
catch 
{ 
    //error handling 
} 

SqlCeCommand不會自動登記在交易中,你必須明確地設置它。據我所知,TransactionDispose()應該回滾,但您可以自己撥打Rollback(),因爲其他人建議您確定一下。

1
try 
{ 
    using (SqlCeConnection oConn = new SqlCeConnection(ConnectionString)) 
    { 
    oConn.Open(); 

    using (SqlCeTransaction transaction = oConn.BeginTransaction()) 
    { 
     try 
     { 
      //delete from multiple tables using ADO.NET 
      transaction.Commit(); 
     } 
     catch 
     { 
      transaction.Rollback(); 
      throw; 
     } 
    } 
    } 
} 
catch (Exception e) 
{ 
    // do Exception handling here 
}
+0

+1 - 擊敗我吧 – ChrisBD

1

保證其安全可靠:

​​

我找不到一個直接的一塊,指出一個事務回滾默認文檔。

+0

+1 - 擊敗我吧 – ChrisBD

0

基本上你的try{...} catch{}塊是在錯誤的地方。它應該是using語句中,優選地圍繞transaction.Commit

+0

這不是在錯誤的地方。需要一個_extra_ try/catch。 –

相關問題