Zugriff auf Access-Datenbanken
Objekthierarchie
In Visual Basic finden sich eine Reihe von Klassen, mit deren Hilfe man auf Datenbanken zugreifen kann. Zum einen wäre da die Klasse DATABASE. In einer Instanz eines Datenbankobjekts befinden sich eine Reihe von Unterobjekte. Diese Unterobjekte sind zum größten Teil Auflistungen, auf deren Elemente man im einzelnen zugreifen kann. Die folgenden Auflistungen sind für uns relevant:
TableDefs | QueryDefs | Relations | Recordsets |
Tabellen definitionen |
Abfrage definitionen |
Relationen | Datensatz mengen |
Und auch alle geöffneten Datenbanken sind in einer Auflistung DATABASES enthalten, die wiederum in einer Auflistung WORKSPACES (Arbeitsbereiche) enthalten ist. Wir werden im Folgenden aber vorerst nur eine Datebank und einen Arbeitsbereich verwenden.
Wir werden zum einfachen Zugriff auf Tabellen oder Abfragen Recordsets verwenden. Mit Hilfe einer solchen Datensatzmenge kann man durch die Tabelle oder Abfrage navigieren, Datensätze hinzufügen, Datensätze verändern, etc.
Ein solches Recordset besitzt dann eine Auflistung FIELDS.
Wie kann man nun auf Auflistungen zugreifen?
Verwendung von Auflistungen
Hat man eine Auflistung C (im Englischen wird auch der Begriff Container benutzt), so gibt es die Eigenschaft COUNT, welche die Anzahl der Objekte in dieser Aufistung enthält. Sie ist vom Typ LONG INTEGER.
Man kann nun indiziert auf die einzelnen Objekte mit C(i) zugreifen, wobei i bei Null anfängt, also zwischen Null Und COUNT - 1 liegt.
Hat ein einzelnes Objekt einen Namen, so kann man auch über C("name") darauf zugreifen.
Beispiel: Indizierter Zugriff auf eine Auflistung
Dieses Beispiel gibt alle Tabellennamen in der Datenbank "test.mdb" mit Hilfe einer MessageBox aus.
DIM db AS DATABASE DIM i AS LONG SET db = OPENDATABASE("test.mdb") FOR i = 0 TO db.TABLEDEFS.COUNT - 1 MsgBox db.TABLEDEFS(i).Name NEXT i db.Close
Mit der SET-Anweisung wird das Datenbankobjekt zugewiesen, in unserem Beispiel öffnen wir eine bestehende Datenbank. (Hier könnte man mit Hilfe von CREATEDATABASE auch eine neue Datenbank erstellen.) Dann gehen wir schrittweise die Tabellendefinitionen durch und geben für jede Tabelle den Namen aus.
Beispiel: Zugriff über Namen auf eine Auflistung
Dieses Beispiel gibt die Anzahl der Felder in der Tabelle "tabelle1" zurück.
DIM db AS DATABASE SET db = OPENDATABASE("test.mdb") MsgBox Str$(db.TABLEDEFS("tabelle1").FIELDS.COUNT) db.Close
Zugriff auf bestehende Tabellen
Zuerst müssen wir die Datenbank öffnen. Dies geschieht wie im vorigen Beispiel mit OPENDATABASE.
SET Datenbankobjekt = workspace.OpenDatabase (dbname[, exclusive[, read-only[, source]]])
Für uns ist erst nur der Datenbankname dbname relevant. Das Objekt workspace kann weggelassen werden, dann wird die Datenbank im aktuellen Arbeitsbereich und nicht etwa in einem anderen geöffnet. Dann öffnen wir ein Recordset-Objekt mit dem Befehl OPENRECORDSET.
SET variable = Datenbank.OpenRecordset(quelle[, typ[, optionen]])
Auch hier ist vorerst nur der Parameter quelle relevant, der den Tabellen- oder Abfragenname angibt. Nun kann man mit dem Recordset-Objekt beispielsweise durch die Tabelle navigieren. Dies geschieht mit den folgenden Methoden:
MoveFirst | Gehe zu erstem Datensatz |
MoveNext | Gehe zu nächsten Datensatz |
MovePrevious | Gehe zu vorherigen Datensatz |
MoveLast | Gehe zu letztem Datensatz |
BOF | Begin of File (ist bereits der erste Datensatz erreicht?) |
EOF | End of File (ist bereits der letzte Datensatz erreicht?) |
Der Zugriff auf einzelne Felder kann durch die Auflistung FIELDS geschehen, aber auch schnell durch die folgende Abkürzung, wobei bei Feldnamen mit Sonderzeichen(z.B. Leerzeichen) eckige Klammern [] um den Feldnamen angegeben werden müssen:
Recordset!Feldname bzw. Recordset![Feldname]
Beispiel: Navigieren in einem Recordset
Das nun folgende Beispiel gibt für jeden Datensatz in der Tabelle "tabelle1" der Datenbank "test.mdb" die Felder "Feld1" und "Feld mit Blanks" in jeweils einer MessageBox aus.
Zuerst wird eine Datenbank und einen Recordset geöffnet, dann zum ersten Datensatz gegangen. Solange nun nicht das Dateiende erreicht ist, werden die Informationen ausgegeben und zum nächsten gegangen.
DIM db AS DATABASE, rs AS RECORDSET DIM i AS LONG SET db = OPENDATABASE("test.mdb") SET rs = db.OpenRecordset("tabelle1") rs.MoveFirst WHILE NOT rs.EOF MsgBox rs!Feld1 MsgBox rs![Feld mit Blanks] rs.MOVENEXT WEND db.CLOSE
Das Hinzufügen von neuen Datensätzen geschieht durch ein ADDNEW, das verändern der Feldinhalte und einen nachfolgenden UPDATE. Beispiel: Anfügen von Datensätzen
DIM db AS DATABASE, rs AS RECORDSET DIM i AS LONG SET db = OPENDATABASE("test.mdb") SET rs = db.OpenRecordset("tabelle1") rs.AddNew rs!Feld1 = "TEST" rs![Feld mit Blank] = "TEST" rs.UPDATE db.CLOSE
Das Ändern von bestehenden Datensätzen geschieht durch ein EDIT, das verändern der Feldinhalte und einen nachfolgendem UPDATE. Beispiel: Ändern von Datensätzen
DIM db AS DATABASE, rs AS RECORDSET DIM i AS LONG SET db = OPENDATABASE("test.mdb") SET rs = db.OpenRecordset("tabelle1") rs.MoveFirst rs.EDIT rs!Feld1 = "TEST" rs![Feld mit Blank] = "TEST" rs.UPDATE db.CLOSE