【问题标题】:SqlBulkCopy into table with composite primary keySqlBulkCopy 到具有复合主键的表中
【发布时间】:2010-12-05 11:40:42
【问题描述】:

我正在尝试使用 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"]};

但同样,没有运气。

【问题讨论】:

    标签: c# .net sql sql-server-2005 sqlbulkcopy


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        你遇到的问题是数据。

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

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

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

        【讨论】:

        • 我也是这么想的。但是,我已将插入限制为我知道尚未在数据库表中的单行值。
        • 数据库认为它们是 - 值是什么?
        • 你和 Majkara 是对的。我正在使用 Linq-to-SQL,并且在 DB.SubmitChanges() 期间正在遍历外键依赖项,它在我的执行路径中的 SqlBulkCopy 之前插入这些外键行......即使我没有明确添加行自己。
        猜你喜欢
        • 1970-01-01
        • 2013-04-30
        • 1970-01-01
        • 2012-05-18
        • 2011-07-03
        • 2014-06-07
        • 2014-07-31
        • 2013-12-19
        • 1970-01-01
        相关资源
        最近更新 更多