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