Bearbeiten von Daten in Datasets mithilfe von .NET Framework

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. Sie 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.

Sie bearbeiten Daten in Datentabellen ähnlich wie die Daten in einer Tabelle in einer beliebigen Datenbank. Der Vorgang kann das Einfügen, Aktualisieren und Löschen von Datensätzen in der Tabelle umfassen. In einem datengebundenen Formular können Sie angeben, welche Felder vom Benutzer bearbeitet werden können. In diesen Fällen verarbeitet die Datenbindungsinfrastruktur alle Änderungsnachverfolgungen, sodass die Änderungen später an die Datenbank zurückgesendet werden können. Wenn Sie Daten programmgesteuert bearbeiten und diese Änderungen an die Datenbank zurücksenden möchten, müssen Sie die Objekte und Methoden verwenden, die die Änderungsnachverfolgung für Sie ausführen.

Neben dem Ändern der tatsächlichen Daten können Sie auch eine DataTable abfragen, um bestimmte Datenzeilen zurückzugeben. Beispielsweise können Sie einzelne Zeilen, bestimmte Zeilenversionen (ursprüngliche und vorgeschlagene), geänderte Zeilen oder Zeilen mit Fehlern abfragen.

So bearbeiten Sie Zeilen in einem Dataset

Um eine vorhandene Zeile in einer DataTable zu bearbeiten, müssen Sie die DataRow suchen, die Sie bearbeiten möchten, und dann die aktualisierten Werte den gewünschten Spalten zuweisen.

Wenn Sie den Index der Zeile, die Sie bearbeiten möchten, nicht kennen, verwenden Sie die FindBy-Methode, um nach dem Primärschlüssel zu suchen:

NorthwindDataSet.CustomersRow customersRow = 
    northwindDataSet1.Customers.FindByCustomerID("ALFKI");

customersRow.CompanyName = "Updated Company Name";
customersRow.City = "Seattle";

Wenn Sie den Zeilenindex kennen, können Sie wie folgt auf Zeilen zugreifen und diese bearbeiten:

northwindDataSet1.Customers[4].CompanyName = "Updated Company Name";
northwindDataSet1.Customers[4].City = "Seattle";

So fügen Sie neue Zeilen in ein Dataset ein

Anwendungen, die datengebundene Steuerelemente verwenden, fügen in der Regel neue Datensätze über die Schaltfläche Neu hinzufügen auf einem BindingNavigator-Steuerelement hinzu.

Wenn Sie einem Dataset neue Datensätze manuell hinzufügen möchten, erstellen Sie eine neue Datenzeile, indem Sie die Methode für die Datentabelle aufrufen. Dann fügen Sie die Zeile zur DataRow-Auflistung (Rows) der DataTable hinzu:

NorthwindDataSet.CustomersRow newCustomersRow = 
    northwindDataSet1.Customers.NewCustomersRow();

newCustomersRow.CustomerID = "ALFKI";
newCustomersRow.CompanyName = "Alfreds Futterkiste";

northwindDataSet1.Customers.Rows.Add(newCustomersRow);

Um die Informationen beizubehalten, die das Dataset zum Senden von Aktualisierungen an die Datenquelle benötigt, verwenden Sie die Delete-Methode, um Zeilen in einer Datentabelle zu entfernen. Wenn Ihre Anwendung z. B. ein TableAdapter (oder DataAdapter) verwendet, löscht die Update-Methode von TableAdapter entsprechende Zeilen in der Datenbank, die einen RowState von Deleted aufweisen.

Wenn Ihre Anwendung keine Aktualisierungen an eine Datenquelle zurücksenden muss, ist es möglich, Datensätze durch direkten Zugriff auf die Datenzeilenauflistung (Remove) zu entfernen.

So löschen Sie Datensätze aus einer Datentabelle

  • Rufen Sie die Delete-Methode einer DataRow auf.

    Diese Methode entfernt den Datensatz nicht physisch. Stattdessen wird der Datensatz für den Löschvorgang markiert.

    Hinweis

    Wenn Sie die Count-Eigenschaft einer DataRowCollectionabrufen, enthält die resultierende Anzahl Datensätze, die zum Löschen markiert wurden. Wenn Sie eine genaue Anzahl von Datensätzen erhalten möchten, die nicht zum Löschen markiert sind, können Sie die Auflistung mittels einer Schleife durchlaufen und die Eigenschaft RowState jedes Datensatzes betrachten. (Datensätze, die zum Löschen markiert sind, weisen einen RowState von Deleted auf.) Alternativ können Sie eine Datenansicht eines Datasets erstellen, die basierend auf dem Zeilenzustand filtert, und von dort die Count-Eigenschaft abrufen.

