1

我正在使用 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 除了进行更新之外别无他法?

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

4

2 回答 2

0

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

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

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

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

于 2010-11-25T12:17:22.633 回答
0

由于您需要将这些数据处理为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 支持之外,这还允许更好地记录操作。特别是,也许看看哪个OUTPUT子句INSERT可以帮助复杂的批量操作。

于 2010-11-25T12:20:39.230 回答