Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Резервное копирование БД
 
 автор: zhebov_andrey   (13.05.2009 в 11:55)   личное сообщение
 
 

В меню сервис есть команда "резервное копирование БД", хочу сделать в главной кнопочной форме кнопку с такой же командой. Хочу сделать через макрос, только что то не нашел такой...Нашел только ВыполнитьКоманду/Резервирование, но это вроде не то...

PS Еще есть задумка сделать резервное копирование при закрытии базы... Например пользователь после внесения данных нажимает кнопку выход из программы в главной кнопочной форме (а он может выйти только через кнопку на форме, т к кнопка Аccess не активна) на что выходило бы сообщение "Выполнить резервное копирование БД?" и кнопки "да", "нет". Если да то запускается макрос, если нет то выход из программы...
Подскажите как этот макрос создать???

  Ответить  
 
 автор: osmor   (13.05.2009 в 12:15)   личное сообщение
 
 


Public Sub CreateBackUp()
Dim strDBPath As String
Dim fso As Object
If MsgBox("Создать резервную копию БД ?", _
            vbYesNo Or vbQuestion Or vbDefaultButton1, _
            "Создание резервной копии") = vbYes Then
    strDBPath = CurrentDb.Name
    Set fso = CreateObject("Scripting.FileSystemObject")
    fso.CopyFile strDBPath, Left(strDBPath, Len(strDBPath) - 3) & "bak"
End If
Application.Quit acQuitSaveAll
End Sub


только для варианта когда таблицы и код в одной базе

  Ответить  
 
 автор: zhebov_andrey   (13.05.2009 в 14:15)   личное сообщение
 
 

Чет не работает, может я не так делаю??? Это нужно на кнопку повесить??? Или модуль создать???
Можно примерчик небольшой???

  Ответить  
 
 автор: mvo   (07.04.2010 в 00:09)   личное сообщение
 
 

А код кнопки востановления с резервной копии?

  Ответить  
 
 автор: mvo   (07.04.2010 в 00:10)   личное сообщение
 
 

А как сделать чтобы в форме можно было указывать место для резервной копии. А имя копии состояло с даты копирования.

  Ответить  
 
 автор: АлексейЕ   (13.05.2009 в 12:32)   личное сообщение
 
 

Программное сжатие mdb файла

Описание: Принцип работы кода:
- Запускается функция GetCompactReclaimedSpaceAmount с указанием в параметре имени и пути сжимаемого файла.
1. Проверяем существование файла и формируем имя для временного файла (используем Microsoft Windows Script Host (WSH))
2. Оценим размер высвобождаемого пространства (используем библиотеку ADO (Microsoft ActiveX Data Object))
3. Проверим, все ли отключились от базы (опять ADO)
4. Проведем сжатие базы в новый файл (Microsoft Jet OLE DB Provider и Replication Objects (JRO))
5. Производим замену старого файла на новый.

Использовал позднее связывание, так что должен работать без установленных ссылок на соответствующие библиотеки.

Public Function GetCompactReclaimedSpaceAmount(strFileName As String)
Const cstrConnectionString  As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="

Dim strNameFileNew          As String

Dim lngValue                As Long
Dim strMsg                  As String

Dim JRO                     As Object
Dim File                    As Object
Dim cnn                     As Object

On Error Resume Next

    'Проверям наличие файла для сжатия
    Set File = CreateObject("Scripting.FileSystemObject").GetFile(strFileName)
    If Err.Number <> 0 Then MsgBox "Файл не существует":    Exit Function
    
    'Формируем имя для временного файла
    strNameFileNew = File.ParentFolder.Path & "\~" & File.Name
    Set File = Nothing

    '======= Оценим размер высвобождаемого пространства
    
    Set cnn = CreateObject("ADODB.Connection")
    cnn.Open cstrConnectionString & strFileName
    lngValue = cnn.Properties("Jet OLEDB:Compact Reclaimed Space Amount").Value
    cnn.Close:      Set cnn = Nothing
    
    If lngValue = 0 Then MsgBox ("Сжатие не требуется."):   Exit Function
        
    Select Case True
    Case lngValue < 1024
        strMsg = Format$(lngValue, "# ##0.00") & " байт"
    Case lngValue < 1048576
        strMsg = Format$(lngValue / 1024, "# ##0.00") & " кб."
    Case Else
        strMsg = Format$(lngValue / 1048576, "# ##0.00") & " мб."
    End Select
    
    strMsg = "При сжатии будет высвобождено " & strMsg & Chr(13) & Chr(10) & "Будем сжимать?"
    
    If (MsgBox(strMsg, vbYesNo) <> vbYes) Then Exit Function
    
    '======= Проверим, все ли отключились от базы
    
    If ExistsConnectedUser(strFileName) Then
         MsgBox "Не все пользователи отключились от базы."
        Exit Function
    End If

    '====== Проведем сжатие базы в новый файл
    'Удалим файл с именем временного файла
    Set File = CreateObject("Scripting.FileSystemObject").GetFile(strNameFileNew)
    If Err.Number = 0 Then
        File.Delete
        Set File = Nothing
    Else
        Err.Clear
    End If
    
    'Проведем сжатие
    Set JRO = CreateObject("JRO.JetEngine")
    JRO.CompactDatabase cstrConnectionString & strFileName, cstrConnectionString & strNameFileNew
   
   '====== Заменим файлов.
   
    If Not (ExistsConnectedUser(strFileName)) Then
        Set File = CreateObject("Scripting.FileSystemObject").GetFile(strNameFileNew)
        File.Copy strFileName, True
        File.Delete
    End If

