Freigeben über


Füllen von Datasets mithilfe von TableAdapters in .NET Framework-Anwendungen

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. Die Technologien 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.

Eine TableAdapter-Komponente füllt ein Dataset basierend auf einer oder mehrerer von Ihnen angegebenen Abfragen oder gespeicherten Prozeduren mit Daten aus der Datenbank. TableAdapters kann auch Hinzufüge-, Aktualisierungs- und Löschvorgänge für die Datenbank ausführen, um Änderungen, die Sie am Dataset vornehmen, beizubehalten. Sie können auch globale Befehle ausgeben, die sich nicht auf eine bestimmte Tabelle beziehen.

Hinweis

TableAdapters werden von Visual Studio-Designern generiert. Wenn Sie Datasets programmgesteuert erstellen, verwenden Sie DataAdapter, eine .NET-Klasse.

Ausführliche Informationen zu TableAdapter-Vorgängen finden Sie direkt in einem der folgenden Themen:

Thema BESCHREIBUNG
Erstellen und Konfigurieren eines TableAdapters Verwenden der Designer zum Erstellen und Konfigurieren von TableAdapters
Erstellen von parametrisierten TableAdapter-Abfragen Vorgehen, um es Benutzern zu ermöglichen, Argumente für TableAdapter-Prozeduren oder -Abfragen bereitzustellen
Direktes Zugreifen auf die Datenbank mit einem TableAdapter Verwenden der Dbdirect-Methoden von TableAdapters
Deaktivieren von Einschränkungen beim Auffüllen von Datasets Arbeiten mit Fremdschlüsseleinschränkungen beim Aktualisieren von Daten
Erweitern der Funktionalität eines TableAdapter Hinzufügen von benutzerdefiniertem Code zu TableAdapters
Laden von Daten in ein Dataset Arbeiten mit XML

Übersicht über TableAdapter

TableAdapters sind vom Designer generierte Komponenten, die eine Verbindung mit einer Datenbank herstellen, Abfragen oder gespeicherte Prozeduren ausführen und deren DataTable mit den zurückgegebenen Daten füllen. TableAdapters senden außerdem aktualisierte Daten von der Anwendung zurück an die Datenbank. Sie können beliebig viele Abfragen für einen TableAdapter ausführen, solange diese Daten zurückgeben, die dem Schema der Tabelle entsprechen, der der TableAdapter zugeordnet ist. Das folgende Diagramm zeigt, wie TableAdapters mit Datenbanken und anderen Objekten im Arbeitsspeicher interagieren:

Datenfluss in einer Clientanwendung

TableAdapters werden zwar mit dem DataSet-Designer entworfen, aber die generierten TableAdapter-Klassen werde nicht als geschachtelte DataSet-Klassen generiert. Sie befinden sich in separaten Namespaces, die für jedes Dataset spezifisch sind. Wenn Sie beispielsweise ein Dataset mit der Bezeichnung NorthwindDataSet besitzen, befinden sich die TableAdapters, die mit den im NorthwindDataSet enthaltenen DataTables verknüpft sind, im NorthwindDataSetTableAdapters-Namespace. Um programmgesteuert auf einen speziellen TableAdapter zuzugreifen, müssen Sie eine neue Instanz des TableAdapter deklarieren. Beispiel:

NorthwindDataSet northwindDataSet = new NorthwindDataSet();

NorthwindDataSetTableAdapters.CustomersTableAdapter customersTableAdapter = 
    new NorthwindDataSetTableAdapters.CustomersTableAdapter();

customersTableAdapter.Fill(northwindDataSet.Customers);

Zugeordnetes DataTable-Schema

Beim Erstellen eines TableAdapter verwenden Sie die ursprüngliche Abfrage oder gespeicherte Prozedur, um das Schema der DataTable zu definieren, die dem TableAdapter zugeordnet ist. Sie führen diese anfängliche Abfrage oder gespeicherte Prozedur aus, indem Sie die Fill-Methode des TableAdapter aufrufen (wodurch die dem TableAdapter zugeordnete DataTable aufgefüllt wird). Alle an der Hauptabfrage des TableAdapter vorgenommenen Änderungen spiegeln sich im Schema der zugeordneten Datentabelle wider. Zum Beispiel wird durch das Entfernen einer Spalte aus der Hauptabfrage auch die Spalte aus der zugeordneten Datentabelle entfernt. Wenn in weiteren Abfragen des TableAdapter SQL-Anweisungen verwendet werden, die nicht in der Hauptabfrage enthaltene Spalten zurückgeben, versucht der Designer, die Spaltenänderungen zwischen der Hauptabfrage und den zusätzlichen Abfragen zu synchronisieren.

