# 28 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. ## 28.1 Stark typisierte DataSets 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. ### 28.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 28.1). Hier klicken, um das Bild zu vergrößern Abbildung 28.1 So fügen Sie dem Projekt ein typisiertes »DataSet« hinzu. 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 nicht, 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 SQL Express. Geben Sie dann den Instanzbezeichner von SQL Server, getrennt durch ein \-Zeichen, hinter dem Rechnernamen an, z. B. so:
    (local)\SQLExpress
Als Authentifizierungsinformationen wird per Vorgabe die Windows-Anmeldung vorselektiert. Wollen Sie die SQL Server-Anmeldung verwenden, müssen Sie auch Benutzername 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.). Hier klicken, um das Bild zu vergrößern Abbildung 28.2 Der Server-Explorer Aus dem Server-Explorer heraus können Sie eine markierte Tabelle in den Designer des typisierten DataSet ziehen. Dann wären alle Spalten der Tabelle Elemente des typisierten DataSet. 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 28.3. Hier klicken, um das Bild zu vergrößern Abbildung 28.3 Typisiertes 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 Schema-Datei 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. ### 28.1.2 Das Kommandozeilentool »XSD.exe« Aufwendiger ist der Weg über das Kommandozeilentool xsd.exe. Obwohl Sie vermutlich nur in seltenen Fällen darauf zurückgreifen werden, möchte ich an dieser Stelle kurz darauf eingehen. 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 Schema-Informationen 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 DataSet auf und schreiben die Schema-Informationen 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");
Nun wollen wir das Tool xsd.exe dazu benutzen, um aus der Schema-Datei 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 Schema-Datei. Dem zweiten Parameter übergeben Sie /dataset, also:
    xsd.exe DataSetSchema.xsd /dataset