Die CurrentDb-Funktion und das Database-Objekt

Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.

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

Die Containers-Auflistung bietet neben den Auflistungsobjekten die beiden folgenden Methoden:

  • Count: Liefert die Anzahl der Container-Elemente.
  • Refresh: Aktualisiert die Auflistung.

Mit der folgenden Prozedur geben wir ein paar Informationen zu den Container-Elementen aus:

Public Sub ContainersAuflistung()
     Dim db As DAO.Database
     Dim i As Integer
     Set db = CurrentDb
     Debug.Print db.Containers.Count
     For i = 0 To db.Containers.Count - 1
         Debug.Print db.Containers(i).Name,  db.Containers(i).Documents.Count,  db.Containers(i).Properties.Count
     Next i
End Sub

Damit erhalten wir die folgenden Ergebnisse:

DataAccessPages  0             6 
Databases        3             6 
Forms            0             6 
Modules          1             6 
Relationships    1             6 
Reports          0             6 
Scripts          0             6 
SysRel           0             6 
Tables           12            6

Wir entnehmen dieser Ausgabe schon, dass die Container-Elemente weitere Elemente wie etwa Datenbanken, sonst aber meistens Objekte der Datenbank enthalten. Die folgende Prozedur gibt beispielsweise die Namen aller Tabelle der Datenbank aus:

Public Sub ContainerTablesAusgeben()
     Dim i As Integer
     Dim db As DAO.Database
     Set db = CurrentDb
     For i = 0 To db.Containers("Tables").Documents.Count - 1
         Debug.Print db.Containers("Tables").Documents(i).Name
     Next i
End Sub

Die Methode CreateProperty

Diese Methode erstellt ein benutzerdefiniertes Property-Objekt für das Database-Objekt. Wozu braucht man das Beispielsweise, um Daten, die sonst vielleicht in einer Tabelle gespeichert werden, wie beispielsweise die Version des aktuellen Frontends einer Datenbank, an einer anderen Stelle zu speichern.

Die folgende Prozedur erstellt eine neue Property mit der CreateProperty-Methode und übergibt neben dem Namen noch den Datentyp (hier dbText) sowie den Wert für diese Property (hier 1.0.0.0). Dann hängt sie die Property mit der Append-Methode an die Properties-Auflistung an:

Public Sub CreatePropertyMethode()
     Dim db As DAO.Database
     Dim prp As DAO.Property
     Set db = CurrentDb
     Set prp = db.CreateProperty("FEVersion", dbText, "1.0.0.0")
     db.Properties.Append prp
End Sub

Die folgende Prozedur liest die Property wieder aus und gibt den Wert im Direktbereich aus:

Public Sub PropertyAuslesen()
     Dim db As DAO.Database
     Dim prp As DAO.Property
     Set db = CurrentDb
     Set prp = db.Properties("FEVersion")
     Debug.Print prp.Value
End Sub

Um den Wert einer einmal erstellten Property zu erstellen, können Sie diesen einfach zuweisen:

db.Properties("FEVersion").Value = "1.0.0.1"

Das liefert allerdings einen Fehler, wenn die Property noch nicht vorliegt. Dazu kombinieren wir dann die vorherigen Prozeduren:

Public Sub PropertySetzen(strProperty As String, strValue As String)
     Dim db As DAO.Database
     Dim prp As DAO.Property
     Set db = CurrentDb
     On Error Resume Next
     Set prp = db.Properties(strProperty)
     On Error GoTo 0
     If prp Is Nothing Then
         Set prp = db.CreateProperty(strProperty,  dbText, strValue)
         db.Properties.Append prp
     Else
         prp.Value = strValue
     End If
End Sub

Die Prozedur versucht, die Property mit dem Namen aus strProperty zu referenzieren, allerdings bei deaktivierter Fehlerbehandlung. Ist prp danach leer, wird die Property neu angelegt, sonst einfach gefüllt.

Die Methode CreateQueryDef

Mit der Methode CreateQueryDef legen Sie ein neues QueryDef-Objekt, also eine Abfrage, in der aktuellen Datenbank an. Hier erledigen wir genau das mit der CreateQueryDef-Methode:

Public Sub CreateQueryDefMethode()
     Dim db As DAO.Database
     Dim qdf As DAO.QueryDef
     Set db = CurrentDb
     Set qdf = db.CreateQueryDef("qryTest",  "SELECT * FROM tblTest")
     ''''Nicht nötig!
     ''''db.QueryDefs.Append qdf
End Sub

Diese erhält als ersten Parameter den Namen der zu erstellenden Abfrage und als zweiten den SQL-Ausdruck für die Abfrage. Beachten Sie: CreateQueryDef muss kein QueryDefs.Append folgen, da QueryDef-Objekte automatisch angehängt werden! Die Aktivierung des Navigationsbereichs und Betätigen der Taste F5 liefert die Abfrage dann auch in den Navigationsbereich.

Die Methode CreateRelation

Die CreateRelation-Methode erstellt eine neue Beziehung zwischen zwei Tabellen. Ein Beispiel dazu schauen wir uns in einem späteren Beitrag an.

Die Methode CreateTableDef

Die CreateTableDef-Methode haben Sie weiter oben bereits kennengelernt. Sie erstellt ein neues TableDef-Objekt, das Sie noch mit Feldern ausstatten müssen, bevor Sie es über die Append-Methode der TableDefs-Auflistung zur Datenbank hinzufügen.

Die Methode Execute

Mit der Execute-Methode können Sie SQL-Aktionsabfragen ausführen – beispielsweise so:

Public Sub ExecuteMethode()
     Dim db As DAO.Database
     Dim strSQL As String
     Set db = CurrentDb
     strSQL = "INSERT INTO tblTest(ID, Test) VALUES(33, ''''bla'''')"
     db.Execute strSQL, dbFailOnError
End Sub

Die Methode erwartet als ersten Parameter die SQL-Zeichenfolge. Der zweite Parameter ist optional und kann beispielsweise den Wert dbFailOnError entgegennehmen. Damit werden Fehler, die beim Ausführen der Abfrage auftreten, auch als VBA-Fehler ausgelöst.

Die Eigenschaft Name

Die Bezeichnung Name für diese Eigenschaft ist etwas irreführend. Sie liefert nämlich den Pfad zur Datenbank:

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

Testzugang

eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar