IT-Academy Logo
Sign Up Login Help
Home - Programmieren - Visual Basic - DataAccessObject (DAO)



DataAccessObject (DAO)

Ein Einblick in DAO und deren Möglichkeiten für den Zugriff auf Datenbanken.


Autor: Patrick Bucher (paedubucher)
Datum: 25-05-2004, 08:26:34
Referenzen: nicht bekannt
Schwierigkeit: Fortgeschrittene
Ansichten: 20515x
Rating: 8.33 (3x bewertet)

Hinweis:

Für den hier dargestellte Inhalt ist nicht der Betreiber der Plattform, sondern der jeweilige Autor verantwortlich.
Falls Sie Missbrauch vermuten, bitten wir Sie, uns unter missbrauch@it-academy.cc zu kontaktieren.

[Druckansicht] [Als E-Mail senden] [Kommentar verfassen]



Voraussetzungen:
  • Kenntnisse über das relationale Datenbanksystem
  • SQL Grundlagen
  • Visual Basic Grundlagen
Was ist DAO?

DAO bedeutet DataAccessObject, ist also ein Visual Basic Objekt für den Zugriff auf Datenbanken. Dieses Objekt wird immer mehr durch den Nachfolger ADO abgelöst. Einfache Datenbankanwendungen (Adressverwaltung, ...) sind aber mit DAO sehr einfach zu realisieren. Der Datenbankzugriff erfolgt über die Jet Engine, eine Datenbankengine, die den Umgang mit Access Datenbanken ermöglicht. Man kann DAO in Access-VBA oder in Visual Basic 6 verwenden.

Die Verbindung mit der Datenbank

Das Workspace Objekt

Das Workspace Objekt enthält eine Aufzählung aller aktueller Sitzungen der Jet Engine. Eine neue Jet Engine Sitzung wird mit der "CreateWorkspace"-Methode erstellt. Man kann den Namen der Sitzung und optional Username und Passwort für die Sitzung eingeben.

Set Variable = DBEngine.CreateWorkspace(Name, User, Passwort)
Das Erstellen einer neuen Sitzung ist aber oft überflüssig, da bereits eine Sitzung läuft, wenn das Programm ausgeführt wird. In diesem Falle kann man den Workspace mit dem Index 0 verwenden. Dahinter verbirgt sich die aktuelle Sitzung.

Dim ws as Workspace
Set ws = DBEngine.Workspaces(0)
Datenbank öffnen

Die Datenbank wird mit dem "Databases"-Objekt angesprochen. In Access ist das Problem wieder einfach zu lösen, man gibt einfach den Index 0 an, der für die aktuell geöffnete Datenbank steht.

Dim db as Database
Set db = ws.Databases(0)
Hier wird mit dem neu initialisierten “ws”-Objekt gearbeitet.

In Visual Basic muss man noch den Pfad zur Datenbank angeben, die geöffnet werden soll.

Dim db as Database
Set db = ws.Databases(Pfad)
Der Pfad wird als String übergeben, wahlweise absolut oder relativ. Die weiteren Parameter kann man im Objektkatalog nachschlagen, der sowohl in der VBA, wie auch in der Visual Basic 6 Umgebung über F2 aufgerufen werden kann.

Die Datenbank soll nach der Verwendung wieder geschlossen werden, das übernimmt die "Close"-Methode des "Database"-Objekts.

db.Close
In kleineren Anwendungen kann man diese Anweisung weglassen, die Datenbankverbindung wird nach dem Verlassen der Prozedur auf jeden Fall verloren gehen. Was man jedoch öffnet, sollte man auch wieder schließen.

Das Recordset-Objekt

Um Datensatzgruppen ansprechen zu können, verwendet man das "Recordset"-Objekt. Alle Aktionen mit der Datenbank (Abfragen, Datensätze löschen und editieren, ...) werden über dieses Objekt abgewickelt.

Zuerst muss ein Recordset geöffnet werden. Dazu dient die "OpenRecordset"-Methode des "Database"-Objekts.

Dim rs as DAO.Recordset
set rs = db.OpenRecordset(Tabellenname/SQL-Query, [Type], …)
Besonders zu beachten ist die erste Zeile! Sowohl das DAO wie auch ADO haben eine Recordset-Collection!

Sowohl der Tabellenname als auch das SQL-Query müssen als String angegeben werden. Um WHERE Bedingungen in ein SQL-Query einzufügen, sollte man zuerst eine Stringvariable deklarieren und diese entsprechend verketten. Ein kleines Beispiel:

Dim strQuery As String
strQuery = „SELECT * FROM adressen WHERE plz = ” & intPostleihzahl & “;”
Das Query sollte nun je nach Postleihzahl etwa so aussehen:

SELECT * FROM adressen WHERE plz = 4324;
Hier empfehlen sich ein paar Ausgaben ins Direktfenster. Vor allem bei komplexeren Verkettungen verliert man schnell den Überblick über Leerzeichen usw.

Wie wird das Recordset geöffnet?

Es gibt mehrere Möglichkeiten um ein Recordset zu öffnen. Hier die drei wichtigsten:

dbOpenTable:

