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

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

谢谢, 波动率

【问题讨论】:

    标签: asp.net sqlbulkcopy


    【解决方案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);
      

      【讨论】:

        猜你喜欢
        • 2010-11-04
        • 1970-01-01
        • 2012-09-12
        • 2019-02-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-23
        相关资源
        最近更新 更多