34.6 Filtern und suchen in einer DataTable
34.6.1 Die Methode »Find«
Wenn Sie in einer DataTable nach einer bestimmten Datenzeile suchen wollen, bietet sich die Methode Find der DataRowCollection an. Die Methode nimmt ein Objekt entgegen, das den Primärschlüssel der zu suchenden Zeile enthält. Wegen der Eindeutigkeit des Primärschlüssels ist sichergestellt, dass nur eine Zeile zurückgegeben wird. Es gibt auch eine Überladung, die ein Object-Array erwartet. Diese ist für die Tabellen gedacht, die einen Primärschlüssel aus mehreren Spalten bilden.
Die Methode Find setzt voraus, dass die entsprechende Spalte auch als Primärschlüsselspalte in der DataTable bekannt ist. Dazu bietet es sich an, entweder manuell mit der Eigenschaft PrimaryKey der DataTable die Primärschlüsselspalte als solche zu kennzeichnen oder vorher die Methode FillSchema des SqlDataAdapters aufzurufen.
Im folgenden Codebeispiel wird die Datenzeile mit dem Primärschlüssel 10 in der Tabelle Products gesucht.
SqlConnection con = new SqlConnection("...");
SqlCommand cmd = new SqlCommand("SELECT * FROM Products", con);
DataSet ds = new DataSet();
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.FillSchema(ds, SchemaType.Source);
da.Fill(ds);
//Nach der Datenzeile mit PS = 10 suchen
DataRow row = ds.Tables[0].Rows.Find(10);
if (row == null)
Console.WriteLine("Datenzeile nicht gefunden.");
else
Console.WriteLine(row["ProductName"]);
Listing 34.14 Suchen eines Datensatzes mit einem bestimmten Primärschlüssel
Das Beispiel einer Tabelle mit einem Primärschlüssel, der aus mehreren Spalten gebildet wird, ist die Tabelle OrderDetails der Northwind-Datenbank, in der der Primärschlüssel durch die Spalten OrderID und ProductID gebildet wird. Möchten Sie in dieser Tabelle nach einem bestimmten Datensatz suchen, müssen Sie die Find-Methode wie folgt aufrufen:
DataRow row = ds.Tables[0].Rows.Find(new Object[]{10248,11});
34.6.2 Die Methode »Select«
Die Find-Methode liefert nur maximal eine Datenzeile. Mit der Select-Methode lassen sich auch mehrere Datenzeilen aus einer DataTable filtern. Im Gegensatz zur Find-Methode ist Select eine Methode des DataTable-Objekts und ebenfalls mehrfach überladen.
Die einfachste Version ist parameterlos und liefert alle Datenzeilen zurück, allerdings in Form eines DataRow-Arrays, beispielsweise:
DataRow[] liste = ds.Tables[0].Select();
Eine Überladung von Select erwartet eine Zeichenfolge als Übergabeargument. Die Zeichenfolge beschreibt ein Filterkriterium, ähnlich der WHERE-Klausel in einer SQL-Abfrage, allerdings ohne WHERE. Auch hier wird die Ergebnisliste durch ein DataRow-Array gebildet.
Angenommen, Sie sind an allen Artikeln interessiert, die zur CategoryID=2 gehören und einen Preis größer 20 haben, können Sie die Liste wie folgt bilden:
DataTable tbl = ds.Tables[0];
DataRow[] liste = tbl.Select("CategoryID=2 AND UnitPrice > 20");
foreach (DataRow item in liste)
Console.WriteLine("{0}, {1}", item["ProductName"], item["UnitPrice"]);
Listing 34.15 Filtern mit der Methode »Select«
Durch die zweiparametrige Überladung der Methode können Sie im ersten Parameter das Filterkriterium angeben, im zweiten die Sortierreihenfolge. Das entspricht der ORDER BY-Klausel eines SQL-Statements, wiederum ohne ORDER BY selbst angeben zu müssen. Mit ASC und DESC können Sie auch die Sortierreihenfolge auf- und absteigend festlegen.
DataRow[] liste = tbl.Select("CategoryID=6", "ProductName ");
Um die Datenzeilenliste ohne zu filtern zu sortieren, geben Sie im ersten Parameter null an.
Die vielleicht interessanteste Überladung definiert drei Parameter: den ersten für den Filter, den zweiten für die Sortierung und den dritten vom Typ DataViewRowState. Diese Enumeration beschreibt den Zustand der Datenzeilen, die die Ergebnismenge bilden. Beispielsweise können Sie alle als gelöscht markierten Datenzeilen in einem DataRow-Array zusammenfassen oder alle geänderten. Da die Enumeration DataRowViewState das FlagsAttribute aufweist, lassen sich auch mehrere Enumerationsmember miteinander kombinieren. In Tabelle 34.6 sind alle Mitglieder der Enumeration aufgeführt.
Member | Beschreibung |
None |
Keine |
Unchanged |
Unveränderte Datenzeile |
Added |
Hinzugefügte Datenzeile |
Deleted |
Gelöschte Datenzeile |
ModifiedCurrent |
Die aktuelle Version einer geänderten Datenzeile |
ModifiedOriginal |
Die ursprüngliche Version einer geänderten Datenzeile |
OriginalRows |
Ursprüngliche Zeilen, einschließlich unveränderter und gelöschter Zeilen |
CurrentRows |
Aktuelle Zeilen, einschließlich unveränderter, neuer und geänderter Zeilen |
Interessieren Sie sich ausschließlich für alle gelöschten und hinzugefügten Datenzeilen einer DataTable, müssen Sie mit der folgenden Anweisung filtern:
DataRow[] liste = tbl.Select(null, null,
DataViewRowState.Added | DataViewRowState.Deleted);
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.