Die Verbindung zwischen den lokal gespeicherten Daten und der Datenbank stellt der DataAdapter her. Dieses Kapitel beschreibt, wie Sie Daten auslesen und Tabellen benennen.
25 DataAdapter
Im letzten Kapitel haben Sie erfahren, wie Sie ein SQL-Kommando gegen eine Datenbank absetzen. Sie wissen, dass mit der Methode ExecuteNonQuery des Command-Objekts eine Aktionsabfrage ausgeführt werden kann und dass von ExecuteReader ein DataReader-Objekt zurückgeliefert wird, in dem wir eine Datenzeile nach der anderen durchlaufen können. Für ganz einfache Anforderungen mag das durchaus genügen, bei objektiver Betrachtung aber werden damit die Bedürfnisse der täglichen Praxis völlig unzureichend abgedeckt.
Was ist, wenn wir es dem Anwender ermöglichen wollen, beliebig zwischen den einzelnen Datensätzen zu navigieren? Wie kann ein Anwender die eingelesenen Datensätze aktualisieren? Wie kann seitens der Anwendung sichergestellt werden, dass bei der Aktualisierung Einschränkungen (constraints) berücksichtigt werden?
Grundsätzlich ließen sich diese und viele weitere Aufgaben mit dem Gespann Command- und DataReader-Objekt erledigen. Aber denken wir einen Schritt weiter. Beide Objekte sind von einer geöffneten Verbindung zur Datenbank abhängig. Wollen wir es einem Anwender ermöglichen, durch die Datensätze zu navigieren, müssen wir die Verbindung zur Datenquelle über einen längeren Zeitraum geöffnet halten.
Eine Verbindung länger als unbedingt notwendig geöffnet zu halten, ist aus vielerlei Hinsicht nicht akzeptabel. Stellen Sie sich nur eine Datenbank im Internet vor. Eine geöffnete Verbindung kostet Geld, und die Netzwerkressourcen werden belastet. Zudem ist die Anzahl der gleichzeitigen Zugriffe auf eine Datenbank begrenzt. Ein DataAdapter vermeidet diese Probleme.
Hinweis |
Wenn möglich werden die Db- statt der Sql-Typen verwendet. Alle Aussagen, die sich im Folgenden auf die Db-Typen beziehen, gelten auch für die analogen Sql-Typen. |
25.1 Was ist ein DataAdapter? 

Eine gute Lösung sollte alle Datensätze einlesen und im lokalen Speicher ablegen. Wir brauchen diesen Ansatz jedoch nicht selbst zu programmieren, ADO.NET stellt mit der (abstrakten) Klasse DbDataAdapter ein Bindeglied zwischen der Datenquelle und dem lokalen Speicher zur Verfügung. Es kann Daten aus einer Datenquelle abfragen und in einer oder mehreren Tabellen im lokalen Speicher halten. Darüber hinaus kann ein DataAdapter-Objekt auch lokale Änderungen an den Tabellen an die Datenquelle übermitteln. Um die Netzwerk- und Datenbankbelastung so gering wie möglich zu halten, baut das DataAdapter-Objekt nur dann eine Verbindung zur Datenbank auf, wenn dies notwendig ist. Sind alle Operationen beendet, wird die Verbindung wieder geschlossen.
Im Zusammenhang mit einem DataAdapter spielen auch Connection- und Command-Objekte eine wichtige Rolle. Alle drei sind provider-spezifisch (zum Beispiel SqlDataAdapter, SqlConnection und SqlCommand) und werden zu den verbundenen Typen des ADO.NET-Objektmodells gezählt. Die Datentypen, die die Daten im lokalen Speicher automatisch verwalten und organisieren, werden zu den unverbundenen Typen des ADO.NET-Objektmodells gerechnet. Ein DataAdapter kann daher als Bindeglied zwischen den verbundenen und den unverbundenen Objekten angesehen werden.
Ein DataAdapter spielt in zwei Szenarien eine wichtige Rolle:
- beim Füllen eines DataSets oder einer DataTable
- beim Aktualisieren des geänderten Inhalts von DataSet bzw. DataTable
In diesem Kapitel werden wir uns ausschließlich mit dem Abrufen von Dateninformationen und dem sich daran anschließenden Füllen der lokalen Objekte beschäftigen. Das »andere Gesicht« des DataAdapters sehen wir uns nach dem Studium von DataSet an.
25.1.1 Ein Programmbeispiel 

Ehe wir uns mit dem DataAdapter genauer beschäftigen, möchte ich Ihnen ein Beispiel zeigen, das mithilfe eines DataAdapters den lokalen Speicher mit den Spalten ProductName und UnitPrice aller Datensätze der Tabelle Products füllt. Die lokale Datensatzliste wird anschließend in einer Schleife an der Konsole ausgegeben. Auf die genaue Erklärung des Codes soll hier noch verzichtet werden. Auffällig ist, dass Open und Close fehlen.
'...\ADO\DataAdapter\Beispiel.vb |
Option Strict On
Imports System.Data.Common, System.Data.SqlClient
Namespace ADO
Module Beispiel
Sub Test()
Dim con As DbConnection = New SqlConnection()
con.ConnectionString = "Data Source=(local);" & _
"Initial Catalog=Northwind;Integrated Security=sspi"
Dim cmd As DbCommand = New SqlCommand()
cmd.CommandText = "SELECT ProductName, UnitPrice FROM products"
cmd.Connection = con
Dim da As DbDataAdapter = New SqlDataAdapter()
da.SelectCommand = cmd
Dim tbl As New DataTable() ' lokaler Speicher
da.Fill(tbl)
For Each row As DataRow In tbl.Rows
Console.WriteLine("{0,-35} {1} ", row(0), row(1))
Next
Console.ReadLine()
End Sub
End Module
End Namespace
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.