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