Exemplarische Vorgehensweise: Speichern von Daten aus verknüpften Datentabellen (Hierarchische Aktualisierung)
Das Speichern von Daten aus einer Anwendung zurück in die Datenbank ist recht einfach, wenn Sie mit einer einzelnen Datentabelle arbeiten und keine Fremdschlüsseleinschränkungen berücksichtigt werden müssen. Wenn Sie jedoch Daten aus einem DataSet speichern müssen, in dem mehrere verknüpfte Datentabellen enthalten sind, müssen Sie die Änderungen an der Datenbank in einer festgelegten Reihenfolge senden, sodass keine Einschränkungen verletzt werden. Wenn Sie geänderte Daten in verknüpften Tabellen aktualisieren, können Sie die programmgesteuerte Logik bereitstellen, um spezifische Datenuntergruppen aus den einzelnen Tabellen zu extrahieren und die Aktualisierungen in der richtigen Reihenfolge an die Datenbank zu senden, oder Sie verwenden die TableAdapterManager-Komponente.
In dieser exemplarischen Vorgehensweise wird erläutert, wie die verknüpften Daten mithilfe der TableAdapterManager-Komponente gespeichert werden. Informationen über das manuelle Codieren der Aktualisierungen von verknüpften Datentabellen finden Sie unter Exemplarische Vorgehensweise: Speichern von Daten in einer Datenbank (mehrere Tabellen).
Vorbereitungsmaßnahmen
Um diese exemplarische Vorgehensweise nachzuvollziehen, benötigen Sie Folgendes:
- Zugriff auf die Beispieldatenbank Northwind. Weitere Informationen finden Sie unter Gewusst wie: Installieren von Beispieldatenbanken.
Erstellen der Windows-basierten Anwendung
Der erste Schritt in dieser exemplarischen Vorgehensweise ist das Erstellen einer neuen Windows-basierten Anwendung.
So erstellen Sie die neue Windows-basierte Anwendung
Erstellen Sie über das Menü Datei ein neues Projekt.
Tipp
Hierarchische Aktualisierungen werden in Visual Basic- und C#-Projekten unterstützt. Erstellen Sie das neue Projekt daher in einer dieser Sprachen.
Nennen Sie das Projekt HierarchicalUpdateWalkthrough.
Wählen Sie Windows Forms-Anwendung aus, und klicken Sie auf OK. Weitere Informationen finden Sie unter Erstellen von Windows-basierten Anwendungen.
Das Projekt HierarchicalUpdateWalkthrough wird erstellt und dem Projektmappen-Explorer hinzugefügt.
Erstellen des DataSets
Da zur Veranschaulichung von hierarchischen Aktualisierungen verknüpfte Tabellen erforderlich sind, ist der nächste Schritt das Erstellen eines DataSets, in dem die Tabellen Customers und Orders aus der Northwind-Datenbank enthalten sind. Erstellen Sie das DataSet mithilfe des Assistenten zum Konfigurieren von Datenquellen. Sie benötigen Zugriff auf die Beispieldatenbank Northwind, um die Verbindung erstellen zu können. Informationen zum Einrichten der Beispieldatenbank Northwind finden Sie unter Gewusst wie: Installieren von Beispieldatenbanken.
So erstellen Sie das DataSet
Klicken Sie im Menü Daten auf Datenquellen anzeigen.
Wählen Sie im Datenquellenfenster die Option Neue Datenquelle hinzufügen aus, um den Assistenten zum Konfigurieren von Datenquellen zu starten.
Klicken Sie auf der Seite Datenquellentyp auswählen auf Datenbank und anschließend auf Weiter.
Führen Sie auf der Seite Wählen Sie Ihre Datenverbindung eine der folgenden Aktionen aus:
Wenn im Dropdown-Listenfeld eine Datenverbindung zur Beispieldatenbank Northwind verfügbar ist, klicken Sie auf diese.
- oder -
Klicken Sie auf Neue Verbindung, um das Dialogfeld Verbindung hinzufügen/ändern zu öffnen. Weitere Informationen finden Sie unter Dialogfeld "Verbindung hinzufügen/ändern" (Allgemein).
Sollte für die Datenbank ein Kennwort erforderlich sein, wählen Sie die Option für die Einbeziehung vertraulicher Daten aus, und klicken Sie anschließend auf Weiter.
Klicken Sie auf der Seite Verbindungszeichenfolge in der Anwendungskonfigurationsdatei speichern auf Weiter.
Erweitern Sie auf der Seite Datenbankobjekte auswählen den Knoten Tabellen.
Aktivieren Sie die Kontrollkästchen für die Tabellen Customers und Orders, und klicken Sie dann auf Fertig stellen.
Das NorthwindDataSet wird erstellt und Ihrem Projekt hinzugefügt. Die Tabellen werden im Fenster Datenquellen angezeigt.
Ändern der zu erstellenden datengebundenen Standardsteuerelemente
Nach Auffüllen des Fensters Datenquellen können Sie die zu erstellenden Steuerelemente auswählen, wenn Sie die Elemente in ein Windows Form ziehen. In dieser exemplarischen Vorgehensweise werden die Daten aus der Tabelle Customers in einzelnen Steuerelementen angezeigt (Details). Die Daten aus der Tabelle Orders werden in einem DataGridView-Steuerelement angezeigt (DataGridView).
So legen Sie das Steuerelement für die Elemente im Datenquellenfenster fest
Erweitern Sie im Datenquellenfenster den Knoten Customers.
Ändern Sie die zu erstellenden Steuerelemente der Tabelle Customers in einzelne Steuerelemente, indem Sie in der Steuerelementliste des Knotens Customers auf Details klicken. Weitere Informationen finden Sie unter Gewusst wie: Festlegen des Steuerelements, das beim Ziehen aus dem Datenquellenfenster erstellt werden soll.
Tipp
In der Tabelle Orders wird das Standardsteuerelement DataGridView verwendet.
Erstellen des datengebundenen Formulars
Erstellen Sie nach Auswahl der Steuerelemente im Fenster Datenquellen die datengebundenen Steuerelemente, indem Sie die Elemente auf das Formular ziehen.
So erstellen Sie datengebundene Steuerelemente für die Daten von Customers und Orders
Ziehen Sie den Hauptknoten Customers aus dem Datenquellenfenster auf Form1.
Auf dem Formular werden datengebundene Steuerelemente mit beschreibenden Bezeichnungen und einer TableAdapterManager-Komponente angezeigt, einer Symbolleiste (BindingNavigator) zum Navigieren in Datensätzen. Auf der Komponentenleiste werden ein typisiertes DataSet, ein TableAdapter und eine BindingSource angezeigt.
Ziehen Sie den Knoten Orders aus dem Datenquellenfenster in Form1.
Tipp
Der verknüpfte Knoten Orders befindet sich in der Tabelle Customers unter dem Knoten Fax und ist dem Knoten Customers untergeordnet. Der Knoten Orders, der als Peer zum Knoten Customers angezeigt wird, stellt sämtliche Reihenfolgen in der Tabelle dar. Der Knoten Orders, der als untergeordneter Knoten des Knotens Customers angezeigt wird, stellt die verknüpften Reihenfolgen dar.
Auf dem Formular werden ein DataGridView-Steuerelement und eine Symbolleiste (BindingNavigator) zur Navigation in den Datensätzen angezeigt. Ein TableAdapter und eine BindingSource werden auf der Komponentenleiste angezeigt.
Ändern des generierten sicheren Codes zum Ausführen der hierarchischen Aktualisierung
Speichern Sie Änderungen aus den verknüpften Datentabellen in der Datenbank, indem Sie die TableAdapterManager.UpdateAll-Methode aufrufen und den Namen des DataSets weitergeben, das die verknüpften Tabellen enthält. Führen Sie beispielsweise die TableAdapterManager.UpdateAll(NorthwindDataSet)-Methode aus, um Aktualisierungen von allen Tabellen im NorthwindDataSet an die Back-End-Datenbank zu senden.
Nachdem Sie die Elemente aus dem Fenster Datenquellen abgelegt haben, wird automatisch Code zum Form_Load-Ereignis hinzugefügt, um die einzelnen Tabellen zu füllen (die TableAdapter.Fill-Methoden). Außerdem wird Code zum Click-Ereignis der Schaltfläche Speichern des BindingNavigator hinzugefügt, um Daten aus dem DataSet wieder in der Datenbank zu speichern (die TableAdapterManager.UpdateAll-Methode).
Der generierte sichere Code enthält darüber hinaus eine Codezeile, durch die die CustomersBindingSource.EndEdit-Methode aufgerufen wird. Genauer gesagt wird die EndEdit-Methode der ersten BindingSource aufgerufen, die dem Formular hinzugefügt wurde. Mit anderen Worten, dieser Code wird nur für die erste Tabelle generiert, die aus dem Fenster Datenquellen in das Formular gezogen wird. Durch den EndEdit-Aufruf wird für alle anstehenden Änderungen in sämtlichen datengebundenen Steuerelementen, die zurzeit bearbeitet werden, ein Commit ausgeführt. Wenn das datengebundene Steuerelement noch über einen Fokus verfügt und Sie auf die Schaltfläche Speichern klicken, wird daher vor dem eigentlichen Speichern für alle anstehenden Bearbeitungen im Steuerelement ein Commit ausgeführt (TableAdapterManager.UpdateAll-Methode).
Tipp
Der Designer fügt lediglich den BindingSource.EndEdit-Code für die erste Tabelle hinzu, die auf dem Formular abgelegt wird. Sie müssen daher eine Codezeile hinzufügen, um die BindingSource.EndEdit-Methode für jede verknüpfte Tabelle auf dem Formular aufzurufen. Im Rahmen dieser exemplarischen Vorgehensweise bedeutet dies, dass Sie der OrdersBindingSource.EndEdit-Methode einen Aufruf hinzufügen müssen.
So aktualisieren Sie den Code, um vor dem Speichern einen Commit für Änderungen an den verknüpften Tabellen auszuführen
Doppelklicken Sie auf die Schaltfläche Speichern auf dem BindingNavigator, um Form1 im Code-Editor zu öffnen.
Fügen Sie eine Codezeile für den Aufruf der OrdersBindingSource.EndEdit-Methode nach der Zeile hinzu, durch die die CustomersBindingSource.EndEdit-Methode aufgerufen wird. Der Code im Click-Ereignis der Schaltfläche Speichern sollte etwa folgendermaßen aussehen:
Me.Validate() Me.CustomersBindingSource.EndEdit() Me.OrdersBindingSource.EndEdit() Me.TableAdapterManager.UpdateAll(Me.NorthwindDataSet)
this.Validate(); this.customersBindingSource.EndEdit(); this.ordersBindingSource.EndEdit(); this.tableAdapterManager.UpdateAll(this.northwindDataSet);
Zusätzlich zum Commit von Änderungen in einer verknüpften untergeordneten Tabelle müssen Sie vor dem Speichern in einer Datenbank möglicherweise auch einen Commit für die einzelnen neu erstellten übergeordneten Datensätze ausführen, bevor Sie dem DataSet neue untergeordnete Datensätze hinzufügen. Mit anderen Worten, Sie müssen möglicherweise den neuen übergeordneten Datensatz (Customer) dem DataSet hinzufügen, bevor Fremdschlüsseleinschränkungen das Hinzufügen neuer untergeordneter Datensätze (Orders) zum DataSet zulassen. Zu diesem Zweck können Sie das untergeordnete BindingSource.AddingNew-Ereignis verwenden.
Tipp
Ob Sie für neue übergeordnete Datensätze einen Commit ausführen müssen oder nicht ist von dem Steuerelementtyp abhängig, der zum Binden Ihrer Datenquelle verwendet wird. In dieser exemplarischen Vorgehensweise verwenden Sie einzelne Steuerelemente, die an die übergeordnete Tabelle gebunden werden. Dies erfordert zusätzlichen Code, um einen Commit für den neuen übergeordneten Datensatz auszuführen. Wenn die übergeordneten Datensätze in einem komplexen Bindungssteuerelement wie beispielsweise DataGridView angezeigt werden, ist dieser zusätzliche EndEdit-Aufruf für den übergeordneten Datensatz nicht erforderlich. Der Grund hierfür ist, dass der Commit-Vorgang für neue Datensätzen von der zugrunde liegenden Datenbindungsfunktionalität des Steuerelements ausgeführt wird.
So fügen Sie Code hinzu, um für übergeordnete Datensätze im DataSet einen Commit auszuführen, bevor neue untergeordnete Datensätze hinzugefügt werden
Erstellen Sie einen Ereignishandler für das OrdersBindingSource.AddingNew-Ereignis.
- Öffnen Sie Form1 in der Entwurfsansicht, klicken Sie auf der Komponentenleiste auf OrdersBindingSource, wählen Sie im Fenster Eigenschaften die Option Ereignisse aus, und doppelklicken Sie auf das AddingNew-Ereignis.
Fügen Sie dem Ereignishandler eine Codezeil hinzu, von der die CustomersBindingSource.EndEditMethode aufgerufen wird. Der Code im OrdersBindingSource_AddingNew-Ereignishandler sollte etwa folgendermaßen aussehen:
Me.CustomersBindingSource.EndEdit()
this.customersBindingSource.EndEdit();
Überprüfen, ob hierarchische Aktualisierungen aktiviert sind
Hierarchische Aktualisierungen werden durch Festlegen der Eigenschaft Hierarchische Aktualisierung des DataSets an- und ausgeschaltet. In der Standardeinstellung sind hierarchische Aktualisierungen aktiviert. Sie müssen für diese exemplarische Vorgehensweise den Wert für die Eigenschaft Hierarchische Aktualisierung daher nicht ändern.
So überprüfen Sie, ob hierarchische Aktualisierungen aktiviert sind
Öffnen Sie das DataSet im DataSet-Designer, indem Sie im Projektmappen-Explorer auf die Datei NorthwindDataSet.xsd doppelklicken.
Wählen Sie einen leeren Bereich auf der Entwurfsoberfläche aus.
Suchen Sie im Eigenschaftenfenster die Eigenschaft Hierarchische Aktualisierung, und überprüfen Sie, ob sie auf True festgelegt ist.
Tipp
Durch die Einstellung der Eigenschaft Hierarchische Aktualisierung wird gesteuert, ob mit einem TableAdapterManager Code generiert wird. Außerdem wird die Logik festgelegt, um hierarchische Aktualisierungen auszuführen bzw. nicht auszuführen. Durch Festlegen der Einstellung HierarchicalUpdate auf True wird ein TableAdapterManager generiert, durch Festlegen der Einstellung HierarchicalUpdate auf False wird kein TableAdapterManager generiert.
Testen der Anwendung
So testen Sie die Anwendung
Drücken Sie F5.
Nehmen Sie in jeder Tabelle einige Änderungen an den Daten eines oder mehrerer Datensätze vor.
Fügen Sie einen neuen Kunden hinzu, und fügen Sie anschließend eine neue Reihenfolge für diesen Kunden hinzu.
Klicken Sie auf die Schaltfläche Speichern. Durch den TableAdapterManager wird die erforderliche Logik für alle verwandten Aktualisierungen behandelt.
Überprüfen Sie die Werte in der Datenbank, um sicherzustellen, dass die Änderungen in jeder Tabelle gespeichert wurden.
Nächste Schritte
Abhängig von den Anforderungen Ihrer Anwendung können nach dem Speichern der verknüpften Daten in der Windows-Anwendung weitere Schritte sinnvoll sein. Zu den möglichen Verbesserungen, die Sie an dieser Anwendung vornehmen können, gehören die folgenden:
Hinzufügen einer dritten Tabelle, z. B. die Tabelle OrderDetails, sowie Experimentieren mit einer drei-Tabellen-Hierarchie
Hinzufügen von Validierungscode, um zu überprüfen, ob diese Daten neben den Datenbankeinschränkungen auch den Anwendungsanforderungen entsprechen. Weitere Informationen finden Sie unter Überprüfen von Daten.
Siehe auch
Aufgaben
Gewusst wie: Konfigurieren von Fremdschlüsseleinschränkungen in einem DataSet
Gewusst wie: Festlegen der Reihenfolge beim Durchführen einer hierarchischen Aktualisierung
Gewusst wie: Implementieren der hierarchischen Aktualisierung in vorhandenen Visual Studio-Projekten