Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
Vorwort zur 6. Auflage
1 Allgemeine Einführung in .NET
2 Grundlagen der Sprache C#
3 Das Klassendesign
4 Vererbung, Polymorphie und Interfaces
5 Delegates und Ereignisse
6 Strukturen und Enumerationen
7 Fehlerbehandlung und Debugging
8 Auflistungsklassen (Collections)
9 Generics – Generische Datentypen
10 Weitere C#-Sprachfeatures
11 LINQ
12 Arbeiten mit Dateien und Streams
13 Binäre Serialisierung
14 XML
15 Multithreading und die Task Parallel Library (TPL)
16 Einige wichtige .NET-Klassen
17 Projektmanagement und Visual Studio 2012
18 Einführung in die WPF und XAML
19 WPF-Layout-Container
20 Fenster in der WPF
21 WPF-Steuerelemente
22 Elementbindungen
23 Konzepte von WPF
24 Datenbindung
25 Weitere Möglichkeiten der Datenbindung
26 Dependency Properties
27 Ereignisse in der WPF
28 WPF-Commands
29 Benutzerdefinierte Controls
30 2D-Grafik
31 ADO.NET – Verbindungsorientierte Objekte
32 ADO.NET – Das Command-Objekt
33 ADO.NET – Der SqlDataAdapter
34 ADO.NET – Daten im lokalen Speicher
35 ADO.NET – Aktualisieren der Datenbank
36 Stark typisierte DataSets
37 Einführung in das ADO.NET Entity Framework
38 Datenabfragen des Entity Data Models (EDM)
39 Entitätsaktualisierung und Zustandsverwaltung
40 Konflikte behandeln
41 Plain Old CLR Objects (POCOs)
Stichwort

Download:
- Beispiele, ca. 62,4 MB

Jetzt Buch bestellen
Ihre Meinung?

Spacer
Visual C# 2012 von Andreas Kühnel
Das umfassende Handbuch
Buch: Visual C# 2012

Visual C# 2012
Rheinwerk Computing
1402 S., 6., aktualisierte und erweiterte Auflage 2013, geb., mit DVD
49,90 Euro, ISBN 978-3-8362-1997-6
Pfeil 33 ADO.NET – Der SqlDataAdapter
Pfeil 33.1 Was ist ein DataAdapter?
Pfeil 33.2 Die Konstruktoren der Klasse DataAdapter
Pfeil 33.3 Arbeiten mit dem SqlDataAdapter
Pfeil 33.3.1 Die Eigenschaft »SelectCommand«
Pfeil 33.3.2 Den lokalen Datenspeicher mit »Fill« füllen
Pfeil 33.3.3 Öffnen und Schließen von Verbindungen
Pfeil 33.3.4 Doppelter Aufruf der Fill-Methode
Pfeil 33.3.5 Mehrere DataAdapter-Objekte aufrufen
Pfeil 33.3.6 Die Spalten- und der Tabellenbezeichner einer DataTable
Pfeil 33.3.7 Paging mit der Fill-Methode
Pfeil 33.4 Tabellenzuordnung mit der Klasse »TableMappings«
Pfeil 33.4.1 Spaltenzuordnungen in einem DataSet
Pfeil 33.4.2 Spaltenzuordnungen einer DataTable
Pfeil 33.4.3 Die Eigenschaft »MissingMappingAction« des DataAdapters
Pfeil 33.5 Das Ereignis »FillError« des SqlDataAdapters

Rheinwerk Computing - Zum Seitenanfang

33.4 Tabellenzuordnung mit der Klasse »TableMappings«Zur nächsten Überschrift

Um ein DataSet mit mehreren Tabellen zu füllen, können Sie eine Batchabfrage absetzen:

string strSQL = "SELECT * FROM Products;" +
"SELECT * FROM Suppliers;" +
"SELECT * FROM Categories";
SqlDataAdapter da = new SqlDataAdapter(strSQL, con);
DataSet ds = new DataSet();
da.Fill(ds);

Listing 33.6 Absetzen einer Batchabfrage

