3 записи с одинаковым идентификатором, но изменяющие разные столбцы с помощью SqlBulkCopy - PullRequest
1 голос
/ 25 ноября 2010

Я делаю преобразование с помощью SqlBulkCopy.В настоящее время у меня есть коллекция классов IList, которую я могу преобразовать в DataTable для использования с SqlBulkCopy.

Проблема в том, что у меня может быть 3 записи с одинаковым идентификатором.

Позвольте мнеобъясните .. вот 3 записи

ID      Name         Address
1       Scott        London
1       Mark         London
1                    Manchester

В основном мне нужно вставить их последовательно .. следовательно, я вставляю запись 1, если она не существует, затем следующую запись, если она существует, мне нужно обновить записьвместо того, чтобы вставить новый 1 (обратите внимание, что идентификатор все еще равен 1), поэтому в случае второй записи я заменяю оба столбца «Имя и адрес» на идентификаторе 1.

Наконец, в третьей записи вы заметили, что «Имя» неОн существует, но его ID 1 и имеет адрес Манчестера, поэтому мне нужно обновить запись, но НЕ ИЗМЕНЯТЬ имя, а обновить Манчестер .. следовательно, 3-я запись создаст id1 =

ID      Name      Address
1       Mark      Manchester

Любые идеи, как яможет это сделать?Я в растерянности.

Спасибо.

РЕДАКТИРОВАТЬ

Хорошо, небольшое обновление.Я буду управлять и объединять свои записи перед использованием SQLbulkCopy.Можно ли получить список того, что удалось и что не удалось ... или это случай ВСЕ или ничего?Я полагаю, что нет никакой другой альтернативы SQLbulkCopy, кроме как делать обновления?

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

Ответы [ 2 ]

0 голосов
/ 25 ноября 2010

Поскольку вам необходимо обработать эти данные в DataTable в любом случае (если вы не пишете пользовательский IDataReader), вы должны объединить записи, прежде чем передать их в SqlBulkCopy; например (в псевдокоде):

/* create empty data-table */
foreach(row in list) {
    var row = /* try to get exsiting row from data-table based on id */
    if(row == null) { row = /* create and append row to data-table */ }
    else { merge non-trivial properties into existing row */
}

затем передайте DataTable на SqlBulkCopy, как только у вас будут нужные данные.


повторное редактирование; в этом сценарии я загружал бы в промежуточную таблицу (обычную таблицу, которая имеет схему, подобную загруженным данным, но обычно не имеет внешних ключей и т. д.), а затем использовал обычный TSQL для перемещения данных в транзакционные таблицы. В дополнение к полной поддержке TSQL это также позволяет лучше регистрировать операции. В частности, возможно, посмотрите на OUTPUT предложение INSERT, которое может помочь в сложных массовых операциях.

0 голосов
/ 25 ноября 2010

Вы не можете делать обновления с помощью массовой копии (массовой вставки), только вставка. Отсюда и название.

Вам необходимо исправить данные, прежде чем вставлять их. Если это означает, что у вас есть обновления в уже существующих строках, вы не можете вставить их, так как это приведет к конфликту ключей.

Вы можете либо массово вставить во временную таблицу, и запустить соответствующие операторы вставки или обновления, только вставить новые строки и выпустить операторы обновления для остальных, либо удалить уже существующие строки после их извлечения и исправления данных перед вставив.

Но нет способа убедить массовое копирование обновить существующую строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...