8.5 Ein Verwaltungsprogramm 

In diesem Abschnitt wird ein einfaches Programm (Projekt DBVerwaltung) zur Verwaltung einer Tabelle vorgestellt. Das Programm ermöglicht die grundlegenden Aktionen wie Alle Sehen, Name suchen, Einfügen, Ändern und Löschen, siehe Abbildung 8.25.
Abbildung 8.25 Benutzeroberfläche des Verwaltungsprogramms
8.5.1 Initialisierung 

Zunächst werden einige klassenweit gültige Variablen vereinbart. Außerdem werden beim Laden des Formulars einige allgemeine Einstellungen vorgenommen, die in den verschiedenen Ereignisprozeduren benötigt werden.
Imports System.Data.OleDb Public Class Form1 Dim con As New OleDbConnection Dim cmd As New OleDbCommand Dim reader As OleDbDataReader Dim pnummer As New ArrayList Private Sub Form1_Load(...) Handles MyBase.Load con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=C:\Temp\firma.mdb" cmd.Connection = con End Sub [...] End Class
Listing 8.3 Projekt »DBVerwaltung«, Initialisierung
Zur Erläuterung:
- Der Namespace System.Data.OleDb wird für die Nutzung der notwendigen Klassen innerhalb des gesamten Formulars importiert.
- Es werden die Variablen für Verbindung, SQL-Befehl und Reader deklariert.
ArrayList
- Außerdem wird ein Objekt der Datenstruktur ArrayList deklariert, siehe Abschnitt 4.6.
- Die Daten für die Verbindung (Provider, Datenquelle) werden bereitgestellt.
- Der SQL-Befehl wird mit der Verbindung verknüpft.
8.5.2 Alle Datensätze sehen 

Betätigt der Benutzer den Button Alle Sehen, werden alle Datensätze angezeigt, siehe Abbildung 8.26. Anschließend könnte man z. B. einen der angezeigten Datensätze markieren, um ihn zu verändern oder zu löschen.
Abbildung 8.26 Alle Datensätze sehen
Allgemeine Prozeduren
Die Ereignisprozedur ruft nur die allgemeine Prozedur AlleSehen() auf. Diese wird von mehreren Ereignisprozeduren aufgerufen. In der Prozedur AlleSehen() wird u. a. die allgemeine Prozedur Ausgabe() aufgerufen. Diese wird ebenfalls von verschiedenen Stellen des Programms aufgerufen.
Public Class Form1 [...] Private Sub cmdAlleSehen_Click(...) Handles ... AlleSehen() End Sub Private Sub AlleSehen() Try con.Open() cmd.CommandText = "select * from personen" Ausgabe() Catch ex As Exception MessageBox.Show(ex.Message) End Try con.Close() txtName.Text = "" txtVorname.Text = "" txtPersonalnummer.Text = "" txtGehalt.Text = "" txtGeburtstag.Text = "" End Sub Private Sub Ausgabe() reader = cmd.ExecuteReader() lstTab.Items.Clear() pnummer.Clear() Do While reader.Read() lstTab.Items.Add(reader("name") & " # " & reader("vorname") & " # " & reader("personalnummer") & " # " & reader("gehalt") & " # " & reader("geburtstag")) pnummer.Add(reader("personalnummer")) Loop reader.Close() End Sub [...] End Class
Listing 8.4 Projekt »DBVerwaltung«, alle Datensätze sehen
Zur Erläuterung:
- In der Prozedur AlleSehen() wird zunächst die Verbindung geöffnet.
- Der SQL-Befehl wird formuliert und gesendet.
- Anschließend wird die Prozedur Ausgabe() aufgerufen.
- Die Verbindung wird wieder geschlossen.
Benutzerführung
- Die Inhalte der fünf Textfelder werden gelöscht. Dies erzeugt einen Startzustand für alle weiteren, möglichen Aktionen und hilft bei einer besseren Benutzerführung.
- In der Prozedur Ausgabe() wird der SQL-Befehl ausgeführt. Das Ergebnis wird im Reader gespeichert.
Clear()
- Das Objekt der Klasse ArrayList wird mithilfe der Methode Clear() geleert.
- Die einzelnen Datensätze werden im Listenfeld ausgegeben.
Add()
- Parallel dazu wird die ArrayList pnummer mit den Personalnummern mithilfe der Methode Add() gefüllt. Das Objekt beinhaltet anschließend die Personalnummern unter dem gleichen Index wie die betreffenden Datensätze im Listenfeld. Dies wird zur Auswahl und Anzeige eines einzelnen Datensatzes in den fünf Textfeldern benötigt. Zum Ändern oder Löschen eines Datensatzes muss zuvor ein Datensatz ausgewählt werden.
- Der Reader wird wieder geschlossen.
8.5.3 Datensatz einfügen 

