使用SqlBulkCopy将数据批量插入具有复合主键的表中。

4

我正在尝试使用SqlBulkCopy通过手动填充应用程序中的DataTable向我的数据库表插入新行。

对于所有表格,这都很好用,除了由3个列组成的复合主键的表格。每当我尝试将任何内容SqlBulkCopy到此表中时,我都会收到以下错误:

Violation of PRIMARY KEY constraint 'PK_MYCOMPOSITEKEY'. Cannot insert duplicate key in object 'dbo.MyTable'.
The statement has been terminated.

这是否可能?

我尝试使用以下方式设置我的DataTable的主键:

dt.PrimaryKey = new[] {dt.Columns["PKcolumn1"], dt.Columns["PKcolumn2"], dt.Columns["PKcolumn3"]};

但是,再次尝试,仍然没有运气。

3个回答

1

你遇到的问题与数据有关。

在输入文件中,可能存在以下情况之一或两者同时存在:

一行数据在主键列上与表中已有的数据相同

或者

文件中至少有两行数据在主键列上的值相同


这也是我想的。然而,我将插入限制为一行值,我知道这些值尚未在数据库表中。 - kamens
数据库认为它们是什么 - 值是什么? - mmmmmm
你和Majkara都是正确的。我正在使用Linq-to-SQL,在DB.SubmitChanges()期间遍历了一个外键依赖项,这导致在我的执行路径中插入了这些外部行...即使我没有显式地添加这些行。 - kamens

1

批量插入到暂存表中。清理任何重复记录。然后使用直接 SQL 进行插入。在编写插入代码时,请确保将其限制为暂存表中不在生产表中的记录。


1

在向数据库提交数据之前,您应该验证批量数据是否存在副本,问题可能不仅仅是与现有约束或记录冲突。这样做是正确的,并且通常需要报告它。

尽管如此,DataSet甚至DataReaders的整个展示都是一种混乱的映射练习,具有糟糕的无类型设计,大量不必要的转换、分配、基于object[]的值,整个过程变得有序、类型和字符串依赖性混乱(这只有微软才能设计并继续设计)。另一方面,本地OLEDB批量接口要干净得多。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接