Announcement

Collapse
No announcement yet.

DataTable - Abfrage

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • DataTable - Abfrage

    Liebe Freunde,

    ich habe eine DataTable, die 3-spaltig ist:
    • X
    • Y
    • Obj


    Nun möchte ich z.B. Folgendes abfragen:
    "Alle Werte der Spalte Obj, wo X=2 und Y=3 ist."

    Wie kann ich das am einfachsten und speicherschonendsten realisieren?

    Ich danke euch für eure freundliche Hilfe und Unterstützung!
    Mit freundlichen Grüßen
    Innocentus

  • #2
    Hallo,

    wenn du LINQ verwenden kannst/willst dann zB so:
    [highlight=c#]
    using System.Data;

    namespace ConsoleApplication1
    {
    class Program
    {
    static void Main()
    {
    DataTable dt = new DataTable();
    dt.Columns.Add("x", typeof(int));
    dt.Columns.Add("y", typeof(int));
    dt.Columns.Add("Obj", typeof(object));

    var query =
    from zeile in dt.AsEnumerable()
    where
    zeile.Field<int>("x") == 2 &&
    zeile.Field<int>("y") == 3
    select zeile.Field<object>("Obj");
    }
    }
    }
    [/highlight]

    bzw. in Vb.net
    [highlight=vbnet]
    Imports System.Data

    Namespace ConsoleApplication1
    Class Program
    Private Shared Sub Main(ByVal args As String())
    Dim dt As New DataTable()
    dt.Columns.Add("x", GetType(Integer))
    dt.Columns.Add("y", GetType(Integer))
    dt.Columns.Add("Obj", GetType(Object))

    Dim query = From zeile In dt.AsEnumerable() _
    Where zeile.Field(Of Integer)("x") = 2 AndAlso zeile.Field(Of Integer)("y") = 3 _
    Select zeile.Field(Of Object)("Obj")
    End Sub
    End Class
    End Namespace
    [/highlight]

    mfG Gü
    Zuletzt editiert von gfoidl; 05.12.2008, 13:39. Reason: Wegen Highlighting-Bug die [] entfernt - Danke Jürgen.
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      Ohne LINQ geht es so (mit C#-Code):
      Code:
      string query = "X=2 AND Y=3";   //  Abfrage-String
      //  Abfrage ausführen liefert ein DataRow-Array
      DataRow[] rows = myDataTable.Select(query);
      //  generische Liste als eigentliches Ergebnis erzeugen
      List<Obj> results = new List<Obj>();
      //  die Objekte aus den ausgewählten Zeilen übernehmen
      foreach(DataRow row in rows) {
         //  hier muss irgendwie CType eingebaut werden
         Obj obj = row["Obj"] as Obj;
         if (obj != null)       //  ungleich; d.h. sofern die Spalte Obj gefüllt ist
            results.Add(obj);
      }
      Erläuterungen findest Du in der SDK-Doku/MSDN vor allem unter DataColumn.Expression.

      Jürgen

      Mit VB kenne ich mich überhaupt nicht aus (ich kann es nur notdürftig lesen, aber nicht schreiben); aber der Aufbau sollte klar sein.

      PS. An Gü: Mit C#-Highlighting funktionieren die "[" nicht.

      Comment


      • #4
        Vielen Dank

        Das ist ja wunderbar, dass man sogar Queries verwenden kann.

        Vielen Dank für eure freundliche Hilfe und Unterstützung!
        Mit freundlichen Grüßen
        Innocentus

        Comment


        • #5
          Nachtrag

          Nachtrag:
          Wie kann ich die Spalten typisieren?

          Ich habe folgenden Code:
          Code:
                  _tiles = New DataTable()
                  _tiles.Columns.Add(New DataColumn("x"))
                  _tiles.Columns.Add(New DataColumn("y"))
                  _tiles.Columns.Add(New DataColumn("obj"))
          Der Parameter 1 und der Parameter 2 sollen jeweils einen Long-Wert erhalten.
          Der Parameter 3 soll eine Instanz der Klasse TestObject sein.

          Vielen Dank für eure freundliche Hilfe und Unterstützung!
          Mit freundlichen Grüßen
          Innocentus

          Comment


          • #6
            Wie kann ich die Spalten typisieren?
            Schau dir mein obigen Beispiel an.

            mfG Gü
            "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

            Comment

            Working...
            X