2016-01-23 74 views
0

我的方案是我創建了一個OleDbTransaction,稍後將提交或回滾。由於相應的OleDbConnection需要在事務生命週期中保持打開狀態,所以我想知道是否有某個外部事件(例如SQL Server崩潰或我的網絡連接斷開)會導致連接關閉?我知道我可以聽DbConnection.StateChange事件,但是如果唯一可以改變連接狀態的代碼是我自己的,那麼我不需要大驚小怪。謝謝。外部事件可以導致打開的DbConnection關閉嗎?

編輯:

下面是一些代碼添加額外的上下文的問題:

public class DBAccess { 
    private OleDbConnection cn = null; 
    private OleDbTransaction tn = null; 
    private const string cnString = "my connection string"; 

    public void UpdateField(string fieldName, object data, int key) { 
     if (tn == null) { 
      cn = new OleDbConnection(cnString); 
      cn.StateChange += Connection_StateChange; 
      tn = cn.BeginTransaction(); 
     } 

     OleDbCommand cmd = new OleDbCommand("UPDATE MYTABLE SET " + fieldname + "=" + data.ToString() + "WHERE TABLEKEY=" + key, cn, tn); 

     if (cmd.ExecuteNonQuery() != 1) { 
      throw new ApplicationException(); 
     } 
    } 

    public void Commit() { 
     if (tn != null) { 
      tn.Commit(); 
      cn.Close(); 
      tn = null; 
     } 
    } 

    public void Rollback() { 
     if (tn != null) { 
      tn.Rollback(); 
      cn.Close(); 
      tn = null; 
     } 
    } 

    private void Connection_StateChange(object sender, StateChangeEventArgs e) { 
     // can anything other than my code calling cn.Close() get me here? 
} 

在我的應用程序,用戶可以在一段做一些修改不同領域中的表時間......每個人都會單獨致電UpdateField()。當他們準備保存更改時,他們會按保存按鈕,代碼會調用我的班級的Commit()方法...還會有一個放棄更改按鈕,可以調用我的班級的Rollback()方法。所以,連接和交易需要在一段時間內保持開放。在那段時間內,連接到數據庫的事情可能會發生,導致提交或回滾失敗。如果註冊StateChange事件意味着我立即得到通知,數據庫現在無法訪問,那麼我可以對此做一些事情。否則,我必須在提交/回滾時處理它。再次,謝謝。

回答

0

我希望我能正確理解你的問題。通常,您打開連接,提交交易,然後檢查是否有行受到影響。如果0行回來,那麼你知道沒有行被提交,你可以再試一次,或者...而且,如果你把所有的東西包裝在「try> catch」中,那麼你可以進一步發現錯誤。

如果你打開一個連接然後連接被關閉(出於某種外部原因),那麼你嘗試提交該命令,將會拋出一個錯誤,你可以捕獲該錯誤。

如果發生錯誤,「try> catch」將捕獲錯誤,如果您的更改已提交,「int result ...」將顯示您。

https://msdn.microsoft.com/en-us/library/system.data.oledb.oledbcommand.executenonquery(v=vs.110).aspx

喜歡的東西:

try 
{ 
    //.... 
    int result = myOleDBCommand.ExecuteNonQuery(); 
    if (result <= 0) { /*the command executed but, nothing changed on the datasource so you can decide what to do here*/ } 
} 
catch (Exception ex) 
{ 
    //if you get here then a problem has occurred and you can choose how to deal with it. 
} 
+0

編輯我的職位,以提供額外的上下文。 –

+1

因此,我仍然不確定工作流以及爲什麼將所有對象更改打包爲一個提交(或者,如果不應將更改提交給數據庫,則不提交),但......假設您的類具有屬性還有一種保存方法,那麼爲什麼不抓取原始類的副本並將其放到一邊。然後你的用戶可以進行更改並繼續保存正在工作的類(推測可以創建更新語句?)。如果您想要回滾,只需保存一份您已坐在旁邊的課程副本。 – beeker

+0

作爲一個原則,我不喜歡爲現有代碼可以完成的事情編寫代碼,而且當我第一次啓動這個事務處理機制時,由於它已經存在,所以對我很有吸引力。話雖如此,我認爲你更簡單的方法的好處超過了代碼混亂的代價。仍然對我原來的問題感到好奇,但這會起作用。感謝您的建議。 –

相關問題