如何使用 .Net 数据表更新数据库表并忽略现有记录

本文关键字:记录 Net 何使用 数据表 更新 数据库 | 更新日期: 2023-09-27 18:33:48

我有一个包含记录的.Net DataTable,所有这些都是"添加"的记录。数据库中的相应表可能包含数百万行。如果我尝试简单地在我的 SqlDataAdapter 上调用"Update"方法,则任何现有记录都会导致由于违反主键约束而引发异常。我考虑过将物理表的所有记录加载到第二个 DataTable 实例中,将两者合并,然后在第二个 DataTable 上调用 Update 方法。这实际上完全符合我的需求。但是,我担心的是,如果物理表中有 300 亿条记录,则将所有这些数据加载到内存中的 DataTable 中可能是一个问题。

我考虑过从物理表中选择一个数据子集并如上所述进行,但事实证明,子查询的构造非常复杂且非常繁琐。你看,我不是在处理一个已知的表。我正在使用一个包含数百个数据表的数据集。每个数据表都映射到其自己的物理表。表的名称和架构在编译时未知。这一切都必须在运行时完成。

我玩过 SqlBulkCopy 类,但遇到了同样的问题 - 重复记录会引发异常。

我不想在运行时为每个表动态构造查询。如果这是唯一的方法,那就这样吧,但我只是忍不住认为必须有一个更简单的解决方案使用 Ado.Net 提供的东西。

如何使用 .Net 数据表更新数据库表并忽略现有记录

你可以像这样创建你的插入命令:

declare @pk int = 1
declare @txt nvarchar(100) = 'nothing'
insert into #temp (id, txt)
    select distinct @pk, @txt 
        where not exists (select id from #temp x where x.id = @pk)

假设您的表 #temp(用于此示例的临时表(是这样创建的(主键位于 ID 上(

create table #temp (id int not null, txt nvarchar(100))