Как узнать через API - изменялась ли БД?

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
Osteon
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 122
Зарегистрирован: 17.01.2013 (Чт) 5:53

Re: Как узнать через API - изменялась ли БД?

Сообщение Osteon » 28.02.2013 (Чт) 8:51

HandKot писал(а):а не будет ли время изменения файла временем последнего ее открытия ?

А разве открытие и изменение - не разные вещи? Можно ведь открыть ReadOnly. Я пробовал просто открывать файл, не изменяя его, CompareFileTime разницы не видит. Правда, файл текстовый, тот, что я в предыдущем посту приложил. Не знаю, если открыть БД, не изменяя ее, будет ли так же. как поэкспериментирую - доложусь.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 28.02.2013 (Чт) 10:43

Вообще, я бы смотрел размер и хэш по необходимости...

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Как узнать через API - изменялась ли БД?

Сообщение iGrok » 28.02.2013 (Чт) 15:07

HandKot писал(а):а не будет ли время изменения файла временем последнего ее открытия ? :?:

Время изменения не будет временем последнего открытия, если только при открытии бд СУБД не пишет в файл никаких дополнительных меток.

Qwertiy писал(а):Вообще, я бы смотрел размер и хэш по необходимости...

Собственно, я изначально и написал, что желательно учитывать три параметра - время изменения, размер, хэш.
Если время не менялось, то всё ок, и ничего копировать точно не нужно. Если изменилось, можно дополнительно проверить размер и хэш.
label:
cli
jmp label

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 28.02.2013 (Чт) 17:26

iGrok писал(а):Собственно, я изначально и написал, что желательно учитывать три параметра - время изменения, размер, хэш.
Если время не менялось, то всё ок, и ничего копировать точно не нужно. Если изменилось, можно дополнительно проверить размер и хэш.

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

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Как узнать через API - изменялась ли БД?

Сообщение iGrok » 28.02.2013 (Чт) 19:24

Честно говоря, не вижу большой разницы. Оба параметра получаются за сравнимое время.

При этом я не представляю ситуации, при которой файл изменился, а метка времени осталась старой. А вот ситуацию, при которой файл изменился, а размер нет - запросто. Тем более с учётом того, что речь идёт о БД.

Хэш, конечно, решает. Для скорости можно применять "двойное" хэширование - crc32 для быстрого сравнения, и md5/sha1 для точного - в случае совпадения crc32.
label:
cli
jmp label

HandKot
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 28.06.2006 (Ср) 13:34
Откуда: Sergiev Posad

Re: Как узнать через API - изменялась ли БД?

Сообщение HandKot » 01.03.2013 (Пт) 7:01

iGrok писал(а):
HandKot писал(а):а не будет ли время изменения файла временем последнего ее открытия ? :?:

Время изменения не будет временем последнего открытия, если только при открытии бд СУБД не пишет в файл никаких дополнительных меток.


вот об этом я и говорю, я просто открывал базу в акцес и тут же ее закрывал. в св-вах файла (через проводник) время изменения было временем последнего открытия. получается субд при открытии что-то с файлом делает и просто предложил проверить это уже в проекте
I Have Nine Lives You Have One Only
THINK!

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Как узнать через API - изменялась ли БД?

Сообщение iGrok » 01.03.2013 (Пт) 16:26

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

Скорее всего, хэш при этом тоже изменится. Не станет же СУБД писать в файл не изменившуюся информацию? Проверить бы...
label:
cli
jmp label

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Как узнать через API - изменялась ли БД?

Сообщение FireFenix » 03.03.2013 (Вс) 3:33

iGrok писал(а):Не станет же СУБД писать в файл не изменившуюся информацию? Проверить бы...

Если в ходе некоторых измнений информация в БД приходит к изначальному виду?
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Как узнать через API - изменялась ли БД?

Сообщение iGrok » 03.03.2013 (Вс) 4:12

FireFenix писал(а):Если в ходе некоторых измнений информация в БД приходит к изначальному виду?

Вероятность прикинул? :)
label:
cli
jmp label

Osteon
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 122
Зарегистрирован: 17.01.2013 (Чт) 5:53

Re: Как узнать через API - изменялась ли БД?

Сообщение Osteon » 04.03.2013 (Пн) 20:10

Ответственно заявляю: погонял то, что я выложил на суд гуру и академика (правда, оценок их так и не дождался). При открытии БД, а потом выходе из программы, не модифицируя БД, сравнивая результат GetFileTime до открытия и после открытия БД, CompareFileTime возвращает "0", т.е., разницы не видит. Ну. а после модификации - видит, естессно...

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Как узнать через API - изменялась ли БД?

