Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Hinweis
Die DataSet Klassen und verwandten Klassen sind ältere .NET Framework-Technologien aus den frühen 2000er Jahren, mit denen Anwendungen mit Daten im Arbeitsspeicher arbeiten können, während die Apps von der Datenbank getrennt sind. Die Technologien sind besonders nützlich für Apps, mit denen Benutzer Daten ändern und die Änderungen wieder in der Datenbank speichern können. Obwohl Datasets eine bewährte erfolgreiche Technologie sind, ist der empfohlene Ansatz für neue .NET-Anwendungen die Verwendung von Entity Framework Core. Entity Framework bietet eine natürlichere Möglichkeit zum Arbeiten mit tabellarischen Daten als Objektmodelle und verfügt über eine einfachere Programmierschnittstelle.
Parallelitätsausnahmen (System.Data.DBConcurrencyException) werden ausgelöst, wenn zwei Benutzer versuchen, dieselben Daten in einer Datenbank gleichzeitig zu ändern. In dieser exemplarischen Vorgehensweise erstellen Sie eine Windows-Anwendung, die veranschaulicht, wie Sie eine DBConcurrencyException abfangen, die Zeile lokalisieren, die den Fehler verursacht hat, und eine Strategie erlernen, wie Sie damit umgehen können.
Diese Schritt-für-Schritt-Anleitung führt Sie durch den folgenden Prozess:
Erstellen Sie ein neues Windows Forms App (.NET Framework) -Projekt.
Erstellen Sie ein neues Dataset basierend auf der Tabelle "Northwind Customers".
Erstellen Sie ein Formular mit einer DataGridView, um die Daten anzuzeigen.
Füllen Sie ein Dataset mit Daten aus der Tabelle "Kunden" in der Northwind-Datenbank aus.
Verwenden Sie das Feature "Tabellendaten anzeigen " im Server-Explorer , um auf die Daten der Kundentabelle zuzugreifen und einen Datensatz zu ändern.
Ändern Sie denselben Datensatz in einen anderen Wert, aktualisieren Sie das Dataset, und versuchen Sie, die Änderungen in die Datenbank zu schreiben, wodurch ein Parallelitätsfehler ausgelöst wird.
Erfassen Sie den Fehler, und zeigen Sie dann die verschiedenen Versionen des Datensatzes an, sodass der Benutzer ermitteln kann, ob die Datenbank fortgesetzt und aktualisiert werden soll, oder brechen Sie die Aktualisierung ab.
Voraussetzungen
In dieser exemplarischen Vorgehensweise wird SQL Server Express LocalDB und die Northwind-Beispieldatenbank verwendet.
Wenn Sie nicht über SQL Server Express LocalDB verfügen, installieren Sie sie entweder über die SQL Server Express-Downloadseite oder über das Visual Studio-Installationsprogramm. Im Visual Studio Installerkönnen Sie SQL Server Express LocalDB als Teil der Datenspeicher und Verarbeitung Workload oder als einzelne Komponente installieren.
Installieren Sie die Northwind-Beispieldatenbank, indem Sie die folgenden Schritte ausführen:
Öffnen Sie in Visual Studio das fenster SQL Server-Objekt-Explorer. (SQL Server-Objekt-Explorer wird als Teil der Datenspeicherungs- und Verarbeitungsauslastung im Visual Studio Installer installiert.) Erweitern Sie den SQL Server-Knoten . Klicken Sie mit der rechten Maustaste auf Ihre LocalDB-Instanz, und wählen Sie neue Abfrageaus.
Ein Abfrage-Editor-Fenster wird geöffnet.
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.
Fügen Sie das T-SQL-Skript in den Abfrage-Editor ein, und wählen Sie dann die Schaltfläche Ausführen aus.
Nach kurzer Zeit wird die Ausführung der Abfrage abgeschlossen, und die Northwind-Datenbank wird erstellt.
Erstellen eines neuen Projekts
Erstellen Sie zunächst eine neue Windows Forms-Anwendung:
Wählen Sie in Visual Studio im Menü "Datei" die Option "Neues Projekt"> aus.
Erweitern Sie entweder Visual C# oder Visual Basic im linken Bereich, und wählen Sie dann Windows Desktop aus.
Wählen Sie im mittleren Bereich den Projekttyp "Windows Forms-App " aus.
Benennen Sie das Projekt "ConcurrencyWalkthrough", und wählen Sie dann "OK" aus.
Das Projekt ConcurrencyWalkthrough wird erstellt und dem Projektmappen-Explorer hinzugefügt, woraufhin ein neues Formular im Designer geöffnet wird.
Erstellen des Northwind-Datasets
Erstellen Sie als Nächstes ein Dataset mit dem Namen "NorthwindDataSet":
Wählen Sie im Menü "Daten " die Option "Neue Datenquelle hinzufügen" aus.
Der Assistent zum Konfigurieren von Datenquellen wird geöffnet.
Wählen Sie auf dem Bildschirm " Datenquellentyp auswählen " die Option "Datenbank" aus.