Das folgende Beispiel zeigt, wie die Delete-Methode aufgerufen wird, um die erste Zeile in der Customers-Tabelle als gelöscht zu markieren:

northwindDataSet1.Customers.Rows[0].Delete();

Ermitteln, ob geänderte Zeilen vorhanden sind

Wenn Änderungen an Datensätzen in einem Dataset vorgenommen werden, werden die Informationen zu diesen Änderungen gespeichert, bis ein Commit ausgeführt wird. Sie committen die Änderungen, wenn Sie die AcceptChanges-Methode eines Datasets oder einer Datentabelle aufrufen oder die Update-Methode einer TableAdapter- oder Datenadapterinstanz aufrufen.

Änderungen werden in jeder Datenzeile auf zwei Arten nachverfolgt:

  • Jede Datenzeile enthält Informationen zum RowState (z. B. Added, Modified, Deleted oder Unchanged).

  • Jede geänderte Datenzeile enthält mehrere Versionen dieser Zeile (DataRowVersion), die ursprüngliche Version (vor Änderungen) und die aktuelle Version (nach Änderungen). In dem Zeitraum, während dessen eine Änderung noch nicht festgeschrieben wurde (in der Zeit, in der Sie auf das RowChanging-Ereignis reagieren können), ist zusätzlich eine dritte Version verfügbar, die so genannte vorläufige Version.

Wenn das Dataset geändert wurde, gibt die HasChanges-Methode eines Datasets den Wert true zurück. Nachdem festgestellt wurde, dass geänderte Zeilen vorhanden sind, können Sie die GetChanges-Methode eines DataSet oder einer DataTable aufrufen, um die Gruppe der geänderten Zeilen zurückzugeben.

So stellen Sie fest, ob Zeilen geändert wurden

  • Rufen Sie die HasChanges-Methode eines Datasets auf, um geänderte Zeilen zu suchen.

Im folgenden Beispiel wird veranschaulicht, wie Sie anhand des Rückgabewerts der HasChanges-Methode feststellen, ob ein Dataset mit dem Namen NorthwindDataset1 geänderte Zeilen enthält:

if (northwindDataSet1.HasChanges()) 
{
    // Changed rows were detected, add appropriate code.
}
else
{
    // No changed rows were detected, add appropriate code.
}

Bestimmen des Typs von Änderungen

Sie können außerdem ermitteln, welche Art von Änderungen in einem Dataset vorgenommen wurden, indem Sie einen Wert aus der DataRowState-Enumeration an die HasChanges-Methode übergeben.

So stellen Sie fest, welche Art von Änderungen an einer Zeile vorgenommen wurden

Das folgende Beispiel zeigt, wie Sie ein Dataset mit dem Namen NorthwindDataset1 daraufhin überprüfen, ob neue Zeilen hinzugefügt wurden:

if (northwindDataSet1.HasChanges(DataRowState.Added)) 
{
    // New rows have been added to the dataset, add appropriate code.
}
else
{
    // No new rows have been added to the dataset, add appropriate code.
}

So suchen Sie Zeilen mit Fehlern

Wenn Sie mit einzelnen Spalten und Datenzeilen arbeiten, treten möglicherweise Fehler auf. Sie können die HasErrors-Eigenschaft überprüfen, um festzustellen, ob Fehler in DataSet, DataTable oder DataRow vorhanden sind.

  1. Überprüfen Sie die HasErrors-Eigenschaft, um festzustellen, ob Fehler im Dataset vorhanden sind.

  2. Wenn die HasErrors-Eigenschaft true ist, durchlaufen Sie die Auflistungen von Tabellen und dann die Zeilen, um die Zeile mit dem Fehler zu finden.

private void FindErrors() 
{
    if (dataSet1.HasErrors)
    {
        foreach (DataTable table in dataSet1.Tables)
        {
            if (table.HasErrors)
            {
                foreach (DataRow row in table.Rows)
                {
                    if (row.HasErrors)
                    {
                        // Process error here.
                    }
                }
            }
        }
    }
}