2013-10-21 93 views
2

我正在使用C#在Windows窗體上使用SqlDataAdapter。我有一個BindingSource將它連接到我的領域與功能記錄遍歷和保存更改回數據庫。使用ADO.NET更新單個記錄SqlDataAdapter

我想給用戶提供更改當前記錄更新數據庫,不寫那些其他記錄製成,但他們留在該集緩存修改(即保存與全部保存)的選項。

我已經把它的工作原理(排序)如下:

SqlCommand updateCurrent = new SqlCommand("UPDATE Table SET Attribute = @attribute WHERE ID = @currentRecord", sqlConnection) 

updateCurrent.Parameters.AddWithValue("@currentRecord", bindingSource.GetItemProperties(null)["ID"].GetValue(bindingSource.Current)); 
updateCurrent.Parameters.AddWithValue("@attribute", bindingSource.GetItemProperties(null)["Attribute"].GetValue(bindingSource.Current)); 

updateCurrent.ExecuteNonQuery(); 

它的工作原理,它更新當前顯示的記錄(只有該記錄),但是當常規更新函數被調用稍後,它會導致System.Data.DBConcurrencyException(UpdateCommand影響預期的1條記錄的0)。

我想我明白了爲什麼發生錯誤的(我做了,現在沒有反映在緩存副本更改數據庫),但不知道如何着手。

是否有這樣做的最佳做法?從一開始就是一個固有的壞主意?

+0

這聽起來像你想使用DataTable – Stig

+1

我其實首先嚐試(使用DataViewRowState.ModifiedOriginal從視圖中創建一個新的'DataTable',通過ID刪除當前記錄的行,使用' DataViewRowState.ModifiedCurrent',將DataTable提交給數據庫,然後將BindingSource鏈接表從之前的狀態恢復到原始狀態,我認爲它看起來不必要的複雜(甚至比這更復雜),我想它會避免併發異常 - 我是否應該再次使用我剛剛描述的方法? –

回答

2

所有你需要的,以存檔你想要做的是:

此命令將與特定的行(yourDataRow)的內容更新數據庫。

YourTableAdapter.Update(yourDataRow); 

該命令將更新整個DataTable。

YourTableAdapter.Update(yourDataTable); 

DataTable將知道哪一行已被更新,哪些已被保存。

+0

感謝 - 令人難以置信的簡單但正是我期望實現的!下面是我用於獲取當前記錄的DataRow的行,來完成類似的事情: 'DataRow [] activeRecord = dataTable。 Select(「ID =」+ bindingSource.GetItemProperties(null)[「ID」]。GetValue(bindingSource.Current),null,DataRowViewState.ModifiedCurrent);' –

0

只是吐了一會兒後在這裏看看它。但是:

問題#1 我會這樣做:如果您在保存更新發生的時候,那麼「保存全部」的想法幾乎被拋出窗口(無用),因爲保存全部當一切已經是最新的時候顯然是低效的。 ...因此,一次更新一個或需要全部保存。

問題#2(實際抱怨的問題) DBConcurrencyException不是錯誤,它是拋出的異常(差異),它拋出的唯一原因是因爲沒有對數據庫進行更新。 (因爲你已經保存在一個行的基礎上)那麼爲什麼你會有更新?你不會的。因此,也許因爲你似乎是自動保存幾乎空的try/catch將是最好的途徑。 (老實說): 除非你正在工作瓦特/大量的數據(可以說> 10,000行),我會創建一個「全部保存」功能,更新所有已更改的行也許可以使用焦點偵聽器並將其添加到列表或其他內容以找出更改)。如果你想編輯有人喜歡自己正在做再使用「全部保存」功能,在這種情況下,僅僅是1行中的每個時間節省。如果其他人被更改,拯救所有救援。以各種方式工作。

額外的獎勵:使用緩存副本實際上是一個愚蠢的想法。 (除非你的電腦是野獸),就像我對小數據所說的那樣,完全沒問題。但讓我們來映射一個1,000,000行的數據庫。現在嘗試緩存1,000,000行......沒有你說得比較會更快,但所有不需要的數據加載到內存中是一個可怕的想法。縮放時,程序會崩潰。