Нарушение ограничения PRIMARY KEY.Невозможно вставить дубликат ключа в объект - PullRequest
0 голосов
/ 25 апреля 2018

Я сбрасываю миллионы записей в мою таблицу, используя sql массовое копирование. Я обрабатываю свои данные и подготавливаю данные, и как только размер достигает 1000 записей, я использую Sql Bulk copy , чтобы выгрузить данные в таблицу, а затем очиститьdatatable, и этот процесс продолжается.

В конце я фиксирую транзакцию в методе 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.

Но все еще та же ошибка даже после выполнения выше.

Затем я попытался вставить запись из управления сервером sqlstudio и он был вставлен, но значение 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
        }
    }

Я искал эту проблему, и большинство решений вращалось вокруг установки Id в Autoincrement, который у меня уже есть на моемколонка, поэтому я не понимаю, в чем проблема.

Я буду признателен за любую помощь:)

1 Ответ

0 голосов
/ 25 апреля 2018

Я выяснил, и проблема была SqlBulkCopyOptions.KeepIdentity, которая мешала базе данных генерировать значение идентификатора для AutoIncrement column Id

Я перешел на использование SqlBulkCopyOptions.Default, которое решает эту проблему.

Поэтому, если у вас есть таблица назначения, назначающая идентификатор, не используйте опцию SqlBulkCopyOptions.KeepIdentity.

...