Freigeben über


Überprüfen von Daten in Datasets in .NET Framework-Anwendungen

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.

Die Überprüfung von Daten ist der Prozess der Bestätigung, dass die in Datenobjekte eingegebenen Werte den Einschränkungen im Schema eines Datasets entsprechen. Der Überprüfungsprozess bestätigt außerdem, dass diese Werte den Regeln folgen, die für Ihre Anwendung eingerichtet wurden. Es empfiehlt sich, Daten vor dem Senden von Aktualisierungen an die zugrunde liegende Datenbank zu überprüfen. Dadurch werden Fehler sowie die potenzielle Anzahl von Roundtrips zwischen einer Anwendung und der Datenbank reduziert.

Sie können bestätigen, dass Daten, die in ein Dataset geschrieben werden, gültig sind, indem Sie Überprüfungsprüfungen im Dataset selbst erstellen. Das Dataset kann die Daten unabhängig davon überprüfen, wie das Update ausgeführt wird – ob direkt durch Steuerelemente in einem Formular, innerhalb einer Komponente oder auf andere Weise. Da das Dataset Teil Ihrer Anwendung ist (im Gegensatz zum Datenbank-Back-End), ist es ein logischer Ort, um anwendungsspezifische Überprüfungen zu erstellen.

Der beste Ort zum Hinzufügen der Validierung zu Ihrer Anwendung befindet sich in der partiellen Klassendatei des Datasets. Öffnen Sie in Visual Basic oder Visual C# den Dataset-Designer , und doppelklicken Sie auf die Spalte oder Tabelle, für die Sie eine Überprüfung erstellen möchten. Diese Aktion öffnet die Codedatei, in der Sie entweder einen ColumnChanging oder einen RowChanging Ereignishandler erstellen können.

private static void OnColumnChanging(object sender, DataColumnChangeEventArgs e)
{

}

Überprüfen von Daten

Die Überprüfung innerhalb eines Datasets erfolgt auf folgende Weise:

  • Durch Erstellen einer eigenen anwendungsspezifischen Überprüfung, die Werte in einer einzelnen Datenspalte während Änderungen überprüfen kann. Weitere Informationen finden Sie unter So validieren Sie Daten während Spaltenänderungen.

  • Indem Sie eine eigene anwendungsspezifische Überprüfung erstellen, die Daten auf Werte überprüfen kann, während sich eine ganze Datenzeile ändert. Weitere Informationen finden Sie unter So validieren Sie Daten bei Zeilenänderungen.

  • Durch das Erstellen von Schlüsseln, eindeutigen Einschränkungen usw. als Teil der tatsächlichen Schemadefinition des Datasets.

  • Durch Festlegen der Eigenschaften des DataColumn-Objekts, z. B. MaxLength, AllowDBNull und Unique.

Mehrere Ereignisse werden vom DataTable Objekt ausgelöst, wenn eine Änderung in einem Datensatz auftritt:

  • Die Ereignisse ColumnChanging und ColumnChanged werden während und nach jeder Änderung einer einzelnen Spalte ausgelöst. Das ColumnChanging Ereignis ist nützlich, wenn Sie Änderungen in bestimmten Spalten überprüfen möchten. Informationen zur vorgeschlagenen Änderung werden als Argument mit dem Ereignis übergeben.
  • Die Ereignisse RowChanging und RowChanged werden während und nach jeder Änderung in einer Zeile ausgelöst. Das RowChanging Ereignis ist allgemeiner. Es weist darauf hin, dass eine Änderung an einer beliebigen Stelle in der Zeile auftritt, aber Sie wissen nicht, welche Spalte geändert wurde.

Standardmäßig löst jede Änderung in einer Spalte daher vier Ereignisse aus. Das erste sind die ColumnChanging und ColumnChanged Ereignisse für die bestimmte Spalte, die geändert wird. Als Nächstes folgen die Ereignisse RowChanging und RowChanged. Wenn an der Zeile mehrere Änderungen vorgenommen werden, werden die Ereignisse für jede Änderung ausgelöst.

