Übersicht über TableAdapters

 

Veröffentlicht: Juli 2016

TableAdapters ermöglichen die Kommunikation zwischen der Anwendung und einer Datenbank. Dies bedeutet, dass ein TableAdapter eine Verbindung mit einer Datenbank herstellt, Abfragen oder gespeicherte Prozeduren ausführt und eine neue Datentabelle mit den zurückgegebenen Daten zurückgibt oder aber eine vorhandene DataTable mit den zurückgegebenen Daten füllt. Mit TableAdapters werden außerdem aktualisierte Daten von der Anwendung an die Datenbank zurückgesendet.

Benutzer früherer Versionen von Visual Studio stellen sich einen TableAdapter am besten als DataAdapter mit integriertem Verbindungsobjekt und der Möglichkeit vor, mehrere Abfragen aufzunehmen. Jede einem TableAdapter hinzugefügte Abfrage wird als öffentliche Methode verfügbar gemacht, die wie jede andere Methode oder Funktion für ein Objekt aufgerufen wird.

Zusätzlich zur Standardfunktionalität eines DataAdapter umfassen TableAdapters weitere typisierte Methoden zum Kapseln von Abfragen, die über ein gemeinsames Schema mit der zugeordneten typisierten DataTable verfügen. Anders gesagt, ein TableAdapter kann beliebig viele Abfragen aufnehmen, solange diese Daten zurückgeben, die das gleiche Schema einhalten.

In der vorherigen Version von Visual Studio wurden ADO.NET-Datenadapter für die Kommunikation zwischen einer Anwendung und einer Datenbank verwendet. Während Datenadapter immer noch eine Hauptkomponente von .NET Framework-Datenanbieter sind, sind TableAdapters mit dem Designer generierte Komponenten, die die Funktion von DataAdapters verbessern. TableAdapters enthalten normalerweise die Fill-Methode und die Update-Methode, um Daten in einer Datenbank abzurufen und zu aktualisieren.

TableAdapters werden mit dem Dataset-Designer innerhalb von Datasets mit starker Typisierung erstellt. Sie können TableAdapters während der Erstellung eines neuen Datasets mit dem Assistent zum Konfigurieren von Datenquellen erstellen. Sie können TableAdapters auch in vorhandenen Datasets mit dem TableAdapter-Konfigurations-Assistent erstellen, oder Sie können Datenbankobjekte aus dem Server-Explorer auf den Dataset-Designer ziehen. Weitere Informationen finden Sie unter Gewusst wie: Erstellen von TableAdapters.

Während TableAdapters mit dem Dataset-Designer entworfen werden, werden die generierten TableAdapter-Klassen nicht als geschachtelte DataSet-Klassen generiert. Sie befinden sich in einem separaten Namespace, der für jedes Dataset spezifisch ist. 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);
        Dim northwindDataSet As New NorthwindDataSet()
        Dim customersTableAdapter As New NorthwindDataSetTableAdapters.CustomersTableAdapter()

        customersTableAdapter.Fill(northwindDataSet.Customers)

Zugeordnetes DataTable-Schema

Wenn Sie einen TableAdapter erstellen, wird die ursprüngliche Abfrage oder gespeicherte Prozedur verwendet, 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-Hauptmethode des TableAdapter aufrufen (wodurch die dem TableAdapter zugeordnete DataTable aufgefüllt wird). Alle Änderungen an der Hauptabfrage des TableAdapter spiegeln sich im Schema der zugeordneten Datentabelle wider. Durch das Entfernen einer Spalte aus der Hauptabfrage wird z. B. auch die Spalte aus der zugeordneten Datentabelle entfernt. Wenn in weiteren Abfragen des TableAdapter SQL-Anweisungen verwendet werden, durch die Spalten zurückgegeben werden, die nicht in der Hauptabfrage enthalten sind, versucht der Designer, die Spaltenänderungen zwischen der Hauptabfrage und etwaigen zusätzlichen Abfragen zu synchronisieren. Weitere Informationen finden Sie unter Gewusst wie: Bearbeiten von TableAdapters.

Aktualisierungsbefehle für TableAdapter

Die Aktualisierungsfunktionalität eines TableAdapter ist von der Menge der Informationen abhängig, die auf der Grundlage der im TableAdapter-Assistenten enthaltenen Hauptabfrage verfügbar sind. Beispielsweise sind TableAdapters, die so konfiguriert sind, dass sie Werte aus mehreren Tabellen (JOINs), 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 Eigenschaftenfenster manuell konfigurieren.

TableAdapter-Abfragen

TableAdapter mit mehreren Abfragen

