Freigeben über


Speichern von Daten zurück in der Datenbank 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.

Das Dataset ist eine Speicherkopie von Daten. Wenn Sie diese Daten ändern, empfiehlt es sich, diese Änderungen wieder in der Datenbank zu speichern. Dies geschieht auf eine von drei Arten:

  • Durch Aufrufen einer der Update Methoden eines TableAdapter

  • Durch Aufrufen einer der DBDirect Methoden des TableAdapter

  • Aufruf der UpdateAll-Methode für den TableAdapterManager. Diese wird von Visual Studio für Sie generiert, wenn das Dataset Tabellen enthält, die mit anderen Tabellen im Dataset verknüpft sind.

Wenn Sie Datensatz-Tabellen an Steuerelemente auf einer Windows-Form- oder XAML-Seite binden, nimmt Ihnen die Datenbindungsarchitektur die gesamte Arbeit ab.

Wenn Sie mit TableAdapters vertraut sind, können Sie direkt zu einem der folgenden Themen springen:

Thema BESCHREIBUNG
Einfügen neuer Datensätze in eine Datenbank Durchführen von Aktualisierungen und Einfügungen mit TableAdapter- oder Command-Objekten
Aktualisieren von Daten mithilfe eines TableAdapter So führen Sie Aktualisierungen mit TableAdapters aus
Hierarchische Aktualisierung So führen Sie Aktualisierungen aus einem Dataset mit zwei oder mehr verknüpften Tabellen aus
Behandeln einer Parallelitäts ausnahme Behandeln von Ausnahmen, wenn zwei Benutzer versuchen, die gleichen Daten in einer Datenbank gleichzeitig zu ändern
Vorgehensweise: Speichern von Daten mithilfe einer Transaktion Speichern von Daten in einer Transaktion mithilfe des Systems Transaktionsnamespace und ein TransactionScope-Objekt
Speichern von Daten in einer Transaktion Exemplarische Vorgehensweise zum Erstellen einer Windows Forms-Anwendung zum Veranschaulichen des Speicherns von Daten in einer Datenbank innerhalb einer Transaktion
Speichern von Daten in einer Datenbank (mehrere Tabellen) Bearbeiten von Datensätzen und Rückspeichern von Änderungen in mehreren Tabellen in der Datenbank
Speichern von Daten aus einem Objekt in einer Datenbank So übergeben Sie Daten aus einem Objekt, das sich nicht in einem Dataset befindet, mithilfe einer TableAdapter DbDirect-Methode an eine Datenbank
Speichern von Daten mit den TableAdapter DBDirect-Methoden Verwenden des TableAdapters zum direkten Senden von SQL-Abfragen an die Datenbank
Speichern eines Datasets als XML So speichern Sie ein Dataset in einem XML-Dokument

Zweistufige Updates

Das Aktualisieren einer Datenquelle ist ein zweistufiger Prozess. Der erste Schritt besteht darin, das Dataset mit neuen Datensätzen, geänderten Datensätzen oder gelöschten Datensätzen zu aktualisieren. Wenn Ihre Anwendung diese Änderungen nie zurück an die Datenquelle sendet, sind Sie mit dem Update fertig.

Wenn Sie die Änderungen zurück an die Datenbank senden, ist ein zweiter Schritt erforderlich. Wenn Sie keine datengebundenen Steuerelemente verwenden, müssen Sie die Update Methode desselben TableAdapter (oder Datenadapters) manuell aufrufen, das Sie zum Auffüllen des Datasets verwendet haben. Sie können jedoch auch verschiedene Adapter verwenden, z. B. um Daten aus einer Datenquelle in eine andere zu verschieben oder mehrere Datenquellen zu aktualisieren. Wenn Sie keine Datenbindung verwenden und Änderungen für verwandte Tabellen speichern, müssen Sie eine Variable der automatisch generierten TableAdapterManager Klasse manuell instanziieren und dann die Methode aufrufen UpdateAll .

