Вставка SqlBulkCopy со столбцом идентификаторов - PullRequest
59 голосов
/ 11 июля 2011

Я использую объект SqlBulkCopy для вставки пары миллионов сгенерированных строк в базу данных. Единственная проблема заключается в том, что таблица, в которую я вставляю, имеет столбец идентификаторов. Я попытался установить SqlBulkCopyOptions на SqlBulkCopyOptions.KeepIdentity и установить столбец идентификаторов на 0, DbNull.Value и null. Ни один из которых не работал. Я чувствую, что упускаю что-то довольно простое, если бы кто-то мог просветить меня, это было бы фантастически. Спасибо!

edit Для пояснения, у меня не установлены значения идентификатора в DataTable, который я импортирую. Я хочу, чтобы они были созданы как часть импорта.

редактировать 2 Вот код, который я использую для создания базового SqlBulkCopy объекта.

SqlBulkCopy sbc = GetBulkCopy(SqlBulkCopyOptions.KeepIdentity);
sbc.DestinationTableName = LOOKUP_TABLE;

private static SqlBulkCopy GetBulkCopy(SqlBulkCopyOptions options = 
    SqlBulkCopyOptions.Default) 
{
    Configuration cfg = WebConfigurationManager.OpenWebConfiguration("/RSWifi");
    string connString =
    cfg.ConnectionStrings.ConnectionStrings["WifiData"].ConnectionString;
    return new SqlBulkCopy(connString, options);
}

Ответы [ 7 ]

34 голосов
/ 11 июля 2011

Чтобы таблица назначения присваивала идентификатор, не используйте параметр SqlBulkCopyOptions.KeepIdentity. Вместо этого не отображайте удостоверение из источника и не извлекайте его из источника для отправки на SqlBulkCopy.

21 голосов
/ 11 июля 2011

Заполните ColumnMapping объекта BulkCopy и не отображайте столбец идентификации.Столбец идентификации будет создан целевой базой данных.

1 голос
/ 13 февраля 2019

Вот как я решил это в .NET Core (dt - ваша дата):

dt.Columns.Cast<DataColumn>().ForEach((c, i) => sqlBulkCopy.ColumnMappings.Add(c.ColumnName, i + 1));

Вы в основном пропускаете столбец идентификаторов (Id), присваивая столбцам назначения порядковый номер, начинающийся с 1 вместо 0.

1 голос
/ 26 июня 2013

Да, вы правы, используя опцию SqlBulkCopyOptions.KeepIdentity, тогда средство записи массовых копий не думает, что именно ваша структура таблицы этот объект записывает из начального столбца, поэтому для наших нужд я делаю то же самое, чтобы сохранить поле идентификатора в моемtable, просто вы должны создать дополнительный столбец в вашем объекте с данными с остальными необходимыми столбцами и передать нулевые значения в этот столбец, после чего таблица автоматически обработает Identity.

1 голос
/ 11 июля 2011

У вас есть две опции -

1 - используйте KeepIdentity и сохраните значения Identity источника.

2 - Не отображать поле Identity.Если вы не попытаетесь присвоить значение, целевая таблица назначит его автоматически.

0 голосов
/ 20 января 2016

В моем случае это оказалось пустым пространством внутри имени столбца, и в одном из столбцов я случайно использовал Hyphon (-) вместо подчеркивания (_) в моей таблице SQL.Я заменил пробел и гифон на подчеркивание в таблице sql, и это устранило проблему.

0 голосов
/ 03 сентября 2014

Причина : - В конце Excel было несколько пустых строк в конце данных, которые, возможно, выглядят как пустые строки.При массовой загрузке были предприняты попытки загрузить эти пустые строки в таблицу.

Решение : - выбрать только те строки, которые содержат данные - скопировать данные на новый лист.Скажем, у вас есть данные в «Листе 1», переместите их в «Лист 2» и удалите «Лист 1».

...