Galileo Computing < openbook >
Galileo Computing - Bücher zur Programmierung und Softwareentwicklung
Galileo Computing - Bücher zur Programmierung und Softwareentwicklung

...powered by haas.homelinux.net...

Einstieg in VB.NET von René Martin
- Für Programmiereinsteiger -
Einstieg in VB.NET
gp Kapitel 9 Datenbankzugriff
  gp 9.1 Tabellen
  gp 9.2 Abfragen
    gp 9.2.1 Sortieren in einer Abfrage
    gp 9.2.2 Filtern in einer Abfrage
  gp 9.3 Beziehungen zwischen Tabellen
  gp 9.4 Zugriff von VB.NET auf die Datenbank
    gp 9.4.1 Gebundene Formulare
    gp 9.4.2 Steuerung des Formulars
    gp 9.4.3 Gebundene Formulare ohne Assistent
    gp 9.4.4 Ungebundene Formulare

Kapitel 9 Datenbankzugriff

Dieses Kapitel soll einen Überblick über und einen Einblick in die Arbeitsweise von Datenbanken am Beispiel Access geben. Es ist unmöglich, auf den wenigen Seiten ein profundes Wissen der Datenbankprogrammierung zu vermitteln. Zunächst folgen einige allgemeine Vorbemerkungen, dann die Besonderheiten des Datenbankzugriffs mit VB.NET.


Galileo Computing

9.1 Tabellen  downtop

Mit Access liegt ein relationales Datenbankmodell zugrunde. Das heißt, Daten werden nur einmal in einer Tabelle abgespeichert. Überall dort, wo Daten benötigt werden, werden sie durch Verknüpfungen hergeholt. Stellen Sie sich eine Namensliste vor (Kunden, Mitglieder, Lieferanten, Angestellte ...). In einer Tabelle werden alle Namen gespeichert, in einer weiteren Tabelle befinden sich beispielsweise die Bankverbindungen. Natürlich könnte man – wie etwa in Excel möglich – zu jedem Namen die Bankverbindung eingeben. Aber stellen Sie sich vor, mehrere Leute pflegen die Daten. Es kann nun sein, dass der Bankname von fünf verschiedenen Leuten auf fünf verschiedene Arten eingegeben wird. Und das bei derselben Bankleitzahl. Oder stellen Sie sich vor, zwei Banken fusionieren (was wirklich kein aus der Luft gegriffenes Beispiel ist). Der Name einer der beiden Banken ändert sich. Damit nicht die gesamte Tabelle (mit »Suchen und Ersetzen«) nach dem Bankennamen durchforstet werden muss, wird er nur einmal in »Bankenliste« geändert. Jedes Mitglied, das eine Bankverbindung bei dieser Bank angegeben hat, erhält nun automatisch die Änderungen. Wie eine solche Normalform (man spricht von der dritten Normalform) eingerichtet wird, soll im Folgenden beschrieben werden.

Das Wesen und der Kern der Datenbank liegt in der Tabelle. Jede Tabelle einer Datenbank besteht aus Spalten (Datenfeldern) und Zeilen (Datensätzen). Sie enthalten die eigentlichen Daten. Dabei sind die Daten der Zeilen und der Spalten in der Regel unsortiert. Lediglich die Daten einer Zeile, das heißt von einem Datensatz, gehören zusammen. Alle Datenwerte einer Spalte sind vom gleichen Typ. Die Namen der Spalten sind eindeutig und folgen gewissen Regeln: Sie dürfen keinen Punkt enthalten, ebenso kein »!« und keine »[ und ]«. Leerzeichen sind erlaubt, allerdings nicht immer praktisch.


Galileo Computing

9.1.1 Datentypen  downtop

In der Entwurfsansicht wird eine Tabelle definiert. In der Datenblattansicht kann man sich das Ergebnis ansehen. Man könnte dort Daten eingeben, ansehen und ändern. Doch dafür stehen Formulare (in Access oder VB.NET) zur Verfügung. Die Feldnamen, die in der Tabelle normalerweise nebeneinander stehen, werden untereinander geschrieben. Sie können nachträglich gelöscht, verschoben, umbenannt und kopiert werden.

Bevor man die Daten eingibt, sollte man sich Gedanken darüber machen, von welchem Typ die Daten sind, die eingetragen werden. Folgende Typen stehen zur Verfügung:

