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.
Hierarchische Aktualisierung bezieht sich auf den Prozess des Speicherns aktualisierter Daten (aus einem Dataset mit mindestens zwei verknüpften Tabellen) zurück in eine Datenbank, während referenzielle Integritätsregeln beibehalten werden. Referenzielle Integrität bezieht sich auf die Konsistenzregeln, die von den Einschränkungen in einer Datenbank bereitgestellt werden, die das Verhalten des Einfügens, Aktualisierens und Löschens verwandter Datensätze steuern. Beispielsweise ist es referenzielle Integrität, die die Erstellung eines Kundendatensatzes erzwingt, bevor Bestellungen für diesen Kunden erstellt werden können. Weitere Informationen zu Beziehungen in Datasets finden Sie unter "Beziehungen in Datasets".
Das hierarchische Update-Feature verwendet ein TableAdapterManager, um die TableAdapter-Elemente in einem typisierten Dataset zu verwalten. Die TableAdapterManager Komponente ist eine von Visual Studio generierte Klasse, nicht ein .NET-Typ. Wenn Sie eine Tabelle aus dem Fenster "Datenquellen " auf eine Windows Form- oder WPF-Seite ziehen, fügt Visual Studio dem Formular oder der Seite eine Variable vom Typ "TableAdapterManager" hinzu, und sie wird im Designer im Komponentenbereich angezeigt. Ausführliche Informationen zur TableAdapterManager Klasse finden Sie im TableAdapterManager Reference Section of TableAdapters.
Standardmäßig behandelt ein Dataset verwandte Tabellen als "nur Beziehungen", was bedeutet, dass keine Fremdschlüsseleinschränkungen erzwungen werden. Sie können diese Einstellung während der Entwurfsphase mithilfe des Dataset-Designers ändern. Wählen Sie die Beziehungslinie zwischen zwei Tabellen aus, um das Dialogfeld "Beziehung " anzuzeigen. Die änderungen, die Sie hier vornehmen, bestimmen, wie sich das TableAdapterManager Verhalten verhält, wenn sie die Änderungen in den zugehörigen Tabellen zurück an die Datenbank sendet.
Aktivieren der hierarchischen Aktualisierung in einem Dataset
Standardmäßig ist die hierarchische Aktualisierung für alle neuen Datasets aktiviert, die in einem Projekt hinzugefügt oder erstellt werden. Aktivieren oder deaktivieren Sie hierarchische Aktualisierung, indem Sie die Hierarchische Update-Eigenschaft eines typisierten Datasets im Dataset auf "True " oder " False" festlegen:
Erstellen einer neuen Beziehung zwischen Tabellen
Wenn Sie eine neue Beziehung zwischen zwei Tabellen erstellen möchten, wählen Sie im Dataset-Designer die Titelleiste jeder Tabelle aus, klicken Sie dann mit der rechten Maustaste, und wählen Sie dann "Beziehung hinzufügen" aus.
Grundlegendes zu Fremdschlüsseleinschränkungen, kaskadierenden Updates und Löschungen
Es ist wichtig zu verstehen, wie Fremdschlüsseleinschränkungen und kaskadierendes Verhalten in der Datenbank im generierten Datasetcode erstellt werden.
Standardmäßig werden die Datentabellen in einem Dataset mit BeziehungenDataRelation () generiert, die den Beziehungen in der Datenbank entsprechen. Die Beziehung im Dataset wird jedoch nicht als Fremdschlüsseleinschränkung generiert. Die DataRelation ist als Relation Only konfiguriert, ohne dass UpdateRule oder DeleteRule wirksam sind.
Standardmäßig werden kaskadierende Aktualisierungen und kaskadierende Löschlöschungen deaktiviert, auch wenn die Datenbankbeziehung mit kaskadierenden Updates oder kaskadierenden Löschlöschungen aktiviert ist. Beispielsweise kann das Erstellen eines neuen Kunden und einer neuen Bestellung und der Versuch, die Daten zu speichern, zu einem Konflikt mit den Fremdschlüsseleinschränkungen führen, die in der Datenbank definiert sind. Weitere Informationen finden Sie unter "Deaktivieren von Einschränkungen beim Ausfüllen eines Datasets".
Festlegen der Reihenfolge zum Ausführen von Updates
Durch Festlegen der Reihenfolge zum Ausführen von Aktualisierungen wird die Reihenfolge der einzelnen Einfügungen, Aktualisierungen und Löschungen festgelegt, die zum Speichern aller geänderten Daten in allen Tabellen eines Datasets erforderlich sind. Wenn hierarchische Aktualisierung aktiviert ist, werden Einfügungen zuerst ausgeführt, dann aktualisiert und dann gelöscht. Der TableAdapterManager stellt eine UpdateOrder-Eigenschaft bereit, die so eingestellt werden kann, um zuerst Aktualisierungen auszuführen, dann Einfügungen vorzunehmen und schließlich Löschungen.
Hinweis
Es ist wichtig zu verstehen, dass die Updatereihenfolge alles umfasst. Das heißt, wenn Aktualisierungen ausgeführt werden, werden Einfügungen und anschließende Löschungen für alle Tabellen im Dataset ausgeführt.
Wenn Sie die UpdateOrder Eigenschaft festlegen möchten, wählen Sie nach dem Ziehen von Elementen aus dem Datenquellenfenster auf ein Formular das TableAdapterManager Element im Komponentenbereich aus, und legen Sie dann die UpdateOrder Eigenschaft im Eigenschaftenfenster fest.
Erstellen einer Sicherungskopie eines Datasets vor dem Ausführen einer hierarchischen Aktualisierung
Beim Speichern von Daten (durch Aufrufen der TableAdapterManager.UpdateAll() Methode) versucht die TableAdapterManager, die Daten für jede Tabelle in einer einzelnen Transaktion zu aktualisieren. Wenn ein Teil der Aktualisierung für eine Tabelle fehlschlägt, wird die gesamte Transaktion zurückgesetzt. In den meisten Fällen gibt das Rollback Ihre Anwendung in den ursprünglichen Zustand zurück.
Es kann jedoch vorkommen, dass Sie das Dataset aus der Sicherungskopie wiederherstellen möchten. Ein Beispiel hierfür ist die Verwendung von automatisch inkrementierenden Werten. Wenn ein Speichervorgang z. B. nicht erfolgreich ist, werden automatische Inkrementwerte nicht im Dataset zurückgesetzt, und das Dataset erstellt weiterhin automatisch inkrementierende Werte. Dadurch bleibt eine Lücke bei der Nummerierung, die in Ihrer Anwendung möglicherweise nicht akzeptabel ist. In Situationen, in denen dies ein Problem darstellt, stellt die TableAdapterManager Eigenschaft eine BackupDataSetBeforeUpdate Eigenschaft bereit, die das vorhandene Dataset durch eine Sicherungskopie ersetzt, wenn die Transaktion fehlschlägt.
Hinweis
Die Sicherungskopie befindet sich nur im Arbeitsspeicher, während die TableAdapterManager.UpdateAll Methode ausgeführt wird. Daher gibt es keinen programmgesteuerten Zugriff auf dieses Sicherungsdatenset, da es entweder das ursprüngliche Dataset ersetzt oder außerhalb des Gültigkeitsbereichs liegt, sobald die TableAdapterManager.UpdateAll Methode abgeschlossen ist.
Ändere den generierten Speichercode, um die hierarchische Aktualisierung auszuführen.
Speichern Sie Änderungen aus den verknüpften Datentabellen im Dataset in der Datenbank, indem Sie die TableAdapterManager.UpdateAll Methode aufrufen und den Namen des Datasets übergeben, das die zugehörigen Tabellen enthält. Führen Sie beispielsweise die TableAdapterManager.UpdateAll(NorthwindDataset) Methode aus, um Aktualisierungen aus allen Tabellen in NorthwindDataset an die Back-End-Datenbank zu senden.
Nachdem Sie die Elemente aus dem Fenster "Datenquellen " gelöscht haben, wird dem Ereignis automatisch Code hinzugefügt Form_Load , um jede Tabelle (die TableAdapter.Fill Methoden) aufzufüllen. Code wird auch dem Klick-Ereignis der Schaltfläche Speichern des BindingNavigator hinzugefügt, um Daten aus dem Datensatz mithilfe der TableAdapterManager.UpdateAll-Methode zurück in die Datenbank zu speichern.
Der generierte Speichercode enthält auch eine Codezeile, die die CustomersBindingSource.EndEdit Methode aufruft. Genauer gesagt ruft er die EndEdit-Methode der ersten BindingSource auf, die dem Formular hinzugefügt wurde. Mit anderen Worten, dieser Code wird nur für die erste Tabelle generiert, die aus dem Fenster " Datenquellen " auf das Formular gezogen wird. Der Aufruf EndEdit führt ein Commit aller Änderungen durch, die in irgendeinem datengebundenen Steuerelement ablaufen, das derzeit bearbeitet wird. Wenn ein datengebundenes Steuerelement weiterhin den Fokus hat und Sie auf die Schaltfläche " Speichern " klicken, werden daher alle ausstehenden Bearbeitungen in diesem Steuerelement vor dem tatsächlichen Speichern (die TableAdapterManager.UpdateAll Methode) übernommen.
Hinweis
Der Dataset-Designer fügt nur den BindingSource.EndEdit Code für die erste Tabelle hinzu, die auf dem Formular abgelegt wird. Daher müssen Sie eine Codezeile hinzufügen, um die BindingSource.EndEdit Methode für jede verwandte Tabelle im Formular aufzurufen. Für diese exemplarische Vorgehensweise heißt das, dass Sie einen Aufruf zur OrdersBindingSource.EndEdit-Methode hinzufügen müssen.
So aktualisieren Sie den Code, um Änderungen an den verknüpften Tabellen vor dem Speichern zu übernehmen
Doppelklicken Sie im Code-Editor auf die Schaltfläche "BindingNavigator", um Formular1 zu öffnen.
Fügen Sie eine Codezeile hinzu, um die Methode nach der
OrdersBindingSource.EndEditZeile aufzurufen, die dieCustomersBindingSource.EndEditMethode aufruft. Der Code im Click-Ereignis der Schaltfläche " Speichern " sollte wie folgt aussehen:
Neben dem Commit für Änderungen an einer verknüpften untergeordneten Tabelle vor dem Speichern in einer Datenbank müssen Sie vielleicht einen einen Commit der neue erstellten übergeordneten Datensätze durchführen, ehe Sie neue untergeordnete Datensätze dem Dataset hinzufügen. Anders ausgedrückt: Sie müssen möglicherweise den neuen übergeordneten Datensatz (Customer) dem Dataset hinzufügen, bevor es die Fremdschlüsseleinschränkungen ermöglichen, dass dem Dataset neue untergeordnete Datensätze (Orders) hinzugefügt werden können. Das erreichen Sie, indem Sie das untergeordnete BindingSource.AddingNew-Ereignis verwenden.
Hinweis
Ob Sie neue übergeordnete Datensätze übernehmen müssen, hängt vom Typ des Steuerelements ab, das zum Binden an Ihre Datenquelle verwendet wird. In dieser exemplarischen Vorgehensweise verwenden Sie einzelne Steuerelemente für das Binden an die übergeordnete Tabelle. Dazu ist ein zusätzlicher Code erforderlich, um den neuen übergeordneten Datensatz zu committen. Wenn die übergeordneten Datensätze stattdessen in einem komplexen Bindungssteuerungselement wie dem DataGridView angezeigt wurden, wäre dieser zusätzliche EndEdit Aufruf für den übergeordneten Datensatz nicht erforderlich. Dies liegt daran, dass die zugrunde liegende Datenbindungsfunktion des Steuerelements das Bestätigen der neuen Datensätze verarbeitet.
So fügen Sie Code für den Commit übergeordneter Datensätze hinzu, ehe untergeordnete Datensätze hinzufügt werden
Erstellen Sie einen Ereignishandler für das
OrdersBindingSource.AddingNew-Ereignis.- Öffnen Sie "Form1 " in der Entwurfsansicht, wählen Sie "OrdersBindingSource " im Komponentenbereich aus, wählen Sie " Ereignisse " im Eigenschaftenfenster aus, und doppelklicken Sie dann auf das AddNew-Ereignis .
Fügen Sie dem Ereignishandler, der die
CustomersBindingSource.EndEditMethode aufruft, eine Codezeile hinzu. Der Code imOrdersBindingSource_AddingNewEreignishandler sollte wie folgt aussehen:
TableAdapterManager-Referenz
Standardmäßig wird eine TableAdapterManager Klasse generiert, wenn Sie ein Dataset erstellen, das verwandte Tabellen enthält. Um zu verhindern, dass die Klasse generiert wird, ändern Sie den Wert der Hierarchical Update Eigenschaft des Datasets in "false". Wenn Sie eine Tabelle mit einer Beziehung auf die Entwurfsoberfläche einer Windows Form- oder WPF-Seite ziehen, deklariert Visual Studio eine Membervariable der Klasse. Wenn Sie keine Datenbindung verwenden, müssen Sie die Variable manuell deklarieren.
Die TableAdapterManager Klasse ist kein .NET-Typ. Daher können Sie sie in der Dokumentation nicht nachschlagen. Sie wird während der Entwurfsphase als Teil des Erstellungsprozesses des Datensatzes erstellt.
Im Folgenden sind die häufig verwendeten Methoden und Eigenschaften der TableAdapterManager Klasse aufgeführt:
| Mitglied | BESCHREIBUNG |
|---|---|
UpdateAll-Methode |
Speichert alle Daten aus allen Datentabellen. |
BackUpDataSetBeforeUpdate-Eigenschaft |
Bestimmt, ob eine Sicherungskopie des Datasets erstellt werden soll, bevor die TableAdapterManager.UpdateAll Methode ausgeführt wird. Boolescher Wert. |
tableNameTableAdapter Eigenschaft |
Stellt ein TableAdapter dar. Das generierte TableAdapterManager enthält für jedes verwaltete TableAdapter eine Eigenschaft. So wird beispielsweise ein Datensatz mit einer Tabelle „Customers“ und „Orders“ mit einem TableAdapterManager erzeugt, der die Eigenschaften CustomersTableAdapter und OrdersTableAdapter enthält. |
UpdateOrder-Eigenschaft |
Steuert die Reihenfolge der einzelnen Einfüge-, Aktualisierungs- und Löschbefehle. Legen Sie dies auf einen der Werte in der TableAdapterManager.UpdateOrderOption Enumeration fest.Standardmäßig ist UpdateOrder auf InsertUpdateDelete festgelegt. Dies bedeutet, dass für alle Tabellen im Dataset Einfüge- und anschließende Aktualisierungen und anschließende Löschungen ausgeführt werden. |