Der Zugriff auf die Objekte der aktuellen Datenbank erfolgt in vielen Fällen über eine Objektvariable mit dem Datentyp Database. Diese wird dann mit der CurrentDb-Funktion gefüllt. Der Zugriff auf die aktuelle Datenbank kann dabei auch direkt über CurrentDb erfolgen. Dieser Beitrag liefert Informationen über die Eigenschaften und Methoden des Database-Objekts.
Die folgenden beiden Zeilen kommen wohl in jeder Datenbank vor, die in irgendeiner Form mit VBA-Code ausgestattet ist:
Dim db As DAO.Database Set db = CurrentDb
Die erste deklariert eine Objektvariable namens db auf Basis des Datentyps Database, die zweite weist dieser Objektvariablen mit der CurrentDB-Funktion einen Verweis auf das Database-Objekt der aktuellen Access-Instanz zu.
Aktuelles Abbild
In der Praxis können Sie das Database-Objekt mit der CurrentDb-Funktion füllen oder auch direkt über die CurrentDb-Funktion die Eigenschaften und Methoden des Database-Objekts der aktuellen Datenbank nutzen.
Es gibt allerdings einen entscheidenden Unterschied: Wenn Sie das aktuelle Database-Objekt einmal mit CurrentDb ermittelt und in einer Variablen wie db gespeichert haben, dann bekommen Sie änderungen, die direkt über die Methoden von CurrentDb oder einer anderen Objektvariablen des Typs Database vorgenommen wurden, nicht mehr mit. Das folgende Beispiel zeigt, wie das gemeint ist:
Dim db As DAO.Database Dim tdf As DAO.TableDef Dim fld As DAO.Field Set db = CurrentDb On Error Resume Next CurrentDb.TableDefs.Delete ("tblTest") On Error GoTo 0 Debug.Print "Tabellen vorher: " & db.TableDefs.Count Set tdf = CurrentDb.CreateTableDef("tblTest") Set fld = tdf.CreateField("ID", dbLong) tdf.Fields.Append fld Set fld = tdf.CreateField("Test", dbText) tdf.Fields.Append fld CurrentDb.TableDefs.Append tdf Debug.Print "Tabellen nachher CurrentDb: " & CurrentDb.TableDefs.Count Debug.Print "Tabellen nachher db: " & db.TableDefs.Count
Hier füllen wir die Variable db über CurrentDb mit dem aktuellen Database-Objekt. Dann geben wir die Anzahl der Tabellendefinitionen des Database-Objekts aus db über db.Table.Count im Direktfenster aus – bei einer frischen .accdb-Datenbank im Format von Access 2016 sind das beispielsweise 11.
Anschließend erstellen wir über die CreateTableDef-Methode direkt auf Basis der von CurrentDb gelieferten Database ein neues TableDef-Objekt, also eine neue Tabelle, und fügen dieser zwei Felder hinzu, bevor wir sie mit der Append-Methode der TableDefs-Auflistung hinzufügen. Schließlich geben wir erneut die Anzahl der TableDef-Objekte der in db gespeicherten Database und der mit CurrentDb ermittelten aktuellen Version im Direktfenster aus. Es zeigt sich, dass die in db gespeicherte Version der Datenbank die neue Tabellendefinition nicht enthält und somit tatsächlich nur einen Snapshot der Objekte liefert.
Sie sollten also beim Zugriff auf die Datenbank über das Database-Objekt berücksichtigen, dass eine per CurrentDb referenzierte Instanz möglicherweise einen veralteten Zustand liefert.
Aktualität bei Recordsets
Aber wie sieht das bei Recordsets aus – liefern diese auch in Abhängigkeit von CurrentDb/db unterschiedliche Ergebnismengen Das haben wir uns in der Prozedur aus Listing 1 angeschaut. Hier haben wir die Tabelle tblTest zunächst vollständig geleert. Dann haben wir ein Recordset-Objekt auf Basis des in der in der Variablen db gespeicherten Database-Objekts geöffnet und über die Execute-Methode des Database-Objekts aus db einen neuen Datensatz erstellt.
Public Sub TestDatenAktuell() Dim db As DAO.Database Dim rst As DAO.Recordset Set db = CurrentDb db.Execute "DELETE FROM tblTest", dbFailOnError Set rst = db.OpenRecordset("SELECT * FROM tblTest", dbOpenDynaset) Debug.Print "Anzahl vorher: " & rst.RecordCount db.Execute "INSERT INTO tblTest(Test) VALUES(''''Test'''')", dbFailOnError Debug.Print "Anzahl nachher: " & rst.RecordCount Debug.Print "Anzahl CurrentDb: " & CurrentDb.OpenRecordset("tblTest").RecordCount Debug.Print "Anzahl db/rst neu: " & db.OpenRecordset("tblTest").RecordCount End Sub
Listing 1: Test, wo neue Datensätze erfasst werden
Das Recordset rst enthält dann keine aktualisierten Daten und liefert den Wert 0 als Anzahl. Wenn wir die Anzahl über ein neues Recordset auf Basis von CurrentDb ermittelt, ist diese aktuell – genauso, wenn wir ein neues Recordset auf Basis von db erstellen. Sie können das Recordset also neu füllen und erhalten dann auch die aktuellen Daten, auch wenn db mit CurrentDb in einem älteren Zustand des Database-Objekts gefüllt wurde.
Eigenschaften und Methoden des Database-Objekts
Das mit CurrentDb gefüllte Database-Objekt und der Direktzugriff mit CurrentDb liefert die gleichen Eigenschaften und Methoden, die wir im Anschluss betrachten:
- Close: Schließt eine geöffnete Datenbank.
- CollatingOrder: Legt die Sortierung für Zeichenfolgen in Textfeldern fest.
- Connect: Liefert Informationen über die Verbindungszeichenfolge.
- Containers: Liefert die Auflistung der Container-Objekte.
- CreateProperty: Erstellt eine benutzerdefinierte Eigenschaft.
- CreateQueryDef: Erstellt ein QueryDef-Objekt, also eine Abfrage.
- CreateRelation: Erstellt ein Relation-Objekt, also eine Beziehung.
- CreateTableDef: Erstellt ein TableDef-Objekt, also eine Tabelle.
- Execute: Führt eine Aktionsabfrage durch.
- Name: Gibt Pfad und Name der Datenbank aus.
- NewPassword: ändert das Kennwort für die Datenbank.
- OpenRecordset: Erstellt ein neues Recordset.
- Properties: Liefert die Auflistung aller Property-Elemente des Database-Objekts.
- QueryDefs: Liefert eine Auflistung aller QueryDef-Objekte, also Abfragen
- QueryTimeout: Anzahl der Sekunden, die gewartet wird, bis ein Timeoutfehler auftritt, wenn eine Abfrage in einer ODBC-Datenquelle ausgeführt wird.
- RecordsAffected: Liefert die Anzahl der von der letzten in dieser Sitzung ausgeführten Aktionsabfrage betroffenen Datensätze.
- Recordsets: Liefert die Auflistung aller im Kontext des Database-Objekts geöffneten Recordset-Objekte.
- Relations: Liefert die Auflistung der Relations, also Beziehungen.
- TableDefs: Liefert die Auflistung der TableDef-Objekte der Datenbank, also der Tabellen.
- Transactions: Gibt an, ob die Datenbank Transaktionen unterstützt.
- Updatable: Gibt an, ob die Datenbank schreibgeschützt geöffnet ist.
- Version: Liefert die Version der Datenbank-Engine, mit der die Datenbank erstellt wurde.
- DesignMasterID, MakeReplica, PopulatePartial, ReplicaID, Synchronize: Eigenschaften für die Replikation, die seit Access 2013 nicht mehr unterstützt wird
Die Methode Close
Die Close-Methode schließt die aktuell geöffnete und mit dem Database-Objekt referenzierte Datenbank. Dies ist vor allem für Datenbanken interessant, die von einer geöffneten Datenbank aus per OpenDatabase geöffnet werden und dann wieder geschlossen werden sollen. Das folgende Beispiel öffnet eine Datenbank namens connect.accdb im aktuellen Datenbankverzeichnis:
Public Sub OpenAndClose() Dim db As DAO.Database Set db = DBEngine(0).OpenDatabase( CurrentProject.Path & "\connect.accdb") Stop db.Close End Sub
Dann wird die Ausführung mit der Stop-Anweisung unterbrochen. Sie können nun im Windows Explorer prüfen, ob die Datenbank wirklich geöffnet ist – in diesem Fall sollte dann eine zusätzliche Datei mit der Endung .laccdb erscheinen. Führen Sie die Prozedur weiter aus und rufen somit die Close-Methode des Database-Objekts auf, wird die Datenbank wieder geschlossen und die .laccdb-Datei verschwindet wieder.
Die Eigenschaft CollatingOrder
Diese Eigenschaft CollatingOrder legt die Sortierreihenfolge fest. Der Standardwert lautet dbSortGeneral (1033), was der Sortierung in den Sprachen Englisch, Französisch, Deutsch, Portugiesisch, Italienisch und modernem Spanisch entspricht.
Wenn Sie mit der CreateDatabase-Methode des Workspace-Objekts eine Datenbank erstellen und dabei mit dem Parameter Options einen anderen Wert übergeben, können Sie diesen später mit CollatingOrder auslesen:
DBEngine(0).CreateDatabase CurrentProject.Path & "\dutch.accdb", db_lang_dutch, dbversion120
Die CollatingOrder können Sie dann in der anschließend geöffneten Datenbank dutch.accdb wie folgt abfragen:
CurrentDb.CollatingOrder 1043
Die Eigenschaft Connect
Diese Eigenschaft liefert beispielsweise beim öffnen externer Dateien als Datenbank Informationen, die beim Verbinden über den Connect-Parameter angegeben wurden. Wenn Sie mit der OpenDatabase-Methode des Workspace-Objekts beispielsweise eine Excel-Datei wie die folgende öffnen, gibt die Connect-Eigenschaft den Wert des letzten Parameter aus – hier also etwa Excel 8.0;HDR=Yes:
Public Sub ConnectEigenschaft() Dim db As DAO.Database Set db = DBEngine.OpenDatabase(CurrentProject.Path & "\Excel.xlsx", False, True, "Excel 8.0;HDR=Yes;") Debug.Print db.Connect End Sub