Tabelle 9.1   Die Felddatentypen in Access
Datentyp Größe Beispiel, Verwendung
Text maximal 255 Zeichen Personennamen, Straßennamen, Ortsnamen
Memo längere Texte: maximal 64.000 Zeichen (» 32 Din-A-4-Seiten) Achtung: kann nicht sortiert werden! Bemerkungen, Kommentare
Zahl Zahlen, mit denen später gerechnet werden soll. 1, 2, 4 oder 8 Byte Menge, Anzahl, Werte
Datum/Uhrzeit alle Datums- oder Zeitangaben zwischen dem 01.01.100 und dem 31.12.9999. Benötigt werden 8 Byte Termine, Daten, Uhrzeiten, Arbeitsbeginn
Währung alle Zahlen, die als Währungswerte dargestellt werden. Sie werden auf vier Dezimalstellen genau berechnet, mit zwei Dezimalstellen dargestellt und automatisch auf zwei Nachkommastellen kaufmännisch gerundet. 8 Byte werden benötigt Preise, Kosten, Mehrwertsteuer
AutoWert eindeutiger Zähler, der vom Benutzer nicht verändert werden kann. 4 Byte werden benötigt Zähler
Ja/Nein dieses Feld nimmt nur diese beiden Zustände an. 1 Bit bezahlt (ja/nein) Versicherung abgeschlossen (ja/nein)
OLE-Objekt eingebettete Objekte, beispielsweise Bilder, Sound, Videos. Bis zu 1 Gigabyte ist möglich Fotos
Hyperlink Verknüpfungen zu anderen Dateien oder zu Seiten im Internet  

Abbildung

Abbildung 9.1   Die Entwurfsansicht einer Tabelle

Auf den ersten Blick sieht man den Unterschied zwischen Text und Zahl. Beim genaueren Hinsehen sind die Unterschiede zum Teil jedoch sehr diffizil. Es ist keine Frage, dass Vorname, Zuname, Straße und Ort Texte sind. Aber Postleitzahlen? Diese sehen auf den ersten Blick wie Zahlen aus. Wenn Sie aber zum Beispiel eine Postleitzahl aus Sachsen eingeben, entstehen Schwierigkeiten. Die führende Null wird beim Verlassen gelöscht. Formatiert man nun die als Zahl definierte Postleitzahl vom Typ »00000«, dann bleiben die übrigen Postleitzahlen wie sie waren, die führende 0 der Sachsen wird intern abgeschnitten und per Formatierung wieder angezeigt. Der Nachteil liegt auf der Hand: Gesellen sich nun Mitglieder aus Österreich und der Schweiz zu den Deutschen, dann werden ihre vierstelligen Postleitzahlen zu fünfstelligen vervollständigt. Sie können nun mit den Sachsen verwechselt werden. Als Lösung bietet sich Text an.

Das gleiche Problem entsteht bei Telefonnummern. Will man die Durchwahl von Telefonnummern trennen, so benötigt man ein Zeichen: eine Leerstelle, eine Klammer oder einen Gedankenstrich. Zwar könnte dieser hinzuformatiert werden, allerdings sind Telefonnummern und Durchwahlnummern unterschiedlich lang. Es kann keine feste Position für das Trennzeichen angegeben werden. Über Vorwahlen braucht man wohl nicht zu sprechen: In Deutschland sind die Telefonvorwahlnummern drei-, vier- oder fünfziffrig. Alle besitzen eine führende Null. Es ist sehr schwierig, so etwas zu formatieren. Deshalb ist es besser, gleich auf Text zurückzugreifen.

Und warum nimmt man nicht immer gleich Text? Die Antwort ist simpel: Gerechnet werden kann nur mit Zahlen. Für einfache Rechnungen, aber auch für komplexe Funktionen müssen die Daten intern als Zahlen vorliegen. Nur dann kann die Rechnung erfolgen. Sie sollten sich also vor Erstellen des Felds genaue Gedanken darüber machen, ob und wie die Daten weiterverarbeitet werden. Manche Banken fordern beispielsweise bei einem automatischen Bankeinzug als Gegenprobe die Summe der Kontonummern und Bankleitzahlen!

Ein weiterer Grund liegt im Speicherplatz: Je kleiner der Datentyp pro Feld ist, umso weniger Speicher wird benötigt. Für eine Integer-Zahl, beispielsweise 31.998, werden 2 Byte benötigt. 2 Byte entsprechen allerdings erst zwei Zeichen. Wird die gleiche Zahl als Text gespeichert, so werden 5 Byte benötigt!

Eine andere Überlegung ist in diesem Zusammenhang noch wichtig. Es ist offensichtlich vernünftig, für Vor- und Zunamen zwei verschiedene Felder anzulegen. Für Straßen wird in der Regel nur eines verwendet. Auch dies ist nicht unproblematisch. Text wird anders sortiert als Zahlen. Nehmen Sie die drei Vornamen »Sieglinde«, »Brünhilde« und »Siegmund«. Um sie in eine alphabethische Reihenfolge zu bringen, wird der erste Buchstabe (das erste Zeichen) von allen drei Texten verglichen. Ergebnis: »B« < »S«. Folgerung: »Brünhilde« ist die erste. Da »S« = »S«, wird das zweite Zeichen genommen. Hier gilt »i« = »i«, ebenso »e« = »e« und »g« = »g«. Erst »l« < »m« ermöglicht die Aussage »Sieglinde« < »Siegmund«. Zahlen werden anders sortiert. Von den drei Zahlen 7, 21 und 13 wird nicht die Reihenfolge der Zeichen von links nach rechts betrachtet. Denn sonst würde gelten: 13 < 21 < 7. Und das ist falsch. Zahlen werden als ganze Zahlen betrachtet und verglichen. Ergebnis: 7 < 13 < 21. Was passiert nun mit Straßennamen. Angenommen, wir haben einige Mitglieder in der Wotanstraße, nämlich in der Wotanstraße 2, Wotanstraße 5a, Wotanstraße 5b, Wotanstraße 14, Wotanstraße 17-19 und Wotanstraße 22. Da es sich hier um einen Text handelt, werden die Einträge wie folgt sortiert: Wotanstraße 14, Wotanstraße 17-19, Wotanstraße 2, Wotanstraße 22, Wotanstraße 5a und Wotanstraße 5b. Aber das ist falsch. Eine Lösung wäre das Trennen in zwei Spalten: Straßennamen und Hausnummern. Aber daran schließt sich die Frage an, von welchem Typ die Hausnummer ist. Wird sie als Zahl deklariert, dann können Wotanstraße 5a und Wotanstraße 17-19 nicht eingetragen werden. Wird Sie als Text deklariert, dann funktioniert das korrekte Sortieren wieder nicht. Ich selbst habe früher in Mannheim, in »C7,17« gewohnt. Wie sollte man das auf Straße und Hausnummer verteilen? Korrekt wäre: Straße »C7«, Hausnummer »17«. Damit geht allerdings das Komma verloren. Verzichtet man auf das Komma, dann könnte es natürlich leicht zu Verwechslungen zwischen L1 22 und L12 2 kommen. Egal wie Sie das Problem lösen, auch hier sollten Hausnummern nicht als Zahlen deklariert werden, da es durchaus solche gibt, die keine »echten« Zahlen sind.

Die gleichen Überlegungen müssen selbstverständlich bei Nummern aller Art angestellt werden: Artikelnummern, Abteilungsnummern, KFZ-Kennzeichen, ISBN-Nummern, Sozialversicherungsnummern und so weiter.


Galileo Computing

9.1.2 Primärschlüssel  downtop

Ein wichtiges Kennzeichen von relationalen Datenbanken ist die Vergabe eines Schlüssels. Jeder Datensatz muss eindeutig durch einen Primärschlüssel identifizierbar sein. Ein Schlüssel kann ein eindeutiges Datenfeld darstellen oder eine Kombination aus mehreren, die Eindeutigkeit liefern. Dazu kann eine fortlaufende Zahl verwendet werden oder auch eine Zahl, die Eindeutigkeit aufweist: die Mitgliedsnummer. Folgende Lösung ist nicht die eleganteste, aber sie funktioniert immer: Wählen Sie zu Beginn der Tabelle als erste Spalte eine ID, vergeben Sie den Datentyp »AutoWert« und setzen Sie einen Primärschlüssel. Dann kann nichts mehr schief gehen!


Galileo Computing

9.1.3 Die Feldeigenschaften  downtop

