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

Inhaltsverzeichnis
Vorwort zur 5. Auflage
1 Allgemeine Einführung in .NET
2 Grundlagen der Sprache C#
3 Klassendesign
4 Vererbung, Polymorphie und Interfaces
5 Delegates und Ereignisse
6 Weitere .NET-Datentypen
7 Weitere Möglichkeiten von C#
8 Auflistungsklassen (Collections)
9 Fehlerbehandlung und Debugging
10 LINQ to Objects
11 Multithreading und die Task Parallel Library (TPL)
12 Arbeiten mit Dateien und Streams
13 Binäre Serialisierung
14 Einige wichtige .NET-Klassen
15 Projektmanagement und Visual Studio 2010
16 XML
17 WPF – Die Grundlagen
18 WPF-Containerelemente
19 WPF-Steuerelemente
20 Konzepte der WPF
21 Datenbindung
22 2D-Grafik
23 ADO.NET – verbindungsorientierte Objekte
24 ADO.NET – Das Command-Objekt
25 ADO.NET – Der SqlDataAdapter
26 ADO.NET – Daten im lokalen Speicher
27 ADO.NET – Aktualisieren der Datenbank
28 Stark typisierte DataSets
29 LINQ to SQL
30 Weitergabe von Anwendungen
Stichwort

Buch bestellen
Ihre Meinung?

Spacer
<< zurück
Visual C# 2010 von Andreas Kühnel
Das umfassende Handbuch
Buch: Visual C# 2010

Visual C# 2010
geb., mit DVD
1295 S., 49,90 Euro
Rheinwerk Computing
ISBN 978-3-8362-1552-7
Pfeil 26 ADO.NET – Daten im lokalen Speicher
Pfeil 26.1 »DataSet«-Objekte verwenden
Pfeil 26.1.1 »DataSet«-Objekte erzeugen
Pfeil 26.1.2 Anatomie einer »DataTable«
Pfeil 26.1.3 Zugriff auf eine Tabelle im »DataSet«
Pfeil 26.1.4 Zugriff auf die Ergebnisliste
Pfeil 26.1.5 Dateninformationen in eine XML-Datei schreiben
Pfeil 26.2 Gültigkeitsprüfung im »DataSet«
Pfeil 26.2.1 Dem »DataSet« Schema-Informationen übergeben
Pfeil 26.2.2 Eigenschaften einer »DataColumn«, die zur Gültigkeitsprüfung dienen
Pfeil 26.2.3 Die »Constraints«-Klassen einer »DataTable«
Pfeil 26.2.4 Schema mit Programmcode erzeugen
Pfeil 26.2.5 Schema-Informationen mit »SqlDataAdapter« abrufen
Pfeil 26.3 Änderungen in einer DataTable vornehmen
Pfeil 26.3.1 Editieren einer DataRow
Pfeil 26.3.2 Datenzeile löschen
Pfeil 26.3.3 Neue Datenzeile hinzufügen
Pfeil 26.3.4 Der Sonderfall: Autoinkrementspalten
Pfeil 26.3.5 Was passiert bei der Änderung einer Datenzeile?
Pfeil 26.3.6 Manuelles Steuern der Eigenschaft »DataRowState«
Pfeil 26.4 Mit mehreren Tabellen arbeiten
Pfeil 26.4.1 Der Weg über JOIN-Abfragen
Pfeil 26.4.2 Mehrere Tabellen in einem »DataSet«
Pfeil 26.4.3 Eine »DataRelation« erzeugen
Pfeil 26.4.4 »DataRelation« und Einschränkungen
Pfeil 26.4.5 In Beziehung stehende Daten suchen
Pfeil 26.4.6 Ergänzung zum Speichern von Schema-Informationen in einer XML-Schema-Datei
Pfeil 26.5 Filtern und Suchen in einer DataTable
Pfeil 26.5.1 Die Methode »Find«
Pfeil 26.5.2 Die Methode »Select«
Pfeil 26.6 Objekte vom Typ »DataView«
Pfeil 26.6.1 »DataView« erzeugen
Pfeil 26.6.2 Auf die Datenzeilen in einer »DataView« zugreifen
Pfeil 26.6.3 Die Eigenschaft »Sort« und die Methode »Find«
Pfeil 26.6.4 Die Methode »FindRows«
Pfeil 26.6.5 Die Eigenschaft »RowFilter«
Pfeil 26.6.6 Die Eigenschaft »RowStateFilter«
Pfeil 26.6.7 Änderungen an einem »DataView«-Objekt
Pfeil 26.6.8 Aus einer »DataView« eine »DataTable« erzeugen


Galileo Computing - Zum Seitenanfang

26.6 Objekte vom Typ »DataView« Zur nächsten ÜberschriftZur vorigen Überschrift

Wenn Sie die Select-Methode der DataTable benutzen, sollten Sie sich über zwei Nachteile im Klaren sein:

  • Sie arbeitet nicht effizient mit den Daten.
  • Der Rückgabewert ist immer ein DataRow-Array, das von WinForms und Webformularen nicht unterstützt wird.

Diese Nachteile hat ein DataView-Objekt nicht. DataViews repräsentieren eine einfache Möglichkeit, verschiedene Sichten auf einen Datenbestand anzubieten – ähnlich den Views einer Datenbank. Ausgangsbasis für eine DataView ist jedoch kein SQL, sondern eine DataTable. So könnte man zum Beispiel eine DataTable mit den Bestellungen eines Kunden füllen und eine DataView erzeugen, die nur die Bestellungen anzeigt, die noch offen sind. Eine weitere DataView könnte gleichzeitig alle Bestellungen darstellen, die schon abgeschlossen sind.

Im Gegensatz zur Select-Methode können mehrere Sichten gleichzeitig angezeigt werden, ohne eine Kopie der Daten erstellen zu müssen. Außerdem werden DataView-Objekte automatisch aktualisiert, sobald sich die Daten in der DataTable ändern. Zudem bietet eine DataView eine bessere Unterstützung für das Filtern von Daten als das DataTable-Objekt.

Ein DataView-Objekt verwaltet keine eigene Kopie der Daten. Stattdessen greift eine DataView auf Daten zurück, die in einer DataTable gespeichert sind. Daten, die in zwei verschiedenen Tabellen gespeichert sind, lassen sich mit einer DataView nicht verknüpfen. Mit anderen Worten: Eine DataView kann nur auf eine DataTable zugreifen.


Galileo Computing - Zum Seitenanfang

26.6.1 »DataView« erzeugen Zur nächsten ÜberschriftZur vorigen Überschrift

Die Klasse DataView definiert drei Konstruktoren. Der einfachste ist der parameterlose. Wenn Sie diesen benutzen, müssen Sie in einer weiteren Anweisung das DataView-Objekt mit einer DataTable verknüpfen. Dazu dient die Eigenschaft Table.


DataView view = new DataView();
view.Table = ds.Tables[0];

Der einfach parametrisierte Konstruktor nimmt direkt die Referenz auf die DataTable entgegen.


DataView view = new DataView(ds.Tables[0]);

Der dritte Konstruktor erinnert an die Select-Methode der Klasse DataTable. Im ersten Parameter erwartet er die Referenz auf die DataTable, im zweiten wird ein Filterkriterium angegeben, im dritten das Sortierkriterium und schließlich im vierten ein Wert vom Typ DataViewRowState.


DataView view = new DataView(tbl, "", "", DataViewRowState.Unchanged);

Der letztgenannte Konstruktor weist den Eigenschaften

  • Table,
  • RowFilter,
  • Sort und
  • RowStateFilter

der DataView sofort die entsprechenden Werte zu.


Galileo Computing - Zum Seitenanfang

26.6.2 Auf die Datenzeilen in einer »DataView« zugreifen Zur nächsten ÜberschriftZur vorigen Überschrift

Während Sie über die Eigenschaft Rows einer DataTable an die Auflistung aller Datenzeilen einer DataTable gelangen, verhält sich eine DataView selbst wie eine Collection. Sie können sie daher in einer foreach-Schleife durchlaufen. Die zurückgelieferte Datenzeile ist vom Typ DataRowView.

Die DataRowView werten Sie aus, indem Sie dem Indexer den Bezeichner der Spalte oder dessen Index übergeben.


DataView view = new DataView(ds.Tables["Artikel"]);
foreach (DataRowView rowView in view)
  Console.WriteLine(rowView["ProductName"]);

Da sich eine DataView wie eine Auflistung verhält, verwundert es nicht, dass die Eigenschaft Count die Anzahl der DataRowView-Objekte zurückliefert. Damit haben Sie die Möglichkeit, eine DataView auch in einer for-Schleife zu durchlaufen.


Galileo Computing - Zum Seitenanfang

26.6.3 Die Eigenschaft »Sort« und die Methode »Find« Zur nächsten ÜberschriftZur vorigen Überschrift

Die Find-Methode einer DataView dient dazu, eine ganz bestimmte Datenzeile zu suchen. Allerdings ist daran eine Bedingung geknüpft: der Sort-Methode muss zuvor ein gültiger Spaltenbezeichner übergeben werden. Sort beschreibt immer nur einen Spaltennamen, optional gefolgt von ASC (aufsteigend) oder DESC (absteigend). Der Find-Methode wird dann der Wert übergeben, nach dem in der unter Sort angegebenen Spalte gesucht wird.

Ungewöhnlich ist der Rückgabewert der Find-Methode. Es ist ein Integer, der den Index der gefundenen Datenzeile in der DataView angibt. Wird keine Datenzeile gefunden, ist der Wert –1.


DataView view = new DataView(ds.Tables[0]);
view.Sort = "ProductName";
int index = view.Find("Chai");
if (index != -1)
  Console.WriteLine("Artikel: {0}", view[index]["UnitPrice"]);
else
  Console.WriteLine("Keine Datenzeile gefunden.");


Galileo Computing - Zum Seitenanfang

26.6.4 Die Methode »FindRows« Zur nächsten ÜberschriftZur vorigen Überschrift

Die Find-Methode einer DataRowCollection und die Find-Methode einer DataView ähneln sich in gewisser Hinsicht, denn beide liefern nur eine Datenzeile zurück. Die Find-Methode der DataRowCollection tut dies, weil diese Find-Methode die Angabe des Primärschlüssels des zu suchenden Datensatzes erwartet, und die Find-Methode der DataView verhält sich so, weil sie per Definition nur einen Integer-Wert liefert.

Wenn Sie aber zum Beispiel eine Sicht auf die DataTable der Lieferanten erstellen und der Sort-Eigenschaft eine Stadt übergeben, könnte es sein, dass mehrere Lieferanten in der angegebenen Stadt sesshaft sind. In diesem Fall ist die Find-Methode denkbar ungeeignet. Eine DataView stellt dafür die Methode FindRows bereit. Im Unterschied zu Find ist der Rückgabewert ein DataRowView-Array.


DataView view = new DataView(ds.Tables[0]);
view.Sort = "CategoryID";
DataRowView[] rowArr = view.FindRows(1);
foreach (DataRowView row in rowArr)
  Console.WriteLine("Artikel: {0}", row["ProductName"]);

Das Codefragment beantwortet die Frage, welche Artikel der Tabelle Products alle der Kategorie-Nummer 1 zugeordnet werden.


Galileo Computing - Zum Seitenanfang

26.6.5 Die Eigenschaft »RowFilter« Zur nächsten ÜberschriftZur vorigen Überschrift

