Speichern von Daten in einer Datenbank (mehrere Tabellen) in .NET Framework-Anwendungen

Hinweis

Datasets und verwandte Klassen sind ältere .NET-Technologien aus den frühen 2000er Jahren, die es Anwendungen ermöglichen, mit Daten im Arbeitsspeicher zu arbeiten, während die Anwendungen von der Datenbank getrennt sind. Die Technologien sind besonders nützlich für Anwendungen, die es Benutzern ermöglichen, Daten zu ändern und die Änderungen wieder in der Datenbank zu speichern. Obwohl sich Datasets als sehr erfolgreiche Technologie erwiesen haben, empfehlen wir, dass neue .NET-Anwendungen Entity Framework Core verwenden. Entity Framework bietet eine natürlichere Möglichkeit, mit tabellarischen Daten als Objektmodelle zu arbeiten, und verfügt über eine einfachere Programmierschnittstelle.

Eines der häufigsten Szenarios in der Anwendungsentwicklung ist das Anzeigen von Daten auf einem Formular in einer Windows-Anwendung, das Bearbeiten der Daten und das Senden der aktualisierten Daten zurück an die Datenbank. In dieser exemplarischen Vorgehensweise wird ein Formular erstellt, in dem Daten aus zwei verknüpften Tabellen angezeigt werden. Darüber hinaus wird gezeigt, wie Datensätze bearbeitet und Änderungen wieder in der Datenbank gespeichert werden. In diesem Beispiel werden die Tabellen Customers und Orders aus der Beispieldatenbank Northwind verwendet.

Sie können Daten in der Anwendung wieder in der Datenbank speichern, indem Sie die Update-Methode eines TableAdapter aufrufen. Wenn Sie Tabellen aus dem Fenster Datenquellen in ein Formular ziehen, wird der zum Speichern von Daten erforderliche Code automatisch hinzugefügt. Alle zusätzlichen Tabellen, die einem Formular hinzugefügt werden, erfordern das manuelle Hinzufügen dieses Codes. In dieser exemplarischen Vorgehensweise wird veranschaulicht, wie Code hinzugefügt wird, um Aktualisierungen aus mehreren Tabellen zu speichern.

In dieser exemplarischen Vorgehensweise werden u. a. folgende Aufgaben veranschaulicht:

Voraussetzungen

Für dieses Tutorial müssen die Workloads .NET-Desktopentwicklung und Datenspeicherung und -verarbeitung in Visual Studio installiert sein. Um diese zu installieren, öffnen Sie Visual Studio-Installer und wählen Ändern (oder Weitere>Ändern) neben der Version von Visual Studio aus, die Sie ändern möchten. Weitere Informationen finden Sie im Artikel Ändern von Visual Studio durch Hinzufügen oder Entfernen von Arbeitsauslastungen und Komponenten.

In dieser exemplarischen Vorgehensweise werden SQL Server Express LocalDB und die Northwind-Beispieldatenbank verwendet.

  1. Wenn Sie nicht über SQL Server Express LocalDB verfügen, installieren Sie diese Komponente entweder über die SQL Server Express-Downloadseite oder über den Visual Studio-Installer. Im Visual Studio-Installer können Sie SQL Server Express LocalDB als Teil der Workload Datenspeicherung und -verarbeitung oder als einzelne Komponente installieren.

  2. Installieren Sie die Northwind-Beispieldatenbank, indem Sie die folgenden Schritte ausführen:

    1. Öffnen Sie in Visual Studio das Fenster SQL Server-Objekt-Explorer. (Der SQL Server-Objekt-Explorer wird als Teil der Workload für die Datenspeicherung und -verarbeitung im Visual Studio-Installer installiert.) Erweitern Sie den Knoten SQL Server. Klicken Sie mit der rechten Maustaste auf Ihre LocalDB-Instanz, und wählen Sie Neue Abfrage aus.

      Ein Abfrage-Editor-Fenster wird geöffnet.

    2. Kopieren Sie das Northwind-Transact-SQL-Skript in die Zwischenablage. Dieses T-SQL-Skript erstellt die Northwind-Datenbank von Grund auf neu und füllt sie mit Daten auf.

    3. Fügen Sie das T-SQL-Skript in den Abfrage-Editor ein, und klicken Sie dann auf die Schaltfläche Ausführen.

      Nach kurzer Zeit wird die Ausführung der Abfrage abgeschlossen, und die Northwind-Datenbank wird erstellt.

