Wer in Access per VBA auf Datenbanken zugreift, nutzt meist die DAO-Bibliothek – oft ohne zu wissen, dass am Anfang der gesamten Objekthierarchie die „DBEngine“ steht. Sie repräsentiert die Datenbank-Engine selbst und bietet Zugriff auf Arbeitsbereiche, Verbindungen und globale Einstellungen. Dieser Beitrag stellt die wichtigsten Eigenschaften und Methoden der DBEngine-Klasse vor und zeigt anhand praktischer Beispiele, wie Sie diese gewinnbringend einsetzen.
Die DAO-Objekthierarchie
Die DAO-Bibliothek (Data Access Objects) organisiert ihre Objekte in einer festen Hierarchie. An der Wurzel steht die DBEngine-Klasse. Sie ist kein Objekt, das Sie explizit instanziieren müssen – VBA stellt es Ihnen über die DAO-Bibliothek automatisch als globale Instanz bereit. Die Hierarchie lautet vereinfacht: DBEngine – Workspace – Database – TableDef/QueryDef/Recordset.
Sie können DBEngine direkt ansprechen, ohne vorher ein Objekt zu deklarieren:
Debug.Print DBEngine.Version
Alternativ können Sie auch eine explizit typisierte Variable verwenden. Das verbessert die IntelliSense-Unterstützung:
Dim dbe As DAO.DBEngine Set dbe = DBEngine Debug.Print dbe.Version
Wichtige Eigenschaften der DBEngine
Die DBEngine-Klasse stellt eine Reihe von Eigenschaften zur Verfügung, über die Sie globale Einstellungen der Jet- bzw. ACE-Engine steuern können.
Version
Die Eigenschaft Version gibt die Versionsnummer der aktuell verwendeten DAO-Bibliothek als Zeichenkette zurück. Das ist nützlich, um zur Laufzeit zu ermitteln, mit welcher Engine die Anwendung arbeitet:
Debug.Print DBEngine.Version 'z.B. "16.0"
Der zurückgegebene Wert bezieht sich auf die DAO-Version, nicht auf die Access-Version. Für die Bibliothek Microsoft DAO 3.6 Object Library liefert sie beispielsweise den Wert 3.6, für die heute verwendete Microsoft Office 16.0 Access database engine Object Library den Wert 16.0. Damit lässt sich also einfach ermitteln, ob die alte oder die neue DAO-Bibliothek verwendet wird.
DefaultUser und DefaultPassword
Mit DefaultUser und DefaultPassword legen Sie fest, welche Anmeldedaten beim Öffnen von Datenbanken ohne explizite Angabe von Benutzername und Kennwort verwendet werden.
Diese Eigenschaften stammen noch aus der älteren Workgroup-Sicherheit von Access und sind in modernen Umgebungen kaum noch relevant, können aber beim Zugriff auf ältere gesicherte Datenbanken nützlich sein:
DBEngine.DefaultUser = "Admin" DBEngine.DefaultPassword = ""
Dies funktioniert nur mit der alten Workgroup-Security, die in .mdb-Dateien bis Access 2003 zum Einsatz kam, in .accdb-Dateien ist dies wirkungslos.
LoginTimeout
Die Eigenschaft LoginTimeout legt fest, wie viele Sekunden die Engine wartet, bevor ein Anmeldeversuch an einem ODBC-Server als fehlgeschlagen gilt. Der Standardwert beträgt 20 Sekunden.
In der Praxis ist die Wirkung dieser Eigenschaft jedoch begrenzt: Moderne ODBC-Treiber wie der ODBC Driver 17 for SQL Server haben eigene interne Verbindungs- und Retry-Timeouts, die Vorrang vor dem hier gesetzten Wert haben. So kann es vorkommen, dass trotz eines gesetzten Werts von 2 Sekunden erst nach 10 oder mehr Sekunden eine Fehlermeldung erscheint, weil der Treiber seinen eigenen Zyklus durchläuft.
Die Einstellung funktioniert auch nur für ODBC und andere externe Treiber, nicht für den direkten Zugriff über die ACE-Engine.
Es gibt zwar in ADODB ebenfalls eine Eigenschaft, deren Name verheißen lässt, dass man damit den Zeitpunkt eines Verbindungsabbruchs steuern könnte, jedoch funktioniert auch die dortige ConnectionTimeout-Eigenschaft nur bei einer sehr beschränkten Menge von Konstellationen zuverlässig. Das ist beispielsweise bei bestimmten falschen Angaben des Servernamens der Fall. In anderen Situationen schalten sich andere Automatismen dazwischen, die sich nicht durch die Einstellung der Zeit bis zum Verbindungsabbruch steuern lassen.
IniPath
Mit IniPath können Sie einen Registry-Pfad angeben, unter dem die Jet/ACE-Engine ihre Konfiguration liest. Normalerweise liest die Engine ihre Einstellungen aus dem Standardpfad in der Windows-Registry.
Über diese Eigenschaft können Sie einen alternativen Schlüssel angeben, um Engine-Parameter wie Cache-Größen oder Sperrmodi individuell zu konfigurieren. Dies ist ein fortgeschrittenes Thema, das hauptsächlich für Mehrbenutzerumgebungen mit speziellen Anforderungen interessant ist.
SystemDB
Die Eigenschaft SystemDB gibt den Pfad zur aktuell verwendeten Arbeitsgruppeninformationsdatei (.mdw) an. Diese Eigenschaft ist ein Relikt der älteren Access-Sicherheitsarchitektur. In modernen Anwendungen ohne Workgroup-Sicherheit hat sie keine praktische Bedeutung mehr. Sie können sie lesen, um zu prüfen, welche .mdw-Datei aktuell verwendet wird:
Debug.Print DBEngine.SystemDB
Workspaces-Auflistung
Die Workspaces-Auflistung enthält alle aktuell geöffneten Workspace-Objekte.
Standardmäßig enthält sie genau einen Eintrag: den Standardarbeitsbereich Workspaces(0). Über diesen gelangen Sie zur aktuellen Datenbank:
Dim ws As DAO.Workspace Set ws = DBEngine.Workspaces(0) Debug.Print ws.Name 'Ausgabe: #Default Workspace#
Wichtige Methoden der DBEngine
Neben den Eigenschaften bietet die DBEngine-Klasse mehrere Methoden, die direkt auf der Ebene der Engine operieren. Diese stellen wir in den folgenden Abschnitten vor.
OpenDatabase
Mit OpenDatabase öffnen Sie eine Datenbankdatei und erhalten ein Database-Objekt zurück. Die Methode hat folgende Signatur:
DBEngine.OpenDatabase(Name, [Exclusive], [ReadOnly], [Connect])
Der Parameter Name gibt den Pfad zur Datenbankdatei an. Exclusive legt fest, ob die Datenbank exklusiv geöffnet werden soll, ReadOnly schränkt den Zugriff auf Lesen ein.
Der optionale Parameter Connect ermöglicht die Übergabe einer Verbindungszeichenfolge für ODBC-Quellen.
Ein typisches Beispiel: Sie möchten aus VBA heraus eine externe Access-Datenbank öffnen, um dort Daten zu lesen, ohne diese als verknüpfte Tabelle einbinden zu müssen (siehe Listing 1).
Sub DatenAusExternerDB() Dim db As DAO.Database Dim rst As DAO.Recordset Dim strPfad As String strPfad = "C:\Daten\Archiv.accdb" Set db = DBEngine.OpenDatabase(strPfad, False, True) Set rst = db.OpenRecordset( _ "SELECT * FROM tblBestellungen", dbOpenSnapshot) Do While Not rst.EOF Debug.Print rst!BestellNr rst.MoveNext Loop rst.Close db.Close Set rst = Nothing Set db = Nothing End Sub
Listing 1: Die Prozedur DatenAusExternerDB
Beachten Sie: Die so geöffnete Datenbank ist von der aktuellen Access-Sitzung unabhängig und muss am Ende explizit mit Close geschlossen und das Objekt auf Nothing gesetzt werden.
CreateWorkspace
Mit CreateWorkspace können Sie einen neuen Arbeitsbereich anlegen. In der Praxis spielt diese Methode heute vor allem noch für Jet-/ACE-Arbeitsbereiche eine Rolle. Die Methode hat folgende Signatur:
DBEngine.CreateWorkspace(Name, UserName, Password, [UseType])
Der Parameter UseType legt den Typ des Arbeitsbereichs fest. Der Wert dbUseJet erstellt einen Jet-/ACE-Arbeitsbereich. Der frühere Wert dbUseODBC war für ODBCDirect vorgesehen, das in modernen DAO-Versionen nicht mehr unterstützt wird – die Verwendung führt sogar zu einem Fehler (siehe Bild 1).

