![]() |
|
Модераторы: gambit |
![]()
|
|
| Mr_Smith |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 27.4.2007 Репутация: нет Всего: нет |
Здравствуйте. собственно сабж. делаю сервис который скажем каждый раз обращался бы к базе и получал от нее ТОЛЬКО ИЗМЕНЕННЫЕ ИЛИ ДОБАВЛЕННЫЕ данные по сравнению с его предыдущим сканированием базы.
т.е. нужно получать только изменения в базе за текущие сутки я придумал делать так: 1. получаю все данные из базы и схему в датасет 2. сохраняю схему на диск и данные скажем в хмл как "данные на вчерашний момент.xml" а на следующий день делаю так 1. считываю схему в датасет и загружаю в него данные из "данные на вчерашний момент.xml" и применяю AcceptChanges 2. делаю запрос к базе чтоб получить все данные из базы, и, поскольку в датасет уже загруженна схема и данные на вчерашний день, то в датасет должны по идее попасть только те данные, которых не было на вчерашний день (схема просто не даст попасть тем записям, которые уже есть) я так думаю.... 3. раз все данные до сегодняшнего дня в датасете имеют статус Unchanged (после применения метода AcceptChanges), а новые которые только что долились должны, я думаю, иметь статус Added или там Modified, то вызов MyDataSetWith_Changes = DataBaseTillToday_Dataset.GetChanges() должен слить все изменения за сегодня, что и нужно, но так не работает. я подозреваю что после долива новые данные становятся не Added, а Unchanged и поэтому в MyDataSetWith_Changes ничего не попадает.... Скажите, как вообще можно получить текущий слепок данных? Это сообщение отредактировал(а) Mr_Smith - 26.9.2007, 16:52 |
|||
|
||||
| thomas |
|
||||
![]() Доцент... почти ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1385 Регистрация: 3.10.2006 Где: " Сказочное королевство" Репутация: 35 Всего: 65 |
Mr_Smith,
Приветствую. Ты хочешь это
а делаешь это
Получается что ты каждый раз тянешь из базы все данные. Потому как при выполнении запроса к БД не важно есть данные в ДС или нет, я так думаю ... , и тянутся все данные указанные в запросе. Мне думается, раз ты задаешь периодичность обращения к базе за данными, так и используй в запросе на выборку параметр времени. Каждый раз база будет выдавать тебе данные, которые внесены в базу после "время Ч" - "периодичность". Соответственно в твоей БД должно быть поле типа тайм-стамп, в котором храниться время последнего редактирования записи. Всё. -------------------- Крепко жму горло, искренне ваш Thomas. (С)vingrad Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну! Проблемы негров шерифа не волнуют. |
||||
|
|||||
| Mr_Smith |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 27.4.2007 Репутация: нет Всего: нет |
базу бы меньше всего хотелось бы трогать. я понимаю, что создание и логирование изменений в базе самое лучшее.
про то что тяну каждый раз все данные - в моей пляске все вертится вокруг того, с каким стейтом они попадут в датасет: старые данные - как Unchanged, а новые(сегодняшние изменения) как Added или Modified и по этому признаку можно будет легко отколупнуть требуемое... |
|||
|
||||
| SLeN |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 137 Регистрация: 8.12.2006 Где: SPB Репутация: 1 Всего: 4 |
fill дата адаптера вызывает AcceptChanges по окончанию dataset.load() тоже
можно попробывать вызвать дата ридер и в ручную заполнить датасет построчно P.S. Не могу придумать как по такому алгоритму находить удаленные записи ведь при загрузке удаленная запись останется как Unchanged хотя в данном вопросе поднимается -
Это сообщение отредактировал(а) SLeN - 26.9.2007, 20:08 --------------------
Православные не проходите мимо! Люди нуждаются в вас |
|||
|
||||
| SLeN |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 137 Регистрация: 8.12.2006 Где: SPB Репутация: 1 Всего: 4 |
ошибся я немного...
в общем вот:
хотя можно и с дата ридером помудрить и определить собственную логику добавления --------------------
Православные не проходите мимо! Люди нуждаются в вас |
||||
|
|||||
| Mr_Smith |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 27.4.2007 Репутация: нет Всего: нет |
ты на какой студии делал это?
у меня на строку foreach ( DataRow row in ds.Tables[0].Rows) компиялтор грит что тот не поддерживает интерфейс перечисления |
|||
|
||||
| Mr_Smith |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 27.4.2007 Репутация: нет Всего: нет |
а ларчик то просто открывается.. ))
чтобы получать изменения в базе нужны: 1. ПРАВИЛЬНО сконфигурированная схема (должны быть верно расставлены ограничения записей по первичному ключу) 2. слепок с данными до текущего момента (можно к примеру в хмл-файле хранить), который будет загружаться в датасет для сравнения версий данных. Делается так все так: 1. в датасет загружается схема 2. в него же загружаются данные на вчерашний момент. делается AcceptChanges() к датасету. 3. в дата адаптере, который должен "доливать изменения" ставится da.AcceptChangesDuringFill = false; , а потом уже da.Fill(myDS). 4. к датасету применяется метод myDS.GetChanges() Вот собственно и все.
Тут на самом деле ничего хитрого нет. делается это так: есть данные в датасете, и я долил новую порцию. Далее я иду по таблицам и смотрю - изменился ли индекс новой версии строки по сравнению с ее старым положением? Если строка "поднялась", то это ОДНОЗНАЧНО говорит о том, что строки перед этой были удалены. Остается только удалить их в датасете. Это сообщение отредактировал(а) Mr_Smith - 2.10.2007, 07:57 |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Базы данных под .NET | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |