gpt4 book ai didi

c# - 违反 PRIMARY KEY 约束。无法在对象中插入重复的键

转载 作者:行者123 更新时间:2023-12-02 08:30:10 25 4
gpt4 key购买 nike

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

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

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

Violation of PRIMARY KEY constraint 'PK_Sales'. Cannot insert duplicate key in object 'dbo.Sales'. The duplicate key value is (10364).\r\nThe statement has been terminated

我的列排序与我的数据库表列排序相同。我什至执行了 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 

注意:我已在 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
}
}

我确实搜索了这个问题,大多数解决方案都是围绕将 Id 设置为自动增量来进行的,我已经在我的专栏中使用了它,所以我现在不明白问题是什么。

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

最佳答案

我发现问题是 SqlBulkCopyOptions.KeepIdentity 它阻止数据库为 AutoIncrement 列 Id 生成标识值

我改用 SqlBulkCopyOptions.Default 来解决这个问题。

因此,当您让目标表分配标识时,请勿使用 SqlBulkCopyOptions.KeepIdentity 选项。

关于c# - 违反 PRIMARY KEY 约束。无法在对象中插入重复的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50016023/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com