Exemplarische Vorgehensweise: Speichern von Daten mithilfe einer Transaktion 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.

In dieser exemplarischen Vorgehensweise wird gezeigt, wie Daten mithilfe des System.Transactions-Namespace in einer Transaktion gespeichert werden. In dieser exemplarischen Vorgehensweise erstellen Sie eine Windows Forms-Anwendung. Sie verwenden den Assistenten zum Konfigurieren von Datenquellen, um ein Dataset für zwei Tabellen in der Northwind-Beispieldatenbank zu erstellen. Sie fügen einem Windows-Formular datengebundene Steuerelemente hinzu, und Sie ändern den Code für die Schaltfläche „Speichern“ von BindingNavigator, um die Datenbank in einem TransactionScope zu aktualisieren.

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 .NET-Desktopentwicklung 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 einer Windows Forms-Anwendung

Im ersten Schritt wird eine Windows Forms-App (.NET Framework) erstellt.

  1. Wählen Sie in Visual Studio im Menü Datei die Optionen Neu>Projekt aus.

  2. Erweitern Sie entweder Visual C# oder Visual Basic im linken Bereich, und wählen Sie dann Windows Desktop aus.

  3. Wählen Sie im mittleren Bereich den Projekttyp Windows Forms-App aus.

  4. Geben Sie dem Projekt den Namen SavingDataInATransactionWalkthrough, und wählen Sie dann OK aus.

    Das Projekt SavingDataInATransactionWalkthrough wird erstellt und zum Projektmappen-Explorer hinzugefügt.

Erstellen einer Datenbank-Datenquelle

In diesem Schritt wird der Assistent zum Konfigurieren von Datenquellen dazu verwendet, eine Datenquelle anhand der Tabellen Customers und Orders in der Beispieldatenbank Northwind zu erstellen.

  1. Wählen Sie zum Öffnen des Fensters Datenquellen im Menü Daten die Option Datenquellen anzeigen aus.

  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

    • Klicken Sie auf neue Verbindung, um das Dialogfeld Add/Modify Connection (Verbindung hinzufügen/ändern) zu starten und eine Verbindung mit der Datenbank Northwind herzustellen.

  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 die Option Fertig stellen aus.

    Das NorthwindDataSet wird Ihrem Projekt hinzugefügt, und die Tabellen Customers und Orders werden im Fenster Datenquellen angezeigt.

Hinzufügen von Steuerelementen zu dem Formular

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

  1. Erweitern Sie im Fenster Datenquellen den Knoten Customers.

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

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

  3. Ziehen Sie den zugehörigen Knoten Orders (der zugehörige untergeordnete Tabellenknoten unter der Spalte Fax, nicht der Hauptknoten Orders) auf das Formular unter CustomersDataGridView.

    Ein DataGridView wird auf dem Formular angezeigt. Ein OrdersTableAdapter und eine BindingSource werden auf der Komponentenleiste angezeigt.

Hinzufügen einer Referenz zur Assembly System.transactions

Transaktionen verwenden den Namespace System.Transactions. Eine Projektverweis zur Assembly system.transactions wird standardmäßig nicht hinzugefügt. Sie müssen das also manuell tun.

So fügen Sie einen Verweis zur DLL-Datei System.Transactions hinzu

  1. Wählen Sie im Menü Projekt die Option Verweis hinzufügen aus.

  2. Wählen Sie System.Transactions (auf der Registerkarte .NET) und dann die Option OK aus.

    Dem Projekt wird ein Verweis auf System.Transactions hinzugefügt.

Ändern des Codes in der Schaltfläche „SaveItem“ von BindingNavigator

Standardmäßig wird für die erste auf dem Formular abgelegte Tabelle Code dem click-Ereignis der Schaltfläche „Speichern“ auf dem BindingNavigator hinzugefügt. Sie müssen für das Ändern weiterer Tabellen den Code manuell hinzufügen. Bei dieser exemplarischen Vorgehensweise wird der vorhandene Speichercode aus dem Klickereignishandler der Schaltfläche „Speichern“ umgestaltet. Außerdem werden ein paar weitere Methoden dafür erstellt, die spezifische Aktualisierungsfunktionalität abhängig davon zur Verfügung zu stellen, ob die Zeile hinzugefügt oder gelöscht werden soll.