Bild 1: Die Verwendung von dbUseODBC führt zu einem Fehler
Unabhängig davon steht über DBEngine.Workspaces(0) immer der Standardarbeitsbereich zur Verfügung, über den sich auch Transaktionen steuern lassen.
Transaktionen über Workspace steuern
Über DBEngine.Workspaces(0) können Sie auf den aktuellen Workspace zugreifen und darüber Transaktionen steuern. Transaktionen über dieses Workspace-Objekt sind besonders dann nützlich, wenn Sie sicherstellen möchten, dass mehrere Schreiboperationen entweder vollständig oder gar nicht ausgeführt werden. Im Fehlerfall sorgt Rollback dafür, dass keine halbfertigen Änderungen in der Datenbank verbleiben. Ein Beispiel sehen wir in Listing 2.
Sub TransaktionMitWorkspace() Dim ws As DAO.Workspace Dim db As DAO.Database Set ws = DBEngine.CreateWorkspace("MeinWS", "Admin", "", dbUseJet) Set db = ws.OpenDatabase(CurrentDb().Name) ws.BeginTrans On Error GoTo Fehler db.Execute "UPDATE tblArtikel SET Preis = Preis * 1.05 WHERE Kategorie = 'A'", dbFailOnError db.Execute "INSERT INTO tblPreishistorie (Datum, Faktor) VALUES (Date(), 1.05)", dbFailOnError ws.CommitTrans GoTo Ende Fehler: ws.Rollback MsgBox "Fehler: Transaktion zurückgerollt." Ende: db.Close ws.Close Set db = Nothing Set ws = Nothing End Sub
Listing 2: Die Prozedur TransaktionMitWorkspace
CompactDatabase
Die Methode CompactDatabase komprimiert eine Datenbankdatei und erstellt dabei eine neue, optimierte Kopie.
Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...
den kompletten Artikel im PDF-Format mit Beispieldatenbank
diesen und alle anderen Artikel mit dem Jahresabo
