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

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

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

Сообщение Osteon » 13.02.2013 (Ср) 11:19

Здравствуйте.
Работаю в WinXP SP3, с БД Access 2007, пишу на VB6.
Хочу на уровне тривиальной FileCopy сделать сохранение резервной копии БД автоматически при выходе из программы. Если БД не менялась, нет смысла загружать ресурсы сохранением не менявшейся БД (подразумевается, что при предыдущем выходе она уже была сохранена). Если делать глобальную переменную dbChange As Boolean в самой программе, может так статься, что БД то будет/то не будет изменяться, и каждый раз отслеживать переменную муторно. Существует ли функция Windows (типа API) для проверки на уровне операционной системы - был ли изменен файл *.mdb? Или по другому как? Если да - сделайте пару намеков, плиз...

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

Сообщение Qwertiy » 13.02.2013 (Ср) 12:23

Osteon писал(а):Существует ли функция Windows (типа API) для проверки на уровне операционной системы - был ли изменен файл

Есть.

Osteon писал(а):файл *.mdb

А доступ к файлу для копирования вообще будет?

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

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

Сообщение Osteon » 13.02.2013 (Ср) 15:33

Qwertiy писал(а):Есть.

Лаконично. :D
Qwertiy писал(а):А доступ к файлу для копирования вообще будет?

Конечно. Копирование будет происходить при выходе из программы, так что БД все равно закрывать.

Вообще, сам алгоритм представляю так: При запуске программы функция проверяет состояние файла БД, при выходе проверяет, была ли модификация файла. Ну, а дальше If ... Then ... End If :wink:

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

Сообщение Qwertiy » 13.02.2013 (Ср) 17:49

Osteon писал(а):Лаконично. :D

Не помню, надо гуглить. Можно мониторить файл на изменения.

PS: Незачем помещать такие вопросы в раздел по БД, т. к. к БД они никакого отношения не имеют.

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

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

Сообщение Osteon » 13.02.2013 (Ср) 18:55

Qwertiy писал(а):PS: Незачем помещать такие вопросы в раздел по БД, т. к. к БД они никакого отношения не имеют.

Извините, конечно... Просто вопрос относится к БД, вот я и поместил его сюда... :oops: Если модеры не против, пусть остается здесь, если же нет - пусть перенесут в нужный раздел...

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

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

Сообщение Osteon » 19.02.2013 (Вт) 10:36

Не лЮбите вы меня... :cry:

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

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

Сообщение iGrok » 19.02.2013 (Вт) 10:57

А я бы вместо мониторинга изменений через соответствующую API, сделал проще.

1) Проверить время последнего изменения файла.
2) Сравнить размер файла.
3) Если время изменилось, а размер нет - можно дополнительно считать хэш файла (или даже CRC32, для начала) (если там не несколько гигабайт, конечно), и сравнивать его.
label:
cli
jmp label

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

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

Сообщение Osteon » 21.02.2013 (Чт) 7:54

iGrok писал(а):А я бы вместо мониторинга изменений через соответствующую API, сделал проще.

1) Проверить время последнего изменения файла.
2) Сравнить размер файла.
3) Если время изменилось, а размер нет - можно дополнительно считать хэш файла (или даже CRC32, для начала) (если там не несколько гигабайт, конечно), и сравнивать его.


Нет, конечно не в гигах размер. А через какую API?

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

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

Сообщение Osteon » 21.02.2013 (Чт) 7:55

Можно примерчик для особо одаренных?

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

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

Сообщение Osteon » 21.02.2013 (Чт) 11:29

Как только идее дать пинка, тут же появляются мысли и побуждение к действию:
Найдено на http://www.script-coding.com/WSH/FileSystemObject.html

