28.5 TableAdapter erzeugen
Die Klasse TableAdapter gibt es nicht, sondern der Designer von Visual Studio erzeugt tabellenspezifische Versionen. Trotz ähnlicher Funktionalität ist der TableAdapter nicht von der Klasse DataAdapter abgeleitet, sondern von System.ComponentModel.Component.
Wenn Sie zum Beispiel die Spalten ProductID, ProductName und UnitPrice der Tabelle Products in den Designer ziehen, was dem SQL-Statement
SELECT ProductID, ProductName, UnitPrice FROM Products
entspricht, enthält der TableAdapter ein SqlDataAdapter-Objekt, das entsprechend dem SQL-Statement konfiguriert ist. Mit einem TableAdapter können Sie somit eine DataTable in einem typisierten DataSet füllen oder die in einer DataTable anstehenden Änderungen zur Datenbank übermitteln.
28.5.1 Visual Studio Assistent
Wenn Sie ein neues typisiertes DataSet generieren, indem Sie aus dem Server-Explorer Tabellen oder Spalten per Drag&Drop in den Designer ziehen, wird in der zugrunde liegenden Quellcodedatei neben der Klasse des typisierten DataSets für jede Tabelle auch eine extra TableAdapter-Klasse erzeugt (siehe Abschnitt 28.2.1, »Grobstruktur: Datentypen«).
Ein TableAdapter lässt sich aber auch über Visual Studio erzeugen. Legen Sie dazu zuerst ein leeres typisiertes DataSet an. Markieren Sie dazu das Projekt im Projektmappen-Explorer, und wählen Sie Neues Element hinzufügen. Im Vorlagendialog suchen Sie die Vorlage DataSet. Einen TableAdapter können Sie nun über das Menü Daten, das Kontextmenü des Designers oder dadurch bereitstellen, dass Sie das Element TableAdapter in den Designer ziehen. Danach öffnet sich ein Assistent, der Sie durch alle Konfigurationsschritte führt. Abbildung 28.6 zeigt dessen erste Seite. Hier wählen Sie entweder eine im Server-Explorer verfügbare Verbindung aus oder richten über die Schaltfläche Neue Verbindung eine neue Verbindung ein.
Abbildung 28.6 Konfigurieren der Verbindung eines TableAdapters
Nachdem Sie die Verbindung eingerichtet haben, verlangt der Assistent im nächsten Schritt die Angabe des Befehlstyps (siehe Abbildung 28.7). Sie können hier eine SQL-Anweisung angeben, eine neue gespeicherte Prozedur erstellen oder eine schon vorhandene gespeicherte Prozedur auswählen, um Daten abzurufen, zu aktualisieren, zu löschen oder hinzuzufügen.
Abbildung 28.7 Festlegen des Befehlstyps
Ich zeige die Schritte bei Wahl der obersten Option, SQL-Anweisungen verwenden. Im dann folgenden Dialog (siehe Abbildung 28.8) geben Sie das SQL-Statement manuell ein oder klicken auf die Schaltfläche Abfrage-Generator.
Abbildung 28.8 Erstellen einer SQL-Anweisung im Assistenten
Über die Schaltfläche Abfrage-Generator gelangen Sie zu dem in Abbildung 28.9 gezeigten Dialogfenster, in dem Sie zwischen Tabellen, Ansichten, Funktionen und Synonymen der entsprechenden Datenbank auswählen können. Unter Tabellen markieren Sie die Tabelle, für die der TableAdapter erzeugt werden soll, und bestätigen Sie Ihre Wahl mit Hinzufügen. Schließen Sie dann den Dialog.
Abbildung 28.9 Tabelle für den TableAdapter festlegen
Nachdem Sie die Tabelle festgelegt haben, können Sie das Dialogfenster schließen. Im nächsten Fenster spezifizieren Sie das SQL-Statement (siehe Abbildung 28.10). In der oberen Hälfte wählen Sie in der grafischen Anzeige der ausgewählten Tabelle ihre Spalten, oder Sie setzen ein Häkchen vor den Listeneintrag *(Alle Spalten), um die gesamte Tabelle zu erhalten.
Im zweiten Block des Dialogs können Sie für die ausgewählten Spalten eigene Spaltenbezeichner angeben, die Sortierungsart und Sortierreihenfolge festlegen sowie Auswahlkriterien bestimmen. Das resultierende SQL-Statement sehen Sie im dritten Block von oben.
Um zu testen, ob die erzeugte SQL-Anweisung auch das erwartete Ergebnis liefert, klicken Sie auf die Schaltfläche Abfrage ausführen. Das Ergebnis sehen Sie im untersten Block des Dialogfensters (siehe Abbildung 28.10). Entspricht es Ihren Erwartungen, schließen Sie das Fenster mit OK.
Abbildung 28.10 Abfrage-Generator zum Erstellen einer Abfrage
Nun gelangen Sie wieder zum Dialogfenster aus Abbildung 28.8 zurück. Über die Schaltfläche Erweiterte Optionen erreichen Sie den Dialog aus Abbildung 28.11, in dem Sie den TableAdapter-Konfigurationsassistenten anweisen, Aktualisierungslogik hinzuzufügen.
Abbildung 28.11 Erweiterte Optionen des TableAdapter-Konfigurationsassistenten
Wollen Sie die Daten nur lesen, können Sie die Optionen deaktivieren. Dazu reicht es, die erste Option Insert-, Update- und Delete-Anweisungen generieren abzuwählen, da die beiden anderen Optionen diese erste voraussetzen und automatisch mit deaktiviert werden.
In der WHERE-Klausel der Aktualisierungsbefehle INSERT, UPDATE und DELETE nutzt der Assistent immer die Primärschlüsselspalten der Tabelle. Sollen außerdem alle anderen Spalten verwendet werden, wählen Sie die Option Vollständige Parallelität verwenden.
Die Option Datentabelle aktualisieren ist nur für Datenbanken verfügbar, die Batch-Abfragen unterstützen, wie zum Beispiel der SQL Server. Mit aktivierter Option erzeugt der Assistent Abfragen, um den Inhalt der geänderten Datenzeilen nach Übermittlung der Änderungen sofort wieder abzurufen. Neue Werte, die serverseitig generiert werden, zum Beispiel Autoinkrementwerte von Primärschlüsselspalten, sind sofort nach Aufruf der Update-Methode in der DataRow verfügbar.
Nach Festlegung der erweiterten Optionen haben Sie die SQL-Anweisungen vollständig definiert und legen im nächsten Schritt des Assistenten die für den TableAdapter verfügbaren Methoden fest (siehe Abbildung 28.12). Die Namen können Sie beliebig wählen.
Abbildung 28.12 Methoden des TableAdapters festlegen
Die Methode Fill für die Methode zur Datenbeschaffung entspricht in Namen und Funktionalität der Methode Fill in der Klasse DataAdapter. Bitte beachten Sie, dass GetData bei jedem Aufruf eine neue typrichtige Tabelle erzeugt und mit Daten aus der Datenbank füllt.
Mit der dritten Option werden Methoden erzeugt, um Werte direkt zur Datenbank zu senden, ohne dabei eine DataRow zu erzeugen. Auf diese sogenannten DBDirect-Methoden gehe ich in Abschnitt 28.6.5, »Direkte Aktualisierung der Datenbank« noch einmal ein.
Damit ist der TableAdapter vollständig konfiguriert, und der letzte Dialog in Abbildung 28.13 zeigt die Zusammenfassung der DataTable-Funktionalität. Ein Klick auf Fertig stellen erzeugt den Code.
Abbildung 28.13 Funktionalitäten des neu konfigurierten TableAdapters
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.