Falls der Benutzer den Button Einfügen betätigt, wird ein Datensatz eingefügt, der sich aus den Daten in den fünf Textfeldern zusammensetzt. Diese müssen zuvor vom Benutzer gefüllt werden, siehe Abbildung 8.27.
Abbildung 8.27 Ein neuer Datensatz
Die Ereignisprozedur hat den folgenden Code:
Private Sub cmdEinfügen_Click(...) Handles ... Dim anzahl As Integer Try con.Open() cmd.CommandText = "insert into personen " & "(name, vorname, personalnummer, " & "gehalt, geburtstag) values ('" & txtName.Text & "', '" & txtVorname.Text & "', " & txtPersonalnummer.Text & ", " & txtGehalt.Text.Replace(",", ".") & ", '" & txtGeburtstag.Text & "')" 'MessageBox.Show(cmd.CommandText) anzahl = cmd.ExecuteNonQuery() If anzahl > 0 Then MessageBox.Show( "Ein Datensatz eingefügt") End If Catch ex As Exception MessageBox.Show(ex.Message) MessageBox.Show("Bitte mindestens einen" & " Namen, eine eindeutige Personal" & "nummer und ein gültiges Geburts" & "datum eintragen") End Try con.Close() AlleSehen() End Sub
Listing 8.5 Projekt »DBVerwaltung«, Datensatz einfügen
Zur Erläuterung:
- Die Verbindung wird geöffnet.
- Der SQL-Befehl zum Einfügen wird mit den Inhalten der fünf Textfelder zusammengesetzt. Zur Kontrolle können Sie sich den Befehl mithilfe der Methode MessageBox.Show() ansehen, siehe Abbildung 8.28. Bei den Feldern für Zeichenketten und Datumsangaben achten Sie wieder auf die einfachen Hochkommata.
Abbildung 8.28 Kontrolle des insert-Befehls
Doppelte Personalnummer
- Falls die eingetragene Personalnummer bereits in einem anderen Datensatz vorkommt, tritt ein Fehler auf und es erscheint eine entsprechende Fehlermeldung.
Dezimaltrennzeichen
- Das Gehalt wird in dem zugehörigen Textfeld mit einem Komma als Dezimaltrennzeichen eingetragen. Zur Speicherung in der Datenbank wird dieses Komma mithilfe der Methode Replace() in einen Punkt umgewandelt.
- Der SQL-Befehl wird gesendet. Im Erfolgsfall wird ausgegeben, dass ein Datensatz eingefügt werden konnte.
- Die Verbindung wird wieder geschlossen.
- Alle Datensätze, einschließlich des neu eingefügten Datensatzes, werden im Listenfeld neu angezeigt.
8.5.4 Datensatz ändern 