So ändern Sie automatisch generierten Speichern-Code

  1. Wählen Sie im CustomersBindingNavigator die Schaltfläche zum Speichern (die Schaltfläche mit dem Diskettensymbol) aus.

  2. Ersetzen Sie die CustomersBindingNavigatorSaveItem_Click-Methode durch folgenden Code:

    private void customersBindingNavigatorSaveItem_Click(object sender, EventArgs e)
    {
        UpdateData();
    }
    
    private void UpdateData()
    {
        this.Validate();
        this.customersBindingSource.EndEdit();
        this.ordersBindingSource.EndEdit();
    
        using (System.Transactions.TransactionScope updateTransaction = 
            new System.Transactions.TransactionScope())
        {
            DeleteOrders();
            DeleteCustomers();
            AddNewCustomers();
            AddNewOrders();
    
            updateTransaction.Complete();
            northwindDataSet.AcceptChanges();
        }
    }
    

Der Befehl für das Abgleichen zugehöriger Daten lautet wie folgt:

  • Löschen Sie untergeordnete Datensätze. (Löschen Sie in diesem Fall Datensätze aus der Tabelle Orders.)

  • Löschen Sie übergeordnete Datensätze. (Löschen Sie in diesem Fall Datensätze aus der Tabelle Customers.)

  • Fügen Sie übergeordnete Datensätze ein. (Fügen Sie in diesem Fall Datensätze in die Tabelle Customers ein.)

  • Fügen Sie untergeordnete Datensätze ein. (Fügen Sie in diesem Fall Datensätze in die Tabelle Orders ein.)

So löschen Sie eine vorhandene Bestellungen

  • Fügen Sie die folgende Methode DeleteOrders zu Form1 hinzu:

    private void DeleteOrders()
    {
        NorthwindDataSet.OrdersDataTable deletedOrders;
        deletedOrders = (NorthwindDataSet.OrdersDataTable)
            northwindDataSet.Orders.GetChanges(DataRowState.Deleted);
    
        if (deletedOrders != null)
        {
            try
            {
                ordersTableAdapter.Update(deletedOrders);
            }
            catch (System.Exception ex)
            {
                MessageBox.Show("DeleteOrders Failed");
            }
        }
    }
    

So löschen Sie eine vorhandene Kunden

  • Fügen Sie die folgende Methode DeleteCustomers zu Form1 hinzu:

    private void DeleteCustomers()
    {
        NorthwindDataSet.CustomersDataTable deletedCustomers;
        deletedCustomers = (NorthwindDataSet.CustomersDataTable)
            northwindDataSet.Customers.GetChanges(DataRowState.Deleted);
    
        if (deletedCustomers != null)
        {
            try
            {
                customersTableAdapter.Update(deletedCustomers);
            }
            catch (System.Exception ex)
            {
                MessageBox.Show("DeleteCustomers Failed");
            }
        }
    }
    

Neue Kunden hinzufügen

  • Fügen Sie die folgende Methode AddNewCustomers zu Form1 hinzu:

    private void AddNewCustomers()
    {
        NorthwindDataSet.CustomersDataTable newCustomers;
        newCustomers = (NorthwindDataSet.CustomersDataTable)
            northwindDataSet.Customers.GetChanges(DataRowState.Added);
    
        if (newCustomers != null)
        {
            try
            {
                customersTableAdapter.Update(newCustomers);
            }
            catch (System.Exception ex)
            {
                MessageBox.Show("AddNewCustomers Failed");
            }
        }
    }
    

Neue Bestellungen hinzufügen

  • Fügen Sie die folgende Methode AddNewOrders zu Form1 hinzu:

    private void AddNewOrders()
    {
        NorthwindDataSet.OrdersDataTable newOrders;
        newOrders = (NorthwindDataSet.OrdersDataTable)
            northwindDataSet.Orders.GetChanges(DataRowState.Added);
    
        if (newOrders != null)
        {
            try
            {
                ordersTableAdapter.Update(newOrders);
            }
            catch (System.Exception ex)
            {
                MessageBox.Show("AddNewOrders Failed");
            }
        }
    }
    

Ausführen der Anwendung

Drücken Sie F5, um die Anwendung auszuführen.