我使用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
}
}
我确实在搜索这个问题,而且大多数解决方案都是围绕将我设置为自动增量设置,这已经在我的专栏上了,所以我现在没有得到问题。
我将不胜感激任何帮助:)
答案 0 :(得分:2)
我想通了,问题是SqlBulkCopyOptions.KeepIdentity
阻止了数据库为AutoIncrement column Id
生成身份值
我转而使用SqlBulkCopyOptions.Default
解决了这个问题。
因此,如果目标表分配了标识,请不要使用SqlBulkCopyOptions.KeepIdentity
选项。