End Function

'Функция проверяет имеются ли пользователи подключенные к базе
Public Function ExistsConnectedUser(strFileName As String) As Boolean
Dim cnn As Object     'As New ADODB.Connection
Dim rst As Object     'As ADODB.Recordset

    Set cnn = CreateObject("ADODB.Connection")
    cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFileName
    Set rst = cnn.OpenSchema(-1, , "{947bb102-5d43-11d1-bdbf-00c04fb92675}")
    
    rst.MoveNext
    ExistsConnectedUser = Not rst.EOF
    
    rst.Close:      Set rst = Nothing
    cnn.Close:      Set cnn = Nothing
End Function 



Дополню немножко
Замечание - данный код тестировался и работает на Access 2003. На 2002 и 2000 не тестировался, но должен работать.
Для Access 2007 необходимо внести некоторые изменения.

1.
Const cstrConnectionString  As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="

заменить на
Const cstrConnectionString  As String = " Provider=Microsoft.ACE.OLEDB.12.0;Data Source="



2.
JRO.CompactDatabase cstrConnectionString & strFileName, cstrConnectionString & strNameFileNew

заменить на
JRO.CompactDatabase _
cstrConnectionString & strFileName & ";Jet OLEDB:Engine Type=5", _
cstrConnectionString & strNameFileNew & ";Jet OLEDB:Engine Type=5"

(в принципе, Engine Type по умолчанию равем 5, и почему это не работае в 2007?... Не понятно.)

3.
cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFileName

заменить на
cnn.Open "Provider= Microsoft.ACE.OLEDB.12.0;Data Source=" & strFileName

  Ответить  
 
 автор: osmor   (13.05.2009 в 12:43)   личное сообщение
 
 

офигеть....

  Ответить  
 
 автор: Дрюня   (13.05.2009 в 12:57)   личное сообщение
 
 


офигеть....


в хорошем смысле ?
вроде как вопрос был про создание резервного архива, а не программное сжатие БД ?

  Ответить  
 
 автор: АлексейЕ   (13.05.2009 в 13:16)   личное сообщение
 
 

Да, пардон...
Обшибся...

Но, с другой стороны, для резервного копирования так же требуется что бы все пользователи отключились от базы.
Этот кусок кода моно использовать. :)

  Ответить  
 
 автор: osmor   (13.05.2009 в 14:27)   личное сообщение
 
 

Однозначно в хорошем

  Ответить  
 
 автор: Анатолий (Киев)   (13.05.2009 в 15:56)   личное сообщение
 
 

А можно поворчать?
ИМХО, в серьезной БД таблицы должны быть в отдельном файле. И резервную копию нужно делать для таблиц. При условии, что обращения к таблицам нет, сжатую копию можно сделать одной строчкой:
DBEngine.CompactDatabase ...
Ну еще обработка ошибок.

  Ответить  
 
 автор: Lukas   (13.05.2009 в 16:08)   личное сообщение
 
 

Эх, вот если бы еще одной строчкой "отогнать" всех пользователей от файла данных...
PS. Вчера с утра приехал за новой порцией "хочушек", так у половины пользователей на длинные выходные оставлены включенными ПК с открытыми интерфейсами к файлу БД. При условии, что свет у них моргает аккурат 3-4 раза на дню. Б... (далее непереводимый итальянский фольклор с использованием местных идиоматических выражений).

  Ответить  
 
 автор: zhebov_andrey   (13.05.2009 в 16:30)   личное сообщение
 
 

Повторюсь...


...А можно примерчик небольшой???


просто форму с кнопкой которая запускает резервное копирование данных...

  Ответить  
 
 автор: Palarm   (13.05.2009 в 19:51)   личное сообщение
 
 

Тут

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList