Visual Basic - Technik, FAQ, Tricks, Beispiele

Home / Daten / Datenbank / Compact

Access-Datenbank komprimieren

Einleitung

Eine Access-Datenbank ist m.E. für viele Anwendungsbereiche durchaus ausreichend - sowohl von der Performance her als auch bei der Verarbeitung von größeren Datenmengen - wenn das Datenbank-Schema sinnvoll (also auch mit Indexen) aufgebaut ist und nicht zu viele Benutzer gleichzeitig darauf zugreifen.

Ein Nachteil der zugrundeliegenden MDB-Dateien ist jedoch das Verhalten, bei Löschungen nicht wirklich den benutzten Speicherbereich freizugeben. So kann eine MDB quasi bis ins Unendliche wachsen, obwohl immer nur ein Datensatz hinzugefügt und wieder gelöscht wird. Da dieses für die Performance nicht gerade gut ist, sollte die MDB regelmäßig komprimiert werden - am Besten natürlich automatisch.

Lösung

Die unten vorgestellte DBCompact-Funktion muss mit dem entsprechenden Pfad zur MDB aufgerufen werden. Optional kann das ggf. notwendige Password angegeben werden, sowie eine "Ruhezeit" (IdleTime, Default ist 1 Tag), welche angibt, wieviel Pause zwischen den einzelnen Komprimierungen liegen soll.

Ganz nebenbei erzeugt die Funktion eine Sicherheitskopie von "*.mdb" mit dem Suffix "*.mdb.bak", falls die Routine ohne Fehler durchläuft. Andernfalls liefert DBCompact übrigens False zurück.

Beispiele

Komprimierung einer ungeschützten Access-Datenbank, falls die letzte Komprimierung (sprich die Sicherheitskopie "*.mdb.bak") bereits ein Tag her ist:

If DBCompact("C:\Test\daten.mdb") Then
  MsgBox "Komprimierung OK oder unnötig"
Else
  MsgBox "Keine Komprimierung möglich"
End If

Komprimierung einer mit Password "willi" geschützten Access-Datenbank erzwingen, egal wann diese zuletzt komprimiert worden ist:

DBCompact "C:\Test\daten.mdb", "willi", 0

Komprimierung, falls letzte Komprimierung 2,5 Stunden her ist:

DBCompact "C:\Test\daten.mdb", , #02:30#

Komprimierung, falls letzte Komprimierung eine Woche her ist:

DBCompact "C:\Test\daten.mdb", IdleTime:=7

Code / Quelltext

Unter Projekt/Verweise (Project/References) muss das Häckchen vor der "Microsoft DAO Library" gesetzt werden, damit direkt auf die JetEngine zugegriffen werden kann. Die hier verwendete FileExists-Funktion ist übrigens im Artikel "Feststellen, ob Datei bzw. Verzeichnis existiert " zu finden.

Die größte Schwierigkeit ist der Aufruf der CompactDatabase-Methode der JetEngine, da hier immer eine Zieldatenbank genannt werden muss, die nicht mit der Quelldatenbank übereinstimmen darf:

Public Function DBCompact( _
    ByRef MDBPath As String, _
    Optional ByRef Password As String, _
    Optional ByVal IdleTime As Single = 1 _
  ) As Boolean
  'Deklarationen:
  Dim BackupPath As String
  Dim TempPath As String
  
  'Prüfen, ob noch in der "Ruhezeit":
  BackupPath = MDBPath & ".bak"
  If FileExists(BackupPath) Then
    If CSng(Now - FileDateTime(BackupPath)) < IdleTime Then
      DBCompact = True
      Exit Function
    End If
  End If
  
  'Ggf. Backup entfernen:
  On Error Resume Next
  Kill BackupPath
  
  'Datenbank "entführen":
  On Error Resume Next
  Name MDBPath As BackupPath
  If Err.Number = 0 Then
  
    'Datenbank komprimieren:
    TempPath = MDBPath & ".tmp"
    If Password = "" Then
      CompactDatabase BackupPath, TempPath
    Else
      CompactDatabase BackupPath, TempPath, , , ";PWD=" & Password
    End If
    
    'Ist die Komprimierung durchgelaufen?
    If Err.Number = 0 Then
      'Komprimierte DB zurückstellen:
      On Error GoTo 0
      Name TempPath As MDBPath
      DBCompact = True
    Else
      'Ursprüngliche DB zurückstellen:
      On Error GoTo 0
      Name BackupPath As MDBPath
    End If
  
  End If
End Function

© Jost Schwider, 07.09.2001-07.09.2001 - http://vb-tec.de/mdbcomp.htm