Konzeptionelles Diagramm von Datasetaktualisierungen

Ein Dataset enthält Sammlungen von Tabellen, die eine Auflistung von Zeilen enthalten. Wenn Sie später eine zugrunde liegende Datenquelle aktualisieren möchten, müssen Sie beim Hinzufügen oder Entfernen von Zeilen die Methoden für die DataTable.DataRowCollection Eigenschaft verwenden. Diese Methoden führen die Änderungsnachverfolgung aus, die zum Aktualisieren der Datenquelle erforderlich ist. Wenn Sie die RemoveAt-Sammlung für die Eigenschaft „Rows“ aufrufen, wird der Löschvorgang nicht an die Datenbank zurückgemeldet.

Zusammenführen von Datasets

Sie können den Inhalt eines Datasets aktualisieren, indem Sie ihn mit einem anderen Dataset zusammenführen . Dazu gehört das Kopieren des Inhalts eines Quelldatensatzes in das aufrufende Dataset (als Ziel-Dataset bezeichnet). Wenn Sie Datasets zusammenführen, werden dem Zieldatensatz neue Datensätze im Quelldatensatz hinzugefügt. Darüber hinaus werden dem Ziel-Dataset zusätzliche Spalten im Quelldatensatz hinzugefügt. Das Zusammenführen von Datasets ist nützlich, wenn Sie über ein lokales Dataset verfügen und ein zweites Dataset aus einer anderen Anwendung erhalten. Es ist auch hilfreich, wenn Sie ein zweites Dataset aus einer Komponente wie einem XML-Webdienst abrufen oder Daten aus mehreren Datasets integrieren müssen.

Beim Zusammenführen von Datasets können Sie ein boolesches Argument (preserveChanges) übergeben, das die Merge Methode angibt, ob vorhandene Änderungen im Zieldatensatz beibehalten werden sollen. Da Datasets mehrere Versionen von Datensätzen verwalten, ist es wichtig zu beachten, dass mehrere Versionen der Datensätze zusammengeführt werden. Die folgende Tabelle zeigt, wie ein Datensatz in zwei Datasets zusammengeführt wird:

DataRowVersion Zieldatensatz Quelldataset
Original James Wilson James C. Wilson
Aktuell Jim Wilson James C. Wilson

Aufrufen der Merge-Methode auf der vorherigen Tabelle mit preserveChanges=false targetDataset.Merge(sourceDataset) führt zu den folgenden Daten:

DataRowVersion Zieldatensatz Quelldataset
Original James C. Wilson James C. Wilson
Aktuell James C. Wilson James C. Wilson

Das Aufrufen der Merge-Methode mit preserveChanges = true targetDataset.Merge(sourceDataset, true) führt zu den folgenden Daten:

DataRowVersion Zieldatensatz Quelldataset
Original James C. Wilson James C. Wilson
Aktuell Jim Wilson James C. Wilson

Vorsicht

Wenn die RejectChanges Methode in dem preserveChanges = true Szenario für einen Datensatz im Zieldatenset aufgerufen wird, wird sie wieder auf die ursprünglichen Daten aus dem Quelldatenset zurückgesetzt. Dies bedeutet: Wenn Sie versuchen, die ursprüngliche Datenquelle mit dem Ziel-Dataset zu aktualisieren, kann die ursprüngliche Zeile möglicherweise nicht gefunden werden, die aktualisiert werden soll. Sie können eine Parallelitätsverletzung verhindern, indem Sie ein anderes Dataset mit den aktualisierten Datensätzen aus der Datenquelle ausfüllen und dann eine Zusammenführung durchführen, um eine Parallelitätsverletzung zu verhindern. (Eine Parallelitätsverletzung tritt auf, wenn ein anderer Benutzer einen Datensatz in der Datenquelle ändert, nachdem das Dataset ausgefüllt wurde.)

Aktualisierungsbeschränkungen