Das DataSet beherbergt nun drei Tabellen. In jeder sind alle Datensätze der entsprechenden Originaltabellen Products, Suppliers und Categories enthalten. Allerdings stehen wir vor der Frage: Wie können wir eine bestimmte Tabelle im DataSet ansprechen, wenn darin mehrere Tabellen enthalten sind?

Ein DataSet verwaltet alle in ihm enthaltenen Tabellen in einer Auflistung vom Typ DataTableCollection. Die Referenz auf diese Auflistung liefert die Eigenschaft Tables des DataSet-Objekts.

Jetzt sollte man auch noch wissen, dass ein DataTable-Objekt seinen Tabellennamen über die Eigenschaft TableName preisgibt. Mit diesen Kenntnissen können wir jetzt die Namen der Tabellen im DataSet abfragen:

foreach(DataTable table in ds.Tables)
Console.WriteLine(table.TableName);

Die Ausgabe wird nicht – wie vielleicht zu vermuten wäre – Products, Suppliers und Categories lauten, sondern, wie schon vorher behauptet,

Table
Table1
Table2

Die Zuordnung von Table zu Products, Table1 zu Suppliers und Table2 zu Categories ist aber in den meisten Fällen nicht wünschenswert. Besser geeignet wären sprechende Bezeichner, die zudem zur Verbesserung der Lesbarkeit des Codes beitragen. Der SqlDataAdapter bietet daher einen Mechanismus, um den Tabellen im Abfrageergebnis einen anderen Namen zuzuordnen: die Eigenschaft TableMappings, die die Referenz auf ein DataTableMappingCollection-Objekt liefert.

public DataTableMappingCollection TableMappings{get;}

In der Auflistung DataTableMappingCollection werden Objekte vom Typ DataTableMapping verwaltet. Jedes dieser Objekte ordnet einer Tabelle im DataSet einen Tabellennamen zu.

Am einfachsten ist es, mit der Add-Methode die Auflistung zu füllen. Dazu wird dem ersten Parameter die Zeichenfolge übergeben, unter der die Tabelle per Vorgabe in das DataSet gefüllt wird. Dem zweiten Parameter teilt man den gewünschten Tabellennamen mit.

public DataTableMapping Add(string, string)

Das folgende Codefragment zeigt, wie Sie die DataTableMappingCollection des DataAdapter-Objekts füllen können. Dabei wird davon ausgegangen, dass die oben angeführte Batchabfrage abgesetzt wird. Die Zuordnung muss vor dem Füllen des DataSets mit Fill erfolgen, ansonsten bleibt sie wirkungslos.

da.TableMappings.Add("Table", "Artikel");
da.TableMappings.Add("Table1", "Lieferanten");
da.TableMappings.Add("Table2", "Kategorien");
DataSet ds = new DataSet();
da.Fill(ds);
[...]

Listing 33.7 Beschreiben von TableMappings

Add ruft implizit den DataTableMapping-Konstruktor auf. Sie können das natürlich auch selbst in die Hand nehmen, müssen dann aber jeder Tabelle über die Eigenschaft SourceTable sagen, welchen Standardnamen sie im DataSet hat, und über DataSetTable, welcher Bezeichner der Tabelle neu zugeordnet werden soll. Das folgende Beispiel zeigt, wie der Code dazu aussieht.

DataTableMapping dtm1 = new DataTableMapping();
dtm1.SourceTable = "Table";
dtm1.DataSetTable = "Artikel";
da.TableMappings.Add((object)dtm1);
DataTableMapping dtm2 = new DataTableMapping();
dtm2.SourceTable = "Table1";
dtm2.DataSetTable = "Lieferanten";
da.TableMappings.Add((object)dtm2);
DataTableMapping dtm3 = new DataTableMapping();
dtm3.SourceTable = "Table2";
dtm3.DataSetTable = "Kategorien";
da.TableMappings.Add((object)dtm3);
DataSet ds = new DataSet();
da.Fill(ds);
[...]

Listing 33.8 Komplexes TableMapping

