违反PRIMARY KEY约束。无法在对象

时间:2018-04-25 07:04:41

标签: c# sql-server ado.net primary-key sqlbulkcopy

我使用sql批量复制在我的表中转储数百万条记录。我处理我的数据并准备数据表,一旦大小达到1000条记录,我使用Sql Bulk copy将数据转储到表中,然后清空数据表和此过程继续。

最后我在End方法中提交事务并处理批量复制,事务等。

当我尝试转储记录时,我收到此错误:

  

违反PRIMARY KEY约束' PK_Sales'。无法插入   对象' dbo.Sales'中的重复键。重复的键值是   (10364)。\ r \ n该声明已被终止

我的列排序与我的数据库表列排序相同。我甚至执行了truncate语句并执行了此语句:

DBCC CHECKIDENT(dbo.Discrepancy, RESEED, 0);

我得到了这个输出:

Checking identity information: current identity value '0'.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.

但即使在上面做了之后仍然是同样的错误。

然后我尝试从 sql server management studio 插入记录并插入,但Id(pk)的值令我惊讶的是:10365

销售表结构:

Id(pk)   TestId(F.K)     othercols 

注意:我已设置AutoIncrement on my Id列。

代码:

public class SaveRepo : IDisposable
    {
        DataTable dataTable;
        SqlConnection connection;
        string connectionString;
        SqlTransaction transaction;
        SqlBulkCopy bulkCopy;
        int testId,

        public SaveRepo (int testId)//testId=10364
        {
            this.connectionString = connectionString;
            dataTable = new DataTable();
            connection = new SqlConnection(connectionString);
            connection.Open();
            transaction = connection.BeginTransaction();
            bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.KeepIdentity, transaction);
            bulkCopy.DestinationTableName = "dbo.Sales";
            this.testId = testId;
            dataTable.Columns.Add("TestId", typeof(int));
        }

       void Dump()
        {
            bulkCopy.WriteToServer(dataTable);
        }

        public void End()
        {
            transaction.Commit();
            //dispose the stuffs also
        }
    }

我确实在搜索这个问题,而且大多数解决方案都是围绕将我设置为自动增量设置,这已经在我的专栏上了,所以我现在没有得到问题。

我将不胜感激任何帮助:)

1 个答案:

答案 0 :(得分:2)

我想通了,问题是SqlBulkCopyOptions.KeepIdentity阻止了数据库为AutoIncrement column Id生成身份值

我转而使用SqlBulkCopyOptions.Default解决了这个问题。

因此,如果目标表分配了标识,请不要使用SqlBulkCopyOptions.KeepIdentity选项。