Wenn Sie Änderungen an einer vorhandenen Datenzeile vornehmen möchten, fügen Sie Daten in den einzelnen Spalten hinzu, oder aktualisieren Sie sie. Wenn das Dataset Einschränkungen enthält (z. B. Fremdschlüssel oder nicht nullable Einschränkungen), ist es möglich, dass der Datensatz beim Aktualisieren vorübergehend in einem Fehlerzustand sein kann. Das heißt, es kann sich in einem Fehlerzustand befinden, nachdem Sie die Aktualisierung einer Spalte abgeschlossen haben, aber bevor Sie zum nächsten wechseln.

Um vorzeitige Einschränkungsverletzungen zu verhindern, können Sie Aktualisierungseinschränkungen vorübergehend anhalten. Dies dient zwei Zwecken:

  • Es verhindert, dass ein Fehler ausgelöst wird, nachdem Sie die Aktualisierung einer Spalte abgeschlossen haben, aber nicht mit dem Aktualisieren einer anderen Spalte begonnen haben.

  • Es verhindert, dass bestimmte Updateereignisse ausgelöst werden (Ereignisse, die häufig für die Überprüfung verwendet werden).

Hinweis

In Windows Forms setzt die in das Datagrid integrierte Datenbindungsarchitektur die Einschränkungsüberprüfung aus, bis der Fokus aus einer Zeile verschoben wird, und Sie müssen die Methoden BeginEdit, EndEdit oder CancelEdit nicht explizit aufrufen.

Einschränkungen werden automatisch deaktiviert, wenn die Merge Methode für ein Dataset aufgerufen wird. Wenn die Zusammenführung abgeschlossen ist und es Einschränkungen für das Dataset gibt, die nicht aktiviert werden können, wird ein ConstraintException-Fehler ausgelöst. In dieser Situation wird die Eigenschaft EnforceConstraints auf false, festgelegt, und alle Einschränkungsverstöße müssen aufgelöst werden, bevor die Eigenschaft EnforceConstraints auf true zurückgesetzt wird.

Nachdem Sie ein Update abgeschlossen haben, können Sie die Einschränkungsüberprüfung erneut aktivieren, wodurch auch Aktualisierungsereignisse erneut aktiviert und ausgelöst werden.

Weitere Informationen zum Anhalten von Ereignissen finden Sie unter "Deaktivieren von Einschränkungen beim Ausfüllen eines Datasets".

Fehler beim Aktualisieren von Datasets

Wenn Sie einen Datensatz in einem Dataset aktualisieren, besteht die Möglichkeit eines Fehlers. Beispielsweise können Sie versehentlich Daten des falschen Typs in eine Spalte oder Daten schreiben, die zu lang sind, oder Daten, die ein anderes Integritätsproblem aufweisen. Oder Sie verfügen möglicherweise über anwendungsspezifische Überprüfungsprüfungen, die benutzerdefinierte Fehler während jeder Phase eines Updateereignisses auslösen können. Weitere Informationen finden Sie unter Überprüfen von Daten in Datasets.

Verwalten von Informationen zu Änderungen

Informationen zu den Änderungen in einem Dataset werden auf zwei Arten verwaltet: durch das Kennzeichnen von Zeilen, die darauf hinweisen, dass sie geändert wurden (RowState), und durch das Beibehalten mehrerer Kopien eines Datensatzes (DataRowVersion). Mithilfe dieser Informationen können Prozesse bestimmen, was sich im Dataset geändert hat, und geeignete Aktualisierungen an die Datenquelle senden.

RowState-Eigenschaft

Die RowState Eigenschaft eines DataRow Objekts ist ein Wert, der Informationen zum Status einer bestimmten Datenzeile bereitstellt.

In der folgenden Tabelle sind die möglichen Werte der DataRowState Enumeration aufgeführt:

DataRowState-Wert BESCHREIBUNG
Added Die Zeile wurde als Element einem DataRowCollection hinzugefügt. (Eine Zeile in diesem Zustand verfügt nicht über eine entsprechende Originalversion, da sie nicht vorhanden war, als die letzte AcceptChanges Methode aufgerufen wurde).
Deleted Die Zeile wurde mithilfe Delete eines DataRow Objekts gelöscht.
Detached Die Zeile wurde erstellt, ist aber nicht Teil eines DataRowCollection. Ein DataRow Objekt befindet sich in diesem Zustand unmittelbar nach dem Erstellen, bevor es einer Auflistung hinzugefügt wurde, und nachdem es aus einer Auflistung entfernt wurde.
Modified Ein Spaltenwert in der Zeile hat sich in irgendeiner Weise geändert.
Unchanged Die Zeile wurde seit dem letzten Aufruf von AcceptChanges nicht geändert.

DataRowVersion-Enumeration

Datasets verwalten mehrere Versionen von Datensätzen. Die DataRowVersion Felder werden verwendet, um den in einer DataRow gefundenen Wert abzurufen, entweder mit der Item[] Eigenschaft oder der GetChildRows Methode des DataRow Objekts.

In der folgenden Tabelle sind die möglichen Werte der DataRowVersion Enumeration aufgeführt:

DataRowVersion-Wert BESCHREIBUNG
Current Die aktuelle Version eines Datensatzes enthält alle Änderungen, die seit dem letzten Aufruf AcceptChanges für den Datensatz ausgeführt wurden. Wenn die Zeile gelöscht wurde, gibt es keine aktuelle Version.
Default Der Standardwert eines Datensatzes, wie durch das Datasetschema oder die Datenquelle definiert.
Original Die ursprüngliche Version eines Datensatzes ist eine Kopie des Datensatzes zu dem Zeitpunkt, zu dem zuletzt ein Commit für Dataset-Änderungen ausgeführt wurde. In der Praxis handelt es sich hierbei normalerweise um die Version eines Datensatzes, wie sie aus einer Datenquelle gelesen wird.
Proposed Die vorgeschlagene Version eines Datensatzes, der vorübergehend verfügbar ist, während Sie sich in der Mitte eines Updates befinden , d. h. zwischen dem Zeitpunkt, zu dem Sie die BeginEdit Methode und die EndEdit Methode aufgerufen haben. In der Regel greifen Sie auf die vorgeschlagene Version eines Datensatzes in einem Handler für ein Ereignis zu, z. B. RowChanging. Durch Aufrufen der CancelEdit Methode werden die Änderungen rückgängig gemacht und die vorgeschlagene Version der Datenzeile gelöscht.

Die originalen und aktuellen Versionen sind nützlich, wenn Aktualisierungsinformationen an eine Datenquelle übertragen werden. Wenn eine Aktualisierung an die Datenquelle gesendet wird, befinden sich die neuen Informationen für die Datenbank in der aktuellen Version eines Datensatzes. Informationen aus der ursprünglichen Version werden verwendet, um den zu aktualisierenden Datensatz zu finden.

Wenn beispielsweise der Primärschlüssel eines Datensatzes geändert wird, benötigen Sie eine Möglichkeit, den richtigen Datensatz in der Datenquelle zu finden, um die Änderungen zu aktualisieren. Wenn keine ursprüngliche Version vorhanden ist, würde der Datensatz wahrscheinlich an die Datenquelle angefügt, was nicht nur zu einem zusätzlichen unerwünschten Datensatz führt, sondern auch zu einem Datensatz, der ungenau und veraltet ist. Die beiden Versionen werden auch zur Parallelitätskontrolle verwendet. Sie können die ursprüngliche Version mit einem Datensatz in der Datenquelle vergleichen, um zu bestimmen, ob sich der Datensatz seit dem Laden in das Dataset geändert hat.

Die vorgeschlagene Version ist nützlich, wenn Sie eine Überprüfung durchführen müssen, bevor Sie die Änderungen am Dataset tatsächlich übernehmen.

