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"]};

但同样,没有运气。

4

3 回答 3

1

您遇到的问题是数据。

在输入文件中有一个或两个

在 e pk 列中具有与表中已有数据相同的数据的行

或者

该文件至少有两行具有相同的 pk 列值

于 2009-10-09T21:24:41.877 回答
1

批量插入临时表。清理所有重复记录。然后使用直接 SQL 进行插入。当您编写插入代码时,请务必将其限制为暂存表中不在 prod 表中的记录。

于 2009-10-09T21:50:56.830 回答
1

您应该在访问数据库之前验证您的批量数据的副本,问题也可能存在(不仅仅是与现有约束或数据库中的记录冲突)。它确实有效,并且报告它通常是正确的。

尽管如此,DataSet 甚至 DataReaders 的整个展示在映射、糟糕的无类型设计、大量不必要的转换、分配、基于 object[] 的值方面都是一个混乱的练习,整个事情变成了顺序、类型和字符串相关的混乱(只有 MS可以设计并继续设计)。另一方面,原生 OLEDB 批量接口更干净。

于 2009-10-09T21:57:12.320 回答