Die Daten eines bestimmten Datensatzes werden in den Textfeldern angezeigt, wenn der Benutzer vorher den betreffenden Eintrag im Listenfeld ausgewählt hat. Er kann nun die Daten des Datensatzes ändern. Betätigt er anschließend den Button Ändern, so wird der Datensatz mit den angezeigten Daten aktualisiert.
Die Ereignisprozedur, die für die Anzeige eines Datensatzes in den Textfeldern sorgt, hat folgenden Code:
Private Sub lstTab_SelectedIndexChanged(... ) Handles lstTab.SelectedIndexChanged Try con.Open() cmd.CommandText = "select * from personen" & " where personalnummer = " & pnummer(lstTab.SelectedIndex) reader = cmd.ExecuteReader() reader.Read() txtName.Text = reader("name") txtVorname.Text = reader("vorname") txtPersonalnummer.Text = reader("personalnummer") txtGehalt.Text = reader("gehalt") txtGeburtstag.Text = reader("geburtstag") reader.Close() Catch ex As Exception MessageBox.Show(ex.Message) End Try con.Close() End Sub
Listing 8.6 Projekt »DBVerwaltung«, Datensatz anzeigen
Zur Erläuterung:
- Sobald der Benutzer einen Datensatz in der Liste markiert, wird diese Prozedur aufgerufen.
- Es wird ein SQL-Befehl zusammengesetzt, in dem der betreffende Datensatz ausgewählt wird. Dazu wird der zugehörige Eintrag (mit der Personalnummer) in der ArrayList pnummer benutzt.
- Markiert der Benutzer den dritten Datensatz von oben, so steht die Eigenschaft SelectedIndex des Listenfelds auf dem Wert 2. Es wird dann das Element 2 aus der ArrayList pnummer ermittelt. Dies ist die Personalnummer des markierten Datensatzes, denn das Listenfeld und die ArrayList wurden parallel gefüllt.
- Der SQL-Befehl wird gesendet. Das Ergebnis der Abfrage besteht nur aus einem Datensatz, aufgrund der Eindeutigkeit des Felds personalnummer. Daher muss keine Schleife durchlaufen werden.
- Es wird ein Datensatz mithilfe der Methode Read() aus dem Reader geholt. Sein Inhalt wird in den fünf Textfeldern dargestellt.
Die Ereignisprozedur zum Ändern des ausgewählten (und gegebenenfalls veränderten) Datensatzes sieht wie folgt aus:
Private Sub cmdÄndern_Click(...) Handles ... Dim anzahl As Integer Try con.Open() cmd.CommandText = "update personen set " & "name = '" & txtName.Text & "', " & "vorname = '" & txtVorname.Text & "', " & "personalnummer = " & txtPersonalnummer.Text & ", " & "gehalt = " & txtGehalt.Text.Replace(",", ".") & ", " & "geburtstag = '" & txtGeburtstag.Text & "' " & "where personalnummer = " & pnummer(lstTab.SelectedIndex) 'MessageBox.Show(cmd.CommandText) anzahl = cmd.ExecuteNonQuery() If anzahl > 0 Then MessageBox.Show("Datensatz geändert") End If Catch ex As Exception MessageBox.Show(ex.Message) MessageBox.Show("Bitte einen Datensatz" & " auswählen und mindestens einen" & " Namen, eine eindeutige Personal" & "nummer und ein gültiges Geburts" & "datum eintragen") End Try con.Close() AlleSehen() End Sub
Listing 8.7 Projekt »DBVerwaltung«, Datensatz ändern
Zur Erläuterung:
- Die Verbindung wird geöffnet.
Ändern
- Der SQL-Befehl zum Ändern wird mit den Inhalten der fünf Textfelder zusammengesetzt. Zur Kontrolle können Sie sich den Befehl wiederum mithilfe der Methode MessageBox.Show() ansehen, siehe Abbildung 8.29. Er bezieht sich nur auf den markierten Datensatz, da die zugehörige Personalnummer in der where-Klausel angegeben wurde.
Abbildung 8.29 Kontrolle des update-Befehls
- Bei dem SQL-Befehl ist wie beim Einfügen auf Folgendes zu achten:
- einfache Hochkommata bei Zeichenketten und Datumsangaben
- gültige Zahlen- und Datumsangaben
- Der SQL-Befehl wird gesendet. Im Erfolgsfall wird ausgegeben, dass ein Datensatz geändert werden konnte.
- Die Verbindung wird wieder geschlossen.
- Alle Datensätze, einschließlich des soeben geänderten Datensatzes, werden im Listenfeld neu angezeigt.
8.5.5 Datensatz löschen 