Auch wenn Sich Datensätze geändert haben, gibt es nicht immer originale oder aktuelle Versionen dieser Zeile. Wenn Sie eine neue Zeile in die Tabelle einfügen, gibt es keine originale Version, nur eine aktuelle Version. Wenn Sie eine Zeile löschen, indem Sie die Methode der Tabelle Delete aufrufen, gibt es eine ursprüngliche Version, jedoch keine aktuelle Version.

Sie können testen, ob eine bestimmte Version eines Datensatzes vorhanden ist, indem Sie die Methode einer Datenzeile HasVersion abfragen. Sie können auf eine der beiden Versionen eines Datensatzes zugreifen, indem Sie einen DataRowVersion Enumerationswert als optionales Argument übergeben, wenn Sie den Wert einer Spalte anfordern.

Abrufen geänderter Datensätze

Es ist üblich, nicht jeden Datensatz in einem Dataset zu aktualisieren. Beispielsweise kann ein Benutzer mit einem Windows Forms-Steuerelement DataGridView arbeiten, das viele Datensätze anzeigt. Der Benutzer aktualisiert jedoch möglicherweise nur einige Datensätze, löscht eins, und fügt eine neue ein. Datasets und Datentabellen bieten eine Methode (GetChanges) zum Zurückgeben nur der zeilen, die geändert wurden.

Sie können Untermengen von geänderten Datensätzen mithilfe der GetChanges Methode der Datentabelle (GetChanges) oder des Datasets (GetChanges) selbst erstellen. Wenn Sie die Methode für die Datentabelle aufrufen, wird eine Kopie der Tabelle mit nur den geänderten Datensätzen zurückgegeben. Ebenso erhalten Sie beim Aufrufen der Methode für das Dataset ein neues Dataset mit nur geänderten Datensätzen.

GetChanges selbst gibt alle geänderten Datensätze zurück. Im Gegensatz dazu können Sie durch Übergeben des gewünschten DataRowState Parameters an die GetChanges Methode angeben, welche Teilmenge von geänderten Datensätzen Sie möchten: neu hinzugefügte Datensätze, Datensätze, die für das Löschen, getrennte Datensätze oder geänderte Datensätze markiert sind.

Das Abrufen einer Teilmenge von geänderten Datensätzen ist nützlich, wenn Sie Datensätze zur Verarbeitung an eine andere Komponente senden möchten. Anstatt das gesamte Dataset zu senden, können Sie den Mehraufwand für die Kommunikation mit der anderen Komponente reduzieren, indem Sie nur die Datensätze abrufen, die die Komponente benötigt.

Committen von Änderungen im Dataset

Wenn Änderungen im Dataset vorgenommen werden, wird die RowState Eigenschaft der geänderten Zeilen festgelegt. Die ursprünglichen und aktuellen Datensatzversionen werden von der RowVersion-Eigenschaft eingerichtet, verwaltet und verfügbar gemacht. Die Metadaten, die in den Eigenschaften dieser geänderten Zeilen gespeichert sind, sind erforderlich, um die richtigen Aktualisierungen an die Datenquelle zu senden.

Wenn die Änderungen den aktuellen Status der Datenquelle widerspiegeln, müssen Sie diese Informationen nicht mehr verwalten. In der Regel gibt es zwei Male, wenn das Dataset und seine Quelle synchronisiert sind:

  • Unmittelbar nachdem Sie Informationen in das Dataset geladen haben, z. B. wenn Sie Daten aus der Quelle lesen.

  • Nach dem Senden von Änderungen aus dem Dataset an die Datenquelle (aber nicht zuvor, da Sie die Änderungsinformationen verlieren würden, die zum Senden von Änderungen an die Datenbank erforderlich sind).

