2011-04-20 107 views
3

我在一個類型化的數據集中有一個多對多的關係表。 爲了方便更新,我在添加新的之前刪除舊的關係(可能與之前一樣)。DataTable:在插入新安全文件之前刪除舊的DataRows?

現在我不知道,如果這種方式是故障保護,或者我應該確保只有刪除被真正刪除(例如使用LINQ)和只添加一個這是真正的新。

在SQL-Server是關係表中定義的唯一約束,這兩個外鍵是一個複合主鍵。

是DataAdapter的更新它的RowState是<>不變預見或沒有數據行的順序? 換句話說:DataAdapter.Update(DataTable)是否有可能在密鑰已經存在時導致異常?

這是數據模型:

Datamodel

這是部分的代碼(LbSymptomCodes是一個ASP.Net列表框):

Dim daTrelRmaSymptomCode As New ERPModel.dsRMATableAdapters.trelRMA_SymptomCodeTableAdapter 
For Each oldTrelRmaSymptomCodeRow As ERPModel.dsRMA.trelRMA_SymptomCodeRow In thisRMA.GettrelRMA_SymptomCodeRows 
    oldTrelRmaSymptomCodeRow.Delete() 
Next 
For Each item As ListItem In LbSymptomCodes.Items 
    If item.Selected Then 
     Dim newTrelRmaSymptomCodeRow As ERPModel.dsRMA.trelRMA_SymptomCodeRow = Services.dsRMA.trelRMA_SymptomCode.NewtrelRMA_SymptomCodeRow 
     newTrelRmaSymptomCodeRow.fiRMA = Services.IdRma 
     newTrelRmaSymptomCodeRow.fiSymptomCode = CInt(item.Value) 
     Services.dsRMA.trelRMA_SymptomCode.AddtrelRMA_SymptomCodeRow(newTrelRmaSymptomCodeRow) 
    End If 
Next 
daTrelRmaSymptomCode.Update(Services.dsRMA.trelRMA_SymptomCode) 

預先感謝您。

回答

1

我認爲DataAdapter的ADO.NET中是足夠聰明,以正確的順序執行刪除/插入。

但是,如果您確實希望確保以正確的順序完成更新,則應該使用Select方法手動執行,以針對每個特定的行狀態返回一個數據行數組。然後,您可以調用數據行

DataTable tbl = ds.Tables["YourTable"]; 

// Process any Deleted rows first 
adapter.Update(tbl.Select(null, null, DataViewRowState.Deleted)); 

// Process any Updated/Modified rows 
adapter.Update(tbl.Select(null, null, DataViewRowState.ModifiedCurrent)); 

// Process the Inserts last 
adapter.Update(tbl.Select(null, null, DataViewRowState.Added)); 
+0

謝謝。但是這會導致三個數據庫調用(和三個事務)而不是一個。當更新在已刪除行和已更改行上的已接受更改的已添加行上失敗時,我無法RejectChanges。 – 2011-04-20 09:21:03

+0

@TimSchmelter:如果發生任何錯誤,您不能在try/catch塊中的單個事務中包裝所有更新以回滾嗎? – codingbadger 2011-04-20 09:45:51

+0

可能但困難,因爲在類型化數據集中,此邏輯封裝在自動生成的TableAdapter中。我必須將這些適配器擴展到與自動生成的文件不同的文件中的部分類中,並公開DataAdapter本身以提供事務。但我很樂意避免這種額外的努力;) – 2011-04-20 11:29:53

1

關於DA不知道,但在理論上DB交易應按照下列順序刪除,插入,更新進行的陣列上的更新方法。

看MSDN的更新方法的具體措辭是

塊引用 試圖保存在數據表到數據庫的所有變化。 (這包括去除從表中刪除任何行,添加插入到表中的行,並在已更改的表更新任何行。) 塊引用

在問候您的刪除項目,並可能重新的溶液插入相同的項目,通常這應該避免,因爲它會在數據庫上創建一個負載。在大批量應用程序中,您希望儘可能減少對數據庫的調用,因爲它們非常昂貴;計算時間,從確定哪些行更新是虛假的,是便宜的。

+0

謝謝。因爲用戶(並且根本沒有多少用戶)只能在列表框中選擇1-5個項目,所以DB的額外負載相當有限。 – 2011-04-20 09:26:11