代码之家  ›  专栏  ›  技术社区  ›  Martin

3条ID相同但使用SqlBulkCopy更改不同列的记录

  •  1
  • Martin  · 技术社区  · 15 年前

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

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

    让我解释一下。。这是三张唱片

    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没有其他选择,只能进行更新吗?

    理想的情况是能够插入所有内容,并且将失败的内容插入到临时表中。。。因此,我只需要担心纠正我失败表中的错误,因为我知道其他的都很好

    2 回复  |  直到 15 年前
        1
  •  0
  •   Marc Gravell    15 年前

    因为你需要把数据处理成 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 */
    }
    

    然后通过 数据表 SqlBulkCopy数据库 一旦你有了想要的数据。


    重新编辑;在该场景中,我将上传到一个临时表(只是一个有一个类似上传数据的模式的常规表,但通常没有外键等),然后使用常规TSQL将数据移动到事务表中。除了完全支持TSQL之外,这还允许更好地记录操作。特别是,也许看看 OUTPUT 条款 INSERT 有助于复杂的批量操作。

        2
  •  0
  •   Lasse V. Karlsen    15 年前

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

    在插入数据之前,需要先修复数据。如果这意味着对已存在的行有更新,则不能插入那些会产生键冲突的文件。

    您可以将大量插入到临时表中,并运行适当的插入或更新语句,只插入其余的新行并发布更新语句,或者在获取它们之后删除先前存在的行并在重新插入之前修复数据。

    但是无法说服批量复制来更新现有的行。