Warum noch ein Access-Buch?
Für wen ist das Buch?
Jetzt bestellen
+ direkter Download des eBooks!
Nur EUR 59,95!
Fehler gefunden?
Bitte melden!
Wünsche an das Buch?
Her damit!
Was denken die Leser über dieses Buch?
Lesen Sie aktuelle Rezensionen!
Kapitel des noch nicht veröffentlichten Buchs zum Downloaden, Probelesen und Kommentieren
Beispieldatenbanken
Zusätzliches Material

Das Buch im HTML-Format

Für unbestimmte Zeit bieten Addison-Wesley und André Minhorst den kompletten Inhalt des Buchs als Download an. Schauen Sie rein und informieren Sie sich über den Inhalt! Und wenn Ihnen das Buch nützlich erscheint und Sie glauben, dass Sie etwas gelernt haben oder durch das Gelesene sogar etwas Zeit und somit Geld bei Ihrer Arbeit einsparen konnten, können Sie sich ja beim Autor und beim Verlag revanchieren - beispielsweise durch den Kauf dieses Buchs.

Am schönsten wäre es natürlich, wenn Sie das Buch direkt hier bestellen - Sie erhalten das Buch dann direkt vom Verlag, und der Autor und Verlag haben dann noch mehr davon, als wenn Sie es anderswo kaufen.

Danke für Ihr Interesse!

19.6 Sichern von Access- Datenbanken

19.6.1 Voraussetzungen und Vorbereitungen

Der optimale Zeitpunkt zum Sichern einer Datenbank ist der, an dem diese geschlossen ist. Sollte dies im Fall Ihrer Anwendung zu fest definierten Zeitpunkten der Fall sein (zum Beispiel nachts), steht einer automatischen Sicherung etwa durch einen geplanten Task nichts im Wege.

In allen anderen Fällen können die folgenden VBA-Routinen große Hilfe leisten - das Backup lässt sich hiermit auch zur Laufzeit durchführen.

Voraussetzung für die nachfolgend beschriebene Vorgehensweise zum Erstellen eines Backups ist, dass die zu sichernden Daten getrennt vom Frontend in einer Backend-Datenbank gehalten werden. Wie Sie dies realisieren, haben Sie bereits in Abschnitt 19.5, »Mehrbenutzerbetrieb mit Access-Datenbanken« dieses Kapitels erfahren.

Die erste Routine durchläuft alle geöffneten Objekte der aktuellen Datenbank und schließt sie gegebenenfalls. Dabei werden nur Tabellen, Abfragen, Formulare und Berichte sowie geöffnete Datensatzgruppen berücksichtigt.

Public Sub AlleObjekteSchliessen()

    Dim obj As Object
    Dim strTemp As String

    On Error Resume Next
    'Alle Formulare schließen
    For Each obj In Forms
        DoCmd.Close acForm, obj.Name, acSaveYes
    Next obj

    'Alle Berichte schließen
    For Each obj In Reports
        DoCmd.Close acReport, obj.Name, acSaveYes
    Next obj

    'Eventuell offene Tabellen oder Abfragen schließen
    Do
        strTemp = vbNullString
        strTemp = Screen.ActiveDatasheet.Name
        DoCmd.Close acTable, strTemp
        DoCmd.Close acQuery, strTemp
        DoEvents
    Loop Until Len(strTemp) = 0

    'Eventuell offene Recordsets schließen
    For Each obj In DBEngine(0)(0).Recordsets
        obj.Close
    Next obj

    Set obj = Nothing

End Sub

Listing 19.6: Schließen aller offenen Datenbankobjekte

Die zweite Routine beendet alle gegebenenfalls noch offenen Schreibvorgänge. Dazu startet sie eine Transaktion (weitere Informationen in Kapitel 9, Abschnitt 9.11, »Transaktionen«), um direkt im Anschluss alle begonnenen Transaktionen mit CommitTrans und der Option dbForceOSFlush zu beenden.

Das vorherige Starten einer Transaktion ist notwendig, weil CommitTrans einen Fehler erzeugt, wenn gar keine Transaktion läuft. Der anschließende Aufruf der Idle-Methode bewirkt, dass noch offene Hintergrundprozesse ausgeführt werden.

Private Sub SchreibvorgaengeBeenden()

    '"Nulltransaktion":
    'Eventuell ausstehende Schreibvorgänge erzwingen
    DBEngine.BeginTrans
    DBEngine.CommitTrans dbForceOSFlush

    'Datenbank-Engine "resetten":
    DBEngine.Idle
End Sub

Listing 19.7: Beenden der Schreibvorgänge

Schließlich muss geprüft werden, ob das Backend geschlossen ist - die vorhergehenden Routinen haben das für das aktuelle Frontend bereits erledigt, es könnten aber noch andere Benutzer das Backend im Zugriff haben. Das ist am einfachsten möglich, indem Sie die Existenz einer entsprechenden .laccdb-Datei nachweisen. Sie wird immer angelegt, wenn man eine Datenbank öffnet. Ist die Datei vorhanden, ist die Backend-Datenbank nicht geschlossen und kann dementsprechend auch nicht risikolos kopiert werden.

Außerdem muss die Backend-Datenbank für den exklusiven Zugriff vorbereitet sein, was Sie durch entsprechendes Öffnen prüfen.

Private Function BackendBereit(strBackend As String) As Boolean

    Dim strLDB

    If Len(Dir(strBackend)) = 0 Then Exit Function

    'Existenz des zugehörigen LDB-Files ermitteln
    strLDB = Left(strBackend, InStrRev(strBackend, ".") - 1) & ".LACCDB"
    If Len(Dir(strLDB)) = 0 Then BackendBereit = True
    On Error Resume Next

    'Zur Sicherheit Möglichkeit des Vollzugriff auf Backend ermitteln
    Open strBackend For Binary Access Read Lock Read Write As #1
    If Err.Number <> 0 Then BackendBereit = False
    Close #1

End Function

Listing 19.8: Prüfen, ob das Backend geschlossen und für den Vollzugriff vorbereitet ist

Public Function BackupErstellen(strBackend As String) As Boolean

    AlleObjekteSchliessen

    SchreibvorgaengeBeenden

    If BackendBereit(strBackend) Then
        'BackupErstellen = BackendKopieren(strBackend, strBackendKopie)
        '...        BackupErstellen = True
    Else
        MsgBox "Backend kann momentan nicht ausgeführt werden." & vbCrLf _
            & "Versuchen Sie es zu einem späteren Zeitpunkt."
    End If

End Function

Listing 19.9: Aufruf der vorherigen drei Routinen und Start des Backup-Vorgangs, wenn das Backend geschlossen und zugreifbar ist

Nächster Abschnitt:

19.6.2 Einfaches Kopieren mit FileCopy

© 2006-2008 André Minhorst Alle Rechte vorbehalten.