Wählen Sie eine Verbindung mit der Northwind-Beispieldatenbank aus der Liste der verfügbaren Verbindungen aus. Wenn die Verbindung in der Liste der Verbindungen nicht verfügbar ist, wählen Sie "Neue Verbindung" aus.
Hinweis
Wenn Sie eine Verbindung mit einer lokalen Datenbankdatei herstellen, wählen Sie "Nein " aus, wenn Sie gefragt werden, ob Sie die Datei zu Ihrem Projekt hinzufügen möchten.
Wählen Sie auf dem Bildschirm "Verbindungszeichenfolge in der Anwendungskonfigurationsdatei speichern" die Option "Weiter" aus.
Erweitern Sie den Knoten "Tabellen ", und wählen Sie die Tabelle " Kunden " aus. Der Standardname für das Dataset sollte NorthwindDataSet sein.
Wählen Sie "Fertig stellen" aus, um das Dataset dem Projekt hinzuzufügen.
Erstellen eines datengebundenen DataGridView-Steuerelements
In diesem Abschnitt erstellen Sie ein System.Windows.Forms.DataGridView Element, indem Sie das Element "Kunden " aus dem Fenster "Datenquellen " auf Ihr Windows Form-Formular ziehen.
Um das Fenster "Datenquellen " zu öffnen, wählen Sie im Menü "Daten " die Option "Datenquellen anzeigen" aus.
Erweitern Sie im Fenster "Datenquellen " den Knoten "NorthwindDataSet ", und wählen Sie dann die Tabelle " Customers " aus.
Wählen Sie den Abwärtspfeil auf dem Tabellenknoten und dann DataGridView in der Dropdownliste aus.
Ziehen Sie die Tabelle auf einen leeren Bereich des Formulars.
Ein DataGridView Steuerelement mit dem Namen CustomersDataGridView und ein BindingNavigator Steuerelement namens CustomersBindingNavigator werden dem Formular hinzugefügt, das an das BindingSource gebunden ist. Dies ist wiederum an die Tabelle "Customers" im NorthwindDataSet gebunden.
Testen des Formulars
Sie können nun das Formular testen, um sicherzustellen, dass es sich bis zu diesem Punkt wie erwartet verhält:
Wählen Sie F5 aus, um die Anwendung auszuführen.
Das Formular wird mit einem DataGridView Steuerelement angezeigt, das mit Daten aus der Tabelle "Kunden" gefüllt ist.
Klicken Sie im Menü Debuggen auf Stop Debugging (Debuggen beenden).
Behandeln von Parallelitätsfehlern
Die Behandlung von Fehlern hängt von den spezifischen Geschäftsregeln ab, die Ihre Anwendung regeln. Für diesen Walkthrough verwenden wir die folgende Strategie als Beispiel für die Behandlung eines Parallelitätsfehlers.
Die Anwendung stellt dem Benutzer drei Versionen des Datensatzes vor:
Der aktuelle Datensatz in der Datenbank
Der ursprüngliche Datensatz, der in das Dataset geladen wird
Die vorgeschlagenen Änderungen im Dataset
Der Benutzer kann dann entweder die Datenbank mit der vorgeschlagenen Version überschreiben oder das Update abbrechen und das Dataset mit den neuen Werten aus der Datenbank aktualisieren.
So aktivieren Sie das Handling von Parallelitätsfehlern
Erstellen Sie einen benutzerdefinierten Fehlerhandler.
Zeigen Sie dem Benutzer Auswahlmöglichkeiten an.
Verarbeiten sie die Antwort des Benutzers.
Senden Sie das Update erneut, oder setzen Sie die Daten im Dataset zurück.
Hinzufügen von Code zur Behandlung der Parallelitäts ausnahme
Wenn Sie versuchen, eine Aktualisierung durchzuführen und eine Ausnahme ausgelöst wird, möchten Sie im Allgemeinen etwas mit den Informationen ausführen, die von der ausgelösten Ausnahme bereitgestellt werden. In diesem Abschnitt fügen Sie Code hinzu, der versucht, die Datenbank zu aktualisieren. Sie behandeln auch jede DBConcurrencyException, die ausgelöst werden kann, sowie alle anderen Ausnahmen.
Hinweis
Die CreateMessage- und ProcessDialogResults-Methoden werden später in der Anleitung hinzugefügt.
Fügen Sie den folgenden Code unter der
Form1_LoadMethode hinzu:private void UpdateDatabase() { try { this.customersTableAdapter.Update(this.northwindDataSet.Customers); MessageBox.Show("Update successful"); } catch (DBConcurrencyException dbcx) { DialogResult response = MessageBox.Show(CreateMessage((NorthwindDataSet.CustomersRow) (dbcx.Row)), "Concurrency Exception", MessageBoxButtons.YesNo); ProcessDialogResult(response); } catch (Exception ex) { MessageBox.Show("An error was thrown while attempting to update the database."); } }
Ersetzen Sie die
CustomersBindingNavigatorSaveItem_ClickMethode, um dieUpdateDatabaseMethode aufzurufen, damit sie wie folgt aussieht:
Anzeigen von Auswahlmöglichkeiten für den Benutzer
Der Code, den Sie gerade geschrieben haben, ruft die CreateMessage Prozedur auf, um Fehlerinformationen für den Benutzer anzuzeigen. Für diese exemplarische Vorgehensweise verwenden Sie ein Meldungsfeld, um die verschiedenen Versionen des Datensatzes für den Benutzer anzuzeigen. Dadurch kann der Benutzer auswählen, ob der Datensatz mit den Änderungen überschrieben oder die Bearbeitung abgebrochen werden soll. Sobald der Benutzer eine Option (klickt auf eine Schaltfläche) im Meldungsfeld auswählt, wird die Antwort an die ProcessDialogResult Methode übergeben.
Erstellen Sie die Nachricht, indem Sie dem Code-Editor den folgenden Code hinzufügen. Geben Sie diesen Code unter der UpdateDatabase Methode ein:
private string CreateMessage(NorthwindDataSet.CustomersRow cr)
{
return
"Database: " + GetRowData(GetCurrentRowInDB(cr), DataRowVersion.Default) + "\n" +
"Original: " + GetRowData(cr, DataRowVersion.Original) + "\n" +
"Proposed: " + GetRowData(cr, DataRowVersion.Current) + "\n" +
"Do you still want to update the database with the proposed value?";
}
//--------------------------------------------------------------------------
// This method loads a temporary table with current records from the database
// and returns the current values from the row that caused the exception.
//--------------------------------------------------------------------------
private NorthwindDataSet.CustomersDataTable tempCustomersDataTable =
new NorthwindDataSet.CustomersDataTable();
private NorthwindDataSet.CustomersRow GetCurrentRowInDB(NorthwindDataSet.CustomersRow RowWithError)
{
this.customersTableAdapter.Fill(tempCustomersDataTable);
NorthwindDataSet.CustomersRow currentRowInDb =
tempCustomersDataTable.FindByCustomerID(RowWithError.CustomerID);
return currentRowInDb;
}
//--------------------------------------------------------------------------
// This method takes a CustomersRow and RowVersion
// and returns a string of column values to display to the user.
//--------------------------------------------------------------------------
private string GetRowData(NorthwindDataSet.CustomersRow custRow, DataRowVersion RowVersion)
{
string rowData = "";
for (int i = 0; i < custRow.ItemArray.Length ; i++ )
{
rowData = rowData + custRow[i, RowVersion].ToString() + " ";
}
return rowData;
}
Verarbeiten der Antwort des Benutzers
Außerdem benötigen Sie Code, um die Antwort des Benutzers auf das Meldungsfeld zu verarbeiten. Die Optionen sind entweder das Überschreiben des aktuellen Datensatzes in der Datenbank mit der vorgeschlagenen Änderung, oder verlassen Sie die lokalen Änderungen, und aktualisieren Sie die Datentabelle mit dem Datensatz, der sich derzeit in der Datenbank befindet. Wenn der Benutzer "Ja" auswäht, wird die Merge Methode aufgerufen, wobei das Argument "preserveChanges " auf "true" festgelegt ist. Dies bewirkt, dass der Aktualisierungsversuch erfolgreich ist, da die ursprüngliche Version des Datensatzes jetzt mit dem Datensatz in der Datenbank übereinstimmt.
Fügen Sie den folgenden Code unterhalb des Codes hinzu, der im vorherigen Abschnitt hinzugefügt wurde:
// This method takes the DialogResult selected by the user and updates the database
// with the new values or cancels the update and resets the Customers table
// (in the dataset) with the values currently in the database.
private void ProcessDialogResult(DialogResult response)
{
switch (response)
{
case DialogResult.Yes:
northwindDataSet.Merge(tempCustomersDataTable, true, MissingSchemaAction.Ignore);
UpdateDatabase();
break;
case DialogResult.No:
northwindDataSet.Merge(tempCustomersDataTable);
MessageBox.Show("Update cancelled");
break;
}
}
Testen des Formularverhaltens
Sie können das Formular jetzt testen, um sicherzustellen, dass es sich wie erwartet verhält. Um eine Parallelitätsverletzung zu simulieren, ändern Sie daten in der Datenbank nach dem Ausfüllen des NorthwindDataSet.
Wählen Sie F5 aus, um die Anwendung auszuführen.
Nachdem das Formular angezeigt wurde, lassen Sie es ausgeführt, und wechseln Sie zur Visual Studio-IDE.
Wählen Sie im Menü "Ansicht " die Option "Server-Explorer" aus.
Erweitern Sie im Server-Explorer die Verbindung, die Ihre Anwendung verwendet, und erweitern Sie dann den Knoten "Tabellen ".
Klicken Sie mit der rechten Maustaste auf die Tabelle "Kunden ", und wählen Sie dann " Tabellendaten anzeigen" aus.
Ändern Sie im ersten Datensatz (ALFKI) ContactName in Maria Anders2.
Hinweis
Navigieren Sie zu einer anderen Zeile, um die Änderung zu übernehmen.
Wechseln Sie zum aktiven Formular von ConcurrencyWalkthrough.
Ändern Sie im ersten Datensatz im Formular (ALFKI) "ContactName " in "Maria Anders1".
Wählen Sie die Schaltfläche Speichern aus.
Der Parallelitätsfehler wird ausgelöst, und das Meldungsfeld wird angezeigt.
Wenn Sie "Nein" auswählen, wird die Aktualisierung abgebrochen und das Dataset mit den Werten aktualisiert, die sich derzeit in der Datenbank befinden. Wenn Sie "Ja " auswählen, wird der vorgeschlagene Wert in die Datenbank geschrieben.