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.
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
UpdateMethoden eines TableAdapterDurch Aufrufen einer der
DBDirectMethoden des TableAdapterAufruf 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 .

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
FillMethode aufrufen, indem Sie dieAcceptChangesDuringFillEigenschaft des Adapters auffalsefestlegen. Wenn es auffalsefestgelegt 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
UPDATEAnweisung. Der Adapter weiß, eineUPDATEAnweisung zu verwenden, da der Wert der RowState Eigenschaft lautet Modified.Die übertragene SQL-Anweisung beinhaltet eine
WHERE-Klausel, die darauf hinweist, dass das Zielobjekt derUPDATE-Anweisung die Zeile ist, woCustomerID = 'c400'. Dieser Teil derSELECTAnweisung unterscheidet die Zielzeile von allen anderen, da derCustomerIDPrimärschlüssel der Zieltabelle ist. Die Informationen für dieWHEREKlausel 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
SETKlausel, um die neuen Werte der geänderten Spalten festzulegen.Hinweis
Wenn die TableAdapter-Eigenschaft
UpdateCommandauf 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.