Sie können die ausstehenden Änderungen am Dataset übernehmen, indem Sie die AcceptChanges Methode aufrufen. AcceptChanges Wird in der Regel zu folgenden Zeiten aufgerufen:

  • Nachdem Sie das Dataset geladen haben. Wenn Sie ein Dataset laden, indem Sie die Fill-Methode eines TableAdapter aufrufen, führt der Adapter automatisch ein Commit für die Änderungen aus. Wenn Sie ein Dataset jedoch laden, indem Sie ein anderes Dataset darin zusammenführen, müssen Sie die Änderungen manuell übernehmen.

    Hinweis

    Sie können verhindern, dass der Adapter Änderungen automatisch übernimmt, wenn Sie die Fill Methode aufrufen, indem Sie die AcceptChangesDuringFill Eigenschaft des Adapters auf false festlegen. Wenn es auf false festgelegt ist, wird das RowState jeder Zeile, die während der Füllung eingefügt wird, auf Added festgelegt.

  • Nachdem Sie Datasetänderungen an einen anderen Prozess gesendet haben, z. B. einen XML-Webdienst.

    Vorsicht

    Wenn Sie die Änderung auf diese Weise übernehmen, werden alle Änderungsinformationen gelöscht. Übernehmen Sie keine Änderungen, bis Sie die Ausführung von Vorgängen abgeschlossen haben, für die Ihre Anwendung wissen muss, welche Änderungen im Dataset vorgenommen wurden.

Mit dieser Methode wird Folgendes erreicht:

  • Die Current-Version eines Datensatzes wird in seine Original-Version geschrieben, wobei die ursprüngliche Version überschrieben wird.

  • Entfernt jede Zeile, in der die RowState-Eigenschaft auf Deleted festgelegt ist.

  • Legt die RowState-Eigenschaft eines Datensatzes auf Unchanged fest.

Die AcceptChanges Methode ist auf drei Ebenen verfügbar. Sie können es für ein DataRow Objekt aufrufen, um Änderungen nur für diese Zeile zu übernehmen. Sie können es auch für ein DataTable Objekt aufrufen, um alle Zeilen in einer Tabelle festzuschreiben. Und schließlich können Sie die Methode für das Objekt DataSet aufrufen, um alle ausstehenden Änderungen in sämtlichen Datensätzen aller Tabellen des Datasets zu committen.

In der folgenden Tabelle wird basierend auf dem Objekt, für das die Methode aufgerufen wird, beschrieben, für welche Änderungen ein Commit ausgeführt wird:

Methode Ergebnis
System.Data.DataRow.AcceptChanges Änderungen werden nur für die spezifische Zeile übernommen.
System.Data.DataTable.AcceptChanges Änderungen werden für alle Zeilen in der bestimmten Tabelle übernommen.
System.Data.DataSet.AcceptChanges Änderungen werden für alle Zeilen in allen Tabellen des Datensatzes gespeichert.

Hinweis

Wenn Sie ein Dataset durch Aufrufen der Methode eines TableAdapter Fill laden, müssen Sie keine Änderungen explizit akzeptieren. Standardmäßig ruft die Fill Methode die AcceptChanges Methode auf, nachdem sie die Datentabelle auffüllt.

Eine verwandte Methode RejectChanges macht die Auswirkungen von Änderungen rückgängig, indem die Original-Version zurück in die Current-Version der Datensätze kopiert wird. Außerdem wird der RowState jedes Datensatzes wieder auf Unchangedfestgelegt.

Datenvalidierung

Um zu überprüfen, ob die Daten in Ihrer Anwendung die Anforderungen der Prozesse erfüllen, an die sie übergeben wird, müssen Sie häufig eine Überprüfung hinzufügen. Dies kann die Überprüfung beinhalten, dass der Eintrag eines Benutzers in einem Formular korrekt ist, das Validieren von Daten, die von einer anderen Anwendung an Ihre Anwendung gesendet werden, oder sogar die Überprüfung, dass die innerhalb Ihrer Komponente berechneten Informationen innerhalb der Einschränkungen Ihrer Datenquelle und Anwendungsanforderungen liegen.