Aktualisierungsbefehle für TableAdapter

Die Aktualisierungsfunktionalität eines TableAdapter ist von der Menge der Informationen abhängig, die in der Hauptabfrage im TableAdapter-Assistenten verfügbar sind. Beispielsweise sind TableAdapters, die so konfiguriert sind, dass sie Werte aus mehreren Tabellen (per JOIN), Skalarwerte, Ansichten oder die Ergebnisse von Aggregatfunktionen abrufen, bei der Erstellung anfänglich nicht in der Lage, Aktualisierungen an die zugrunde liegende Datenbank zurückzusenden. Sie können jedoch die Befehle INSERT, UPDATE und DELETE im Eigenschaften-Fenster manuell konfigurieren.

TableAdapter-Abfragen

TableAdapter mit mehreren Abfragen

TableAdapters können mehrere Abfragen enthalten, um ihre zugeordneten Datentabellen aufzufüllen. Sie können so viele Abfragen für einen TableAdapter definieren, wie für die Anwendung erforderlich sind, solange jede Abfrage Daten zurückgibt, die demselben Schema entsprechen wie die zugeordnete Datentabelle. Diese Funktion ermöglicht es einem TableAdapter, unterschiedliche Ergebnisse basierend auf unterschiedlichen Kriterien zu laden.

Wenn die Anwendung beispielsweise eine Tabelle mit Kundennamen enthält, können Sie eine Abfrage erstellen, durch die die Tabelle mit allen Kundennamen aufgefüllt wird, die mit einem bestimmten Buchstaben beginnen. Durch eine weitere Abfrage können Sie die Tabelle mit allen Kunden auffüllen, die aus demselben Bundesland/Kanton stammen. Um eine Customers-Tabelle mit Kunden in einem bestimmten Bundesland/Kanton aufzufüllen, können Sie eine FillByState-Abfrage erstellen, die als Parameter für den Wert für das Bundesland bzw. den Kanton Folgendes annimmt: SELECT * FROM Customers WHERE State = @State. Sie führen die Abfrage aus, indem Sie die FillByState-Methode aufrufen und den Parameterwert folgendermaßen übergeben: CustomerTableAdapter.FillByState("WA").

Zusätzlich zum Hinzufügen von Abfragen, die Daten zurückgeben, die demselben Schema entsprechen wie die Datentabelle des TableAdapter, können Sie Abfragen hinzufügen, die (einzelne) Skalarwerte zurückgeben. Beispielsweise ist eine Abfrage, die die Anzahl der Kunden zurückgibt (SELECT Count(*) From Customers) für einen CustomersTableAdapter, gültig, obwohl die zurückgegebenen Daten nicht dem Schema der Tabelle entsprechen.

ClearBeforeFill-Eigenschaft

Jedes Mal, wenn Sie eine Abfrage zum Auffüllen der TableAdapter-Datentabelle ausführen, werden standardmäßig die bestehenden Daten gelöscht, und nur die Ergebnisse der Abfrage werden in die Tabelle geladen. Legen Sie die ClearBeforeFill-Eigenschaft des TableAdapter auf false fest, wenn Sie die von einer Abfrage zurückgegebenen Daten in die vorhandenen Daten in einer Datentabelle einfügen bzw. mit diesen zusammenführen möchten. Unabhängig davon, ob Sie die Daten löschen, müssen Sie Aktualisierungen explizit an die Datenbank zurücksenden, wenn Sie sie persistent beibehalten wollen. Vergessen Sie also nicht, Änderungen an den Daten in der Tabelle zu speichern, bevor Sie eine weitere Abfrage zum Auffüllen der Tabelle ausführen. Weitere Informationen finden Sie unter Aktualisieren von Daten mit einem TableAdapter.