Die Klasse DataTableMapping gehört zum Namespace System.Data.Common, der vorher mit using bekannt gegeben werden sollte. Sie erkennen, dass diese Art der Zuordnung mehr Programmieraufwand bedeutet.


Rheinwerk Computing - Zum Seitenanfang

33.4.1 Spaltenzuordnungen in einem DataSetZur nächsten ÜberschriftZur vorigen Überschrift

Jeder Spalte der SELECT-Abfrage wird eine Spalte in der DataTable zugeordnet. Als Spaltenbezeichner verwendet ADO.NET dabei den Spaltennamen der Originaltabelle in der Datenbank. Fragen Sie die Datenquelle mit

SELECT ProductName, UnitPrice FROM Products

ab, lauten die Spalten in der DataTable ebenfalls ProductName und UnitPrice. Wünschen Sie andere Spaltenbezeichner, können Sie im SELECT-Statement für die einzelnen Spalten ein Alias angeben, z. B.:

SELECT ProductName AS Artikelname, UnitPrice As Einzelpreis FROM Products

Nun würden in der DataTable die Spaltenbezeichner Artikelname und Einzelpreis lauten.

Sie können aber auch alternativ einen anderen Mechanismus einsetzen. Ein DataTableMapping-Objekt hat eine eigene Auflistung, mit der den obligatorischen Spaltenbezeichnern neue zugeordnet werden können. Diese Auflistung ist vom Typ DataColumnMappingCollection und enthält DataColumnMapping-Objekte. Jedes DataColumnMapping-Objekt beschreibt für sich eine Neuzuordnung eines Spaltenbezeichners in einer DataTable. Die vielleicht ein wenig komplex anmutenden Zusammenhänge zwischen DataAdapter, DataTableMapping und DataColumnMapping sind in Abbildung 33.1 anschaulich dargestellt.

Abbildung

Abbildung 33.1 Die Hierarchie der Zuordnungsklassen

Die Referenz auf die DataColumnMappingCollection stellt die Eigenschaft ColumnMappings der Klasse DataTableMapping bereit:

public DataColumnMappingCollection ColumnMappings {get;}

Um eine Neuzuordnung festzulegen, bietet sich auch hier der Weg über die Add-Methode des DataColumnMappingCollection-Objekts an.

public DataColumnMapping Add(string, string);

Analog zur Add-Methode der DataTableMappingCollection wird dem ersten Parameter der ursprüngliche Spaltenbezeichner und dem zweiten Parameter der gewünschte übergeben.

Das folgende Codefragment zeigt den kompletten Code, der notwendig ist, um neben dem Tabellennamen auch die Spaltenbezeichner einer Abfrage neu festzulegen. Zum Schluss werden die Spaltenneuzuordnungen zur Bestätigung an der Konsole ausgegeben. Der Code im Schleifenkopf zur Ausgabe der Spaltenbezeichner dürfte ohne weitere Erläuterungen verständlich sein.

string strCon = @"...";
SqlConnection con = new SqlConnection(strCon);
string strSQL = "SELECT ProductName, UnitPrice FROM Products";
SqlDataAdapter da = new SqlDataAdapter(strSQL, con);
// Neuzuordnung des Tabellennamens
DataTableMapping dtm = da.TableMappings.Add("Table", "Autoren");
// Neuzuordnung der Tabellenbezeichner
dtm.ColumnMappings.Add("ProductName", "Artikelname");
dtm.ColumnMappings.Add("UnitPrice", "Einzelpreis");
DataSet ds = new DataSet();
da.Fill(ds);
// Konsolenausgabe der Spaltenbezeichner
foreach(DataColumn column in ds.Tables[0].Columns)
Console.WriteLine(column.ColumnName);

Listing 33.9 Tabellen- und Spaltenbezeichner mappen


Rheinwerk Computing - Zum Seitenanfang

33.4.2 Spaltenzuordnungen einer DataTableZur nächsten ÜberschriftZur vorigen Überschrift

