| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Базы данных под .NET > ADO .net получить слепок изменений в базе |
| Автор: Mr_Smith 26.9.2007, 16:49 |
| Здравствуйте. собственно сабж. делаю сервис который скажем каждый раз обращался бы к базе и получал от нее ТОЛЬКО ИЗМЕНЕННЫЕ ИЛИ ДОБАВЛЕННЫЕ данные по сравнению с его предыдущим сканированием базы. т.е. нужно получать только изменения в базе за текущие сутки я придумал делать так: 1. получаю все данные из базы и схему в датасет 2. сохраняю схему на диск и данные скажем в хмл как "данные на вчерашний момент.xml" а на следующий день делаю так 1. считываю схему в датасет и загружаю в него данные из "данные на вчерашний момент.xml" и применяю AcceptChanges 2. делаю запрос к базе чтоб получить все данные из базы, и, поскольку в датасет уже загруженна схема и данные на вчерашний день, то в датасет должны по идее попасть только те данные, которых не было на вчерашний день (схема просто не даст попасть тем записям, которые уже есть) я так думаю.... 3. раз все данные до сегодняшнего дня в датасете имеют статус Unchanged (после применения метода AcceptChanges), а новые которые только что долились должны, я думаю, иметь статус Added или там Modified, то вызов MyDataSetWith_Changes = DataBaseTillToday_Dataset.GetChanges() должен слить все изменения за сегодня, что и нужно, но так не работает. я подозреваю что после долива новые данные становятся не Added, а Unchanged и поэтому в MyDataSetWith_Changes ничего не попадает.... Скажите, как вообще можно получить текущий слепок данных? |
| Автор: thomas 26.9.2007, 17:01 | ||||
| Mr_Smith, Приветствую. Ты хочешь это
а делаешь это
Получается что ты каждый раз тянешь из базы все данные. Потому как при выполнении запроса к БД не важно есть данные в ДС или нет, я так думаю ... , и тянутся все данные указанные в запросе. Мне думается, раз ты задаешь периодичность обращения к базе за данными, так и используй в запросе на выборку параметр времени. Каждый раз база будет выдавать тебе данные, которые внесены в базу после "время Ч" - "периодичность". Соответственно в твоей БД должно быть поле типа тайм-стамп, в котором храниться время последнего редактирования записи. Всё. |
| Автор: Mr_Smith 26.9.2007, 17:09 |
| базу бы меньше всего хотелось бы трогать. я понимаю, что создание и логирование изменений в базе самое лучшее. про то что тяну каждый раз все данные - в моей пляске все вертится вокруг того, с каким стейтом они попадут в датасет: старые данные - как Unchanged, а новые(сегодняшние изменения) как Added или Modified и по этому признаку можно будет легко отколупнуть требуемое... |
| Автор: SLeN 26.9.2007, 19:54 | ||
| fill дата адаптера вызывает AcceptChanges по окончанию dataset.load() тоже можно попробывать вызвать дата ридер и в ручную заполнить датасет построчно P.S. Не могу придумать как по такому алгоритму находить удаленные записи ведь при загрузке удаленная запись останется как Unchanged хотя в данном вопросе поднимается -
|
| Автор: SLeN 27.9.2007, 02:57 | ||||
| ошибся я немного... в общем вот:
хотя можно и с дата ридером помудрить и определить собственную логику добавления |
| Автор: Mr_Smith 28.9.2007, 07:48 |
| ты на какой студии делал это? у меня на строку foreach ( DataRow row in ds.Tables[0].Rows) компиялтор грит что тот не поддерживает интерфейс перечисления |