C# DataTable:在插入新数据行之前删除旧数据行是否安全?
我在类型化数据集中有一个多对多关系表。 为了方便更新,我在添加新关系之前删除旧关系(可能与以前相同) 现在我想知道这种方法是否是故障安全的,或者我是否应该确保只删除真正被删除的(例如使用LINQ),只添加真正新的 在SQL Server中,是为关系表定义的唯一约束,两个外键是复合主键 DataAdapter更新行状态不变的数据行的顺序是否可预测? 换句话说: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
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));