SQL Werte werden nicht angezeigt! Fehlermeldung!

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

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von Cheffboss.

    SQL Werte werden nicht angezeigt! Fehlermeldung!

    Moin! :)
    Ich versuche gerade den Inhalt einer MS-SQL Datenbank auszulesen und mit diesen Werten weiter arbeiten.
    Leider habe, sobald ich den Vorname auslesen möchte eine Fehlermeldung:
    Die tblBenutzer.Vorname-Spalte ist in der Auswahlliste ungültig, da sie nicht in einer Aggregatfunktion und nicht in der GROUP BY-Klausel enthalten ist.

    Wenn ich den Vorname weg nehme und nur das Guthaben auslese, geht der Code.
    Da ich SQL Anfänger bin brauche ich eure Hilfe.
    Woran liegt es?
    Wie kann ich es am besten lösen?
    BIG THX

    SQL-Abfrage

    1. SELECT tblBenutzer.vorname , MAX(Guthaben)
    2. FROM [dbo].[tblGuthaben]
    3. INNER JOIN tblBenutzer
    4. INNER JOIN tblAnmeldedaten
    5. ON tblAnmeldedaten.ID = tblBenutzer.ID
    6. on tblguthaben.ID = tblAnmeldedaten.ID
    Visual Basic.NET 8o
    MS-SQL
    8o
    Wenn dann GroupBy tblBenutzer.Vorname. Aber auch das wird nicht funktionieren. Mir scheint da auch der Join recht komisch. Ich bin da bei @ErfinderDesRades. Formuliere mal den SQL mit PseydoCode damit man weis was du willst. Achja, wenn Du eine Agregatfunktion (Sum, Max, Count usw.) drin hast, muss GroupBy benutzt werden.

    Achja2 installier dir mal das SQL Management Studio, da kannste immer gut Testen, oder dir ein View auf Basis deiner Tabellen bauen, dann siehst du den SQL den das Studio daraus baut.
    "Hier könnte Ihre Werbung stehen..."

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „MichaHo“ ()

    Täte das mal so in etwa versuchen...
    SELECT Benutzername, MAX(Einnahmen)
    FROM MeineTabelle
    GroupBy Benutzername, MAX(Einnahmen)
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

    ErfinderDesRades schrieb:

    ah - scheinbar weisst du, was bei rauskommen soll.
    Dann Frage an dich: Was soll dabei rauskommen?

    Naja von Wissen kann ich nicht sprechen. Ich reime anhand des SQL Statements und der Fehlermeldung das Ziel zusammen.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    @an alle
    Danke, für eure Antwort. :)
    Es tut mir leid dass ich keine weiteren Angaben gemacht habe.
    Ich dachte, dieser Code würde ausreichen.
    Nun versuche ich mein Vorhaben genau zu erklären.
    Ich möchte die Informationen die in der Datenbank gespeichert sind.
    Auslesen und diese anzeigen lassen.


    VB.NET-Quellcode

    1. ' MAX Guthaben anzeigen...
    2. Dim sql_code1 As String = "SELECT MAX(Guthaben) FROM [dbo].[tblGuthaben]"
    3. ' AVG Guthaben anzeigen..
    4. Dim sql_code2 As String = "SELECT AVG(Guthaben) FROM [dbo].[tblGuthaben]"
    5. ' MIN Guthaben anzeigen..
    6. Dim sql_code3 As String = "SELECT MIN(Guthaben) FROM [dbo].[tblGuthaben]"
    7. ' Und so weiter…




    Deshalb möchte ich es eleganter Lösen wenn es möglich ist.
    Anstatt dem SQL-Server für jeden einzelnen Wert(Label) los zu schicken.
    Deshalb möchte ich alle Werte auf einmal auslesen und in ein Array packen um damit dann später, den Inhalt wieder passend auszugeben.
    Um Ressourcen zu sparen und einen besseren Code zu haben.

    Jetzt möchte ich euch mitteilen wie ich das lösen möchte.
    Wenn ich den Code so habe.

    Wird alles wie gewünscht angezeigt.
    Jetzt möchte ich aber bestimmte Zeilen auswählen.
    Zum Beispiel


    Dies wird auch angezeigt, aber sobald ich mehre Werte auslesen möchte erscheint ein seltsamer Fehler(Für mich als SQL-Anfänger).
    Fehlermeldung:



    Nun zum Problem! :!:
    Wenn ich nur den Vorname und Nachname ausgeben möchte, geht es.
    Aber warum nicht wenn ich mehre Spalten haben möchte?


    Ich hoffe ich könnte mein Problem gut Beschreiben.
    Freue mich auf Antwort.
    BIG THX
    Visual Basic.NET 8o
    MS-SQL
    8o
    Sehe ich das richtig das Benutzer.ID, Anmeldedaten.ID und Guthaben.ID alles das gleiche ist? Laut deinen Joins ist das so. Warum dann der Umweg über die Anmeldedaten?

    SQL-Abfrage

    1. SELECT
    2. ID = B.ID,
    3. Vorname = B.Vorname,
    4. Nachname = B.Nachname,
    5. Guthaben = SUM(G.Guthaben)
    6. INTO #GuthabenProBenutzer
    7. FROM tblGuthaben G
    8. JOIN tblBenutzer B ON B.ID = G.ID
    9. GROUP BY B.ID, B.Vorname, B.Nachname
    10. SELECT
    11. MinName = (SELECT Top 1 RTRIM(Vorname) + ' ' + RTRIM(Nachname) FROM #GuthabenProBenutzer ORDER BY Guthaben ASC),
    12. MinBetrag = MIN(Guthaben),
    13. MaxName = (SELECT Top 1 RTRIM(Vorname) + ' ' + RTRIM(Nachname) FROM #GuthabenProBenutzer ORDER BY Guthaben DESC),
    14. MaxBetrag = Max(Guthaben),
    15. Durchschnittsbetrag = Avg(Guthaben),
    16. LetzteAufladung = (SELECT Top 1 Vorname + ' ' + Nachname FROM tblGuthaben G JOIN tblBenutzer B ON B.ID = G.ID ORDER BY G.Datum DESC)
    17. FROM #GuthabenProBenutzer G



    EDIT: Nach dem Testen hab ich gemerkt, dass da noch ein Fehler drin war. Ist aber korrigiert


    Ein Computer wird das tun, was du programmierst - nicht das, was du willst.

    Dieser Beitrag wurde bereits 12 mal editiert, zuletzt von „Yanbel“ ()

    @Yanbel
    Danke, für deinen Code. :)
    Leider finde ich nicht die passende Lösung.
    Ich wollte alle Werte in ein Array zusammenfügen.
    Und diese dann den Labels geben.


    Jetzt mache ich es einfach so!
    Für jedes Label einmal die SQL Datenbank abfragen.
    Code:

    VB.NET-Quellcode

    1. ' MAX Guthaben anzeigen...
    2. Dim sql_code1 As String = "SELECT MAX(Guthaben) FROM [dbo].[tblGuthaben]"
    3. Dim obj1 As Decimal = CDec(SQL.TabelleLesenErsterWert(sql_code1))
    4. Me.lblGeldVerdienstMAX.Text = obj1.ToString("C")
    5. ' AVG Guthaben anzeigen..
    6. Dim sql_code2 As String = "SELECT AVG(Guthaben) FROM [dbo].[tblGuthaben]"
    7. Dim obj2 As Decimal = CDec(SQL.TabelleLesenErsterWert(sql_code2))
    8. Me.lblGeldVerdienstAVG.Text = obj2.ToString("C")
    9. ' MIN Guthaben anzeigen..
    10. Dim sql_code3 As String = "SELECT MIN(Guthaben) FROM [dbo].[tblGuthaben]"
    11. Dim obj3 As Decimal = CDec(SQL.TabelleLesenErsterWert(sql_code3))
    12. Me.lblGeldVerdienstMIN.Text = obj3.ToString("C")

    So macht das Programm dass, was es machen soll!
    Oder Spricht was gegen diese Notlösung? ?(
    BIG THX

    edit2:
    Ja, alle IDs sind gleich.
    Das mit den Anmeldedaten habe ich dann umsonst verwendet.
    Wie gesagt, bin leider noch Anfänger in SQL.
    Visual Basic.NET 8o
    MS-SQL
    8o
    Warum erstellst Du Dir nicht Klassen die deine Daten abbilden, lädst die Daten aus dem SQL in deine Klassen instanzen und kannst damit weiter arbeiten. Da gibts doch schöne Tuts vom @ErfinderDesRades bezüglich typ. dataset.
    "Hier könnte Ihre Werbung stehen..."