Hinweis

Die Methode der Datenzeile BeginEdit deaktiviert die Ereignisse RowChanging und RowChanged nach jeder Änderung der einzelnen Spalten. In diesem Fall wird das Ereignis erst ausgelöst, nachdem die EndEdit Methode aufgerufen wurde, wobei die Ereignisse RowChanging und RowChanged nur einmal ausgelöst werden. Weitere Informationen finden Sie unter "Deaktivieren von Einschränkungen beim Ausfüllen eines Datasets".

Das von Ihnen ausgewählte Ereignis hängt davon ab, wie präzise die Überprüfung sein soll. Wenn Es wichtig ist, dass Sie einen Fehler sofort abfangen, wenn sich eine Spalte ändert, erstellen Sie die Überprüfung mithilfe des ColumnChanging Ereignisses. Verwenden Sie andernfalls das RowChanging Ereignis, was dazu führen kann, mehrere Fehler gleichzeitig zu erfassen. Wenn Ihre Daten so strukturiert sind, dass der Wert einer Spalte basierend auf dem Inhalt einer anderen Spalte überprüft wird, führen Sie die Überprüfung während des RowChanging Ereignisses aus.

Wenn Datensätze aktualisiert werden, löst das DataTable Objekt Ereignisse aus, auf die Sie reagieren können, wenn Änderungen auftreten und nachdem Änderungen vorgenommen wurden.

Wenn Ihre Anwendung ein typisiertes Dataset verwendet, können Sie stark typisierte Ereignishandler erstellen. Dadurch werden vier zusätzliche typierte Ereignisse hinzugefügt, für die Sie Handler erstellen können: dataTableNameRowChanging, , dataTableNameRowChanged, und dataTableNameRowDeleteddataTableNameRowDeleting. Diese typierten Ereignishandler übergeben ein Argument, das die Spaltennamen der Tabelle enthält, mit denen Code einfacher geschrieben und gelesen werden kann.

Datenaktualisierungsereignisse

Ereignis BESCHREIBUNG
ColumnChanging Der Wert in einer Spalte wird geändert. Das Ereignis übergibt die Zeile und Spalte zusammen mit dem vorgeschlagenen neuen Wert an Sie.
ColumnChanged Der Wert in einer Spalte wurde geändert. Das Ereignis übergibt die Zeile und Spalte zusammen mit dem vorgeschlagenen Wert an Sie.
RowChanging Die Änderungen, die an einem DataRow Objekt vorgenommen wurden, sind dabei, wieder in das Dataset zu übernehmen. Wenn Sie die BeginEdit Methode nicht aufgerufen haben, wird das RowChanging Ereignis für jede Änderung an einer Spalte ausgelöst, unmittelbar nachdem das ColumnChanging Ereignis ausgelöst wurde. Wenn Sie vor dem Vornehmen von Änderungen aufgerufen BeginEdit haben, wird das RowChanging Ereignis nur ausgelöst, wenn Sie die EndEdit Methode aufrufen.

Das Ereignis übergibt Ihnen die Zeile zusammen mit einem Wert, der angibt, welche Art von Aktion (Ändern, Einfügen usw.) durchgeführt wird.
RowChanged Eine Zeile wurde geändert. Das Ereignis übergibt Ihnen die Zeile zusammen mit einem Wert, der angibt, welche Art von Aktion (Ändern, Einfügen usw.) durchgeführt wird.
RowDeleting Eine Zeile wird gelöscht. Das Ereignis übergibt Ihnen die Zeile zusammen mit einem Wert, der angibt, welche Art von Aktion (Löschen) durchgeführt wird.
RowDeleted Eine Zeile wurde gelöscht. Das Ereignis übergibt Ihnen die Zeile zusammen mit einem Wert, der angibt, welche Art von Aktion (Löschen) durchgeführt wird.

