Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 3条具有相同ID但使用SqlBulkCopy更改不同列的记录_C#_Primary Key_Bulkinsert_Sqlbulkcopy - Fatal编程技术网

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

C# 3条具有相同ID但使用SqlBulkCopy更改不同列的记录,c#,primary-key,bulkinsert,sqlbulkcopy,C#,Primary Key,Bulkinsert,Sqlbulkcopy,我正在用SqlBulkCopy进行转换。我目前有一个IList类集合,基本上我可以将其转换为DataTable,以便与SqlBulkCopy一起使用 问题是我可以有3个相同ID的记录 让我解释一下。。这里有3张唱片 ID Name Address 1 Scott London 1 Mark London 1 Manchester 基本上我需要按顺序插入。。因此,如果记录1不存在

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

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

让我解释一下。。这里有3张唱片

ID      Name         Address
1       Scott        London
1       Mark         London
1                    Manchester
基本上我需要按顺序插入。。因此,如果记录1不存在,则插入记录1,如果下一条记录存在,则需要更新记录,而不是插入新的1(注意,id仍然是1),因此对于第二条记录,我将替换id 1上的列名称和地址

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

ID      Name      Address
1       Mark      Manchester
你知道我该怎么做吗?我不知所措

谢谢

编辑

好的,更新一下。在使用SQLbulkCopy之前,我将管理和合并我的记录。是否有可能获得成功和失败的列表。。。或者这是一个全有或全无的情况?我想除了更新之外,SQLbulkCopy没有其他选择了


这将是理想的,能够插入一切和失败的是插入到一个临时表。。。因此,我只需要担心更正失败表中的错误,因为我知道的其他错误都没有问题

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

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

您可以批量插入到临时表中,并运行相应的insert或update语句,仅插入新行并对其余行发出update语句,也可以在获取现有行并在重新插入之前修复数据后删除这些行


但是没有办法说服大容量复制更新现有行。

因为您无论如何都需要将该数据处理到
数据表中(除非您正在编写自定义
IDataReader
),所以应该在将记录交给
SqlBulkCopy
之前合并这些记录;例如(在伪代码中):

获得所需数据后,将
DataTable
传递给
SqlBulkCopy



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

谢谢,我已经预测了我的问题
/* 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 */
}