DataTable:在插入新的安全之前删除旧的DataRows?

时间:2011-04-20 08:16:11

标签: c# .net sql-server vb.net ado.net

我在类型化的DataSet中有一个多对多的关系表。 为方便更新,我在添加新关系之前删除旧关系(可能与以前相同)。

现在我想知道这种方式是否安全,或者我是否应该确保只删除哪些是真正删除的(例如使用LINQ)并且只添加那些真正新的。

在SQL-Server中是为关系表定义的唯一约束,两个外键是复合主键。

DataAdapter的订单是否更新RowState所属的DataRows<>可预测与否不变? 换句话说:当密钥已存在时,DataAdapter.Update(DataTable)是否可能导致异常?

这是数据模型:

Datamodel

这是代码的一部分(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)

提前谢谢。

2 个答案:

答案 0 :(得分:1)

我认为ADO.NET中的DataAdapter足够聪明,可以按正确的顺序执行删除/插入。

但是,如果您确实希望确保以正确的顺序完成更新,则应使用Select方法手动执行此操作,以返回每个特定行状态的数据行数组。然后,您可以在数据行数组

上调用Update方法
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的调用,因为它们非常昂贵;计算时间,从确定哪些行更新是虚假的,是便宜的。