Я сбрасываю миллионы записей в моей таблице, используя sql bulk copy. Я обрабатываю свои данные и готовлю данные и размером до 1000 записей. Я использую Sql Bulk copy для вывода данных в таблицу, а затем пустые данные, и этот процесс продолжается.
В конце я совершаю транзакцию в методе «Окончание» и отказываюсь от массовой копии, транзакции и т. Д.
Когда я пытаюсь сбрасывать записи, я получаю эту ошибку:
Нарушение ограничения 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, и она вставлена, но значение Id (pk), к моему удивлению, следующее: 10365
Структура таблицы продаж:
Id(pk) TestId(F.K) othercols
Примечание. Я установил AutoIncrement on my Id
столбец 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
}
}
Я искал эту проблему, и большинство решений было связано с настройкой Id на Autoincrement, которое у меня уже есть в моей колонке, поэтому я не понимаю, в чем проблема.
Буду признателен за любую помощь :)
Я понял, и проблема была SqlBulkCopyOptions.KeepIdentity
которая останавливала базу данных от создания значения идентификатора для AutoIncrement column Id
Я переключился на SqlBulkCopyOptions.Default
который решает эту проблему.
Поэтому, когда в таблице назначения назначается идентификатор, не используйте параметр SqlBulkCopyOptions.KeepIdentity
.