Die CurrentDb-Funktion und das Database-Objekt

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

Die Auflistung Containers

Sie haben das Ende des frei verfügbaren Textes erreicht. Möchten Sie ...

TestzugangOder bist Du bereits Abonnent? Dann logge Dich gleich hier ein. Die Zugangsdaten findest Du entweder in der aktuellen Print-Ausgabe auf Seite U2 oder beim Online-Abo in der E-Mail, die Du als Abonnent regelmäßig erhältst:

Schreibe einen Kommentar