Hier wird direkt auf die Tabelle zugegriffen. Der Zugriff auf Abfragen ist nicht möglich (auch keine SQL Abfragen). Das Sortieren von Datensätzen ist nicht möglich, da der Zugriff auf die Tabelle so erfolgt wie sie auf der Festplatte abgespeichert ist. Dafür hat dieser Zugriffsmodus auch zwei Vorteile. Der Zugriff ist so schnell wie kein anderer und man braucht sich keine Gedanken zur Aktualisierung zu machen, da direkt in die Tabelle geschrieben wird.

dbOpenDynaset:

Hier wird eine Abfrage erstellt. Die Datensätze können beliebig gefiltert und sortiert werden. Dieser Zugriff muss jeweils aktualisiert werden, da nicht direkt auf die Tabelle zugegriffen wird. In der Praxis wird diese Variante am häufigsten verwendet.

dbOpenSnapshot: Hier wird ein "Schnappschuss" des Recordsets erstellt. Daten können nur angesehen werden, Änderungen sind nicht möglich. Diese Variante eignet sich besonders für Ausgaben von Informationen, da diese Methode sehr schnell ist.

Der Datensatzzeiger

Anfang und Ende

Die Navigation durch die Datensätze erfolgt mit einem Datensatzzeiger, der immer auf einen Datensatz verweist. Es gibt zwei besondere Positionen in einer Abfrage/Tabelle; BOF und EOF. BOF steht für Beginn Of. Diese Position steht vor dem ersten Datensatz. EOF steht für End of. EOF befindet sich nach dem letzten Datensatz. Diese beiden Eigenschaften sind vom Typ Boolean.
Der Datensatzzeiger befindet sich bei der Initialisierung des Recordset Objekts an der ersten Stelle.

Navigieren

Um sich durch ein Recordset zu navigieren, hat man 5 Methoden zur Verfügung (sie gehören alle zum Recordset-Objekt):

Methode

Beschreibung

Move(index)

Springt zu einem beliebigen Datensatz (absolute Angabe)

MoveFirst

Springt zum ersten Datensatz

MovePrevious

Springt zum vorherigen Datensatz

MoveNext

Springt zum nächsten Datensatz

MoveLast

Springt zum letzten Datensatz



Das Durchsuchen eines ganzen Recordsets kann z.B. so aussehen:

Do while rs.EOF = false
	[Befehle]
	Rs.MoveNext
Loop
Solange das Ende des Recordsets nicht erreicht wurde, wird die Schleife durchlaufen. In der Schleife wird dann bei jedem Durchlauf zum nächsten Datensatz gesprungen, bis der Datensatzzeiger am Ende des Recordsets angelangt ist und die Bedingung nicht mehr erfüllt ist.

Felder

Ein Feld wird folgendermaßen aufgerufen:

Recordset![Datenfeld]
Jedes Feld hat mehrere Eigenschaften. Um mit diesen arbeiten zu können, sollte man mit dem "Field"-Objekt arbeiten.

Dim f as Field
Set f = rs![vorname]
Die einzelnen Eigenschaften sind im Objektkatalog erläutert.

Editieren

Um Daten zu aktualisieren, muss zuerst der aktuelle Datensatz in einen Puffer geschrieben werden (dies gilt nur für dbOpenDynaset Recordsets!). Das geschieht mit der "Edit"-Methode.

rs.Edit
Der Datensatzzeiger muss sich zu diesem Zeitpunkt natürlich an der richtigen Stelle befinden. Danach kann jedes Feld manuell geändert werden.

rs![vorname] = "Hubert"
rs![nachname] = "Huber"
Der geänderte Datensatz befindet sich nun immer noch im Pufferbereich. Nun muss er zurück in die Tabelle geschrieben werden. Um die Position muss man sich keine Gedanken machen, der Datensatzzeiger wurde nicht verändert!

rs.Update
Die Update Methode erübrigt sich, wenn man direkt auf die Tabelle zugreift und nicht den Umweg über ein Dynaset nimmt.

Löschen

Das Löschen von Datensätzen ist sehr einfach, da man nicht auf einen Puffer ausweichen muss.

rs.Delete
So wird der aktuelle Datensatz (dort wo sich der Datensatzzeiger befindet) unwiderruflich gelöscht.

Datensätze einfügen

Das Einfügen von neuen Datensätzen wird von der "AddNew"-Methode übernommen. Hier muss man sich keine Gedanken um den Datensatzzeiger machen, neue Einträge werden stets an das Ende der Tabelle geschrieben.

rs.AddNew
rs![vorname] = "Anton"
rs![nachname] = "Meier"
rs.update
Die "Update"-Methode ist nur notwendig, wenn man mit einem Dynaset arbeitet.


[back to top]



Userdaten
User nicht eingeloggt

Gesamtranking
Werbung
Datenbankstand
Autoren:04508
Artikel:00815
Glossar:04116
News:13565
Userbeiträge:16552
Queueeinträge:06245
News Umfrage
Ihre Anforderungen an ein Online-Zeiterfassungs-Produkt?
Mobile Nutzung möglich (Ipone, Android)
Externe API Schnittstelle/Plugins dritter
Zeiterfassung meiner Mitarbeiter
Exportieren in CSV/XLS
Siehe Kommentar



[Results] | [Archiv] Votes: 1146
Comments: 0