Die lokal gehaltenen Daten konnten bisher alle Arten von Daten einer Datenbank aufnehmen. Dies ist zwar flexibel, aber Fehler machen sich erst zur Laufzeit bemerkbar. In diesem Kapitel wird die Typisierung der Daten erzwungen, so dass bereits der Compiler Fehler erkennen kann.
28 Stark typisierte DataSets
In den vorangegangenen Kapiteln haben Sie alles Wesentliche im Zusammenhang mit der Klasse DataSet erfahren. Grundsätzlich wird zwischen zwei Arten von DataSets unterschieden: zwischen den untypisierten und den typisierten DataSets. Bisher haben wir uns mit dem untypisierten DataSet beschäftigt. Nun werde ich Ihnen die typisierte Variante mit ihren Stärken und Schwächen vorstellen. Typisierte DataSets werden automatisch erstellt, unter anderem mit dem Designer von Visual Studio.
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 die DataRow-Objekte definiert. Die Konkretisierung auf eine spezielle Art von Datenbankabfrage führt zu eigenen Datentypen für jede Tabelle und jede Spalte, was ein paar Vorteile hat:
- Der Compiler kann die Konsistenz des Programmcodes durch Typprüfungen prüfen (ProductName in row("ProductName") ist nicht prüfbar, row.ProductName schon).
- Die Syntax zur Adressierung von Tabellen und Spalten wird einfacher (row.ProductName ist einfacher als row("ProductName")).
IntelliSense zeigt alle definierten Tabellen und Spalten an.
Hinweis |
Stark typisierte DataSets basieren auf einem konkreten Ausschnitt eines Datenbankschemas, der am einfachsten durch eine konkrete Datenbankabfrage festgelegt wird. Ein allgemeiner Datentyp »typisiertes DataSet« existiert nicht. |
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.
Hinweis |
Da das typisierte DataSet im Quelltext vorliegt, können Sie dort Anpassungen und Ergänzungen jeglicher Art vornehmen. |
28.1 Erzeugung 

Es bieten sich zwei Wege an, um ein stark typisiertes DataSet zu erzeugen:
- mit dem Designer von Visual Studio
- mit dem Kommandozeilenprogramm XSD.exe
28.1.1 Visual Studio Designer 

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 Namen (siehe Abbildung 28.1).
Abbildung 28.1 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 Data Connactions (siehe Abbildung 28.2). Markieren Sie diesen Knoten, und öffnen Sie über dessen Kontextmenü den Dialog Verbindung hinzufügen. Passen Sie gegebenenfalls die Datenquelle über die Schaltfläche Ändern an, zum Beispiel Microsoft SQL Server (SqlClient).
Geben Sie nun den Servernamen an – für einen Server auf der lokalen Maschine alternativ ein Punkt (.) oder »(local)« (einschließlich der runden Klammern). Wenn Sie die Northwind-Datenbank in einer benannten Instanz von SQL Server installiert haben, beispielsweise SQLExpress, dann geben Sie den Instanzbezeichner von SQL Server getrennt durch ein »\«-Zeichen hinter dem Rechnernamen an, zum Beispiel »(local)\SQLExpress«.
Voreingestellt ist die Authentifizierung mit der Windows-Anmeldung. Für die SQL Server-Anmeldung müssen Sie Benutzername und Kennwort eintragen. Dazu muss der SQL Server diese Art der Anmeldung unterstützen. Wählen Sie zum Schluss noch die gewünschte Datenbank aus, testen Sie die Verbindung über die Schaltfläche Testverbindung, und bestätigen Sie die Einstellungen mit OK. Danach wird die Datenbankverbindung im Server-Explorer angezeigt. Wenn Sie deren Knoten erweitern, werden alle Elemente der Northwind-Datenbank angezeigt (Tabellen, Ansichten, Typen usw.).
Abbildung 28.2 Server-Explorer
Wenn Sie aus dem Server-Explorer eine Tabelle in den Designer des typisierten DataSets ziehen, werden alle Spalten der Tabelle übernommen. Um nur einen Teil der Spalten hinzuzufügen, öffnen wir den Knoten der Tabelle und markieren die gewünschten Spalten – halten Sie dabei die
-Taste gedrückt. Ziehen Sie nun die markierten Spalten in den Designer. Das Resultat sollte dann so aussehen wie in Abbildung 28.3.
Abbildung 28.3 Typisiertes DataSet im Designer
Das war bereits alles. Die Abbildung zeigt, dass der Designer automatisch die Beziehung zwischen den Tabellen hinzufügt.
AlleDateienAnzeigen.tifIm Projektmappen-Explorer sehen Sie die Schemadatei NWDataSet.xsd für das typisierte DataSet. Der Datei sind die drei Dateien NWDataSet.Designer.vb, NWDataSet.xsc und NWDataSet.xss untergeordnet. Sie werden angezeigt, wenn Sie sich alle Dateien im Projektmappen-Explorer anzeigen lassen – klicken Sie dazu auf die Symbolleistenschaltfläche im Projektmappen-Explorer. Mit der vb-Datei werden wir uns noch beschäftigen, die beiden anderen werden vom Designer benötigt.
28.1.2 Das Kommandozeilentool XSD.exe 