Die Eigenschaft RowFilter dient zum Selektieren von Datenzeilen. Sie ist vom Typ einer Zeichenfolge und unterscheidet sich nicht vom Filterausdruck der Select-Methode der DataTable. Sie geben also das Filterkriterium an, als würden Sie in einem SQL-Statement eine WHERE-Klausel definieren. Nur die Angabe von WHERE ist nicht notwendig.


DataView view = new DataView(ds.Tables[0]);
view.RowFilter = "ProductName LIKE 'C*'";
foreach (DataRowView rowView in view)
  Console.WriteLine(rowView["ProductName"]);


Galileo Computing - Zum Seitenanfang

26.6.6 Die Eigenschaft »RowStateFilter« Zur nächsten ÜberschriftZur vorigen Überschrift

Die Eigenschaft RowStateFilter akzeptiert Werte der Enumeration DataViewRowState (siehe Tabelle 26.6). Während bei der Ausgabe einer DataTable unabhängig davon, ob bei der Filterung ModifiedCurrent und ModifiedOriginal benutzt wurden, kein Unterschied festzustellen war, werden bei einer DataView tatsächlich entweder die aktuellen oder die ursprünglichen Werte in der Ausgabe erscheinen.


DataView view = new DataView(ds.Tables[0]);
view.RowStateFilter = DataViewRowState.Added | 
                    DataViewRowState.Deleted;
foreach (DataRowView rowView in view)
  Console.WriteLine(rowView["ProductName"]);


Galileo Computing - Zum Seitenanfang

26.6.7 Änderungen an einem »DataView«-Objekt Zur nächsten ÜberschriftZur vorigen Überschrift

Eine DataView ist nicht statisch. Sie können zusätzliche DataRowView-Objekte hinzufügen, oder Sie können eine DataRowView löschen oder deren Inhalt ändern.

Um eine DataRowView hinzuzufügen, stellt die DataView die Methode AddNew bereit. Diese gibt ein neues DataRowView-Objekt zurück, dessen Spalten mit Daten gefüllt werden können. Zum Schluss muss auf der DataRowView die Methode EndEdit aufgerufen werden. Die Änderung ähnelt der einer DataRow. Mit BeginEdit wird die Änderung eingeleitet, und mit EndEdit wird sie abgeschlossen. Ein Abbruch kann mit CancelEdit erzwungen werden. Alles sind Methoden des DataRowView-Objekts. Um eine DataRowView zu löschen, brauchen Sie nur die Methode Delete aufzurufen.

Das folgende Beispielprogramm zeigt Ihnen alle zuvor beschriebenen Änderungsmöglichkeiten. Ausgegeben werden sollen am Ende des Programms nur die geänderten DataRowViews. Dazu wird der Eigenschaft RowStateFilter eine passende Kombination aus den erforderlichen DataRowViewState-Konstanten übergeben.


// ---------------------------------------------------
// Beispiel: ...\Kapitel 26\EditDataView
// ---------------------------------------------------
class Program {
  static void Main(string[] args) {
    SqlConnection con = new SqlConnection();
    con.ConnectionString = "...";
    SqlCommand cmd = new SqlCommand();
    cmd.Connection = con;
    cmd.CommandText = "SELECT ProductName, UnitPrice FROM Products";
    DataSet ds = new DataSet();
    SqlDataAdapter da = new SqlDataAdapter(cmd);
    da.Fill(ds); 
    // DataView erzeugen
    DataView dv = new DataView(ds.Tables[0]); 
    // DataRowView hinzufügen
    DataRowView newRow = dv.AddNew();
    newRow["ProductName"] = "Schokolade";
    newRow["UnitPrice"] = 15.99;
    newRow.EndEdit();
    // DataRowView ändern
    dv[0].BeginEdit();
    dv[0]["ProductName"] = "Eisbein";
    dv[0].EndEdit();
    // DataRowView löschen
    dv[1].Delete();
    dv.RowStateFilter = DataViewRowState.Added |
                        DataViewRowState.Deleted | 
                        DataViewRowState.ModifiedOriginal;
    // Ausgabe der DataView
    foreach (DataRowView rowView in dv)
      Console.WriteLine(rowView["ProductName"]);
    Console.ReadLine();
  }
}