Übergeben Sie der Fill-Methode anstelle eines DataSet-Objekts ein DataTable-Objekt, müssen Sie ein wenig anders vorgehen, um die Spalten mit eigenen Bezeichnern im lokalen Datenspeicher anzusprechen. Dazu erzeugen Sie wieder ein DataTableMapping-Objekt, dem Sie die gewünschten Spaltenbezeichner zuordnen. Bei der Instanziierung von DataTable rufen Sie allerdings den parametrisierten Konstruktor auf, dem der im DataTableMappping zugeordnete Tabellenname übergeben wird.

[...]
DataTableMapping dtm = da.TableMappings.Add("Table", "Products");
// Neuzuordnung der Spaltenbezeichner
dtm.ColumnMappings.Add("ProductName", "Artikelname");
dtm.ColumnMappings.Add("UnitPrice", "Einzelpreis");
DataTable tbl = new DataTable("Artikel");
da.Fill(tbl);
[...]

Listing 33.10 Spaltenzuordnungen festlegen


Rheinwerk Computing - Zum Seitenanfang

33.4.3 Die Eigenschaft »MissingMappingAction« des DataAdaptersZur vorigen Überschrift

Die Neuzuordnung der Tabellen- und Spaltenbezeichner ist eine Option, die vor dem Aufruf der Methode Fill wahrgenommen werden kann. Der DataAdapter prüft vor dem Füllen des DataSets, ob die Zuordnungsauflistungen gefüllt sind. Dabei interessiert er sich besonders für die Spaltenzuordnungen.

Für jede Spalte des Abfrageergebnisses überprüft der DataAdapter, ob dafür eine Zuordnung in der DataColumnMappingCollection angegeben ist. Existiert eine solche nicht, überprüft er im nächsten Schritt seine MissingMappingAction-Eigenschaft. Hier findet er die Antwort darauf, wie er mit einer fehlenden Spaltenangabe umzugehen hat. Wie Sie bisher erfahren haben, werden Spalten, die nicht im DataColumnMapping-Objekt angegeben sind, mit dem Namen, den sie in der Originaltabelle haben, in die entsprechende DataTable eingetragen. Der DataAdapter kann aber auch angewiesen werden, alle Spalten, die nicht in der Zuordnungstabelle enthalten sind, zu ignorieren. Eine dritte Möglichkeit wäre es, eine Ausnahme auszulösen, wenn keine Zuordnung angegeben ist.

MissingMappingAction ist vom Typ der gleichnamigen Enumeration MissingMappingAction. Die drei Member der Enumeration lauten Error, Ignore und Passthrough. Letztere ist die Standardeinstellung.

Tabelle 33.1 Mitglieder der Enumeration »MissingMappingAction«

Member Beschreibung

Error

Fehlt eine Spaltenzuordnung, wird eine Ausnahme ausgelöst.

Ignore

Fehlt eine Spaltenzuordnung, wird die Spalte in der DataTable ignoriert.

Passthrough

Fehlt eine Spaltenzuordnung, wird die Spalte unter ihrem ursprünglichen Namen der DataTable hinzugefügt.



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.

<< zurück
  Zum Rheinwerk-Shop
Zum Rheinwerk-Shop: Visual C# 2012

Visual C# 2012
Jetzt Buch bestellen


 Ihre Meinung?
Wie hat Ihnen das Openbook gefallen?
Ihre Meinung

 Buchempfehlungen
Zum Rheinwerk-Shop: Professionell entwickeln mit Visual C# 2012






 Professionell
 entwickeln mit
 Visual C# 2012


Zum Rheinwerk-Shop: Windows Presentation Foundation






 Windows Presentation
 Foundation


Zum Rheinwerk-Shop: Schrödinger programmiert C++






 Schrödinger
 programmiert C++


Zum Rheinwerk-Shop: C++ Handbuch






 C++ Handbuch


Zum Rheinwerk-Shop: C/C++






 C/C++


 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und der Schweiz
InfoInfo





Copyright © Rheinwerk Verlag GmbH 2013
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das Openbook denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt.
Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de

Cookie-Einstellungen ändern