Код: Выделить всё
Private Sub Command2_Click()

    Dim FSO As Object, File As Object, str As String

    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set File = FSO.GetFile("C:\autoexec.bat")
    str = vbNullString
    str = str & "Дата создания - " & File.DateCreated & vbCrLf
    str = str & "Дата последнего доступа - " & File.DateLastAccessed & vbCrLf
    str = str & "Дата последней модификации - " & File.DateLastModified & vbCrLf
    str = str & "Диск - " & File.Drive.DriveLetter & vbCrLf
    str = str & "Имя - " & File.Name & vbCrLf
    str = str & "Родительский каталог - " & File.ParentFolder.Path & vbCrLf
    str = str & "Путь - " & File.Path & vbCrLf
    str = str & "Короткое имя - " & File.ShortName & vbCrLf
    str = str & "Путь в формате 8.3 - " & File.ShortPath & vbCrLf
    str = str & "Размер - " & File.Size & vbCrLf
    str = str & "Тип файла - " & File.Type
    MsgBox str
   
End Sub


Это, конечно, не API, но зато гораздо проще. Теперь, насколько я понимаю, нужно при входе в программу сохранить значение File.DateLastModified, затем, при выходе сравнить начальное значение и настоящее, то что при выходе. Так ли это?

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

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

Сообщение iGrok » 21.02.2013 (Чт) 12:17

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

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

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

Сообщение Qwertiy » 21.02.2013 (Чт) 12:19


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

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

Сообщение Osteon » 21.02.2013 (Чт) 13:19

iGrok писал(а):Т.е. сравнивать нужно не со значениями в момент старта, а с параметрами последней резервной копии.

Понял, спасибо.

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

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

Сообщение Osteon » 21.02.2013 (Чт) 13:26

Qwertiy писал(а):Ну зачем тут FSO?
И вообще: http://msdn.microsoft.com/en-us/library ... 65(v=vs.85).aspx.

Ой-йо... :shock: По мне - так FSO гораздо проще для моих целей... :roll:

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

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

Сообщение Osteon » 21.02.2013 (Чт) 13:28

Я айпишки-то недолюбливаю, а тут на уровне DWORD/LWORD... :cry:

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

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

Сообщение iGrok » 21.02.2013 (Чт) 17:57

Osteon писал(а):Я айпишки-то недолюбливаю, а тут на уровне DWORD/LWORD...
:mrgreen:
Нету никаких LWORD. :)
А делов-то, потратить один вечер, и перестать их недолюбивать...

Но в данном случае пользы от этой апи тебе действительно немного, т.к. не стоит задачи мониторить изменения и реагировать на них "в реальном времени".
А вот вместо FSO лучше, конечно, разобраться с API GetFileTime.
label:
cli
jmp label

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

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

Сообщение Osteon » 22.02.2013 (Пт) 7:59

iGrok писал(а):А вот вместо FSO лучше, конечно, разобраться с API GetFileTime.

Спасибо, буду разбираться. С наступающим! :D

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

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

Сообщение Osteon » 25.02.2013 (Пн) 13:52

iGrok писал(а):А вот вместо FSO лучше, конечно, разобраться с API GetFileTime.

А почему? Я без дураков, серьезно - чем API лучше FSO? :shock:

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

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

Сообщение Osteon » 25.02.2013 (Пн) 13:54

Нашел
iGrok писал(а):API GetFileTime.
, в общем-то, действительно, не самый сложный вариант. Вот только прежде чем выполнить GetFileTime, там еще несколько айпишек в довесок нужны...

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

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

Сообщение iGrok » 25.02.2013 (Пн) 15:01

Osteon писал(а):чем API лучше FSO?

Более соответствует принципу Бритвы Оккама. :)

Osteon писал(а):несколько айпишек

Айпи (IP) - это обозначение сетевого адреса и соответствующего протокола.
А мы тут, вроде как, апи (API) обсуждаем. :)

А так, да. CreateFile -> GetFileTime -> CloseHandle. Только ничего сложного в этом нет. Примеров в сети навалом, в каждом легко найти, что же именно нужно подставлять во всякие незнакомые параметры для CreateFile.
label:
cli
jmp label

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

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

Сообщение Osteon » 25.02.2013 (Пн) 16:27

iGrok писал(а):Более соответствует принципу Бритвы Оккама

Блин, тут не только в VB ума прибавляется! Теперь я знаю, что такое Бритва Оккама!!! :thumright:
iGrok писал(а):Айпи (IP) - это обозначение сетевого адреса и соответствующего протокола.
А мы тут, вроде как, апи (API) обсуждаем.

