Нам нужно обновить несколько таблиц, которые имеют родительские/дочерние отношения на основе первичного ключа Identity в родительской таблице, который упоминается одной или несколькими дочерними таблицами в качестве внешнего ключа.
- Из-за большого объема данных мы хотели бы построить эти таблицы в памяти, а затем использовать SqlBulkCopy из С# для обновления массива базы данных из DataSet или отдельных DataTables.
- Мы также хотели бы сделать это параллельно, из нескольких потоков, процессов и, возможно, клиентов.
Наш прототип в F # показывает многообещающие результаты с увеличением производительности 34 раза, но этот код заставляет использовать известные значения Identity в родительской таблице. Если не принудительно, столбец Identity корректно генерируется в базе данных, когда SqlBulkCopy вставляет строки, но значения Identity НЕ обновляются в встроенной памяти DataTable. Кроме того, даже если бы они были, неясно, правильно ли DataSet исправит отношения родительский/дочерний, чтобы потом дочерние таблицы могли быть записаны с правильными значениями внешнего ключа.
Может ли кто-нибудь объяснить, как обновить значения идентификаторов SqlBulkCopy, а также как настроить DataSet, чтобы сохранить и обновить отношения между родителями и дочерними элементами, если это не делается автоматически, когда DataAdapter вызывается в FillSchema на отдельных таблицах данных.
Ответы, которые я не ищу:
- Прочитайте базу данных, чтобы найти текущее самое высокое значение Identity, а затем вручную увеличивайте ее при создании каждой родительской строки. Не работает для нескольких процессов/клиентов, и, насколько я понимаю, неудачные транзакции могут привести к пропущению некоторых значений Identity, поэтому этот метод может испортить отношение.
- Напишите родительские строки по очереди и попросите вернуть значение Identity. Это побеждает, по крайней мере, в некоторых преимуществах, используя SqlBulkCopy (да, есть намного больше дочерних строк, чем у родителей, но все еще много родительских строк).
Аналогично следующему неотвеченному вопросу: