Как я могу обновить таблицу базы данных с помощью .Net DataTable и игнорировать существующие записи?

1

У меня есть.Net DataTable, который содержит записи, все из которых являются "добавленными" записями. Соответствующая таблица в базе данных может содержать миллионы строк. Если я попытаюсь просто вызвать метод "Обновить" в моем SqlDataAdapter, любые существующие записи приведут к тому, что исключение будет вызвано из-за нарушения ограничения первичного ключа. Я рассмотрел загрузку всех записей физических таблиц во второй экземпляр DataTable, слияние двух, а затем вызов метода Update во втором DataTable. Это действительно работает так, как я хочу. Однако я обеспокоен тем, что если в физической таблице будет 30 миллиардов записей, загрузка этой информации в DataTable в памяти может быть проблемой.

Я решил выбрать подмножество данных из физической таблицы и продолжить, как описано выше, но построение подзапроса оказалось очень сложным и очень утомительным. Понимаете, я не работаю с одной известной таблицей. Я работаю с DataSet, который содержит несколько сотен DataTables. Каждая из таблиц DataTables соответствует своей собственной физической таблице. Имя и схема таблиц не известны во время компиляции. Это нужно сделать во время выполнения.

Я играл с классом SqlBulkCopy, но имел ту же проблему - дубликаты записей создают исключение.

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

Теги:
ado.net
datatable
dataset
sqldataadapter

1 ответ

0

вы можете создать свою команду insert так:

declare @pk int = 1
declare @txt nvarchar(100) = 'nothing'
insert into #temp (id, txt)
    select distinct @pk, @txt 
        where not exists (select id from #temp x where x.id = @pk)

предполагая, что ваша таблица #temp (временная таблица, используемая для этого примера) создается таким образом (с первичным ключом на id)

create table #temp (id int not null, txt nvarchar(100))

Ещё вопросы

Сообщество Overcoder
Наверх
Меню