Sie können Daten auf verschiedene Arten überprüfen:

  • Fügen Sie in der Geschäftsebene Ihrer Anwendung Code zum Überprüfen von Daten hinzu. Das Dataset ist ein Ort, an dem Sie dies tun können. Das Dataset bietet einige Der Vorteile der Back-End-Überprüfung , z. B. die Möglichkeit, Änderungen zu überprüfen, wenn Spalten- und Zeilenwerte geändert werden. Weitere Informationen finden Sie unter Überprüfen von Daten in Datasets.

  • Fügen Sie in der Präsentationsebene Überprüfungen zu Formularen hinzu. Weitere Informationen finden Sie unter Benutzereingabeüberprüfung in Windows Forms.

  • Im Daten-Back-End werden Daten an die Datenquelle gesendet – zum Beispiel die Datenbank – um sie zur Annahme oder Ablehnung der Daten zu befähigen. Wenn Sie mit einer Datenbank arbeiten, die komplexe Möglichkeiten zum Überprüfen von Daten und zur Bereitstellung von Fehlerinformationen bietet, kann dies ein praktischer Ansatz sein, da Sie die Daten unabhängig davon überprüfen können, woher sie stammen. Dieser Ansatz kann jedoch keine anwendungsspezifischen Validierungsanforderungen erfüllen. Darüber hinaus kann das Überprüfen der Daten aus der Datenquelle zu zahlreichen Roundtrips zur Datenquelle führen, je nachdem, wie Ihre Anwendung die Lösung von Validierungsfehlern erleichtert, die vom Back-End ausgelöst werden.

    Von Bedeutung

    Wenn Sie Datenbefehle mit einer CommandType Eigenschaft verwenden, die auf " Text" festgelegt ist, überprüfen Sie sorgfältig Informationen, die von einem Client gesendet werden, bevor Sie sie an Ihre Datenbank übergeben. Böswillige Benutzer können versuchen, geänderte oder zusätzliche SQL-Anweisungen zu senden (injizieren), um unbefugten Zugriff zu erhalten oder die Datenbank zu beschädigen. Bevor Sie Benutzereingaben in eine Datenbank übertragen, überprüfen Sie immer, ob die Informationen gültig sind. Es empfiehlt sich, parametrisierte Abfragen oder gespeicherte Prozeduren nach Möglichkeit immer zu verwenden.

Übertragen von Aktualisierungen an die Datenquelle

Nachdem Änderungen in einem Dataset vorgenommen wurden, können Sie die Änderungen an eine Datenquelle übertragen. In der Regel rufen Sie dazu die Update Methode eines TableAdapter (oder Datenadapters) auf. Die Methode durchläuft jeden Datensatz in einer Datentabelle, bestimmt, welcher Aktualisierungstyp erforderlich ist (Aktualisierung, Einfügen oder Löschen), falls vorhanden, und führt dann den entsprechenden Befehl aus.

Nehmen wir an, dass Ihre Anwendung ein Dataset verwendet, das eine einzelne Datentabelle enthält, um zu veranschaulich, wie Aktualisierungen vorgenommen werden. Die Anwendung ruft zwei Zeilen aus der Datenbank ab. Nach dem Abruf sieht die In-Memory-Datentabelle wie folgt aus:

(RowState)     CustomerID   Name             Status
(Unchanged)    c200         Robert Lyon      Good
(Unchanged)    c400         Nancy Buchanan    Pending

Ihre Anwendung ändert den Status von Nancy Buchanan in "Bevorzugt". Aufgrund dieser Änderung ändert sich der Wert der RowState Eigenschaft für diese Zeile von Unchanged zu Modified. Der Wert der RowState Eigenschaft für die erste Zeile bleibt Unchanged. Die Datentabelle sieht nun wie folgt aus:

(RowState)     CustomerID   Name             Status
(Unchanged)    c200         Robert Lyon      Good
(Modified)     c400         Nancy Buchanan    Preferred

Ihre Anwendung ruft jetzt die Update Methode auf, um das Dataset an die Datenbank zu übertragen. Die Methode prüft jede Zeile wiederum. Für die erste Zeile überträgt die Methode keine SQL-Anweisung an die Datenbank, da diese Zeile nicht geändert wurde, da sie ursprünglich aus der Datenbank abgerufen wurde.

