3个具有相同ID但使用SqlBulkCopy更改不同列的记录

时间:2010-11-25 12:14:17

标签: c# primary-key bulkinsert sqlbulkcopy

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

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

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

ID      Name         Address
1       Scott        London
1       Mark         London
1                    Manchester

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

最后在第3条记录中你注意到Name不存在,但它的ID为1,并且地址为manchester,所以我需要更新记录但不更改名称但更新曼彻斯特..因此第3条记录会使id1成为=

ID      Name      Address
1       Mark      Manchester

我有什么想法可以做到这一点?我不知所措。

感谢。

修改

好一点更新。在使用SQLbulkCopy之前,我将管理和合并我的记录。是否有可能得到一个成功的列表和失败的列表......或者是全部或者没有的情况?我认为除了SQLbulkCopy之外没有其他替代方法可以做更新吗?

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

2 个答案:

答案 0 :(得分:0)

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

您需要在插入数据之前修复数据。如果这意味着您对预先存在的行进行了更新,则无法插入那些将导致生成密钥冲突的行。

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

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

答案 1 :(得分:0)

由于您需要将这些数据处理成DataTable (除非您正在编写自定义IDataReader),因此您应该先将这些记录合并到{{{ 1}};例如(伪代码):

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


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