Exemplarische Vorgehensweise: Speichern von Daten im Rahmen einer Transaktion
Diese exemplarische Vorgehensweise erläutert, wie Sie mit dem System.Transactions-Namespace Daten im Rahmen einer Transaktion speichern können.In diesem Beispiel werden die Tabellen Customers und Orders aus der Beispieldatenbank Northwind verwendet.
Vorbereitungsmaßnahmen
Diese exemplarische Vorgehensweise erfordert Zugriff auf die Beispieldatenbank Northwind.Informationen zum Einrichten der Beispieldatenbank Northwind finden Sie unter Gewusst wie: Installieren von Beispieldatenbanken.
Erstellen einer Windows-Anwendung
Im ersten Schritt wird eine Windows-Anwendung erstellt.
So erstellen Sie das neue Windows-Projekt
Erstellen Sie in Visual Studio im Menü Datei ein neues Projekt.
Geben Sie dem Projekt den Namen SavingDataInATransactionWalkthrough.
Wählen Sie Windows-Anwendung aus, und klicken Sie auf OK.Weitere Informationen finden Sie unter Entwickeln von Clientanwendungen.
Das Projekt SavingDataInATransactionWalkthrough wird erstellt und dem Projektmappen-Explorer hinzugefügt.
Erstellen einer Datenquelle, die auf einer Datenbank basiert
In diesem Schritt wird mit dem Assistent zum Konfigurieren von Datenquellen eine Datenquelle erstellt, die auf den Tabellen Customers und Orders aus der Beispieldatenbank Northwind basiert.
So erstellen Sie die Datenquelle
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.
Wählen Sie auf der Seite Datenquellentyp auswählen die Option Datenbank aus, und klicken Sie auf Weiter.
Führen Sie auf der Seite Wählen Sie Ihre Datenverbindung einen der folgenden Schritte aus:
Wenn eine Datenverbindung zur Beispieldatenbank Northwind in der Dropdownliste verfügbar ist, wählen Sie sie aus.
- oder -
Wählen Sie Neue Verbindung aus, um das Dialogfeld Verbindung hinzufügen/ändern zu öffnen, und erstellen Sie eine Verbindung zur Datenbank Northwind.Weitere Informationen finden Sie unter Dialogfeld "Verbindung hinzufügen/ändern" (Allgemein).
Falls die Datenbank ein Kennwort erfordern sollte, aktivieren Sie die Option für die Einbeziehung vertraulicher Daten, und klicken Sie dann auf Weiter.
Klicken Sie auf der Seite Verbindungszeichenfolge in der Programmkonfigurationsdatei speichern auf Weiter.
Erweitern Sie auf der Seite Datenbankobjekte auswählen den Knoten Tabellen.
Wählen Sie die Tabellen Customers und Orders aus, und klicken Sie dann auf Fertig stellen.
Das NorthwindDataSet wird Ihrem Projekt hinzugefügt, und die Tabellen Customers und Orders werden im Datenquellenfenster angezeigt.
Hinzufügen von Steuerelementen zum Formular
Sie können die datengebundenen Steuerelemente erstellen, indem Sie Elemente aus dem Datenquellenfenster auf das Formular ziehen.
So erstellen Sie datengebundene Steuerelemente auf dem Windows Form
Erweitern Sie im Datenquellenfenster den Knoten Customers.
Ziehen Sie den Hauptknoten Customers aus dem Datenquellenfenster auf Form1.
Auf dem Formular wird ein DataGridView-Steuerelement und ein Toolstrip (BindingNavigator) für die Navigation in den Datensätzen angezeigt.Ein NorthwindDataset, ein CustomersTableAdapter, BindingSource und ein BindingNavigator werden auf der Komponentenleiste angezeigt.
Ziehen Sie den zugehörigen Knoten Orders (den Knoten, der zur entsprechenden untergeordneten Tabelle gehört und sich unterhalb der Spalte Fax befindet – nicht den Hauptknoten Orders) unterhalb von CustomersDataGridView auf das Formular.
Im Formular wird ein DataGridView-Steuerelement angezeigt.OrdersTableAdapter und BindingSource werden auf der Komponentenleiste angezeigt.
Hinzufügen eines Verweises auf die System.Transactions-Assembly
Transaktionen verwenden den System.Transactions-Namespace.Ein Projektverweis auf die System.Transactions-Assembly wird nicht standardmäßig hinzugefügt. Daher müssen Sie ihn manuell hinzufügen.
So fügen Sie einen Verweis auf die System.Transactions-DLL-Datei hinzu
Wählen Sie im Menü Projekt die Option Verweis hinzufügen aus.
Wählen Sie auf der Registerkarte .NET die Option System.Transactions aus, und klicken Sie auf OK.
Dem Projekt wird ein Verweis auf System.Transactions hinzugefügt.
Ändern des Codes in der SaveItem-Schaltfläche von BindingNavigator
Standardmäßig wird dem click Ereignis der Schaltfläche Speichern im BindingNavigator Code für die erste auf dem Formular abgelegte Tabelle hinzugefügt.Den Code für die Aktualisierung weiterer Tabellen müssen Sie manuell hinzufügen.Für diese exemplarische Vorgehensweise nehmen wir eine Umgestaltung des bestehenden Codes zum Speichern aus dem Klickereignishandler der Schaltfläche Speichern vor und erstellen weitere Methoden, die eine speziell auf das Hinzufügen oder Löschen von Zeilen zugeschnittene Aktualisierungsfunktionalität bereitstellen.
So ändern Sie den automatisch generierten Code zum Speichern
Doppelklicken Sie im CustomersBindingNavigator auf die Schaltfläche Speichern (Diskettensymbol).
Ersetzen Sie die CustomersBindingNavigatorSaveItem_Click-Methode durch folgenden Code:
Private Sub CustomersBindingNavigatorSaveItem_Click() Handles CustomersBindingNavigatorSaveItem.Click UpdateData() End Sub Private Sub UpdateData() Me.Validate() Me.CustomersBindingSource.EndEdit() Me.OrdersBindingSource.EndEdit() Using updateTransaction As New Transactions.TransactionScope DeleteOrders() DeleteCustomers() AddNewCustomers() AddNewOrders() updateTransaction.Complete() NorthwindDataSet.AcceptChanges() End Using End Sub
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(); } }
Die Reihenfolge für das Abgleichen von Änderungen an zusammengehörigen Daten ist folgende:
Löschen der untergeordneten Datensätze (in diesem Fall: Löschen der Datensätze aus der Tabelle Orders)
Löschen der übergeordneten Datensätze (in diesem Fall: Löschen der Datensätze aus der Tabelle Customers)
Einfügen der übergeordneten Datensätze (in diesem Fall: Einfügen der Datensätze in die Tabelle Customers)
Einfügen der untergeordneten Datensätze (in diesem Fall: Einfügen der Datensätze in die Tabelle Orders)
So löschen Sie Bestellungen aus der Tabelle "Orders"
Fügen Sie Form1 die folgende DeleteOrders-Methode hinzu:
Private Sub DeleteOrders() Dim deletedOrders As NorthwindDataSet.OrdersDataTable deletedOrders = CType(NorthwindDataSet.Orders.GetChanges(Data.DataRowState.Deleted), NorthwindDataSet.OrdersDataTable) If Not IsNothing(deletedOrders) Then Try OrdersTableAdapter.Update(deletedOrders) Catch ex As Exception MessageBox.Show("DeleteOrders Failed") End Try End If End Sub
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 Kunden aus der Tabelle "Customers"
Fügen Sie Form1 die folgende DeleteCustomers-Methode hinzu:
Private Sub DeleteCustomers() Dim deletedCustomers As NorthwindDataSet.CustomersDataTable deletedCustomers = CType(NorthwindDataSet.Customers.GetChanges(Data.DataRowState.Deleted), NorthwindDataSet.CustomersDataTable) If Not IsNothing(deletedCustomers) Then Try CustomersTableAdapter.Update(deletedCustomers) Catch ex As Exception MessageBox.Show("DeleteCustomers Failed" & vbCrLf & ex.Message) End Try End If End Sub
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"); } } }
So fügen Sie der Tabelle "Customers" neue Kunden hinzu
Fügen Sie Form1 die folgende AddNewCustomers-Methode hinzu:
Private Sub AddNewCustomers() Dim newCustomers As NorthwindDataSet.CustomersDataTable newCustomers = CType(NorthwindDataSet.Customers.GetChanges(Data.DataRowState.Added), NorthwindDataSet.CustomersDataTable) If Not IsNothing(newCustomers) Then Try CustomersTableAdapter.Update(newCustomers) Catch ex As Exception MessageBox.Show("AddNewCustomers Failed" & vbCrLf & ex.Message) End Try End If End Sub
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"); } } }
So fügen Sie der Tabelle "Orders" neue Bestellungen hinzu
Fügen Sie Form1 die folgende AddNewOrders-Methode hinzu:
Private Sub AddNewOrders() Dim newOrders As NorthwindDataSet.OrdersDataTable newOrders = CType(NorthwindDataSet.Orders.GetChanges(Data.DataRowState.Added), NorthwindDataSet.OrdersDataTable) If Not IsNothing(newOrders) Then Try OrdersTableAdapter.Update(newOrders) Catch ex As Exception MessageBox.Show("AddNewOrders Failed" & vbCrLf & ex.Message) End Try End If End Sub
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
So führen Sie die Anwendung aus
- Drücken Sie F5, um die Anwendung auszuführen.
Siehe auch
Aufgaben
Gewusst wie: Speichern von Daten mithilfe von Transaktionen
Konzepte
Enlisting in Distributed Transactions
Leveraging System.Transactions
Vorbereiten der Anwendung auf den Empfang von Daten
Abrufen von Daten für die Anwendung
Binden von Steuerelementen an Daten in Visual Studio
Bearbeiten von Daten in der Anwendung