C# DataTable:在插入新数据行之前删除旧数据行是否安全?

C# DataTable:在插入新数据行之前删除旧数据行是否安全?,c#,.net,sql-server,vb.net,ado.net,C#,.net,Sql Server,Vb.net,Ado.net,我在类型化数据集中有一个多对多关系表。 为了方便更新,我在添加新关系之前删除旧关系(可能与以前相同) 现在我想知道这种方法是否是故障安全的,或者我是否应该确保只删除真正被删除的(例如使用LINQ),只添加真正新的 在SQL Server中,是为关系表定义的唯一约束,两个外键是复合主键 DataAdapter更新行状态不变的数据行的顺序是否可预测? 换句话说:DataAdapter.Update(DataTable)是否可能在键已经存在时导致异常 这是数据模型: 这是代码的一部分(LBCODES

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

现在我想知道这种方法是否是故障安全的,或者我是否应该确保只删除真正被删除的(例如使用LINQ),只添加真正新的

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

DataAdapter更新行状态不变的数据行的顺序是否可预测? 换句话说:
DataAdapter.Update(DataTable)
是否可能在键已经存在时导致异常

这是数据模型:

这是代码的一部分(
LBCODES
是ASP.Net列表框):


提前谢谢。

我认为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));

不确定DA,但理论上DB事务应按以下顺序执行:删除、插入、更新

查看msdn,更新方法的确切措辞是

大宗报价 尝试将DataTable中的所有更改保存到数据库。(这包括删除从表中删除的任何行,添加插入到表中的行,以及更新表中已更改的任何行。) 大宗报价


对于删除项并可能重新插入相同项的解决方案,通常应避免这样做,因为这会在数据库上创建负载。在大容量应用程序中,您希望尽一切可能减少对DB的调用,因为它们非常昂贵;从确定哪些行更新是虚假的开始,计算时间很便宜。

谢谢。但这将导致三个DB调用(和三个事务)而不是一个。对于已接受的已删除行和已更改行的更改,当添加行的更新失败时,我无法拒绝更改。@TimSchmelter:您不能将所有更新包装在一个try/catch块内的单个事务中,以便在发生任何错误时回滚吗?可能,但很困难,因为在类型化数据集中,此逻辑封装在自动生成的表格适配器。我必须在一个单独的文件(而不是自动生成的文件)中的分部类中扩展这些适配器,并公开DataAdapter本身以提供事务。但我想避免这种额外的努力;)谢谢由于用户(而且用户并不多)只能在列表框中选择1-5个项目,因此数据库的额外负载相当有限。
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));