TableAdapter-Vererbung

Durch TableAdapters wird die Funktionalität von Standarddatenadaptern erweitert, indem eine konfigurierte DataAdapter-Klasse eingekapselt wird. Standardmäßig erbt der TableAdapter von Component und kann nicht in die DataAdapter-Klasse umgewandelt werden. Das Umwandeln eines TableAdapter-Elements in die DataAdapter -Klasse führt zu einem InvalidCastException-Fehler. Um die Basisklasse eines TableAdapter zu ändern, können Sie eine Klasse angeben, die von Component in der Basisklassen-Eigenschaft des TableAdapter im DataSet-Designer abgeleitet wird.

TableAdapter-Methoden und -Eigenschaften

Die TableAdapter-Klasse ist kein .NET-Typ. Dies bedeutet, dass Sie sie nicht in der Dokumentation oder im Objektbrowser nachschlagen können. Sie wird zur Entwurfszeit erstellt, wenn Sie einen der vorhin erwähnten Assistenten verwenden. Der einem TableAdapter beim Erstellen zugewiesene Name basiert auf dem Namen der Tabelle, mit der Sie arbeiten. Wenn Sie beispielsweise einen TableAdapter erstellen, der auf einer Tabelle basiert, die sich in einer Datenbank mit der Bezeichnung Orders befindet, erhält der TableAdapter den Namen OrdersTableAdapter. Sie können den Klassennamen für den TableAdapter ändern, indem Sie die Name-Eigenschaft im DataSet-Designer verwenden.

Dies sind die gebräuchlichsten TableAdapter-Methoden und -Eigenschaften:

Member BESCHREIBUNG
TableAdapter.Fill Füllt die dem TableAdapter zugeordnete Datentabelle mit den Ergebnissen des SELECT-Befehls für den TableAdapter auf.
TableAdapter.Update Sendet Änderungen an die Datenbank zurück, und gibt die Anzahl der vom Aktualisierungsvorgang betroffenen Zeilen als Integer zurück. Weitere Informationen finden Sie unter Aktualisieren von Daten mit einem TableAdapter.
TableAdapter.GetData Gibt eine neue mit Daten aufgefüllte DataTable zurück.
TableAdapter.Insert Erstellt eine neue Zeile in der Datentabelle. Weitere Informationen finden Sie unter Einfügen neuer Datensätze in eine Datenbank.
TableAdapter.ClearBeforeFill Bestimmt, ob eine Datentabelle geleert wird, bevor Sie eine der Fill-Methoden aufrufen.

TableAdapter-Aktualisierungsmethode

TableAdapters verwenden zum Lesen und Schreiben in Datenbanken Datenbefehle. Verwenden Sie die anfängliche Fill-(Haupt-)Abfrage des TableAdapter als Grundlage für die Erstellung des Schemas der zugeordneten Datentabelle sowie wie für die Befehle InsertCommand, UpdateCommand und DeleteCommand, die der TableAdapter.Update-Methode zugeordnet sind. Beim Aufrufen der Update-Methode für einen TableAdapter werden die Anweisungen ausgeführt, die bei der ursprünglichen TableAdapter-Konfiguration erstellt wurden. Die zusätzlichen Abfragen, die Sie mit dem Konfigurations-Assistenten für TableAdapter-Abfragen hinzugefügt haben, werden nicht ausgeführt.

Wenn Sie einen TableAdapter verwenden, führt er effektiv dieselben Operationen mit den Befehlen aus, die Sie normalerweise ausführen würden. Wenn Sie beispielsweise die Fill-Methode für den Adapter aufrufen, führt der Adapter in seiner SelectCommand-Eigenschaft einen Datenbefehl aus und verwendet einen Datenreader (beispielsweise SqlDataReader), um das Resultset in die Datentabelle zu laden. Wenn Sie die Update-Methode des Adapters aufrufen, wird entsprechend der zutreffende Befehl für jeden geänderten Datensatz in der Datentabelle ausgeführt (in den Eigenschaften UpdateCommand, InsertCommand und DeleteCommand).

Hinweis

