Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ADO .net получить слепок изменений в базе, как можно ли это получить ? 
V
    Опции темы
Mr_Smith
Дата 26.9.2007, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 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
PM MAIL ICQ   Вверх
thomas
Дата 26.9.2007, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 35
Всего: 65



Mr_Smith, 
Приветствую.
Ты хочешь это
Цитата

и получал от нее ТОЛЬКО ИЗМЕНЕННЫЕ ИЛИ ДОБАВЛЕННЫЕ данные по сравнению с его предыдущим сканированием базы.

а делаешь это
Цитата

1. считываю схему в датасет и загружаю в него данные из "данные на вчерашний момент.xml"
и применяю AcceptChanges
2. делаю запрос к базе чтоб получить все данные из базы, и, поскольку в датасет уже  загруженна схема и данные на вчерашний день, то в датасет должны по идее попасть только те данные, которых не было на вчерашний день (схема просто не даст попасть тем записям, которые уже есть) я так думаю....

Получается что ты каждый раз тянешь из базы все данные. Потому как при выполнении запроса к БД не важно есть данные в ДС или нет, я так думаю ... , и тянутся все данные указанные в запросе.

Мне думается, раз ты задаешь периодичность обращения к базе за данными, так и используй в запросе на выборку параметр времени. Каждый раз база будет выдавать тебе данные, которые внесены в базу после "время Ч" - "периодичность". Соответственно в твоей БД должно быть поле типа тайм-стамп, в котором храниться время последнего редактирования записи.
Всё.  smile 



--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
Mr_Smith
Дата 26.9.2007, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 27.4.2007

Репутация: нет
Всего: нет



базу бы меньше всего хотелось бы трогать. я понимаю, что создание и логирование изменений в базе самое лучшее.
про то что тяну каждый раз все данные  - в моей пляске все вертится вокруг того, с каким стейтом они попадут в датасет: старые данные - как Unchanged, а новые(сегодняшние изменения) как Added или Modified и по этому признаку можно будет легко отколупнуть требуемое...  
PM MAIL ICQ   Вверх
SLeN
Дата 26.9.2007, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 8.12.2006
Где: SPB

Репутация: 1
Всего: 4



fill дата адаптера вызывает AcceptChanges по окончанию dataset.load() тоже
можно попробывать вызвать дата ридер и в ручную заполнить датасет построчно 

P.S.
Не могу придумать как по такому алгоритму находить удаленные записи
ведь при загрузке удаленная запись останется как Unchanged
хотя в данном вопросе поднимается -
Цитата

ТОЛЬКО ИЗМЕНЕННЫЕ ИЛИ ДОБАВЛЕННЫЕ данные по сравнению с его предыдущим сканированием базы


Это сообщение отредактировал(а) SLeN - 26.9.2007, 20:08
--------------------
Православные не проходите мимо! Люди нуждаются в вас
PM MAIL   Вверх
SLeN
Дата 27.9.2007, 02:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 8.12.2006
Где: SPB

Репутация: 1
Всего: 4



ошибся я немного...
в общем вот:
Код

        SqlConnection con = new SqlConnection(conStr);
        DataSet ds = new DataSet();
        SqlCommand cmdSELECT = con.CreateCommand();
        cmdSELECT.CommandText = "SELECT * FROM Vendors";
        SqlDataAdapter da = new SqlDataAdapter(cmdSELECT);
        // заливаем схему и таблицу, в таблице обязателен примари кей
        da.FillSchema(ds, SchemaType.Source);
        da.Fill(ds);
        // изменяем таблицу в бд эмулируя действия ползователей в течении дня
        SqlCommand cmd = con.CreateCommand();
        cmd.CommandText = "INSERT INTO Vendors VALUES('111','111');";        
        con.Open();
        cmd.ExecuteNonQuery();
        cmd.CommandText = "UPDATE Vendors SET VendorName = 'A' WHERE VendorID = '3';";
        cmd.ExecuteNonQuery();
        con.Close();
        //!!!!!!!!!!!!!!!!!!!!!
        da.FillLoadOption = LoadOption.Upsert;           
        da.Fill(ds); 
        foreach ( DataRow row in ds.Tables[0].Rows)
        {
            Console.WriteLine(row[0].ToString() + "---" + row.RowState.ToString() );

        }

Цитата

Don's Database Design Shop ---Unchanged
Dave's Data ---Unchanged
A ---Modified
111 ---Added

хотя можно и с дата ридером помудрить и определить собственную логику добавления  smile 
--------------------
Православные не проходите мимо! Люди нуждаются в вас
PM MAIL   Вверх
Mr_Smith
Дата 28.9.2007, 07:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 27.4.2007

Репутация: нет
Всего: нет



ты на какой студии делал это?
у меня на строку foreach ( DataRow row in ds.Tables[0].Rows) компиялтор грит что тот не поддерживает интерфейс перечисления

PM MAIL ICQ   Вверх
Mr_Smith
Дата 2.10.2007, 07:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 27.4.2007

Репутация: нет
Всего: нет



а ларчик то просто открывается.. ))
чтобы получать изменения в базе нужны:
1. ПРАВИЛЬНО сконфигурированная схема (должны быть верно расставлены ограничения записей по первичному ключу)
2. слепок с данными до текущего момента (можно к примеру в хмл-файле хранить), который будет загружаться в датасет для сравнения версий данных.

Делается так все так:
1. в датасет загружается схема
2. в него же загружаются данные на вчерашний момент. делается AcceptChanges() к датасету.
3. в дата адаптере, который должен "доливать изменения" ставится da.AcceptChangesDuringFill = false;  , а потом уже da.Fill(myDS).
4. к датасету применяется метод myDS.GetChanges()
Вот собственно и все.


Цитата(SLeN @  26.9.2007,  19:54 Найти цитируемый пост)
P.S.
Не могу придумать как по такому алгоритму находить удаленные записи
ведь при загрузке удаленная запись останется как Unchanged


Тут на самом деле ничего хитрого нет. 
делается это так:
есть данные в датасете, и я долил новую порцию. Далее я иду по таблицам и смотрю - изменился ли индекс новой версии строки по сравнению с ее старым положением?
Если строка "поднялась", то это ОДНОЗНАЧНО говорит о том, что строки перед этой были удалены.
Остается только удалить их в датасете.


Это сообщение отредактировал(а) Mr_Smith - 2.10.2007, 07:57
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Базы данных под .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0492 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.