WHERE Klausel zur Abfrage einer DataTable

  • VB.NET
  • .NET (FX) 3.0–3.5

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    WHERE Klausel zur Abfrage einer DataTable

    Guten Morgen,

    ich komme schon wieder nicht weiter. Ich möchte gern eine Tabelle eines DataSets nach bestimmten Datensätzen
    abfragen.

    VB.NET-Quellcode

    1. Dim Datensatz() As DataRow = DataSet1.Vokabeln.Select("Englisch Where Deutsch = '" & tbDeutsch.Text & "'")


    Folgende Fehlermeldung erscheint bei der Ausführung des Progs: Syntaxfehler: Fehlender Operand nach dem Operator 'Where'.

    Ich hab wirklich keinen blassen Schimmer mehr wo hier jetzt ein Synthaxfehler vorliegt. Vielleicht könnt Ihr ja weiterhelfen.

    Danke im voraus!

    *Topic verschoben*
    Schlimmer als ein Elefant im Porzellanladen, ist ein Igel in der Kondomfabrik und Nutella hat Lichtschutzfaktor 9,7 8)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Ich kann noch nicht mal erkennen, was das Ergebnis sein soll, aber Select macht aus einer Ansammlung von X eine Ansammlung von Y, wobei Y ein Teil von X ist.
    Hat man eine Klasse Foo mit der Eigenschaft Bar, dann kann man schreiben:

    VB.NET-Quellcode

    1. Dim FooList As New List(Of Foo)
    2. '[…]
    3. Dim BarList = FooList.Select(Function(x) x.Bar)

    So erhält man also eine Ansammlung von Bars.

    Where hingegen wirkt als ein Filter:

    VB.NET-Quellcode

    1. Dim FilteredFooList = FooList.Where(Function(x) x.Bar = Baz)

    In der FilteredFooList kommen nur alle Foos rein, deren Bar-Eigenschaft den Wert Baz hat.

    Und jetzt nochmal die Frage: Welche Ergebnisse erwartest Du in dem Datensatz-Array als Ergebnis?

    Dazu müsste man auch wissen, welche Eigenschaften die Vokabeln-Tabelle hat.

    ##########

    Spekulatius:

    VB.NET-Quellcode

    1. Dim Datensatz As DataRow() = DataSet1.Vokabeln.Where(Function(x) x.Deutsch = tbDeutsch.Text).Select(Function(x) x.Englisch)

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Vielen Dank erstmal für Deine Mühe!
    Das Ergebnis?
    Nun ja, es gibt eine Tabelle "vokabeln" mit den Spalten (ID,Englisch,Deutsch,Datum).
    Nun möchte ich den Wert der Spalte Englisch wo die Spalte Deutsch dem Wert der TextboxDeutsch entspricht.
    Ich weiß nicht, ob Du mit meinem Versuch der Erklärung etwas anfangen kannst? :/
    Schlimmer als ein Elefant im Porzellanladen, ist ein Igel in der Kondomfabrik und Nutella hat Lichtschutzfaktor 9,7 8)
    Und jetzt schau nochmal das Ende meines Posts an, da steht die potentielle) (Auf)Lösung.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Wie darf ich das verstehen? Der Code dürfte selbst bei Dir problemlos funktionieren. Denn es enthält genau die Angaben, die Du verwendest. Wenn es nicht klappt: Welche Fehlermeldung gibt es? Oder passt das Ergebnis nicht zu dem, was Du brauchst? Ach, Moment, nee. Das Ergebnis ist eine IEnumerable(Of String), keine IEnumerable(Of DataRow). Hab ich ja selbst gesagt. Das Select verändert einiges. Daher reicht schon:
    Dim Datensatz As DataRow() = DataSet1.Vokabeln.Where(Function(x) x.Deutsch = tbDeutsch.Text)
    Das ergibt die DataRows, deren Deutschtext dem TextBoxInhalt entspricht. Wenn Du von denen die Englisch-Spalteninhalte hernimmst, kommt eben eine String-Auflistung raus. Logisch.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    VaporiZed schrieb:

    Dim Datensatz As DataRow() = DataSet1.Vokabeln.Where(Function(x) x.Deutsch = tbDeutsch.Text)


    Also, ich habe bisher nur mit "normalen" SQL-Statements gearbeitet. Und ich schäme mich fast zu sagen, dass das was Du mir als Lösung präsentierst absolut böhmische Wälder für mich sind.
    --> Function? Und wofür steht x ?
    Wenn ich nicht hier ins Forum schreiben würde, würde ich sagen, das bleibt unter uns. :S
    Schlimmer als ein Elefant im Porzellanladen, ist ein Igel in der Kondomfabrik und Nutella hat Lichtschutzfaktor 9,7 8)
    Dann bin ich über Deinen Eingangspost verwundert, wo Du mit der LINQ-Geschichte anfängst.
    Die LINQ-Extensions arbeiten quasi so:
    Du hast ne Ansammlung von Objekten einer Klasse: Deine Vokabeln. Das ist ne DataTable. Die kann aber intern zu ner Ansammlung von VokabelnRow umgewandelt werden. Also hast Du quasi automatisch ne IEnumerable(Of VokabelnRow). Setzt man da ne LINQ-Extension wie Where oder Select ran, weiß der Compiler: »Ok, jetzt hab ich hier ne Ansammlung von VokabelnRows, damit soll ich was machen, und zwar mit jeder einzelnen davon.« Da Where und Select was zurückgeben sollen, muss man schreiben .Where(Function …. Würde man eine andere LINQ-Extension wie ForEach verwenden, müsste man .ForEach(Sub … schreiben, weil da nix zurückgegeben werden soll, sondern einfach nur mit allen VokabelnRows was gemacht werden soll.
    Zurück zu Where/Select: Ob Du nach Where(Function( ein x oder ein Foo oder ein bla schreibst, ist dem Compiler wurscht. Er weiß dann aber, dass Du eine einzelne VokabelnRow meinst, wenn Du jene geklammerte Variable verwendest. Es geht also
    • DataSet1.Vokabeln.Where(Function(x) x.Deutsch = tbDeutsch.Text)
    • DataSet1.Vokabeln.Where(Function(Foo) Foo.Deutsch = tbDeutsch.Text)
    • DataSet1.Vokabeln.Where(Function(bla) bla.Deutsch = tbDeutsch.Text)
    Und dann erhältst Du eben was passendes zurück. Eben alle VokabelnRows, die die Filterbedingung beim Where erfüllen oder eben die VokabelnRow-Elemente, die beim Select stehen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Super und vielen herzlichen Dank für Deine Mühe!!
    Wenn ich das jetzt tatsächlich so mache:

    VB.NET-Quellcode

    1. Dim Datensatz As DataRow() = DataSet1.Vokabeln.Where(Function(x) x.Deutsch = tbDeutsch.Text)


    erhalte ich allerding die Fehlermeldung: der Wert vom Typ "EnumerableRowCollection(Of DataSet1.VokabelnRow" kann nicht in DataRow() konvertiert werden.

    Was mach ich bloß falsch?
    Schlimmer als ein Elefant im Porzellanladen, ist ein Igel in der Kondomfabrik und Nutella hat Lichtschutzfaktor 9,7 8)

    Steamy2010 schrieb:

    EnumerableRowCollection(Of DataSet1.VokabelnRow" kann nicht in DataRow() konvertiert werden.

    Hier liebe ich Option Infer On

    VB.NET-Quellcode

    1. Dim Datensatz = DataSet1.Vokabeln.Where(Function(x) x.Deutsch = tbDeutsch.Text)
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    @petaod Entschuldige dass ich mich jetzt erst melde. Ich hätte fast meinen Zahnarzttermin versäumt.
    @VaporiZed und @petaod
    Zunächst einmal vielen herzlichen Dank für Eure Rückmeldung.
    Jetzt funktioniert es endlich und so bekomme ich dann mein Ergebnis auch wie gewünscht ausgelesen.

    VB.NET-Quellcode

    1. Dim Ergebnis As String = DataSet1.Vokabeln.Rows.Item(0).ItemArray(2).ToString

    Da ich zukünftig ja noch weitere Statements zu bewerkstelligen habe, noch die Frage, wo bzw. unter welchem Stichwort kann ich mich
    denn wohl hinsichtlich dieser Vorgehensweise noch weiter schlau machen?
    Schlimmer als ein Elefant im Porzellanladen, ist ein Igel in der Kondomfabrik und Nutella hat Lichtschutzfaktor 9,7 8)
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Steamy2010 schrieb:

    VB.NET-Quellcode

    1. Dim Ergebnis As String = DataSet1.Vokabeln.Rows.Item(0).ItemArray(2).ToString
    Besser (weil typisieret) wäre:

    VB.NET-Quellcode

    1. Dim Ergebnis As String = DataSet1.Vokabeln(0).Deutsch
    2. 'bzw
    3. Dim Ergebnis As String = DataSet1.Vokabeln(0).Englisch
    4. 'bzw
    5. Dim Ergebnis As String = DataSet1.Vokabeln(0).Xhosa
    6. 'bzw
    7. Dim Ergebnis As String = DataSet1.Vokabeln(0).Klingonisch
    oder welche auch immer Sprache du grade abrufen möchtest.