我在类型化的DataSet中有一个多对多的关系表。 为方便更新,我在添加新关系之前删除旧关系(可能与以前相同)。
现在我想知道这种方式是否安全,或者我是否应该确保只删除哪些是真正删除的(例如使用LINQ)并且只添加那些真正新的。
在SQL-Server中是为关系表定义的唯一约束,两个外键是复合主键。
DataAdapter的订单是否更新RowState所属的DataRows<>可预测与否不变?
换句话说:当密钥已存在时,DataAdapter.Update(DataTable)
是否可能导致异常?
这是数据模型:
这是代码的一部分(LbSymptomCodes
是ASP.Net ListBox):
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)
提前谢谢。
答案 0 :(得分:1)
我认为ADO.NET中的DataAdapter足够聪明,可以按正确的顺序执行删除/插入。
但是,如果您确实希望确保以正确的顺序完成更新,则应使用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));
答案 1 :(得分:1)
不确定DA,但理论上DB事务应按以下顺序执行删除,插入,更新。
查看msdn更新方法的确切措辞是
块引用 尝试将DataTable中的所有更改保存到数据库。 (这包括删除从表中删除的所有行,添加插入到表中的行,以及更新表中已更改的任何行。) 块引用
关于删除项目以及可能重新插入相同项目的解决方案,通常应该避免这种情况,因为它会在数据库上产生负载。在大批量应用程序中,您希望尽一切可能最大限度地减少对DB的调用,因为它们非常昂贵;计算时间,从确定哪些行更新是虚假的,是便宜的。