Galileo Computing - Zum Seitenanfang

26.6.8 Aus einer »DataView« eine »DataTable« erzeugen topZur vorigen Überschrift

Ihnen liegt eine DataView vor, und Sie möchten diese nun als DataTable speichern? Kein Problem, denn mit der Methode ToTable werden alle Datenzeilen einer DataTable zugeführt, die über die Einstellung der Eigenschaft RowFilter verfügbar sind.

Da ToTable überladen ist, haben Sie mehrere Alternativen, diesen Vorgang zu steuern. So können Sie den Namen der DataTable schon beim Methodenaufruf festlegen und die Spalten festlegen, die der DataTable übergeben werden sollen. Ein weiterer Parameter gestattet es Ihnen, zu spezifizieren, ob die resultierende DataTable nur eindeutige Zeilen basierend auf den angegebenen DataColumns erhält.

Ein Beispiel mit ToTable soll dieses Kapitel abschließen. Zuerst werden die Spalten ProductName, UnitPrice und UnitsInStock der Tabelle Products in eine DataTable geladen. Eine DataView beschränkt die Sicht auf einen Teilbereich dieser DataTable und enthält nur die Datenzeilen der Artikel, die mit dem Buchstaben »C« beginnen und deren Einzelpreis kleiner 30 ist. Mit


DataTable tbl = dv.ToTable("C_Products", false, 
                new string[]{"UnitPrice", "ProductName" });

wird die DataView danach in eine DataTable geschrieben, deren Bezeichner auf C_Products festgelegt ist. Die neue DataTable enthält aber nur die Spalten UnitPrice und ProductName. Der boolesche Parameter gibt Auskunft darüber, ob alle Zeilen eindeutig sein sollen. Er ist hier auf false festgelegt, sodass durchaus auch zwei inhaltsgleiche Zeilen in der resultierenden DataTable erscheinen könnten.


// ---------------------------------------------------
// Beispiel: ...\Kapitel 26\ToTableMethod
// ---------------------------------------------------
class Program {
  static void Main(string[] args){
    SqlConnection con = new SqlConnection();
    con.ConnectionString = "...";
    SqlCommand cmd = new SqlCommand();
    cmd.Connection = con;
    cmd.CommandText = "SELECT ProductName, UnitPrice, UnitsInStock"’
                      +" FROM Products";
    DataSet ds = new DataSet();
    SqlDataAdapter da = new SqlDataAdapter(cmd);
    da.Fill(ds);
    // DataView erzeugen
    DataView dv = new DataView(ds.Tables[0]);
    dv.RowFilter = "ProductName LIKE 'C*' AND UnitPrice < 30";
    // DataView einer DataTable übergeben
    DataTable tbl = dv.ToTable("C_Products", false, 
           new string[] { "UnitPrice", "ProductName" });
    foreach (DataRow row in tbl.Rows)
      Console.WriteLine("{0,-10}{1}", row[0], row[1]);
    Console.ReadLine();
  }
}



Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen. >> Zum Feedback-Formular
<< zurück
  Zum Katalog
Zum Katalog: Visual C# 2010

Visual C# 2010
Jetzt bestellen


 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchempfehlungen
Zum Katalog: Professionell entwickeln mit Visual C# 2012






 Professionell
 entwickeln mit
 Visual C# 2012


Zum Katalog: Windows Presentation Foundation






 Windows Presentation
 Foundation


Zum Katalog: Schrödinger programmiert C++






 Schrödinger
 programmiert C++


Zum Katalog: C++ Handbuch






 C++ Handbuch


Zum Katalog: C/C++






 C/C++


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo




Copyright © Rheinwerk Verlag GmbH 2010
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