Это я переумничал... :P
iGrok писал(а):Только ничего сложного в этом нет. Примеров в сети навалом

Действительно. Уже нашел, уже реализовал свою задачу. СПАСИБО!

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

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

Сообщение Osteon » 26.02.2013 (Вт) 7:42

iGrok писал(а):CreateFile -> GetFileTime -> CloseHandle

Там еще FileTimeToSystemTime и FileTimeToLocalFileTime... :( Без них чегой-то не получается...

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

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

Сообщение iGrok » 26.02.2013 (Вт) 11:08

А зачем? У тебя два файла, оба локальные, у обоих одна "временная зона". Для обоих одинаковым способом получаешь время.
Вот и сравнивай спокойно сначала dwHighDateTime у полученных структур, а потом (если значения одинаковые) и dwLowDateTime.

А ещё лучше воспользуйся для этого CompareFileTime. :)
Последний раз редактировалось iGrok 26.02.2013 (Вт) 11:09, всего редактировалось 1 раз.
label:
cli
jmp label

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

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

Сообщение Osteon » 26.02.2013 (Вт) 14:49

iGrok писал(а):А ещё лучше воспользуйся для этого CompareFileTime

Как ты незаметно к ней подвел... :wink: Чую я, скоро крутым API-шником буду... :lol:

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

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

Сообщение Osteon » 26.02.2013 (Вт) 14:54

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

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

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

Сообщение iGrok » 26.02.2013 (Вт) 19:33

Нет.
iGrok писал(а):При выходе находишь последнюю имеющуюся у тебя резервную копию. Получаешь её размер и время последнего изменения.Получаешь размер и время последнего изменения текущей базы.Т.е. сравнивать нужно не со значениями в момент старта, а с параметрами последней резервной копии.
label:
cli
jmp label

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

Сообщение Qwertiy » 27.02.2013 (Ср) 8:20

Osteon писал(а):Общий алгоритм я понимаю так - при запуске программы с помощью GetFileTime я узнаю время последней модификации файла, сохраняю его где-нить, по окончании работы программы я так же, с помощью GetFileTime, снова узнаю время модификации, с помощью CompareFileTime сравниваю два значения, и в зависимости от результата предпринимаю определенные шаги?

Если база больше никак ментяться не должна, что можно и так. Иначе надо где-то хранить...

iGrok писал(а):При выходе находишь последнюю имеющуюся у тебя резервную копию. Получаешь её размер и время последнего изменения.

Хм.. Время изменения копии не будет совпадать со временем изменения базы...
Хотя, оно ведь будет больше, так что годится, наверное.

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

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

Сообщение Osteon » 27.02.2013 (Ср) 11:50

Уважаемые Академик VBStreets и Гуру!
Прошу вас проверить, правильно ли я все сделал? Может быть, немного не изящно, но, в принципе, работает. Единственное, что гложет - так ли организовано сохранение данных о времени изменения БД? По другому не дотумкиваю... :(

iGrok писал(а):Получаешь её размер и время последнего изменения.

Я решил не находить размер, думаю, что вполне достаточно времени изменения. В соответствии ли с той же "бритвой Оккама"... :wink: И хранить данные решил на диске, потому как не хочу расходовать ресурсы на удержание в памяти значений, которые, по сути, будут нужны только один раз.
У вас нет доступа для просмотра вложений в этом сообщении.

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

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

Сообщение HandKot » 28.02.2013 (Чт) 6:58

Osteon писал(а):Я решил не находить размер, думаю, что вполне достаточно времени изменения. В соответствии ли с той же "бритвой Оккама"... :wink: И хранить данные решил на диске, потому как не хочу расходовать ресурсы на удержание в памяти значений, которые, по сути, будут нужны только один раз.

а не будет ли время изменения файла временем последнего ее открытия ? :?:
I Have Nine Lives You Have One Only
THINK!

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

Сообщение Qwertiy » 28.02.2013 (Чт) 7:31

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

Оно же вроде является временем последней записи в файл, нет?

След.

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

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

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

    TopList