36 Stark typisierte DataSets
In den beiden vorangegangenen Kapiteln haben Sie alles Wesentliche im Zusammenhang mit der Klasse DataSet erfahren. Grundsätzlich wird aber zwischen zwei verschiedenen DataSets unterschieden: dem untypisierten DataSet und dem typisierten DataSet. Das untypisierte DataSet war der Schwerpunkt aller bisherigen Ausführungen. In diesem Kapitel werde ich Ihnen die typisierten DataSets vorstellen und dabei zeigen, welche Stärken und Schwächen diese Gruppe aufweist. Dabei werden wir auch den Designer von Visual Studio verwenden.
Wenn Sie ein typisiertes DataSet erzeugen, werden auch automatisch TableAdapter angelegt. Hierbei handelt es sich um typisierte DataAdapter, über die Sie eine DataTable mit Daten aus der Datenbank füllen und die Aktualisierungen wieder zurückschreiben können.
36.1 Ein stark typisiertes DataSet erzeugen

Lassen Sie uns zunächst einmal ganz allgemein formulieren, was ein typisiertes DataSet ist. Ein stark typisiertes DataSet ist eine Klassendefinition, die von der Klasse DataSet abgeleitet ist. Es enthält Eigenschaften und Methoden, die auf der Struktur der Datenbankabfrage basieren. Darüber hinaus sind in einem typisierten DataSet Klassen für die DataTable- und DataRow-Objekte definiert.
Es bieten sich zwei Wege an, um ein stark typisiertes DataSet zu erzeugen:
- Sie benutzen den Designer von Visual Studio.
- Sie verwenden das Befehlszeilendienstprogramm XSD.exe.
Der einfachere Weg ist natürlich der über den Designer, den ich Ihnen auch als ersten vorstellen möchte.
36.1.1 Typisierte DataSets mit dem Visual Studio Designer erstellen

