8.8 Arbeiten mit DataSets 

Puffer
Die Verbindung zwischen einer Anwendung und einer Datenbank kann auch halb-automatisiert, mithilfe der Entwicklungsumgebung über ein so genanntes DataSet aufgenommen werden. Das DataSet dient dabei als Puffer zur Zwischenspeicherung der Daten.
Der Ablauf bei der Benutzung ergibt sich wie folgt:
- Nach Aufnahme einer Verbindung werden die Daten aus der Datenbank in das DataSet kopiert. Anschließend wird die Verbindung wieder geschlossen.
- Nach Änderung einzelner oder mehrerer Datensätze des DataSets können die Daten über eine neue Verbindung in der Datenbank gespeichert werden.
8.8.1 Eine Tabelle in Detailansicht 

In einem ersten Beispiel soll auf die Tabelle personen der Access Datenbank firma.mdb über einen DataSet zugegriffen werden.
Zur schnellen Erstellung einer einfachen Datenbankanwendung (Projekt DBDataSet, siehe Abbildung 8.51):
- Erstellen Sie ein neues Windows-Forms-Projekt.
- Speichern Sie das gesamte Projekt.
- Rufen Sie im Kontextmenü des Projekts Hinzufügen • Vorhandenes Element auf. Es erscheint das entsprechende Dialogfeld.
Link hinzufügen
- Wählen Sie die Access-Datenbank firma.mdb in ihrem Originalverzeichnis aus. Sie wird normalerweise bei diesem Vorgang in das Projektverzeichnis kopiert und es werden dort weitere Kopien angelegt. Hier wollen wir aber immer auf das Original zugreifen. Daher wählen Sie im Aufklappmenü des Buttons Hinzufügen den Menüpunkt Als Link hinzufügen, siehe Abbildung 8.46.
Abbildung 8.46 Datenbank als Link hinzufügen
- Nach kurzer Zeit erscheint ein Assistentendialogfeld zum Konfigurieren der Datenquelle.
- Es ist eine Liste der Tabellen und Abfragen zu sehen. Markieren Sie die Tabelle personen, siehe Abbildung 8.47.
Abbildung 8.47 Auswahl der Tabelle »personen«
DataSet
- Nach dem Fertig stellen sehen Sie nach kurzer Zeit, dass im Projektmappenexplorer ein Objekt vom Typ DataSet hinzugefügt wurde (firmaDataSet), siehe Abbildung 8.48.
Abbildung 8.48 Objekt vom Typ DataSet
- Wählen Sie nun im Menü Daten den Menüpunkt Datenquellen anzeigen.
- Lassen Sie sich über den Projektmappenexplorer das Formular der Anwendung anzeigen, falls es momentan nicht sichtbar sein sollte.
- Wählen Sie in der Datenquellenanzeige im Aufklappmenü der Tabelle personen die Ansicht Details, siehe Abbildung 8.49.
Abbildung 8.49 Ansicht »Details«
- Ziehen Sie das Symbol der Tabelle personen aus der Datenquellenanzeige in das Formular der Anwendung.
Neue Steuerelemente
- Nach kurzer Zeit erscheinen im bzw. unter dem Formular:
- Eine Navigations-Symbolleiste.
- Einige (im Formular unsichtbare) Komponenten, siehe Abbildung 8.50.
- Ein Satz von Steuerelementen. Das Standardsteuerelement für ein Tabellenfeld ist eine Textbox, für ein Feld vom Typ Datum wird automatisch ein Objekt vom Typ DateTimePicker gewählt.
Abbildung 8.50 Komponenten für den DataSet
- Dadurch wird eine einfache Ansicht und Aktualisierung der Tabellendaten ermöglicht.
- Starten Sie die Anwendung, siehe Abbildung 8.51.
Abbildung 8.51 Anwendung mit DataSet
Zuerst speichern
Sie können nun durch die Datensätze navigieren. Sie können sie ändern. Sie können die Anwendung wieder beenden. Nach einem erneuten Start werden Sie feststellen, dass Daten erst nach Betätigung des Symbols Speichern dauerhaft in der Datenbank gespeichert werden. Vorher sind sie nur temporär im DataSet geändert.
Symbolleiste
Die Navigations-Symbolleiste für den DataSet besteht aus den folgenden Steuerelementen:
- AddNewItem: zum Bereitstellen eines neuen leeren Datensatzes
- CountItem: zur Anzeige der Anzahl der Datensätze
- DeleteItem: zum Löschen eines Datensatzes
- MoveFirstItem: geht zum ersten Datensatz
- MoveLastItem: geht zum letzten Datensatz
- MoveNextItem: geht zum nächsten Datensatz
- MovePreviousItem: geht zum vorigen Datensatz
- PositionItem: zur Positionierung auf einem bestimmten Datensatz und zur Anzeige des betreffenden Datensatzes
- Separator, Separator1, Separator2: zur optischen Trennung der Symbole
- NavigatorSaveItem: zur Speicherung der Inhalte des DataSets in der Datenbank
Projektkomponenten
Die neuen Komponenten des Projekts:
- BindingNavigator (hier: PersonenBindingNavigator): Zentrale Komponente zur Navigation, hat Verbindung zur BindingSource-Komponente.
- BindingSource (hier: PersonenBindingSource): Bildet die Verbindung zwischen den Daten-Steuerelementen (hier: Textboxen und DateTimePicker) und dem DataSet.
- TableAdapter (hier: PersonenTableAdapter): Stellt kurzfristig die Verbindung zwischen dem DataSet und der Datenbank her, zum Empfangen der Daten (von Datenbank zu DataSet) und zum Aktualisieren der Daten (von DataSet zu Datenbank).
- TableAdapterManager (hier: TableAdapterManager): Steuert die Reihenfolge der Aktualisierung der Daten, hier gibt es verschiedene Strategien.
- DataSet: (hier: FirmaDataSet): Puffer zur Zwischenspeicherung der Daten
8.8.2 Schließen ohne Speichern verhindern 

