Я пытаюсь использовать SqlBulkCopy для вставки новых строк в таблицу DB, вручную заполняя DataTable с моим приложением.
Это отлично работает для всех таблиц, кроме таблицы с составным первичным ключом, состоящим из 3 столбцов . Всякий раз, когда я пытаюсь SqlBulkCopy что-либо в этой таблице, я получаю следующую ошибку:
Violation of PRIMARY KEY constraint 'PK_MYCOMPOSITEKEY'. Cannot insert duplicate key in object 'dbo.MyTable'.
The statement has been terminated.
Возможно ли это?
Я попытался настроить первичные ключи DataTable следующим образом:
dt.PrimaryKey = new[] {dt.Columns["PKcolumn1"], dt.Columns["PKcolumn2"], dt.Columns["PKcolumn3"]};
но опять же, не повезло.
У вас проблема с данными.
Во входном файле есть либо или оба
строка, которая имеет те же данные в столбцах e pk, что и в таблице
или
Файл имеет не менее двух строк с одинаковыми значениями столбцов pk
Вы должны проверить свои объемные данные для копий перед тем, как попасть в БД, проблема может быть и там (не только столкновение с существующим ограничением, либо запись в БД). Он работает, и обычно правильно сообщать об этом.
Тем не менее, весь показ DataSet или даже DataReaders является беспорядочным упражнением в сопоставлениях, плохой безликой конструкции, множеством ненужных преобразований, распределений, значений на основе объекта [], и вся вещь становится порядком, типом и зависящим от строки беспорядком (что-то только MS может проектировать и продолжать проектирование). С другой стороны, массовые интерфейсы OLEDB намного чище.