使用 SQLBulkCopy 插入/更新数据库

Posted

技术标签:

【中文标题】使用 SQLBulkCopy 插入/更新数据库【英文标题】:Using SQLBulkCopy to Insert/Update database 【发布时间】:2009-11-09 11:36:39 【问题描述】:

我有一个包含记录的数据表。我正在使用 SqlBulkCopy 将记录插入到 Sql 表中。它工作正常。下一次获取具有相同记录且更改值很少的数据表时,SqlBulkCopy 正在插入另一组记录而不更新以前的记录详细信息。如何使用 SqlBulkCopy 更新 Sql 表?请帮忙。

谢谢, 波动率

【问题讨论】:

【参考方案1】:

SqlBulkCopy 仅用于插入记录,而不是按照here 的说明更新它们。您需要使用不同的技术来进行批量更新。

例如您可以将 SqlBulkCopy 复制到临时表中,然后运行一些 SQL 以从那里更新到主表。

【讨论】:

+1 用于暂存表,这正是您必须使用批量插入进行更新的方式,对于同一张表上的大量更新,这样做非常值得。【参考方案2】:

截断表并执行 Bulkcopy。

【讨论】:

对于 vix:如果您只希望结果表仅包含批量加载记录,则截断然后批量加载是最有效的过程。 - 赞成 适用于一些简单的情况,但如果您正在更新的数据有任何复杂程度,这将是一个真正的痛苦。根据应用程序/数据库的具体情况,维护数据完整性可能非常困难。例如FK 关系需要保留。【参考方案3】:

避免截断表并创建一个新的临时表,顺便说一句,这会消耗更多的空间和内存。

我使用 INSTEAD OF INSERT 创建了一个触发器并在 MERGE 语句中使用。

但不要忘记在 SqlBulkCopy 中添加参数 SqlBulkCopyOptions.FireTriggers。

这是我的两分钱。

【讨论】:

【参考方案4】:

就像 AdaTheDev 提到的,SqlBulkCopy 只能插入,但是有一个替代库允许执行 Upsert 操作。

免责声明:我是项目的所有者Bulk Operations

批量操作库有一个方法“BulkMerge”,它根据指定的键插入或更新行。

var bulk = new BulkOperation(connection);

bulk.ColumnMappings.Add("ID", true);
bulk.ColumnMappings.Add("Column1");
bulk.ColumnMappings.Add("Column2");
bulk.ColumnMappings.Add("Column3");

bulk.BulkMerge(dt);

【讨论】:

以上是关于使用 SQLBulkCopy 插入/更新数据库的主要内容,如果未能解决你的问题,请参考以下文章

C# 中的批量更新

SqlBulkCopy批量更新数据库表用例

关于SQL数据库批量更新和增加的问题。

使用 SqlBulkCopy 插入数据时出错

ASP.NET 批量更新

使用SqlBulkCopy批量插入多条数据进入表中