Oracle массовое копирование дублирующихся строк - PullRequest
0 голосов
/ 14 февраля 2012

У меня есть таблица базы данных следующим образом:

id    min    max
---------------------
1      0     20
2      21    30
3      31    40

Я показываю эту таблицу в виде сетки (asp.net), где пользователь может вставлять новые строки, обновлять существующие и удалять любые строки.Это все манипуляции, которые я храню в базе данных.После обновления, вставки, удаления записей, когда пользователь захотел сохранить его, он или она нажали кнопку «Сохранить», и этот измененный источник данных сохраняется в базе данных (той же таблице, из которой я заполнил сетку).Для обновления базы данных я использую OracleBulkCopy класс.Теперь проблема в том, что когда я обновляю datatable в базу данных, он повторяет уже существующие строки.Например, если я внес изменения в вышеприведенную таблицу в виде сетки и обновил ее в базе данных, то:

id    min    max
------------------
1     0      20 
2     21     30
3     31     40
1     0      20 
2     21     35 (updated)
3     31     40  
4     41     60 (newly inserted)

Я не хочу этого повторения.Здесь id является первичным ключом, и я попробовал следующий код для OracleBulkCopy:

Oracle.DataAccess.Client.OracleBulkCopy oracleBulkCopy = new Oracle.DataAccess.Client.OracleBulkCopy(DM.ConnectionString, Oracle.DataAccess.Client.OracleBulkCopyOptions.UseInternalTransaction);
oracleBulkCopy.DestinationTableName = "RANGE";
oracleBulkCopy.WriteToServer(dataTable);

1 Ответ

0 голосов
/ 14 февраля 2012

OracleBulkCopy действует как SQL*Loader. Он не заботится о дубликатах и ​​просто вставляет все. Фактически, он отключит ваши индексы перед запуском, а затем снова включит их. См., Например, этот вопрос. Обходной путь для этого - массовое копирование во временную таблицу с теми же столбцами, что и у целевой таблицы, а затем выполнение INSERT для вашей таблицы, поскольку это позволит вам игнорировать дубликаты.

РЕДАКТИРОВАТЬ: Согласно APC, это не будет масштабироваться слишком хорошо. Тем не менее, обратите внимание на WriteToServer: вам не нужно копировать все данные, вы можете копировать на основе DataRowState. Смотрите здесь . Таким образом, вы можете массово копировать только те, которые являются новыми строками и, возможно, выполнить обходной путь для измененных строк. Если вы разрешаете удаление из таблицы данных, вам придется обрабатывать их отдельно.

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