Ereignis Schließen
Als nützliche Ergänzung der Anwendung DBDataSet wird noch eine Ereignisprozedur hinzugefügt. Diese wird aufgerufen, sobald der Benutzer das Formular schließen möchte. Es gibt bekanntlich mehrere Möglichkeiten, ein Formular zu schließen:
- über den Aufruf der Methode Close() des Formulars
- über den Klick auf das Kreuz oben rechts im Systemmenü
- über die Tastenkombination
+
FormClosing
In allen Fällen tritt das Ereignis FormClosing ein. Mit der folgenden Prozedur haben Sie die Möglichkeit, das Schließen des Formulars zu verhindern, falls eine Änderung durchgeführt wurde, ohne dass danach gespeichert wurde:
Private Sub Form1_FormClosing( ByVal sender As System.Object, ByVal e As System.Windows. Forms.FormClosingEventArgs ) Handles MyBase.FormClosing If FirmaDataSet.HasChanges() Then If MessageBox.Show( "Beenden, ohne zu speichern?", "Daten geändert", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = DialogResult.No Then e.Cancel = True End If End If End Sub
Listing 8.11 Projekt »DBDataSet«, FormClosing-Ereignis
Zur Erläuterung:
- Die Prozedur zum Ereignis FormClosing bekommt als zweiten Parameter das Objekt e der Klasse FormClosingEventArgs geliefert.
HasChanges()
- Jede Änderung des DataSets wird registriert. Ein DataSet verfügt außerdem über die Methode HasChanges(), mit der Sie feststellen können, ob eine Änderung stattgefunden hat.
- Falls dies zutrifft, dann wird im vorliegenden Programm gefragt, ob Sie die Anwendung wirklich verlassen möchten ohne zu speichern, siehe Abbildung 8.52. Falls Sie mit Nein antworten, dann wird die Eigenschaft Cancel des Objekts e auf True gesetzt. Dies führt dazu, dass das Schließen des Formulars nicht stattfindet.
Abbildung 8.52 Rückfrage beim Schließen nach Änderung
8.8.3 Eine Tabelle in DataGrid-Ansicht 

Eine weitere, übersichtliche Möglichkeit zur Darstellung und Bearbeitung von Daten aus einer Datenbank stellt das Steuerelement DataGridView dar. Dies wird im Projekt DBDataSetGrid gezeigt, siehe Abbildung 8.53.
Abbildung 8.53 Verwendung eines DataGridView
DataGridView
Erstellen Sie ein neues Projekt. Gehen Sie genau so wie in der Anleitung des vorherigen Projekts vor. Wählen Sie jedoch in der Datenquellenanzeige im Aufklappmenü der Tabelle personen die Ansicht DataGridView, siehe Abbildung 8.54. Nunmehr können Sie alle Datensätze gleichzeitig sehen, ändern und speichern.
Abbildung 8.54 Tabellenansicht mit DataGridView
8.8.4 Mehrere Tabellen mit Relationen 

Zugriff auf drei Tabellen
In diesem Abschnitt wird mithilfe eines DataSets eine Anwendung (Projekt DBDataSetMehrereTabellen) mit Zugriff auf die Datenbank projektverwaltung.mdb erstellt. Diese Datenbank beinhaltet mehrere Tabellen und Relationen. Es soll möglich sein, auf die Datensätze der Tabelle projekt, die zugehörigen Datensätze der Tabelle projekt_person und dort über eine Auswahlliste auf den zugehörigen Nachnamen aus der Tabelle person zuzugreifen, also auf Daten aller drei miteinander verbundenen Tabellen, siehe Abbildung 8.55.
Abbildung 8.55 Zugriff auf Inhalte aus drei Tabellen
Die Erstellung:
- In einem neuen Projekt wird ein Element über den Menüpunkt Hinzufügen • Vorhandenes Element hinzugefügt: ein Link auf die Datei C:\Temp\projektverwaltung.mdb. Dabei werden alle Tabellen eingeschlossen. Damit steht ein DataSet zur Verfügung, der alle Tabellen und Relationen beinhaltet.
- Aus der Datenquellenansicht wird die Tabelle projekt in der Detail-Ansicht auf das Formular gezogen.
Tabellenauswahl
- Aus der Datenquellenansicht wird diejenige Tabelle projekt_person in der DataGrid-Ansicht auf das Formular gezogen, die in der Hierarchie eine Ebene unterhalb der Tabelle projekt steht, also die in Abbildung 8.56 markierte Tabelle. Damit werden nur die Datensätze der Tabelle projekt_person eingeblendet, die zum jeweiligen Datensatz der Tabelle projekt gehören.
Abbildung 8.56 Tabelle »projekt_person«, auf Tabelle »projekt« bezogen
Konfigurationsmenü
- Über den kleinen Pfeil oben rechts am DataGrid lässt sich ein Konfigurationsmenü aufklappen, u. a. mit Zugang zu den Dialogfeldern Spalten bearbeiten (Edit Columns) und Spalten hinzufügen (Add Column), siehe Abbildung 8.57.
Abbildung 8.57 Konfigurationsmenü des DataGridView
- Im Dialogfeld Spalten bearbeiten entfernen Sie die beiden Spalten pr_id und pe_id. Sie sind für die Ansicht überflüssig bzw. ungünstig zu bedienen.
- Im Dialogfeld Spalten hinzufügen wählen Sie die Spalte pe_id, den Typ DataGridViewComboBoxColumn und den Headertext pe_nachname, siehe Abbildung 8.58. Damit ist eine weitere Spalte im DataGrid zu sehen, noch ohne Datenbindung und als letzte Spalte.
Abbildung 8.58 Hinzufügen einer neuen Spalte
Spalten-Eigenschaften
- Im Dialogfeld Spalten bearbeiten verschieben Sie die neu hinzugefügte Spalte an die erste Stelle. Es werden die folgenden Eigenschaften zur Datenbindung eingestellt, siehe Abbildung 8.59:
- DataSource: über Weitere Datenquellen die Tabelle person
- DisplayMember: das Feld pe_nachname
- ValueMember: das Feld pe_id
Abbildung 8.59 Eigenschaften der neuen Spalte
DisplayMember liefert die sichtbaren Werte (hier den Nachnamen), wenn der Benutzer die Combobox aufklappt. ValueMember liefert die unsichtbaren zugehörigen Werte (hier die Personen-ID), über die eine Beziehung zu einer anderen Tabelle hergestellt wird.
Mit diesem Projekt steht Ihnen eine einfache Anwendung mit Zugriff auf Inhalte von drei miteinander verbundenen Tabellen zur Verfügung.