An einem Beispiel möchte ich Ihnen zeigen, wie Sie auf einfache Weise ein typisiertes DataSet erzeugen. Das typisierte DataSet soll die beiden Tabellen Products und Categories beschreiben. Aus der Tabelle Products interessieren uns dabei die Spalten ProductID, CategoryID, ProductName und UnitPrice, aus Categories die Spalten CategoryID und CategoryName.
Nachdem Sie ein neues Projekt angelegt haben, fügen Sie über den Projektmappen-Explorer ein neues Element hinzu. Markieren Sie dazu den Knoten des Projekts im Projektmappen-Explorer, öffnen Sie dessen Kontextmenü, und wählen Sie Neues Element hinzufügen. Im sich öffnenden Dialogfenster wählen Sie die Vorlage DataSet aus und geben dem Element einen passenden Namen. Ich habe mich hier für NWDataSet.xsd entschieden (siehe Abbildung 36.1).
Abbildung 36.1 Dem Projekt ein typisiertes DataSet hinzufügen
Im Designer wird nun ein leeres Fenster angezeigt, dem die gewünschten Tabellen hinzugefügt werden müssen. Dazu setzen wir den Server-Explorer ein, dem wir die benötigte Datenbankverbindung zuvor noch hinzufügen müssen. Sollten Sie das Fenster des Server-Explorers nicht sehen, können Sie es über das Menü Ansicht öffnen.
Ganz oben im Server-Explorer sehen Sie den Knoten Datenverbindungen. Markieren Sie diesen Knoten, und wählen Sie in dessen Kontextmenü den Eintrag Verbindung hinzufügen. Es wird daraufhin der gleichnamige Dialog angezeigt. Achten Sie darauf, dass im Feld Datenquelle »Microsoft SQL Server (SqlClient)« eingetragen ist. Wenn das nicht der Fall ist, können Sie über die Schaltfläche Ändern die Datenquelle wechseln.
Geben Sie nun den Servernamen an. Sollte sich der Datenbankserver auf der lokalen Maschine befinden, reicht die Angabe eines Punktes (.). Gleichwertig können Sie auch »(local)« eintragen, einschließlich der runden Klammern. Vielleicht haben Sie auch die Northwind-Datenbank in einer benannten Instanz von SQL Server installiert, beispielsweise SQLExpress. Geben Sie dann den Instanzbezeichner von SQL Server getrennt durch ein »\«-Zeichen hinter dem Rechnernamen an, z. B. »(local)\SQLExpress«.
Als Authentifizierungsinformation wird per Vorgabe die Windows-Anmeldung vorselektiert. Wollen Sie die SQL Server-Anmeldung verwenden, müssen Sie auch Benutzernamen und Kennwort eintragen. Diese Option führt natürlich auch nur dann zum Erfolg, wenn der SQL Server die SQL Server-Authentifizierung unterstützt. Wählen Sie zum Schluss noch die gewünschte Datenbank aus, und testen Sie die Verbindung über die Schaltfläche Testverbindung. Danach können Sie die Einstellungen mit OK bestätigen.
Wenn Sie alles richtig gemacht haben, wird die Datenbankverbindung nun im Server-Explorer angezeigt. Erweitern Sie deren Knoten, werden alle Elemente der Northwind-Datenbank angezeigt (Tabellen, Ansichten, Typen usw.).
Abbildung 36.2 Der Server-Explorer
Aus dem Server-Explorer heraus können Sie eine markierte Tabelle in den Designer des
typisierten DataSets ziehen. Dann wären alle Spalten der Tabelle Elemente des typisierten DataSets. Da wir uns vorgenommen haben, nur bestimmte Spalten hinzuzufügen, öffnen wir den
Knoten der entsprechenden Tabelle und markieren nur die gewünschten Spalten. Halten
Sie dabei die -Taste gedrückt. Ziehen Sie nun die markierten Spalten in den Designer. Haben Sie
die ausgewählten Spalten der ersten Tabelle (z. B. Products) in den Designer gezogen, markieren Sie die erforderlichen Spalten der Tabelle Categories im Server-Explorer und ziehen diese ebenfalls in den Designer. Das Resultat sollte
dann so aussehen wie in Abbildung 36.3.
Abbildung 36.3 Das typisierte DataSet im Designer
Das war bereits alles. Wie Sie in der Abbildung sehen können, erkennt der Designer, dass zwischen den beiden Tabellen Categories und Products eine Beziehung existiert, und fügt diese auch automatisch hinzu.
Sie sollten jetzt noch einen Blick in den Projektmappen-Explorer wagen. Die Schemadatei für das typisierte DataSet ist hier als NWDataSet.xsd eingetragen. Wenn Sie sich alle Dateien im Projektmappen-Explorer anzeigen lassen (klicken Sie dazu auf die entsprechende Symbolleistenschaltfläche im Projektmappen-Explorer), erkennen Sie, dass der XSD-Datei drei Dateien untergeordnet sind: NWDataSet.Designer.cs, NWDataSet.xsc und NWDataSet.xss. Die beiden letzteren interessieren uns nicht, denn hierbei handelt es sich nur um Dateien, die den Designer unterstützen. Die CS-Datei werden wir aber gleich noch genauer unter die Lupe nehmen.
36.1.2 Das Kommandozeilentool XSD.exe
Aufwendiger ist der Weg über das Kommandozeilentool xsd.exe. Obwohl Sie vermutlich nur selten darauf zurückgreifen werden, möchte ich es Ihnen an dieser Stelle kurz vorstellen. Intern wird es natürlich auch vom Designer benutzt, den Sie im letzten Abschnitt kennengelernt haben. Um ein typisiertes DataSet mit dem Tool zu erzeugen, müssen wir zuerst ein nicht typisiertes DataSet bereitstellen, in dem alle Schemainformationen enthalten sind. Damit auch die DataRelation zwischen den Tabellen Products und Categories richtig erkannt wird, müssen wir die Beziehung mittels Code beschreiben. Alle anderen Metadaten besorgen wir uns über die Methode FillSchema. Zum Schluss rufen wir die Methode WriteXmlSchema des DataSets auf und schreiben die Schemainformationen in eine XSD-Datei.
SqlConnection con = new SqlConnection();
con.ConnectionString = "...";
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandText = "SELECT ... FROM Products; " +
"SELECT ... FROM Categories";
DataSet ds = new DataSet();
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.FillSchema(ds, SchemaType.Source);
DataColumn colDetail = ds.Tables[0].Columns["CategoryID"];
DataColumn colMaster = ds.Tables[1].Columns["CategoryID"];
DataRelation rel = new DataRelation("KategorieProdukte",
colMaster, colDetail);
ds.Relations.Add(rel);
ds.WriteXmlSchema(@"D:\DataSetSchema.xsd");
Listing 36.1 Schemainformationen in eine Schemadatei schreiben
Nun wollen wir das Tool xsd.exe dazu benutzen, um aus der Schemadatei eine Datei zu generieren, die das typisierte DataSet enthält. Es wird sich dabei um eine Datei mit der Dateierweiterung .cs handeln.
Rufen Sie das Tool an der Kommandozeile auf, und übergeben Sie ihm im ersten Parameter die zuvor erzeugte Schemadatei. Dem zweiten Parameter übergeben Sie »/dataset«, also:
xsd.exe DataSetSchema.xsd /dataset
Damit ist eine Klassendatei für das typisierte DataSet erzeugt worden, die Sie nun in andere Projekte einfügen und nutzen können.
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.