У меня возникла ситуация, когда у меня есть команда SQL Update, которую все нужно выполнить. Я знаю, что DataSets может выполнять пакетные обновления, но единственный способ, который я смог выполнить, - сначала загрузить всю таблицу в набор данных. Что делать, если я хочу только обновить подмножество записей в таблице?Пакетные обновления с использованием DataAdapter
ответ
EDITED: на основании вашего комментария, я бы рекомендовал использовать метод массовой копии, чтобы сначала перейти к промежуточной таблице. Затем вы можете сделать одно обновление на вашей реальной таблице на основе промежуточной таблицы.
=========
Один из способов заключается в создании SQL команды самостоятельно; однако я бы рекомендовал прочитать о возможностях SQL Injection для защиты себя. В зависимости от вашей ситуации и вашей платформы есть другие варианты.
Например, если вы имеете дело с большим количеством данных, тогда вы можете сделать массовый импорт в таблицу холдинга, из которой вы могли бы выдать одну команду обновления. У меня также был хороший успех, передавая записи в формате XML (я нашел в своей среде, что мне потребовалось не менее 50 строк, чтобы компенсировать затраты на загрузку DOM, и я знал, что проблемы масштабируемости не являются фактором в моем случае).
Некоторые другие вещи, которые я видел, это люди, которые упаковывают обновления в двоичное поле, например одно двоичное поле для каждого столбца, а затем у них есть функция, которая распаковывает двоичное поле. Опять же, вы захотите протестировать свою среду.
Сказав это, подтвердили ли вы, что простое указание одной команды обновления или хранимой процедуры для каждого необходимого вам обновления не является достаточным? Возможно, вам даже не понадобится командовать командами.
- Джош
Берегитесь Преждевременная оптимизация может быть убийцей!
Самый простой выход - это таблица загрузки с требуемыми строками (строки, которые вы хотите обновить). Дважды проверьте, что RowState «Inserted». Назначьте свойство InsertCommand адаптера хранимой процедурой (завернутой в SqlCommand), которая выполняет «обновление», эта настройка обеспечит обновление всех строк, присутствующих в таблице.
Основополагающим здесь является: DataAdapter запускает UpdateCommand в строках, для которых состояние обновлено, запускает InsertCommand для строк, которые содержат Inserted и, наконец, DeleteCommand для строк, для которых состояние Deleted.
Я имею дело с 1000/сек. Я могу обрабатывать добавление с помощью SQLBulkCopy, и удаленные могут быть объединены в одну команду («... where uniqueId in (...)»). Но обновления - проблема. Единственный способ, который я нашел для них, - это по одному. ... и да, это плохо работает. – dviljoen 2008-11-22 15:09:56