2008-10-01 4 views
3

Каков наилучший подход к синхронизации DataSet с данными в базе данных? Вот параметры:Синхронизация DataSet

  • Мы не можем просто перезагрузить данные, потому что он привязан к элементу управления пользовательского интерфейса, которые пользователь может настроить (это дерево сетки, что они могут развернуть/свернуть)
  • Мы можем» t использовать changeflag (например, UpdateTimeStamp) в базе данных, потому что изменения не всегда текут через приложение (например, DBA может обновлять поле с помощью инструкции SQL)
  • Мы не можем использовать триггер обновления в базе данных, потому что это многопользовательская система
  • Мы используем ADO.NET DataSets
  • Несколько fi поля могут меняться в заданном ряду

Я просмотрел возможность слияния DataSet, но это, похоже, не содержит понятия столбца «ID». Я посмотрел возможности DiffGram, но проблема здесь заключается в том, что они, похоже, генерируются из изменений внутри одного и того же набора данных, а не из-за изменений, происшедших на каком-то внешнем источнике данных.

Я некоторое время работал с этим решением, но подход, который, как я знаю, будет работать (с большим количеством неэффективности), заключается в создании отдельного DataSet, а затем повторении всех строк, применяющих изменения, поля по полю, к DataSet на котором он связан.

У кого-нибудь был похожий сценарий? Что вы сделали для решения проблемы? Даже если вы не сталкивались с подобной проблемой, любая рекомендация для решения оценивается.

Благодаря

ответ

1

DataSet.Merge хорошо работает для этого , если у вас есть первичный ключ, определенный для каждого DataTable; DataSet поднимет измененные события на любые элементы управления графическим интерфейсом

, если ваша таблица мала, вы можете просто перечитать все строки и слить их периодически, в противном случае ограничение набора, которое нужно читать с отметкой времени, является хорошей идеей - просто сообщите администраторам баз данных о соблюдении правил и обновите временную метку ;-)

Другой вариант - который немного работает - заключается в том, чтобы сохранить очередь с измененной строкой (временную метку, идентификатор строки) с помощью триггера или хранимой процедуры и запустите обновления запросов от метки времени в очереди; это будет более эффективно, если базовая таблица содержит много строк, позволяя вам (через внутреннее соединение в записи очереди) вытаскивать только измененные строки со времени последнего опроса.

0

Я думаю, было бы легче хранить список узлов, которые пользователь вспененных (если вы можете однозначно идентифицировать каждый из них), а затем повторно загрузить данные и вновь привязать его к tree view, а затем развернуть все ранее расшитые узлы.