Erstellen der Windows Forms-Anwendung

Erstellen Sie ein neues Windows Forms App-Projekt für C# oder Visual Basic. Nennen Sie das Projekt UpdateMultipleTablesWalkthrough.

Erstellen Sie die Datenquelle.

In diesem Schritt wird mit dem Assistenten zum Konfigurieren von Datenquellen eine Datenquelle aus der Northwind-Datenbank erstellt. Sie benötigen Zugriff auf die Beispieldatenbank Northwind, um die Verbindung herstellen zu können. Informationen zum Einrichten der Northwind-Beispieldatenbank finden Sie unter Installieren von Beispieldatenbanken.

  1. Klicken Sie im Menü Daten auf Datenquellen anzeigen.

    Das Fenster Datenquellen wird geöffnet.

  2. Wählen Sie im Datenquellenfenster die Option Neue Datenquelle hinzufügen aus, um den Assistenten zum Konfigurieren von Datenquellen zu starten.

  3. Wählen Sie auf dem Bildschirm Datenquellentyp auswählen die Option Datenbank und dann Weiter aus.

  4. Führen Sie auf dem Bildschirm Wählen Sie Ihre Datenverbindung einen der folgenden Schritte aus:

    • Wenn in der Dropdownliste eine Datenverbindung zur Beispieldatenbank „Northwind“ verfügbar ist, wählen Sie diese aus.

      Oder

    • Wählen Sie Neue Verbindung aus, um das Dialogfeld Verbindung hinzufügen/ändern zu öffnen.

  5. Falls die Datenbank ein Kennwort erfordert, aktivieren Sie die Option für die Einbeziehung vertraulicher Daten, und wählen Sie dann Weiter aus.

  6. Wählen Sie auf der Seite Verbindungszeichenfolge in der Anwendungskonfigurationsdatei speichern die Option Weiter aus.

  7. Erweitern Sie auf dem Bildschirm Datenbankobjekte auswählen den Knoten Tabellen.

  8. Wählen Sie die Tabellen Customers und Orders und dann Fertig stellen aus.

    NorthwindDataSet wird dem Projekt hinzugefügt. Die Tabellen werden im Fenster Datenquellen angezeigt.

Festlegen der zu erstellenden Steuerelemente

In dieser exemplarischen Vorgehensweise werden die Daten der Tabelle Customers in einem Detaillayout dargestellt, in dem die Daten in einzelnen Steuerelementen angezeigt werden. Die Daten aus der Tabelle Orders werden in einem Rasterlayout in einem DataGridView-Steuerelement dargestellt.

So legen Sie den Ablagetyp für die Elemente im Datenquellenfenster fest

  1. Erweitern Sie im Fenster Datenquellen den Knoten Customers.

  2. Ändern Sie das Steuerelement der Tabelle Customers in einzelne Steuerelemente, indem Sie Details in der Steuerelementliste des Knotens Customers auswählen. Weitere Informationen finden Sie unter Festlegen des Steuerelements, das beim Ziehen aus dem Fenster „Datenquellen“ erstellt werden soll.

Erstellen des datengebundenen Formulars

Sie können die datengebundenen Steuerelemente erstellen, indem Sie Elemente aus dem Fenster Datenquellen auf das Formular ziehen.

  1. Ziehen Sie den Hauptknoten Customers aus dem Fenster Datenquellen auf Form1.

    Auf dem Formular werden datengebundene Steuerelemente mit beschreibenden Bezeichnungen sowie ein Toolstrip (BindingNavigator) für die Navigation in den Datensätzen angezeigt. Ein NorthwindDataSet, CustomersTableAdapter, BindingSource und BindingNavigator werden auf der Komponentenleiste angezeigt.

  2. Ziehen Sie den Knoten Orders aus dem Fenster Datenquellen auf Form1.

    Hinweis

    Der verknüpfte Knoten Orders befindet sich unter der Spalte Fax und ist ein untergeordneter Knoten des Knotens Customers.

    Auf dem Formular wird ein DataGridView-Steuerelement und ein Toolstrip (BindingNavigator) für die Navigation in den Datensätzen angezeigt. Ein OrdersTableAdapter und eine BindingSource werden auf der Komponentenleiste angezeigt.

