2011-04-20 51 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