使用 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 插入/更新数据库的主要内容,如果未能解决你的问题,请参考以下文章