Für die zweite Zeile ruft die Update Methode jedoch automatisch den richtigen Datenbefehl auf und überträgt ihn an die Datenbank. Die spezifische Syntax der SQL-Anweisung hängt vom Dialekt von SQL ab, der vom zugrunde liegenden Datenspeicher unterstützt wird. Aber die folgenden allgemeinen Merkmale der übertragenen SQL-Anweisung sind bemerkenswert:

  • Die übertragene SQL-Anweisung ist eine UPDATE Anweisung. Der Adapter weiß, eine UPDATE Anweisung zu verwenden, da der Wert der RowState Eigenschaft lautet Modified.

  • Die übertragene SQL-Anweisung beinhaltet eine WHERE-Klausel, die darauf hinweist, dass das Zielobjekt der UPDATE-Anweisung die Zeile ist, wo CustomerID = 'c400'. Dieser Teil der SELECT Anweisung unterscheidet die Zielzeile von allen anderen, da der CustomerID Primärschlüssel der Zieltabelle ist. Die Informationen für die WHERE Klausel werden von der ursprünglichen Version des Datensatzes abgeleitet (DataRowVersion.Original), falls die Werte, die zum Identifizieren der Zeile erforderlich sind, geändert wurden.

  • Die übertragene SQL-Anweisung enthält die SET Klausel, um die neuen Werte der geänderten Spalten festzulegen.

    Hinweis

    Wenn die TableAdapter-Eigenschaft UpdateCommand auf den Namen einer gespeicherten Prozedur festgelegt wurde, erstellt der Adapter keine SQL-Anweisung. Stattdessen wird die gespeicherte Prozedur mit den entsprechenden Parametern aufgerufen, die übergeben werden.

Übergeben von Parametern

In der Regel verwenden Sie Parameter, um die Werte für Datensätze zu übergeben, die in der Datenbank aktualisiert werden sollen. Wenn die TableAdapter-Methode Update eine UPDATE Anweisung ausführt, muss sie die Parameterwerte ausfüllen. Sie ruft diese Werte aus der Parameters Auflistung für den entsprechenden Datenbefehl ab , in diesem Fall das UpdateCommand Objekt im TableAdapter.

Wenn Sie die Visual Studio-Tools zum Generieren eines Datenadapters verwendet haben, enthält das UpdateCommand Objekt eine Auflistung von Parametern, die jedem Parameterplatzhalter in der Anweisung entsprechen.

Die System.Data.SqlClient.SqlParameter.SourceColumn Eigenschaft der einzelnen Parameter verweist auf eine Spalte in der Datentabelle. Beispielsweise wird die SourceColumn-Eigenschaft für die au_id- und Original_au_id-Parameter auf eine beliebige Spalte in der Datentabelle festgelegt, die die Autoren-ID enthält. Wenn die Methode des Adapters Update ausgeführt wird, liest sie die Autoren-ID-Spalte aus dem Datensatz, der aktualisiert wird, und trägt die Werte in die Anweisung ein.

In einer UPDATE Anweisung müssen Sie sowohl die neuen Werte (die in den Datensatz geschrieben werden) als auch die alten Werte angeben (sodass sich der Datensatz in der Datenbank befinden kann). Es gibt daher zwei Parameter für jeden Wert: eine für die SET Klausel und eine andere für die WHERE Klausel. Beide Parameter lesen Daten aus dem Datensatz, der aktualisiert wird, aber sie erhalten unterschiedliche Versionen des Spaltenwerts basierend auf der Eigenschaft des SourceVersion Parameters. Der Parameter für die SET Klausel ruft die aktuelle Version ab, und der Parameter für die WHERE Klausel ruft die ursprüngliche Version ab.

Hinweis

Sie können werte in der Parameters Sammlung auch selbst im Code festlegen, den Sie in der Regel in einem Ereignishandler für das Ereignis des Datenadapters RowChanging ausführen würden.