MySql abfrage in eine Nutzbare Variable umsetzen.

  • VB.NET

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von SithLady.

    MySql abfrage in eine Nutzbare Variable umsetzen.

    Guten Morgen!

    Da ich derzeit an einem Bankautomaten sitze und nicht weiter komme habe ich versucht mein Problem auf das einfachste herunter zu brechen. Der Code funktioniert bis zu dem Punkt wo ich einen Wert ausgelesen haben will. Die Stelle die ich meine ist diese;

    VB.NET-Quellcode

    1. Dim stand As String = "SELECT Ktostnd FROM Kundschaft WHERE Ktonum= '" + Replace(num, " ", "") + "'"


    Die Abfrage sollte laut dem phpmyAdmin so passen. Die Frage die ich habe ist nun, wie bekomme ich aus dem "stand" den Wert von Ktostnd? Ich brüte schon mehrere Tage da dran und komme effektiv keinen Millimeter weiter. Inzwischen hatte ich schon mehrmals den ganzen Code neu geschrieben und keinen Fortschritt erzielt.

    Ziel ist derzeit einen Bankautomaten zu bauen bei dem die Daten wie Kontonummer, Pin und Kontostand in einer MySQL-Datenbank gesichert sind. Derzeit hänge ich bei der simplen Ausgabe des Kontostandes. Sprich wenn auf der Wert von Ktostnd bspw. 200 Euro ist, ich dies in einer Textbox o.ä. ausgeben lassen kann.

    Ich hoffe ihr könnt mir helfen.

    Verschoben. ~Thunderbolt
    Ja... Es ist schrecklich... Und wie es erst aussieht... jaaaaa...
    Aber immerhin funktioniert der Code... Vorerst...

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

    Zuerst mal herzlich Willkommen hier im Forum ^^

    Nun zu deiner Frage,
    könntest du uns bitte, neben deinem Select, auch zeigen wie du bisjetzt versucht hast auf die Datenbank zuzugreifen, mit der Verbindung usw.?
    Sofern du dich auf einen MySQL Server im Internet verbindest, natürlich nicht vergessen, den ConnectionString zu entfernen.
    Danke und ja. Bin erst meine dritte Woche an VB.Net. Mache eine Umschulung zum FIAE und versuche irgendwie die Aufgabe umzusetzen.

    VB.NET-Quellcode

    1. Private Sub But_deposit_Click(sender As Object, e As EventArgs) Handles but_deposit.Click
    2. Dim num As String
    3. num = Form1.txtb_user.Text
    4. Try
    5. Dim conn As MySqlConnection
    6. conn = New MySqlConnection
    7. conn.ConnectionString = "Server=****;user=****;password=****;database=bankautomdb;"
    8. Try
    9. conn.Open()
    10. Catch myerror As MySqlException
    11. MsgBox("Keine Verbindung zur Datenbank : " & myerror.Message.ToString)
    12. End Try
    13. Dim myAdapter As New MySqlDataAdapter
    14. Dim SQLAbfrage As String = "SELECT ktostnd FROM Kundschaft WHERE Ktonum= " & num & "'"
    15. Dim myCommand As New MySqlCommand
    16. myCommand.Connection = conn
    17. myCommand.CommandText = SQLAbfrage
    18. myAdapter.SelectCommand = myCommand
    19. Dim myData As MySqlDataReader
    20. myData = myCommand.ExecuteReader()
    21. Do While myData.Read()
    22. listb_stnd.Items.Add(myData("Infos"))
    23. Loop
    24. conn.Close()
    25. Catch ex As Exception
    26. End Try
    27. End Sub


    Ich habe inzwischen versucht den Code der ja funktionieren sollte für mich persönlich umzubauen. Das Problem ist lediglich, dass die Listbox bei mir derzeit leer bleibt und effektiv nichts passiert. Nicht einmal eine Fehlermeldung o.ä.
    Ja... Es ist schrecklich... Und wie es erst aussieht... jaaaaa...
    Aber immerhin funktioniert der Code... Vorerst...
    Ich bekomme diese Meldung. Wobei ich die Abfrage noch mal innerhalb von myphpAdmin ausprobierte und ich da tatsächlich lediglich den gesuchten Wert erhalte... Oder übersehe ich gerade etwas?

    MySql.Data.MySqlClient.MySqlException: "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''' at line 1"
    Ja... Es ist schrecklich... Und wie es erst aussieht... jaaaaa...
    Aber immerhin funktioniert der Code... Vorerst...
    Scheint der Sache näher zu kommen. Nun bekomme ich bei;

    listb_stnd.Items.Add(myData("Infos"))


    den Auswurf:
    System.IndexOutOfRangeException: "Could not find specified column in results"

    Ich bin ganz ehrlich... Ich weiß nicht was bei "Infos" genau hin soll.
    Ja... Es ist schrecklich... Und wie es erst aussieht... jaaaaa...
    Aber immerhin funktioniert der Code... Vorerst...
    Danke für die tolle Hilfe.
    Das ganze sieht nun so aus;

    VB.NET-Quellcode

    1. ​Private Sub But_bala_Click(sender As Object, e As EventArgs) Handles but_bala.Click
    2. Dim num As String
    3. num = Form1.txtb_user.Text
    4. Dim conn As MySqlConnection
    5. conn = New MySqlConnection
    6. conn.ConnectionString = "Server=localhost;user=root;password=;database=bankautomdb;"
    7. Try
    8. conn.Open()
    9. Catch myerror As MySqlException
    10. MsgBox("Keine Verbindung zur Datenbank : " & myerror.Message.ToString)
    11. End
    12. End Try
    13. Dim myAdapter As New MySqlDataAdapter
    14. Dim SQLAbfrage As String = "SELECT ktostnd FROM Kundschaft WHERE Ktonum= " & num
    15. Dim myCommand As New MySqlCommand
    16. myCommand.Connection = conn
    17. myCommand.CommandText = SQLAbfrage
    18. myAdapter.SelectCommand = myCommand
    19. Dim myData As MySqlDataReader
    20. myData = myCommand.ExecuteReader()
    21. Do While myData.Read()
    22. listb_stnd.Items.Add(myData("ktostnd"))
    23. Loop
    24. conn.Close()
    25. End Sub


    Nun komme ich hoffentlich auch bei den anderen Aufgabenstellungen weiter :)
    Ja... Es ist schrecklich... Und wie es erst aussieht... jaaaaa...
    Aber immerhin funktioniert der Code... Vorerst...
    Stimmt schon. Ich wollte es erst einmal so versuchen. Habe wenigstens nun ein Projekt, dass mich über eine Woche gekostet hat innerhalb eines Tages fertig gestellt. Auch wenn wahrscheinlich 90% der Programmierer mit ihrem Kopf ein eingehendes Date mit der Tischplatte haben, wenn man alles zusammen sieht.

    Wie gesagt. Bin nun 2 1/2 Wochen dabei. Könnt ihr mir erklären, warum es als "die Holzhammer Methode" gilt "End" anstatt "Return" zu nehmen?
    Ja... Es ist schrecklich... Und wie es erst aussieht... jaaaaa...
    Aber immerhin funktioniert der Code... Vorerst...
    End ist der Todesschuss für eine App: »Brich alles ab, was Du gerade machst, egal ob Dateien/Streams offen sind, Großobjekte verwendet werde, die eigentlich einen geordneten Abbau verlangen, oder die Welt untergeht.« Also die Brutalvariante. Noch ein Zacken schärfer als Application.Exit. Return macht was ganz anderes, es beendet das Ausführen der aktuellen Prozedur und kehrt zum Aufrufpunkt zurück. Wie es dann weitergeht, steht dann in Deinem weiteren Code. Das saubere Beenden von WinForms-Apps geht über Me.Close. Die App beendet sich dann entweder, wenn das Hauptform so geschlossen wird oder das letzte existierende Form. Ist ne Projekteinstellungssache.
    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.

    SithLady schrieb:

    warum es als "die Holzhammer Methode" gilt "End" anstatt "Return" zu nehmen
    Mit End erschiesst sich das Programm selbst.
    docs.microsoft.com/en-us/dotne…/statements/end-statement

    Microsoft schrieb:

    You should use End sparingly, and only when you need to stop immediately.
    The normal ways to terminate a procedure (Return Statement and Exit Statement) not only close down the procedure cleanly but also give the calling code the opportunity to close down cleanly.
    A console application, for example, can simply Return from the Main procedure.
    Also lieber eine geordnete Verabschiedung als ein plötzlicher Suizid.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Vielleicht noch eine kleine Anmerkung.
    Du fragst einen Kontostand ab, dem eine eindeutige Kontonummer zugrunde liegt.
    Das heißt, Du kannst bei einem Treffer genau einen Wert bekommen, nicht mehr.

    Dafür bietet sich eine andere Möglichkeit an, dass Ergebniss der Query zu bekommen: ExecuteScalar

    Spoiler anzeigen

    ExecuteScalar: Verwenden Sie diesen Vorgang, um beliebige SQL-Anweisungen auszuführen, um einen einzelnen Wert zurückzugeben.
    Dieser Vorgang gibt den Wert nur in der ersten Spalte der ersten Zeile im Resultset zurück, das von der SQL-Anweisung zurückgegeben wird.


    In Deinem Fall benutzt Du den DataReader und versuchst, einen einzigen Wert in einer Schleife zu lesen, das macht wenig Sinn in diesem Fall.
    Mache Dich am besten mit ExecuteNonQuery, ExecuteScalar und ExecuteReader vertraut, jede davon hat ihren Sinn.

    SithLady schrieb:

    "SELECT ktostnd FROM Kundschaft WHERE Ktonum= " & num


    Hallo,

    ich möchte hier mal auf die krasse Sicherheitslücke in dieser Zeile hinweisen: Must-Know: Sql-Injection
    So sollte das eher gemacht werden: Tipp & Trick: DbParameter

    Im Grunde kann ich dir damit deine gesamte Datenbank kaputtmachen, auslesen und/oder manipulieren. Auch wenn das erstmal ein „Spielprojekt“ ist, solltest du das gleich richtig machen, sonst hast du später mit solchen Lücken Probleme, wenn das erstmal Gewohnheit geworden ist.
    Mit freundlichen Grüßen,
    Thunderbolt
    Ich werde mich definitiv noch einmal dran setzen. Eigentlich hatte ich vor mit PW-Verschlüsselung anzufangen. Die wird mit aber nichts bringen, wenn ich irgendwann unter "Realbedingungen" eine solche Anwendung zusammenbaue und man alles zerschießen kann ohne dass man auch nur auf die Datenbank zugreifen muss. Da ists dann wirklich egal, ob das PW oder hier die Pin im Klartext auf der DB verstaubt.

    Danke für die Anmerkungen,
    Ja... Es ist schrecklich... Und wie es erst aussieht... jaaaaa...
    Aber immerhin funktioniert der Code... Vorerst...