Anders als Standarddatenadapter können TableAdapters 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. Dadurch wird das Laden von Daten ermöglicht, die verschiedene Kriterien erfüllen. Wenn die Anwendung beispielsweise eine Kundentabelle enthält, können Sie eine Abfrage erstellen, durch die die Tabelle mit allen Kunden aufgefüllt wird, deren Name mit einem bestimmten Buchstaben beginnt. Darüber hinaus können Sie eine weitere Abfrage erstellen, durch die die Tabelle mit allen Kunden aufgefüllt wird, 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"). Weitere Informationen finden Sie unter Gewusst wie: Erstellen von TableAdapter-Abfragen.

Zusätzlich zu 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 das Erstellen einer 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

Der TableAdapter fügt eine für die DataAdapter-Basisklasse nicht verfügbare Eigenschaft hinzu. Jedes Mal, wenn Sie eine Abfrage zum Auffüllen der TableAdapter-Datentabelle ausführen, werden die Daten standardmäßig 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 dies erforderlich ist. Vergessen Sie also nicht, an den Daten in der Tabelle vorgenommene Änderungen zu speichern, bevor Sie eine weitere Abfrage zum Auffüllen der Tabelle ausführen. Weitere Informationen finden Sie unter Gewusst wie: Aktualisieren von Daten mit einem TableAdapter.

TableAdapter-Vererbung

Durch TableAdapters wird die Funktionalität von Standarddatenadaptern erweitert, indem ein konfigurierter DataAdapter gekapselt wird. Standardmäßig erbt der TableAdapter von Component und kann nicht in die DataAdapter-Klasse umgewandelt werden. Die Umwandlung eines TableAdapter in einen DataAdapter führt zu einer InvalidCastException. Um die Basisklasse eines TableAdapter zu ändern, können Sie eine Klasse eingeben, die von der Component in der Basisklassen-Eigenschaft des TableAdapter im Dataset-Designer abgeleitet wird.

TableAdapter-Methoden und -Eigenschaften

Die TableAdapter-Klasse ist nicht Bestandteil von .NET Framework. Daher sind in der Dokumentation und im Objektkatalog keine Informationen dazu zu finden. Sie wird zur Entwurfszeit erstellt, wenn Sie einen der oben 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.

Im Folgenden werden die gebräuchlichsten TableAdapter-Methoden und -Eigenschaften vorgestellt:

Member Beschreibung
TableAdapter.Fill Füllt die dem TableAdapter zugeordnete Datentabelle mit den Ergebnissen des SELECT-Befehls für den TableAdapter auf. Weitere Informationen finden Sie unter Gewusst wie: Füllen eines Datasets mit Daten.
TableAdapter.Update Sendet Änderungen an die Datenbank zurück, und gibt eine der Anzahl der vom Aktualisierungsvorgang betroffenen Zeilen entsprechende ganze Zahl zurück. Weitere Informationen finden Sie unter Gewusst wie: 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 Gewusst wie: Hinzufügen von Zeilen zu einer DataTable.
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. Die anfängliche Fill-(Haupt-)Abfrage des TableAdapter wird ebenso als Grundlage für die Erstellung des Schemas der zugeordneten Datentabelle verwendet wie die Befehle InsertCommand, UpdateCommand und DeleteCommand, die der TableAdapter.Update-Methode zugeordnet sind. Dies bedeutet, dass beim Aufrufen der Update-Methode für einen TableAdapter die Anweisungen ausgeführt werden, die bei der ursprünglichen TableAdapter-Konfiguration erstellt wurden. Die zusätzlichen, mit dem Konfigurations-Assistenten für TableAdapter-Abfragen hinzugefügten Abfragen 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 den Befehlen InsertCommand, UpdateCommand und DeleteCommand werden für die TableAdapter-Erstellung Methoden verwendet, die direkt gegen die Datenbank ausgeführt werden können. Diese Methoden (TableAdapter.Insert, TableAdapter.Update und TableAdapter.Delete) können direkt aufgerufen werden, um Daten 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 Typen Nullable(Of T) und T?, für die ein NULL-Wert zulässig ist. Weitere Informationen zu Typen in Visual Basic, für die NULL-Werte zulässig sind, finden Sie unter Nullable Value Types. Weitere Informationen zu Typen in C#, für die NULL-Werte zulässig sind, finden Sie unter Verwenden von auf NULL festlegbaren Typen.

Siehe auch

Exemplarische Vorgehensweisen zur Arbeit mit Daten
Gewusst wie: Herstellen einer Verbindung zu Daten in einer Datenbank
Exemplarische Vorgehensweise: Herstellen einer Verbindung mit Daten in einer Datenbank (Windows Forms)
Vorbereiten der Anwendung auf den Empfang von Daten
Abrufen von Daten für die Anwendung
Binden von Steuerelementen an Daten in Visual Studio
Bearbeiten von Daten in der Anwendung
Überprüfen von Daten
Speichern von Daten