【问题标题】:3 records with same ID but change different columns using SqlBulkCopy3 条具有相同 ID 但使用 SqlBulkCopy 更改不同列的记录
【发布时间】:2010-11-25 12:14:16
【问题描述】:

我正在使用 SqlBulkCopy 进行转换。我目前有一个 IList 类集合,基本上我可以转换为 DataTable 以与 SqlBulkCopy 一起使用。

问题是我可以有 3 条具有相同 ID 的记录。

让我解释一下..这里有 3 条记录

ID      Name         Address
1       Scott        London
1       Mark         London
1                    Manchester

基本上我需要按顺序插入它们..因此我插入记录 1 如果它不存在,那么如果存在下一条记录我需要更新记录而不是插入新的 1(注意 id 仍然是 1 ) 所以在第二条记录的情况下,我替换了 ID 1 上的两列名称和地址。

最后,在第三条记录中,您注意到名称不存在,但其 ID 为 1,并且地址为曼彻斯特,因此我需要更新记录但不更改名称但更新曼彻斯特..因此第三条记录将使 id1 =

ID      Name      Address
1       Mark      Manchester

任何想法我怎么能做到这一点?我很茫然。

谢谢。

编辑

好的,更新一下。在使用 SQLbulkCopy 之前,我将管理和合并我的记录。是否有可能获得成功和失败的列表......或者它是全部还是什么都没有?我认为除了进行更新之外,除了 SQLbulkCopy 没有其他替代方法吗?

最好能够插入所有内容并将失败的内容插入临时表中......因此我只需要担心纠正失败表中的内容,因为我知道的其他人都可以

【问题讨论】:

    标签: c# primary-key bulkinsert sqlbulkcopy


    【解决方案1】:

    由于您需要将该数据处理成DataTable无论如何(除非您正在编写自定义IDataReader),您应该在将记录提供给SqlBulkCopy 之前将它们合并;例如(在伪代码中):

    /* create empty data-table */
    foreach(row in list) {
        var row = /* try to get exsiting row from data-table based on id */
        if(row == null) { row = /* create and append row to data-table */ }
        else { merge non-trivial properties into existing row */
    }
    

    一旦您获得所需的数据,然后将DataTable 传递给SqlBulkCopy


    重新编辑;在那种情况下,我会上传到一个临时表(只是一个具有与上传数据类似的模式的常规表,但通常没有外键等),然后使用常规 TSQL 将数据移动到事务表中。除了完整的 TSQL 支持之外,这还允许更好地记录操作。特别是,也许看看INSERTOUTPUT 子句,它可以帮助复杂的批量操作。

    【讨论】:

    • 谢谢,我已经更新了我的问题
    【解决方案2】:

    您不能使用批量复制(批量插入)进行更新,只能插入。因此得名。

    您需要在插入数据之前修复它们。如果这意味着您对预先存在的行进行了更新,则不能插入这些行,因为这会产生密钥冲突。

    您可以批量插入临时表,然后运行适当的插入或更新语句,只插入新行并为其余部分发出更新语句,或者在获取预先存在的行并修复之前的数据后删除它们重新插入。

    但没有办法说服批量复制更新现有行。

    【讨论】:

      猜你喜欢
      • 2017-05-05
      • 1970-01-01
      • 2021-03-18
      • 1970-01-01
      • 1970-01-01
      • 2019-12-12
      • 2014-02-10
      • 2013-05-29
      • 1970-01-01
      相关资源
      最近更新 更多