Aufwendiger ist der Weg über das Kommandozeilentool xsd.exe, auf dem der Designer aufbaut. Sollte der Designer einmal aus irgend einem Grund unpassend sein, können Sie das Tool direkt verwenden. Dazu brauchen Sie ein nicht typisiertes DataSet, 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 (im Beispiel in das Verzeichnis, in dem die Applikation gespeichert ist).
'...\ADO\DataSetTypisiert\XSDexe.vb |
Option Strict On
Imports System.Data.Common, System.Data.SqlClient
Namespace ADO
Module XSDexe
Sub Test()
Dim conn As DbConnection = New SqlConnection()
conn.ConnectionString = "Data Source=(local);" & _
"Initial Catalog=Northwind;Integrated Security=sspi"
Dim ds As DataSet = New DataSet()
Dim da As DbDataAdapter = New SqlDataAdapter()
Dim cmd As DbCommand = New SqlCommand()
cmd.Connection = conn
cmd.CommandText = "SELECT ProductID, ProductName, " & _
"CategoryID, UnitPrice FROM Products"
da.SelectCommand = cmd
da.FillSchema(ds, SchemaType.Source, "Products")
cmd.CommandText = "SELECT CategoryID, CategoryName From Categories"
da.SelectCommand = cmd
da.FillSchema(ds, SchemaType.Source, "Categories")
Dim colDetail As DataColumn = ds.Tables(0).Columns("CategoryID")
Dim colMaster As DataColumn = ds.Tables(1).Columns("CategoryID")
Dim rel As DataRelation = _
New DataRelation("KategorieProdukte", colMaster, colDetail)
ds.Relations.Add(rel)
Dim dir As String = My.Application.Info.DirectoryPath
Dim file As String = System.IO.Path.Combine(dir, "WriteXmlSchema.xsd")
ds.WriteXmlSchema(file)
Console.WriteLine("Datei {0} geschrieben", file)
Console.ReadLine()
End Sub
End Module
End Namespace
Hinweis |
Wird das Schema mit der zweiparametrigen Variante da.FillSchema(ds, SchemaType.Source) ermittelt, haben die Tabellen die Standardnamen Table und Table1. |
Das Tool xsd.exe finden Sie im Ordner \bin Ihrer Visual Studio-Installation. Mit ihm erzeugen wir die gleiche .vb-Datei, wie sie der Designer erstellt. Über Start • Alle Programme • Microsoft Visual Studio 2008 • Visual Studio Tools • Visual Studio 2008-Eingabeaufforderung öffnen Sie eine Konsole mit angepasstem Suchpfad, sodass Sie nicht den vollen Pfad zu xsd.exe angeben müssen. Darin rufen Sie das Tool auf und übergeben ihm im ersten Parameter die zuvor erzeugte Schemadatei. Dem zweiten Parameter übergeben Sie /dataset, der dritte ist nötig, wenn die generierte Datei in der »falschen« Programmiersprache erzeugt wird.
xsd.exe WriteXmlSchema.xsd /dataset /language:vb
Damit ist eine Klassendatei für das typisierte DataSet erzeugt worden, die Sie nun in andere Projekte einfügen und nutzen können. Sollten Sie in Windows Presentation Framework- oder Windows Workflow-Projekten auf die Daten zugreifen, sorgt die Option /enableDataBinding für eine flexiblere Verwendung. Falls Sie die Formulierung von Abfragen der Daten mit LINQ bevorzugen, sollten Sie die Option /enableLinqDataSet einsetzen. Durch Eingabe von xsd.exe ohne Parameter erhalten Sie eine Liste aller möglichen Optionen. Trotz der vielen Parameter habe ich xsd nicht zur Generierung eines TableAdapters bewegen können.
Hinweis |
Sollten Sie noch mehr Kontrolle über die Generierung benötigen, lohnt ein Blick in die Klassen, auf die sich xsd.exe stützt: System.Xml.Serialization.XmlSchemaImporter und System.Xml.Serialization.XmlCodeExporter. Lassen Sie sich nicht von der mageren Dokumentation abschrecken, die die Klassen als »intern« brandmarkt. Alternativ gibt es andere Schema-Compiler, zum Beispiel http://dingo.sourceforge.net. |
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.