我的方案是我創建了一個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
事件意味着我立即得到通知,數據庫現在無法訪問,那麼我可以對此做一些事情。否則,我必須在提交/回滾時處理它。再次,謝謝。
編輯我的職位,以提供額外的上下文。 –
因此,我仍然不確定工作流以及爲什麼將所有對象更改打包爲一個提交(或者,如果不應將更改提交給數據庫,則不提交),但......假設您的類具有屬性還有一種保存方法,那麼爲什麼不抓取原始類的副本並將其放到一邊。然後你的用戶可以進行更改並繼續保存正在工作的類(推測可以創建更新語句?)。如果您想要回滾,只需保存一份您已坐在旁邊的課程副本。 – beeker
作爲一個原則,我不喜歡爲現有代碼可以完成的事情編寫代碼,而且當我第一次啓動這個事務處理機制時,由於它已經存在,所以對我很有吸引力。話雖如此,我認爲你更簡單的方法的好處超過了代碼混亂的代價。仍然對我原來的問題感到好奇,但這會起作用。感謝您的建議。 –