Der Benutzer kann den Datensatz löschen, den er zuvor im Listenfeld ausgewählt hat. Dessen Daten werden zusätzlich in den fünf Textfeldern angezeigt.
Die Ereignisprozedur zum Löschen des ausgewählten Datensatzes hat folgenden Code:
Private Sub cmdLöschen_Click(...) Handles ... Dim anzahl As Integer If txtPersonalnummer.Text = "" Then MessageBox.Show( "Bitte einen Datensatz auswählen") Exit Sub End If If MessageBox.Show("Wollen Sie den ausge" & "wählten Datensatz wirklich löschen?", "Löschen", MessageBoxButtons.YesNo) = DialogResult.No Then Exit Sub End If Try con.Open() cmd.CommandText = "delete from personen " & "where personalnummer = " & pnummer(lstTab.SelectedIndex) 'MessageBox.Show(cmd.CommandText) anzahl = cmd.ExecuteNonQuery() If anzahl > 0 Then MessageBox.Show("Datensatz gelöscht") End If Catch ex As Exception MessageBox.Show(ex.Message) End Try con.Close() AlleSehen() End Sub
Listing 8.8 Projekt »DBVerwaltung«, Datensatz löschen
Zur Erläuterung:
- Es wird zunächst geprüft, ob der Benutzer einen Datensatz ausgewählt hat.
Löschen
- Zur Sicherheit wird der Benutzer noch einmal gefragt, ob er den Datensatz wirklich löschen möchte, siehe Abbildung 8.30. Dies ist die übliche Vorgehensweise, um versehentliches Löschen zu vermeiden.
Abbildung 8.30 Rückfrage vor dem Löschen
- Die Verbindung wird geöffnet.
- Der SQL-Befehl zum Löschen wird zusammengesetzt, siehe Abbildung 8.31. Er bezieht sich nur auf den markierten Datensatz, da die zugehörige Personalnummer in der where-Klausel angegeben wurde.
- Der SQL-Befehl wird gesendet. Im Erfolgsfall wird ausgegeben, dass ein Datensatz gelöscht werden konnte.
- Die Verbindung wird wieder geschlossen.
Abbildung 8.31 Kontrolle des delete-Befehls
- Alle noch vorhandenen Datensätze, ohne den soeben gelöschten Datensatz, werden im Listenfeld neu angezeigt.
8.5.6 Datensatz suchen 

Zur Suche nach einem bestimmten Datensatz muss zuvor im Feld name ein Suchtext eingegeben werden. Nach Betätigung des Buttons Name suchen werden alle Datensätze angezeigt, die den Suchtext an einer beliebigen Stelle im Feld name enthalten, siehe Abbildung 8.32.
Abbildung 8.32 Suchen mit (Teil-)Name
Anschließend könnte man z. B. einen der angezeigten Datensätze markieren, um ihn zu verändern oder zu löschen. Die Ereignisprozedur sieht wie folgt aus:
Private Sub cmdNameSuchen_Click(...) Handles ... Try con.Open() cmd.CommandText = "select * from personen where" & " name like '%" & txtName.Text & "%'" 'MessageBox.Show(cmd.CommandText) Ausgabe() Catch ex As Exception MessageBox.Show(ex.Message) End Try con.Close() End Sub
Listing 8.9 Projekt »DBVerwaltung«, Suchen im Feld »name«
Zur Erläuterung:
- Die Verbindung wird geöffnet.
Suchen
- Der SQL-Befehl zum Suchen wird zusammengesetzt. Er beinhaltet den Namen, den der Benutzer im zugehörigen Textfeld eingegeben hat, in der where-Klausel. Die Prozentzeichen davor und dahinter sorgen dafür, dass alle Datensätze gefunden werden, die den Suchtext an einer beliebigen Stelle im Feld name enthalten, siehe Abbildung 8.33.
Abbildung 8.33 Kontrolle des Suchbefehls
- Es wird die Funktion Ausgabe() aufgerufen. Diese sorgt – wie bei der Ausgabe aller Datensätze – für das Senden des SQL-Befehls und für das Empfangen und Anzeigen des Abfrage-Ergebnisses.
- Die Verbindung wird wieder geschlossen.