Сообщение iGrok » 05.03.2013 (Вт) 1:38

Дык а чего там оценивать-то? Три строчки? :)

Но вообще, код некорректен:

GetFileTime lngHandle, udtFileTime, udtFileTime, udtFileTime
Какое именно время ты в итоге получишь в udtFileTime - большая загадка. Создай три переменных, udtCreationTime, udtLastAccessTime, udtLastWriteTime, подставляй все три, в работе используй только последнее значение.

Почему GENERIC_WRITE, если по сути ты в файл ничего не пишешь? Либо GENERIC_READ, либо уж сразу GENERIC_READ Or GENERIC_WRITE.

Зачем нужна канитель с сохранением времени в текстовый файл, и считыванием обратно - вообще не понимаю.

Ну и на всякий случай, у тебя там один и тот же файл читается, а речь шла о том, что нужно смотреть время у последней копии, а не у того же файла в момент запуска.
label:
cli
jmp label

Osteon
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 122
Зарегистрирован: 17.01.2013 (Чт) 5:53

Re: Как узнать через API - изменялась ли БД?

Сообщение Osteon » 06.03.2013 (Ср) 5:52

iGrok писал(а):Дык а чего там оценивать-то? Три строчки?

Вам поровну, а мне приятно... :P
iGrok писал(а):Но вообще, код некорректен:

Я об этом тоже уже подумал. В окончательной версии у меня три разных переменных As FILETIME.
iGrok писал(а):Зачем нужна канитель с сохранением времени в текстовый файл, и считыванием обратно - вообще не понимаю.

Я думал о том, чтобы хранить значение в глобальной переменной As Boolean, но подумал, что все время работы программы она будет занимать определенную ячейку памяти. В общем - нерационально, подумал я. А как, по-Вашему, оптимальней?
iGrok писал(а):у тебя там один и тот же файл читается, а речь шла о том, что нужно смотреть время у последней копии

Это я помню, я предоставил на оценку только сам алгоритм пользования функцией.
iGrok писал(а):Либо GENERIC_READ, либо уж сразу GENERIC_READ Or GENERIC_WRITE.

И самое главное - это о чем речь? Извините... :oops:

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Как узнать через API - изменялась ли БД?

Сообщение iGrok » 06.03.2013 (Ср) 14:07

Osteon писал(а):А как, по-Вашему, оптимальней?

Ну, раз ты читаешь время у последней копии, а не у текущей базы, то зачем его вообще хранить во время работы программы? Перед самым выходом считал параметры обоих файлов, сравнил, если отличаются - сделал новую копию. Всё.

Osteon писал(а):это о чем речь?

А самому на константы в коде взглянуть, и подумать немного? :)
Речь о режиме доступа к файлу в CreateFile. Ты зачем-то запрашиваешь запись в файл, тогда как ты его только читаешь (хотя на деле даже не читаешь). Общепринятым является набор GENERIC_READ Or GENERIC_WRITE, если не нужны ограничения. Одна из двух констант указывается только тогда, когда нужно запретить чтение (GENERIC_WRITE) или запись (GENERIC_READ).
label:
cli
jmp label

Osteon
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 122
Зарегистрирован: 17.01.2013 (Чт) 5:53

Re: Как узнать через API - изменялась ли БД?

Сообщение Osteon » 07.03.2013 (Чт) 5:15

iGrok писал(а):Перед самым выходом считал параметры обоих файлов, сравнил, если отличаются - сделал новую копию. Всё.

Не подумал как-то... :oops:
iGrok писал(а):А самому на константы в коде взглянуть, и подумать немного?

Несмотря на то, что у меня получилось поюзать API, я все равно их побаиваюсь, потому и думы мои на базе страха замораживаются... :? :) Теперь более-менее... Когда за спиной вся мощь интеллекта товарища, как-то спокойнее. :D
Огромное спасибо за помощь!!!

brigval
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 176
Зарегистрирован: 16.10.2005 (Вс) 12:37
Откуда: Подмосковье

Re: Как узнать через API - изменялась ли БД?

Сообщение brigval » 25.03.2013 (Пн) 10:17

Osteon писал(а):Здравствуйте.
Работаю в WinXP SP3, с БД Access 2007, пишу на VB6.
Хочу на уровне тривиальной FileCopy сделать сохранение резервной копии БД автоматически при выходе из программы. Если БД не менялась,

Если программа не обращалась к БД или не вносила в нее значимые изменения, значит БД не менялась.
brigval

Пред.

Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 23

    TopList