Jeder Typ besitzt eine Reihe von Feldeigenschaften. Dort können weitere Kriterien eingestellt werden. Die wichtigste Eigenschaft ist sicherlich die Feldgröße. Je kleiner die Feldgröße gewählt wird, desto weniger Speicherplatz wird benötigt und desto schneller arbeitet die Datenbank.

Die Feldgröße kann für den Text festgelegt werden. Damit ist die Anzahl der Zeichen gemeint, die der Benutzer maximal eingeben darf. Auch für Zahlen gibt es eine Feldgröße. Folgende Werte stehen dabei zur Verfügung:

Tabelle 9.2   Die Zahlentypen von Access
Zahlentyp Wertebereich Dezimalstellen Benötigter Speicherplatz
Byte 0 bis 255 keine 1 Byte
Integer –32.768 bis 32.768 keine 2 Byte
Long Integer –2.147.483.648 bis 2.147.483.648 keine 4 Byte
Single –3,4 * 1038 bis 3,4 * 1038 7 4 Byte
Double –1,797 * 10308 bis 1,797 * 10308 15 8 Byte


Galileo Computing

9.1.4 Standardwert  downtop

In dieser Zeile kann festgelegt werden, ob der Benutzer einen Vorgabewert hat, den er überschreiben kann. Dies kann ein Text oder eine Zahl sein, die häufig vorkommen, oder das aktuelle Datum:

Datum()

Galileo Computing

9.1.5 Beschriftung  downtop

Die Beschriftung ist sekundär: Damit kann ein anderer Feldname angezeigt werden als derjenige, der verwendet wird. Werden etwa alle Feldnamen der Tabelle »tab_Mitglied« mit dem Präfix »tMit« versehen – also beispielsweise »tMitID«, »tMitTitel«, »tMitVorname«, ... –, dann könnte ihnen eine Beschriftung zugewiesen werden: ID, Titel, Vorname ... Der Vorteil der Beschriftung ist, dass alle Abfragen und Formulare (und natürlich auch Berichte) die Beschriftung als Standardtext verwenden. Man muss sie nicht neu beschriften. Allerdings gibt es noch eine Reihe anderer Möglichkeiten, auf Formularen zu beschriften.


Galileo Computing

9.1.6 Ändern von Datentypen  toptop

Beim Erstellen einer neuen Tabelle ist es problemlos möglich, Datentypen zu ändern. Stehen allerdings schon Werte in der Tabelle, dann kann dies zu Problemen führen. Wird die Feldeigenschaft vergrößert, entstehen in der Regel keine Probleme. Wird sie allerdings verkleinert, dann werden Texte, die zu lang waren, abgeschnitten, und zu große Zahlen werden gelöscht. Wird ein Text in eine Zahl verwandelt und steht »echter« Text in einem Feld, dann wird dieses gelöscht. Wird umgekehrt ein Datum oder eine Zahl in Text verwandelt, dann geschieht nichts. AutoWerte können in Zahlen verwandelt werden, Zahlen allerdings nicht in AutoWerte. Ist Letzteres gewünscht, dann muss die Spalte gelöscht und neu erzeugt werden.

Datentypen werden normalerweise dann geändert, wenn festgestellt wurde, dass der vorgegebene Typ zu klein ist. Wenn beispielsweise die Zahlen doch den Byte-Bereich von 255 überschreiten oder wenn »Zahlen« auch führende Nullen oder Buchstaben enthalten und sie nun als Text formatiert werden müssen, dann werden der Datentyp oder die Feldeigenschaft vergrößert.

Verkleinert werden Typen und Eigenschaften in der Regel dann, wenn externe Daten (Excel-Tabellen, Textdateien, andere Datenbankformate) in eine Access-Datenbank importiert werden. Dann sollte man die vorgeschlagene Größe überprüfen und in der Regel verkleinern. Access schlägt beim Textimport immer 255 Zeichen vor und bei Zahlen den Typ »Double«. Dies kann beim Importieren im Assistenten verändert werden oder im Nachhinein in der Entwurfsansicht der Tabelle. Überprüfen Sie die geänderten Daten. Sollte es zu Verlusten kommen, müssen die Daten gelöscht und erneut importiert werden.

  

VB.NET

Einstieg in ASP.NET

Einstieg in C#

Visual C#

VB.NET und Datenbanken

Einstieg in XML