Kontakt
DSVGO
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.
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.
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
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