Hinzufügen von Code zum Aktualisieren der Datenbank

Sie können die Datenbank aktualisieren, indem Sie die Update-Methoden der TableAdapters Customers und Orders aufrufen. Ein Ereignishandler für die Schaltfläche Speichern von BindingNavigator wird standardmäßig dem Code des Formulars hinzugefügt, um Aktualisierungen an die Datenbank zu senden. Mit dieser Prozedur wird der Code geändert und sichergestellt, dass Aktualisierungen in der richtigen Reihenfolge gesendet werden, um mögliche Fehler der referenziellen Integrität zu verhindern. Mit dem Code wird außerdem die Fehlerbehandlung implementiert, indem der Aktualisierungsaufruf mit einem Try-Catch-Block umschlossen wird. Sie können den Code entsprechend den Anforderungen der Anwendung anpassen.

Hinweis

Aus Gründen der Übersichtlichkeit wird in dieser exemplarischen Vorgehensweise keine Transaktion verwendet. Wenn Sie jedoch zwei oder mehr verknüpfte Tabellen aktualisieren, sollten Sie die gesamte Aktualisierungslogik in eine Transaktion einschließen. Eine Transaktion ist ein Prozess, der sicherstellt, dass alle zugehörigen Änderungen an einer Datenbank erfolgreich abgeschlossen werden, bevor ein Commit für eine der Änderungen ausgeführt wird. Weitere Informationen finden Sie unter Transaktionen und Parallelität.

So fügen Sie der Anwendung Aktualisierungslogik hinzu

  1. Wählen Sie im BindingNavigator die Schaltfläche Speichern aus. Dadurch wird der Code-Editor für den bindingNavigatorSaveItem_Click-Ereignishandler geöffnet.

  2. Ändern Sie den Code im Ereignishandler, sodass die Update-Methoden der verknüpften TableAdapters aufgerufen werden. Mit folgendem Code werden zunächst drei temporäre Datentabellen zum Speichern der aktualisierten Informationen für jeden DataRowState (Deleted, Added und Modified) erstellt. Die Aktualisierungen werden in der richtigen Reihenfolge ausgeführt. Der Code sollte wie folgt aussehen:

    this.Validate();
    this.ordersBindingSource.EndEdit();
    this.customersBindingSource.EndEdit();
    
    NorthwindDataSet.OrdersDataTable deletedOrders = (NorthwindDataSet.OrdersDataTable)
        northwindDataSet.Orders.GetChanges(DataRowState.Deleted);
    
    NorthwindDataSet.OrdersDataTable newOrders = (NorthwindDataSet.OrdersDataTable)
        northwindDataSet.Orders.GetChanges(DataRowState.Added);
    
    NorthwindDataSet.OrdersDataTable modifiedOrders = (NorthwindDataSet.OrdersDataTable)
        northwindDataSet.Orders.GetChanges(DataRowState.Modified);
    
    try
    {
        // Remove all deleted orders from the Orders table.
        if (deletedOrders != null)
        {
            ordersTableAdapter.Update(deletedOrders);
        }
    
        // Update the Customers table.
        customersTableAdapter.Update(northwindDataSet.Customers);
    
        // Add new orders to the Orders table.
        if (newOrders != null)
        {
            ordersTableAdapter.Update(newOrders);
        }
    
        // Update all modified Orders.
        if (modifiedOrders != null)
        {
            ordersTableAdapter.Update(modifiedOrders);
        }
    
        northwindDataSet.AcceptChanges();
    }
    
    catch (System.Exception ex)
    {
        MessageBox.Show("Update failed");
    }
    
    finally
    {
        if (deletedOrders != null)
        {
            deletedOrders.Dispose();
        }
        if (newOrders != null)
        {
            newOrders.Dispose();
        }
        if (modifiedOrders != null)
        {
            modifiedOrders.Dispose();
        }
    }
    

Testen der Anwendung

  1. Drücken Sie F5.

  2. Nehmen Sie in jeder Tabelle einige Änderungen an den Daten eines oder mehrerer Datensätze vor.

  3. Klicken Sie auf die Schaltfläche Speichern.

  4. Überprüfen Sie die Werte in der Datenbank, um sicherzustellen, dass die Änderungen gespeichert wurden.