Wenn die Hauptabfrage genügend Informationen enthält, werden beim Generieren des TableAdapter standardmäßig die Befehle InsertCommand, UpdateCommand und DeleteCommand erstellt. Wenn es sich bei der Hauptabfrage für den TableAdapter um mehr als eine SELECT-Anweisung für eine einzelne Tabelle handelt, ist der Designer möglicherweise nicht in der Lage, die Befehle InsertCommand, UpdateCommand und DeleteCommand zu generieren. Wenn diese Befehle nicht generiert werden, tritt beim Ausführen der TableAdapter.Update-Methode möglicherweise ein Fehler auf.

TableAdapter GenerateDbDirectMethods

Zusätzlich zu InsertCommand, UpdateCommand und DeleteCommand werden für die TableAdapter-Erstellung Methoden verwendet, die direkt in der Datenbank ausgeführt werden können. Sie können diese Methoden (TableAdapter.Insert, TableAdapter.Update und TableAdapter.Delete) aufrufen, um Daten direkt in der Datenbank zu bearbeiten. Dies bedeutet, dass Sie zum Umgang mit Einfüge-, Aktualisierungs- und Löschvorgängen, die für die zugeordnete Datentabelle ausstehend sind, diese einzelnen Methoden vom Code aufrufen und dass nicht TableAdapter.Update aufgerufen wird.

Wenn Sie diese direkten Methoden nicht erstellen möchten, legen Sie die GenerateDbDirectMethods-Eigenschaft des TableAdapter im Eigenschaftenfenster auf false fest. Dem TableAdapter hinzugefügte zusätzliche Abfragen sind eigenständig und können diese Methoden nicht generieren.

TableAdapter-Unterstützung für Typen mit Nullwert

Die TableAdapters unterstützen die Nullable-Typen Nullable(Of T) und T?. Weitere Informationen zu Nullable-Typen in Visual Basic finden Sie unter Auf NULL festlegbare Werttypen. Weitere Informationen zu Nullable-Typen in C# finden Sie unter Verwenden von Nullable-Typen.

TableAdapterManager-Referenz

Standardmäßig wird eine TableAdapterManager-Klasse generiert, wenn Sie ein Dataset erstellen, das verknüpfte 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 finden Sie darüber keine Informationen in der Dokumentation. Sie wird zur Entwurfszeit im Rahmen des Dataseterstellungsprozesses erstellt.

Im Folgenden werden die häufig verwendeten Methoden und Eigenschaften der TableAdapterManager-Klasse aufgeführt:

Member BESCHREIBUNG
UpdateAll-Methode Speichert alle Daten aus allen Datentabellen.
BackUpDataSetBeforeUpdate-Eigenschaft Boolescher Wert, der angibt, ob vor dem Ausführen der TableAdapterManager.UpdateAll-Methode eine Sicherungskopie des Datasets erstellt werden soll.
Eigenschaft tableName TableAdapter Stellt einen TableAdapter dar. Der generierte TableAdapterManager enthält eine Eigenschaft für jede verwaltete TableAdapter. Ein Dataset mit einer Tabelle „Customers and Orders“ wird beispielsweise mit einem TableAdapterManager generiert, der die Eigenschaften CustomersTableAdapter und enthältOrdersTableAdapter.
UpdateOrder-Eigenschaft Steuert die Reihenfolge der einzelnen Einfüge-, Aktualisierungs- und Löschbefehle. Legen Sie dies als 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-, dann Aktualisierungs- und dann Löschvorgänge ausgeführt werden.

Sicherheit

Wenn Sie Datenbefehle mit einer auf Text festgelegten CommandType-Eigenschaft verwenden, müssen Sie die von einem Client gesendeten Informationen sorgfältig überprüfen, bevor Sie diese an die Datenbank übergeben. Böswillige Benutzer könnten versuchen, veränderte oder zusätzliche SQL-Anweisungen zu senden (einzufügen), um unautorisierten Zugriff zu erhalten oder die Datenbank zu beschädigen. Bevor Sie Benutzereingaben in eine Datenbank übertragen, vergewissern Sie sich immer, dass die Informationen gültig sind. Eine Best Practice besteht darin, bei Möglichkeit immer parametrisierte Abfragen oder gespeicherte Prozeduren verwenden.