Die ColumnChanging, RowChanging und RowDeleting Ereignisse werden während des Aktualisierungsprozesses ausgelöst. Sie können diese Ereignisse verwenden, um Daten zu überprüfen oder andere Verarbeitungstypen auszuführen. Da das Update während dieser Ereignisse verarbeitet wird, können Sie es abbrechen, indem Sie eine Ausnahme auslösen, die verhindert, dass das Update beendet wird.

Die Ereignisse ColumnChanged, RowChanged und RowDeleted sind Benachrichtigungsereignisse, die ausgelöst werden, wenn das Update erfolgreich abgeschlossen wurde. Diese Ereignisse sind nützlich, wenn Sie basierend auf einem erfolgreichen Update weitere Maßnahmen ergreifen möchten.

Überprüfen von Daten während Spaltenänderungen

Hinweis

Der Dataset-Designer erstellt eine partielle Klasse, in der Validierungslogik einem Dataset hinzugefügt werden kann. Das vom Designer generierte Dataset löscht oder ändert keinen Code in der partiellen Klasse.

Sie können Daten überprüfen, wenn sich der Wert in einer Datenspalte ändert, indem Sie auf das ColumnChanging Ereignis reagieren. Wenn dieses Ereignis ausgelöst wird, übergibt dieses Ereignis ein Ereignisargument (ProposedValue), das den Wert enthält, der für die aktuelle Spalte vorgeschlagen wird. Basierend auf dem Inhalt von e.ProposedValue, können Sie:

  • Übernehmen Sie den vorgeschlagenen Wert, indem Sie nichts tun.

  • Lehnen Sie den vorgeschlagenen Wert ab, indem Sie den Spaltenfehler (SetColumnError) innerhalb des ereignishandlers für Spaltenänderungen festlegen.

  • Verwenden Sie optional ein ErrorProvider Steuerelement, um dem Benutzer eine Fehlermeldung anzuzeigen. Weitere Informationen finden Sie unter ErrorProvider Component (ErrorProvider-Komponente).

Die Überprüfung kann auch während des Ereignisses RowChanging ausgeführt werden.

Daten während Zeilenänderungen validieren

Sie können Code schreiben, um zu überprüfen, ob jede Spalte, die Sie überprüfen möchten, Daten enthält, die den Anforderungen Ihrer Anwendung entsprechen. Legen Sie dazu die Spalte fest, um anzugeben, dass sie einen Fehler enthält, wenn ein vorgeschlagener Wert inakzeptabel ist. In den folgenden Beispielen wird ein Spaltenfehler festgelegt, wenn die Quantity Spalte 0 oder weniger ist. Die Ereignishandler für Zeilenänderungen sollten den folgenden Beispielen ähneln.

So überprüfen Sie Daten, wenn sich eine Zeile ändert (Visual Basic)

  1. Öffnen Sie Ihr Dataset im Dataset-Designer. Weitere Informationen finden Sie unter Exemplarische Vorgehensweise: Erstellen eines Datasets im Dataset-Designer.

  2. Doppelklicken Sie auf die Titelleiste der Tabelle, die Sie überprüfen möchten. Durch diese Aktion wird der RowChanging-Ereignishandler der DataTable in der Datei für die partielle Klasse des Datasets automatisch erstellt.

    Tipp

    Doppelklicken Sie links neben dem Tabellennamen, um den Ereignishandler zum Ändern der Zeile zu erstellen. Wenn Sie auf den Tabellennamen doppelklicken, können Sie ihn bearbeiten.

    Private Sub Order_DetailsDataTable_Order_DetailsRowChanging(
        ByVal sender As System.Object, 
        ByVal e As Order_DetailsRowChangeEvent
      ) Handles Me.Order_DetailsRowChanging
    
        If CType(e.Row.Quantity, Short) <= 0 Then
            e.Row.SetColumnError("Quantity", "Quantity must be greater than 0")
        Else
            e.Row.SetColumnError("Quantity", "")
        End If
    End Sub
    

