Rubrik: Datenbanken | VB-Versionen: VB5, VB6 | 15.02.01 |
Einführung in die Datenbankprogrammierung mit VB Teil 1 Dieser Workshop richtet sich an alle Entwickler, die bisher zwar in Visual-Basic programmiert haben, jedoch mit der Datenbankprogrammierung noch nicht in Berührung gekommen sind. | ||
Autor: Dieter Otter | Bewertung: | Views: 64.310 |
Dieser Workshop richtet sich an alle Entwickler, die bisher zwar in Visual-Basic programmiert haben, jedoch mit der Datenbankprogrammierung noch nicht in Berührung gekommen sind. Zunächst wird anhand einiger Beispiele gezeigt, für welche Aufgaben sich Datenbanken sinnvoll einsetzen lassen. Im Anschluß daran wird der Aufbau einer Datenbank Schritt für Schritt anhand eines konkreten Beispiels erläutert. Am Ende dieses Workshops sollten Sie in der Lage sein, eine Datenbank mit allen benötigten Tabellen und Feldern zu erstellen, Datensätze hinzuzufügen, zu bearbeiten und zu löschen.
Was ist eine Datenbank und wann lässt sich eine solche sinnvoll einsetzen?
Eine Datenbank ist nichts anderes als eine Ansammlung von Daten in einer einzelnen Datei. Bei den Daten kann es sich z.B. um Adressen, Artikel oder auch Termine handeln. Jede einzelne Adresse (Artikel oder auch Termin) steht stellvertretend für einen Datensatz. Ein Datensatz wiederum ist eine Ansammlung von einzelnen Daten-Informationen (Datenfeldern). Ein Adress-Datensatz besteht z.B. aus der Anrede, dem Namen, Vornamen, Straße, PLZ und dem Wohnort. Die Gesamtheit dieser Datenfelder bilden also einen Datensatz.
Sobald Sie viele solcher Datensätze verwalten müssen, ist es empfehlenswert hierfür eine Datenbank einzusetzen. Mit Hilfe der in Visual-Basic und den dazugehörigen Datenbank-Systemdateien vorhandenen Datenbankbefehle, lässt sich eine Datenbank mit verhältnismäßig geringem Aufwand erstellen und pflegen. Das Suchen nach bestimmten Informationen innerhalb des gesamten Datenbestandes erfolgt mit Hilfe der Datenbank-Routinen in nur wenigen Sekunden. Noch schneller von statten geht das Hinzufügen von neuen Datensätzen, das Ändern oder auch Löschen bestehender Daten.
Die Datenbankprogrammierung hat bei Visual-Basic einen sehr hohen Stellenwert. Daher wird Visual-Basic seit der Version 3.0 auch mit einer Datenbank-Engine ausgeliefert. Hierbei handelt es sich um die JET-Engine, welche auch in Microsoft Access verwendet wird. Die JET-Engine ist kein eigenständiges Programm, sondern liegt in Form von Systemdateien vor (DLLs), welche über ihre Objektschnittstelle DAO (DataAccessObject = Datenbankzugriffs-Objekt) angesprochen werden. Neben der DAO-Schnittstelle werden noch ODBC, OLE-DB und in der neuesten Version auch ADO unterstützt. Dieser Workshop konzentriert sich auf die Verwendung von DAO, da diese Schnittstelle bereits seit Visual-Basic 3.0 integriert ist und mit Sicherheit am häufigsten verwendet wird.
Der Einsatz und Aufbau einer Datenbank anhand eines konkreten Beispiels
So viel zur Theorie, nun zur Praxis. Anhand einer kleinen Adress-Datenbank wird nachfolgend der Einsatz und Aufbau einer Datenbank Schritt für Schritt erläutert.
Für jeden einzelnen Datensatz (Adresse) sollen folgende Informationen (Felder) gespeichert werden können:
Anrede, Name, Strasse, PLZ, Ort, Telefon, EMail
Bevor Sie nun mit dem Erstellen des Datenbank-Grundgerüst beginnen, müssen Sie in Ihrem Visual-Basic Projekt zunächst den Verweis zur Datenbankschnittstelle (DAO) festlegen. Dies geschieht über den Menübefehl Projekt - Verweise. Markieren Sie den Eintrag "Microsoft DAO 3.51 Object Library", wie obiger Abbildung zu sehen und klicken dann auf OK. Nun stehen Ihnen in Ihrem Projekt alle benötigten Datenbankbefehle zur Verfügung
Erstellen der Adress-Datenbank - Datei
Zum Erstellen einer neuen Datenbankdatei gehen Sie wie folgt vor:
Dim Db As Database Dim dbFile As String dbFile = App.Path + "\ADRESS.MDB" Set Db = Workspaces(0).CreateDatabase(dbFile, dbLangGeneral, _ dbEncrypt + dbVersion30)
Zunächst muß eine Objekt-Variable vom Typ Database deklariert werden. Über die Objekt-Eigenschaft CreateDatabase wird eine leere Datenbankdatei erstellt. Als erster Parameter wird der vollständige Dateiname inkl. Pfadangabe erwartet. Der zweite Parameter gibt das Gebietsschema an, welches die Sortierreihenfolge der Datenbank angibt. Der dritte Parameter ist optional und gibt an, welche Version das Datenformat haben soll, und ob die Datenbank verschlüsselt werden soll oder nicht. Wenn Sie den dritten Parameter nicht angeben, wird eine unverschlüsselte Datenbank erstellt und das Dateiformat des JET-Datenbankmoduls Version 3.0 verwendet.
Die möglichen Konstanten für den dritten Parameter sind folgende:
dbEncrypt | Erstellt eine verschlüsselte Datenbank |
dbVersion10 | Dateiformat des JET-Datenbankmoduls Version 1.0 verwenden |
dbVersion11 | Dateiformat des JET-Datenbankmoduls Version 1.1 verwenden |
dbVersion20 | Dateiformat des JET-Datenbankmoduls Version 2.0 verwenden |
dbVersion30 | Dateiformat des JET-Datenbankmoduls Version 3.0 verwenden |
Die CreateDatabase-Methode erstellt und öffnet eine neue leere Datenbank und gibt das Database-Objekt zurück. Nur das Erstellen einer Datenbank-Datei reicht jedoch nicht aus, um Datensätze darin speichern zu können. Innerhalb einer Datenbank muß immer mindestens eine Datenbank-Tabelle erstellt werden, für welche dann die entsprechende Datensatz-Struktur festgelegt werden kann. Erst dann lassen sich Datensätze in der Datenbank speichern.
Erstellen der Datenbank-Tabelle mit allen benötigten Datenfeldern
Zum Erstellen einer Datenbank-Tabelle gehen Sie wie folgt vor:
Dim Tabelle As New TableDef Dim Feld As New Field Tabelle.Name = "Adressen" ' Datenfeld #1 Feld.Name = "AdressNr" Feld.Type = dbLong Feld.Attributes = dbAutoIncrField Tabelle.Fields.Append Feld Set Feld = Nothing ' Datenfeld #2 Feld.Name = "Anrede" Feld.Type = dbText Feld.Size = 20 Feld.AllowZeroLength = True Tabelle.Fields.Append Feld Set Feld = Nothing ' Datenfeld #3 Feld.Name = "Name" Feld.Type = dbText Feld.Size = 50 Feld.AllowZeroLength = True Tabelle.Fields.Append Feld Set Feld = Nothing ' Datenfeld #4 Feld.Name = "Strasse" Feld.Type = dbText Feld.Size = 35 Feld.AllowZeroLength = True Tabelle.Fields.Append Feld Set Feld = Nothing ' Datenfeld #5 Feld.Name = "PLZ" Feld.Type = dbText Feld.Size = 8 Feld.AllowZeroLength = True Tabelle.Fields.Append Feld Set Feld = Nothing ' Datenfeld #6 Feld.Name = "Ort" Feld.Type = dbText Feld.Size = 40 Feld.AllowZeroLength = True Tabelle.Fields.Append Feld Set Feld = Nothing ' Datenfeld #7 Feld.Name = "Telefon" Feld.Type = dbText Feld.Size = 25 Feld.AllowZeroLength = True Tabelle.Fields.Append Feld Set Feld = Nothing ' Datenfeld #8 Feld.Name = "EMail" Feld.Type = dbText Feld.Size = 50 Feld.AllowZeroLength = True Tabelle.Fields.Append Feld Set Feld = Nothing Db.TableDefs.Append Tabelle Db.Close Set Tabelle = Nothing Set Db = Nothing
Zunächst muß eine Objekt-Variable vom Typ TableDef ("TableDefinition = Tabellendefinition") deklariert werden. Um die Datenbank-Tabelle eindeutig innerhalb der Datenbank-Datei referenzieren zu können, wird über die Name-Eigenschaft ein eindeutiger Name festgelegt. Im Anschluß daran legen Sie die Datensatz-Struktur fest, indem Sie alle benötigten Datenfelder der Reihe nach der Datenbank-Tabelle hinzufügen.
Um ein Datenfeld festlegen zu können müssen Sie eine Objekt-Variable vom Typ New Field deklarieren. Diese Objekt-Variable besitzt mehrere Eigenschaften, wie Name, Type und Attributes.
Die Name-Eigenschaft ist selbsterklärend und gibt den Namen des Feldes an. Zu beachten ist, daß jedes Feld innerhalb der Datenbank-Tabelle einen eindeutigen Namen besitzen muss.
Die Type-Eigenschaft bestimmt den Feldtyp, d.h. sie legt fest, welche Art von Daten in diesem Feld gespeichert werden.
Nachfolgend finden Sie eine Übersicht der am häufigsten verwendeten Feldtypen.
dbInteger | Integer-Zahl |
dbLong | Long-Integer-Zahl |
dbBoolean | True/False |
dbCurrency | Währungsfeld (Betragsfeld) |
dbDate | Datum/Uhrzeit-Feld |
dbText | Text |
dbMemo | Bemerkungen (lange Texte) |
Es gibt noch zahlreiche weitere Feldtypen, welche allerdings eher seltener benötigt werden. Detailierte Informationen über alle möglichen Feldtypen finden Sie in der Online-Hilfe von Visual-Basic.
Die Eigenschaft Size gibt die Feldlänge an (Anzahl Zeichen, die gespeichert werden können) und wird nur benötigt, wenn es sich um ein Feld vom Typ dbText handelt. Die maximale Größe ist auf 255 Zeichen begrenzt.
Handelt es sich bei dem Datenfeld um ein Feld vom Typ dbText oder dbMemo, so kann über die AllowZeroLength-Eigenschaft bestimmt werden, ob "leere" Felder zulässig sind oder nicht. Wird diese Eigenschaft nicht angegeben, wird automatisch der Wert False angenommen. Dies kann ungewollte Fehler hervorrufen. So wird z.B. beim Versuch einen Datensatz mit leerem Datenfeld zu speichern, ein Laufzeitfehler ausgelöst, d.h. der Datensatz kann nicht gespeichert werden. Es ist also ratsam, der AllowZeroLength-Eigenschaft grundsätzlich den Wert True zuzuweisen.
Über die Attributes-Eigenschaft können Sie festlegen, ob es sich bei dem Datenfeld um einen Zähler mit automatischer fortlaufender Numerierung handelt. Wird für Attributes der Wert dbAutoIncrField festgelegt, so wird der Feldinhalt bei jedem neuen Datensatz automatisch um eins erhöht. Der Feldinhalt kann nicht durch den Anwender verändert werden, da dieses Feld vom JET-Datenbankmodul verwaltet wird. Ein Feld, für das die Attributes-Eigenschaft auf dbAutoIncrField gesetzt wird, muß immer vom Typ dbLong sein.
Nachdem alle benötigten Feld-Eigenschaften festgelegt sind, wird das Feld über die Append-Methode der Datenbank-Tabelle hinzugefügt. Bevor Sie dann das nächste Feld erstellen, müssen Sie die Objekt-Variable Feld auf Nothing setzen.
Nachdem nun die Datenbank-Tabelle alle relevanten Datenfelder beinhaltet, muß die Datenbank-Tabelle letztendlich noch der Datenbank-Datei hinzugefügt werden. Dies geschieht über den Befehl:
Db.TableDefs.Append Tabelle
Über die Methode Db.Close wird die Datenbank geschlossen. Nach dem Hinzufügen der Datenbank-Tabelle können Sie die Objekt-Variable Tabelle durch Setzen auf Nothing wieder freigeben. Ebenso verfahren Sie mit der Objekt-Variable Db, um den belegten Speicher vollständig freizugeben.
Das waren alle notwendigen Schritte, um eine Datenbank inkl. der Datenbank-Tabelle und alle benötigten Datenfelder zu erstellen.
Öffnen und Schließen einer Datenbank
Zum Öffnen und Schließen einer Datenbank stellt Ihnen das JET-Datenbankmodul folgende Befehle zur Verfügung:
' Datenbank öffnen Dim Db As Database Dim Tabelle As Recordset Dim dbFile As String dbFile = App.Path + "\ADRESS.MDB" Set Db = Workspaces(0).OpenDatabase(dbFile, False, False) Set Tabelle = Db.OpenRecordset("Adressen")
Die Methode OpenDatabase erwartet als ersten Parameter den genauen und vollstänfigen Dateinamen der Datenbank. Der zweite Parameter ist optional und legt den Zugriffsmodus zu. Geben Sie hier True an, so wird die Datenbank exklusiv geöffnet, d.h. keine andere Anwendung bzw. kein anderer Anwender kann die Datenbank zusätzlich öffnen. Wird nichts angegeben oder False, wird die Datenbank im "geteilten" Modus geöffnet, d.h. sie kann von mehreren Anwendungen und/oder Anwendern benutzt werden. Der dritte Paramater ist ebenfalls optional und legt das Schreibschutzrecht fest. True bedeutet, daß die Datenbank schreibgeschützt geöffnet werden soll, d.h. die Datensätze können nur gelesen werden. Wird nichts angegeben oder False, so wird die Datenbank mit Schreib-/Lese-Zugriff geöffnet.
Da jede ACCESS-Datenbank mehrere Datenbank-Tabellen enthalten kann, müssen Sie - bevor Sie auf irgendwelche Datensätze zugreifen bzw. neue Datensätze speichern können - zunächst noch die entsprechende Datenbank-Tabelle öffnen. Hierfür dient die Methode OpenRecordset, welche auf die Datenbank-Objekt-Variable Db angewandt wird. Als Parameter wird der Tabellennamen erwartet.
' Datenbank schließen Tabelle.Close Db.Close Set Tabelle = Nothing Set Db = Nothing
Das Schließen einer Datenbank-Tabelle und/oder der gesamten Datenbank erfolgt über die Methode Close. Bevor die Datenbank-Datei geschlossen wird, sollten immer zunächst alle geöffneten Datenbank-Tabellen geschlossen werden. Um auch wirklich den gesamten belegten Speicher wieder freizugeben, ist es ratsam die Objekt-Variablen auf Nothing zu setzen.
Anlegen eines neuen Datensatzes und Speichern der Datenfelder in der Datenbank
Im nachfolgenden wird gezeigt, wie Sie neue Datensätze in der Datenbank speichern können. Hierfür sind nur wenige Befehle notwendig. Zunächst muß jedoch sichergestellt werden, daß die Datenbank und die entsprechende Datenbank-Tabelle geöffnet ist (Vorgehensweise siehe weiter oben). Das Tabellen-Objekt stellt Ihnen dann alle notwendigen Befehle (Methoden) zur Verfügung.
' Neuen Datensatz hinzufügen Tabelle.AddNew Tabelle("Anrede") = "Herrn" Tabelle("Name") = "Dieter Otter" Tabelle("Strasse") = "Riemenschneiderstr. 32" Tabelle("PLZ") = "97708" Tabelle("Ort") = "Steinach" Tabelle("Telefon") = "" Tabelle("Email") = "info@vbarchiv.de" Tabelle.Update
Über die Methode AddNew wird der Datenbank-Tabelle mitgeteilt, daß ein neuer Datensatz hinzugefügt werden soll. Im Anschluß daran werden die einzelnen Datenfelder mit den entsprechenden Inhalten belegt. Die Felder können entweder über deren Index (0...n) oder über deren Feldnamen (in Anführungszeichen) "angesprochen" werden. Nachdem alle Datenfelder belegt wurden, wird der Datensatz mit der Update-Methode gespeichert.
' Neuen Datensatz hinzufügen Dim i As Integer Tabelle.AddNew For i = 1 To 7 Tabelle(i) = Text1(i).Text Next i Tabelle.Update
Kleiner Tipp:
Nach dem Hinzufügen eines neuen Datensatzes befindet sich der Datenbank-Zeiger nicht automatisch auf den neuen Datensatz. Dies können Sie jedoch ändern, indem Sie nach der Update-Methode folgenden Code einfügen:
Tabelle.Bookmark = Tabelle.LastModified
Über die Eigenschaft Bookmark läßt sich das "Lesezeichen" (Datenbank-Zeiger) ermitteln und auch ändern. Wenn Sie dieser Eigenschaft die LastModified-Eigenschaft zuweisen, wird der Datenbank-Zeiger auf den zuletzt bearbeiteten Datensatz gesetzt - also auf den Datensatz, der ja eben neu hinzugekommen ist.
Blättern innerhalb der Datenbank-Tabelle
Zum Bewegen innerhalb der Datenbank-Tabelle stehen folgende Methoden zur Verfügung:
Tabelle.MoveFirst | Wechselt zum ersten Datensatz |
Tabelle.MovePrevious | Einen Datensatz zurückblättern |
Tabelle.MoveNext | Einen Datensatz vorblättern |
Tabelle.MoveLast | Wechselt auf den letzten Datensatz |
Tipp:
Bevor Sie die "Blättern"-Befehle anwenden, sollten Sie immer prüfen, ob ein Blättern überhaupt möglich ist.
' Ersten Datensatz anzeigen If Tabelle.RecordCount > 0 And Not Tabelle.BOF Then _ Tabelle.MoveFirst ' vorigen Datensatz anzeigen If Tabelle.RecordCount > 0 And Not Tabelle.BOF Then _ Tabelle.MovePrevious ' Nächsten Datensatz anzeigen If Tabelle.RecordCount > 0 And Not Tabelle.EOF Then _ Tabelle.MoveNext ' Letzten Datensatz anzeigen If Tabelle.RecordCount > 0 And Not Tabelle.EOF Then _ Tabelle.MoveLast
Über die RecordCount-Eigenschaft wird die Anzahl der gespeicherten Datensätze abgefragt. Die Eigenschaft BOF (True/False) gibt zurück, ob sich der Datenbank-Zeiger bereits auf den ersten Datensatz befindet. Analog hierzu gibt die Eigenschaft EOF (True/False) zurück, ob sich der Datenbank-Zeiger bereits auf den letzten Datensatz befindet. BOF steht für Begin Of File und EOF für End Of File.
Bearbeiten von Datensätzen
Das nachträgliche Bearbeiten eines bestimmten Datensatzes setzt voraus, daß der Datenbank-Zeiger auf den zu bearbeitenden Datensatz "bewegt" wird. Dies erfolgt über die zuvro in diesem Workshop erklärten Befehle zum Blättern innerhalb der Datenbank-Tabelle. Befindet sich der Datenbank-Zeiger nun auf dem entsprechenden Datensatz, kann dieser folgendermassen verändert werden.
Eingeleitet wird der "Bearbeiten-Modus" durch den Befehl Edit. Dann weisen Sie den betroffenen Datenfeldern die neuen Feldinhalte zu. Über den Befehl Update werden die Änderungen dauerhaft gespeichert.
' aktuellen Datensatz bearbeiten Tabelle.Edit Tabelle("Name") = "Otter Dieter" Tabelle("Ort") = "Bad Bocklet/Steinach" ... Tabelle.Update
Im Gegensatz zum Hinzufügen neuer Datensätze müssen Sie den Datenbank-Zeiger beim Bearbeiten nicht mittels der Bookmark und LastModified-Eigenschaft auf den geänderten Datensatz setzen.
Löschen von Datensätzen
Das Löschen von Datensätzen ist recht einfach. Über die Methode Delete wird der aktuelle Datensatz gelöscht.
' aktuellen Datensatz löschen Tabelle.Delete
Um z.B. den siebten Datensatz der Datenbank-Tabelle zu löschen, verwenden Sie folgenden Code:
Tabelle.MoveFirst For i = 1 To 6 Tabelle.MoveNext Next i Tabelle.Delete
Zunächst wird der Datenbank-Zeiger auf den ersten Datensatz gesetzt. Dann wird sechsmal "vorgeblättert", so daß sich der Datenbank-Zeiger auf dem siebten Datensatz befindet. Jetzt kann der Löschen-Befehl ausgeführt werden.
Hinweis:
Nach dem Löschen zeigt der Datenbank-Zeiger auf einen "Null-Datensatz", da der aktuelle Datensatz gelöscht wurde. Um den Datenbank-Zeiger auf den nächsten Datensatz zu setzen, verwenden Sie folgende Codezeilen:
If Not Tabelle.Eof Then Tabelle.MoveNext Else Tabelle.MoveLast End If
Zusammenfassung
Sie sollten nun in der Lage sein, mittels der hier vorgestellten Befehle, Methoden und Eigenschaften, eine eigene Datenbank zu erstellen, eine Datenbank-Tabelle mit den benötigten Datenfelder anzulegen und Datensätze hinzuzufügen, ändern und zu löschen.
Nochmals zur Erinnerung:
CreateDatabase | Neue "leere" Datenbank-Datei erstellen |
OpenDatabase | Datenbank öffnen |
Close | Datenbank/Tabelle schließen |
TableDef-Objekt | Tabellen-Definition festlegen |
Field-Objekt | Tabellen-Feld-Definition |
Append-Methode | Feld/Tabelle hinzufügen |
OpenRecordset | Datenbank-Tabelle öffnen |
AddNew/Update | Neuen Datensatz hinzufügen |
Bookmark/LastModified | Datenbank-Zeiger auf den zuletzt bearbeiteten Datensatz setzen |
Edit/Update | aktuellen Datensatz bearbeiten |
MoveFirst | zum ersten Datensatz blättern |
MovePrevious | einen Datensatz zurückblättern |
MoveNext | einen Datensatz vorblättern |
MoveLast | zum letzten Datensatz blättern |
RecordCount | Anzahl Datensätze ermitteln |
Bof | Prüfen, ob aktueller Datensatz der erste Datensatz ist |
Eof | Prüfen, ob aktueller Datensatz der letzte Datensatz ist |
Vorschau Teil 2
Im zweiten Teil dieses Workshops werden Sie verschiedene Möglichkeiten kennenlernen, um Datensätze schnell aufzufinden. Hierzu werden bestimmte Datenfelder indiziert, d.h. es werden Indexfelder angelegt, mit deren Hilfe Datensätze in einem Bruchteil einer Sekunde gesucht werden können. Außerdem erfahren Sie, wie eine Datenbank-Tabelle nach bestimmten Datenfeldern sortiert werden kann.