2012-06-07 153 views
0

爲了提供恢復在數據庫表中發生的更改的能力,我已經在大量更改之前創建了DataTable的Clone() 。在決定取消更改之前,用戶有能力瀏覽多種表單。在過程結束時,如果他們選擇取消,我想將Clone()的數據更新回數據庫。 我不知道這是否有道理刪除已添加的行,然後添加回原來的clone()'d行,或者更新計劃要更新的行? 看來,如果我要更新原始行,我必須循環才能將行從克隆複製到原始行?還是有另一種方式?使用DataTable.Clone()保存並恢復對數據庫的更改

// Clone the original data 
cloneDataTable = origDataTable.Clone(); 
cloneDataTable.ImportRow(dataRow); 

// Later in the process, if I need to delete the row 
dataRow.Delete(); 
tableAdapter.Update(dataRow); 

// I was considering that I could add the cloned row back in this fashion 
origDataTable.ImportRow(cloneDataTable.Rows[0]); 
tableAdapter.Update(dataRow); 

我可能混淆了問題,但我基本上是在尋找一系列插入後恢復原來的clone()'d的數據到數據庫的簡單和有效的方法/更新已經完成。
理想我想,因爲數據庫插入導致了一個序列值遞增,我想避免執行更新。

感謝您的幫助,並在必要時請向任何澄清。

回答

0

用於實現撤消/取消功能,就如同這是爲了讓所有的事務範圍內對數據庫的直接變化(假設你選擇的數據庫支持事務處理),然後提交或回滾您最好的選擇基於您的用戶是否希望將其更改永久化而進行交易。

實現使用數據表中的卷制自己的撤銷機制是不是一個好方法。

+0

設計就像它一樣。每個表單都會在整個過程中提交更改,所以我沒有選擇。 – McArthey

+0

你仍然有選擇。即使您在不同時間和不同形式下對數據庫進行了更改,仍可以在單個事務的範圍內進行所有這些更改(不能將'use'塊語法與'ElVieejo'一起使用,但是這只是一個小小的方便,你要做的事情就是*準確地說*要使用什麼事務;我覺得有必要重新強調一下,使用DataTables滾動你自己的機制是不行的一個好主意,你扔掉15分鐘的工作(以便使用交易)... – MusiGenesis

+0

...所以你可以花費更多的時間讓這個DataTable方法不能很好地工作 – MusiGenesis

0

使用事務,進行更改,並完成交易,如果作品

using(TransactionScope ts = new TransactionScope()) 
{ 
//updates, inserts, etc 
ts.Complete(); 
} 

如有異常或錯誤發生的交易將回滾TransactionScope的

的所有內部

這一點,如果你使用SQL Server 對不起英文不好!

+0

The更新發生在一組表單和類和帖子等等上,我實際上不能用這種結構來包裝它。 – McArthey

+1

有什麼關於內存中的數據表,以及在最終的使用情況下進行插入和更新?你必須 使用一個事務,然後進行所有的插入,更新等。 你問一個有效的方法,並修改數據庫,然後再次修改「回滾」是根本沒有效率的,對於許多事情,如創建連接,做每個操作兩次(做和回滾)..我認爲適應你的代碼交易將是最好的選擇(如果它的可能性) –

0

由於過程中,我不得不想出自己的解決方案的併發症。感謝那些建議創建交易的人,但這不是一個簡單的解決方案,否則我不會問。 問題是,用戶可以選擇要取消的點,但必須跟蹤並記錄整個時間的狀態。我最終做的是當用戶請求保存狀態時,我在DataTable中設置了cloned = true標誌。

後來,如果選擇取消,我然後做一箇舊的Merge()到新的。

origDataTable.Merge(cloneDataTable); 
tableAdapter.Update(origDataTable.Rows[0]); 

我希望這可以幫助別人。它有點複雜但適合這個應用程序的需求,我喜歡有能力維護我自己的事務,因爲我可以選擇何時將狀態保存到內存中,寫入數據庫並還原。 當然,這可能更容易使用某些內置功能來處理不同設計中的事務,但它適用於此應用程序。 感謝您的意見。