So überprüfen Sie Daten, wenn sich eine Zeile ändert (C#)

  1. Öffnen Sie Ihr Dataset im Dataset-Designer. Weitere Informationen finden Sie unter Einführung: Erstellen eines Datasets im Dataset-Designer.

  2. Doppelklicken Sie auf die Titelleiste der Tabelle, die Sie überprüfen möchten. Diese Aktion erstellt eine Partielle Klassendatei für die DataTable.

    Hinweis

    Der Dataset-Designer erstellt keinen Ereignishandler für das RowChanging Ereignis automatisch. Sie müssen eine Methode zum Behandeln des RowChanging Ereignisses erstellen und Code ausführen, um das Ereignis in der Initialisierungsmethode der Tabelle zu verbinden.

  3. Kopieren Sie den folgenden Code in die partielle Klasse:

    public override void EndInit()
    {
        base.EndInit();
        Order_DetailsRowChanging += TestRowChangeEvent;
    }
    
    public void TestRowChangeEvent(object sender, Order_DetailsRowChangeEvent e)
    {
        if ((short)e.Row.Quantity <= 0)
        {
            e.Row.SetColumnError("Quantity", "Quantity must be greater than 0");
        }
        else
        {
            e.Row.SetColumnError("Quantity", "");
        }
    }
    

So rufen Sie geänderte Zeilen ab

Jede Zeile in einer Datentabelle verfügt über eine RowState Eigenschaft, die den aktuellen Status dieser Zeile mithilfe der Werte in der DataRowState Enumeration nachverfolgt. Sie können geänderte Zeilen aus einem Dataset oder einer Datentabelle zurückgeben, indem Sie die GetChanges Methode eines DataSet oder DataTable aufrufen. Sie können überprüfen, ob Änderungen vor dem Aufrufen GetChanges vorhanden sind, indem Sie die HasChanges Methode eines Datasets aufrufen.

Hinweis

Nachdem Sie Änderungen an einem Dataset oder einer Datentabelle (durch Aufrufen der AcceptChanges Methode) vorgenommen haben, gibt die GetChanges Methode keine Daten zurück. Wenn Ihre Anwendung geänderte Zeilen verarbeiten muss, müssen Sie die Änderungen vor dem Aufrufen der AcceptChanges Methode verarbeiten.

Durch Aufrufen der GetChanges Methode eines Datasets oder einer Datentabelle wird ein neues Dataset oder eine neue Datentabelle zurückgegeben, die nur Datensätze enthält, die geändert wurden. Wenn Sie bestimmte Datensätze abrufen möchten , z. B. nur neue Datensätze oder nur geänderte Datensätze, können Sie einen Wert aus der DataRowState Enumeration als Parameter an die GetChanges Methode übergeben.

Verwenden Sie die DataRowVersion Enumeration, um auf die verschiedenen Versionen einer Zeile zuzugreifen (z. B. die ursprünglichen Werte, die sich vor der Verarbeitung in einer Zeile befanden).

So rufen Sie alle geänderten Datensätze aus einem Dataset ab

  • Rufen Sie die GetChanges Methode eines Datasets auf.

    Im folgenden Beispiel wird ein neues Dataset namens changedRecords erstellt und mit allen geänderten Datensätzen aus einem anderen Dataset namens dataSet1 befüllt.

    DataSet changedRecords = dataSet1.GetChanges();
    

So rufen Sie alle geänderten Datensätze aus einer Datentabelle ab

  • Rufen Sie die GetChanges Methode einer DataTable auf.

    Im folgenden Beispiel wird eine neue Datentabelle namens changedRecordsTable erstellt und sie wird mit allen geänderten Datensätzen aus einer anderen Datentabelle namens dataTable1 aufgefüllt.

    DataTable changedRecordsTable = dataTable1.GetChanges();
    

So rufen Sie alle Datensätze ab, die einen bestimmten Zeilenstatus aufweisen

  • Rufen Sie die GetChanges Methode eines Datasets oder einer Datentabelle auf, und übergeben Sie einen DataRowState Enumerationswert als Argument.

    Das folgende Beispiel zeigt, wie man ein neues Dataset namens addedRecords erstellt und es nur mit den Datensätzen füllt, die zum Dataset dataSet1 hinzugefügt wurden.

    DataSet addedRecords = dataSet1.GetChanges(DataRowState.Added);
    

    Das folgende Beispiel zeigt, wie alle Datensätze zurückgegeben werden, die kürzlich der Customers Tabelle hinzugefügt wurden:

    private NorthwindDataSet.CustomersDataTable GetNewRecords()
    {
        return (NorthwindDataSet.CustomersDataTable)
            northwindDataSet1.Customers.GetChanges(DataRowState.Added);
    }
    

Zugreifen auf die originale Version eines DataRow

Wenn Änderungen an Datenzeilen vorgenommen werden, behält das Dataset sowohl die ursprüngliche (Original) als auch die neuen (Current) Versionen der Zeile bei. Beispielsweise kann Ihre Anwendung vor dem Aufrufen der AcceptChanges Methode auf die verschiedenen Versionen eines Datensatzes (wie in der DataRowVersion Enumeration definiert) zugreifen und die Änderungen entsprechend verarbeiten.

Hinweis

Unterschiedliche Versionen einer Zeile sind erst vorhanden, nachdem sie bearbeitet wurden und bevor die AcceptChanges Methode aufgerufen wurde. Nachdem die AcceptChanges Methode aufgerufen wurde, sind die aktuellen und die ursprünglichen Versionen identisch.

Wenn Sie den DataRowVersion Wert zusammen mit dem Spaltenindex (oder dem Spaltennamen als Zeichenfolge) übergeben, wird der Wert aus der jeweiligen Zeilenversion dieser Spalte zurückgegeben. Die geänderte Spalte wird während der ColumnChanging- und ColumnChanged-Ereignisse identifiziert. Dies ist ein guter Zeitpunkt für die Überprüfung der verschiedenen Zeilenversionen. Wenn Sie Einschränkungen jedoch vorübergehend deaktiviert haben, werden diese Ereignisse nicht ausgelöst, sodass die geänderten Spalten programmgesteuert ermittelt werden müssen. Dazu können Sie die Columns Sammlung durchlaufen und die verschiedenen DataRowVersion Werte vergleichen.

So rufen Sie die ursprüngliche Datensatzversion ab

  • Greifen Sie auf den Wert einer Spalte zu, und übergeben Sie die DataRowVersion der Zeile, die zurückgegeben werden soll.

    Das folgende Beispiel zeigt, wie Sie einen DataRowVersion Wert verwenden, um den ursprünglichen Wert eines Felds in einem CompanyNameDataRowFeld abzurufen:

    string originalCompanyName;
    originalCompanyName = northwindDataSet1.Customers[0]
        ["CompanyName", DataRowVersion.Original].ToString();
    

Zugreifen auf die aktuelle Version eines DataRow

So rufen Sie die aktuelle Datensatzversion ab

  • Greifen Sie auf den Wert einer Spalte zu, und fügen Sie dann dem Index einen Parameter hinzu, der angibt, welche Version einer Zeile zurückgegeben werden soll.

    Das folgende Beispiel zeigt, wie Sie einen DataRowVersion Wert verwenden, um den aktuellen Wert eines Felds in einem CompanyNameDataRowFeld abzurufen:

    string currentCompanyName;
    currentCompanyName = northwindDataSet1.Customers[0]
        ["CompanyName", DataRowVersion.Current].ToString();