Problem beim Speichern von Daten

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von Counterbug.

    Problem beim Speichern von Daten

    Hi,
    ich habe mir ein kleines Tool gemacht, wo ich Benutzer anlegen kann. Allerdings möchte ich auch die Daten ändern können. Folgender Code funktioniert aber irgendwie nicht:

    VB.NET-Quellcode

    1. ​ con.ConnectionString = "DataSource = ADRESSE; Database = admtool; UID = BENUTZER; PWD = PASSWORT;"
    2. cmd.Connection = con
    3. con.Open()
    4. Try
    5. SQL = "UPDATE user SET Dienstgrad='" & text_rang.Text & "'"
    6. Command.Connection = con
    7. Command.CommandText = SQL
    8. Adapter.SelectCommand = Command
    9. dreader = cmd.ExecuteReader
    10. dreader.Close()
    11. con.Close()
    12. MsgBox("Die Daten wurden erfolgreich gespeichert!", vbInformation, "Speichern")
    13. Catch ex As Exception
    14. MsgBox(ex.Message)
    15. End Try


    Hat wer ne Idee, woran das liegen kann?
    Ich würde dir empfehlen:
    - die .NET Version von MsgBox(), MessageBox.Show() zu benutzen
    - die Using Anweisung für Command und Connection zu benutzen
    (man beachte ErfinderDesRades Kommentar unter meinem Post)
    - die Eingaben nicht ungefiltert in die Abfrage fließen zu lassen.
    - die ExecuteNonQuery-Methode vom Reader auszuführen, da du keine Daten liest.

    Ist das außerdem richtig, dass du allen Usern den Dienstgrad zuweisen willst, da du nirgendwo eine WHERE Bedingung einbaust.
    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..

    Rootbob91 schrieb:

    - die Eingaben nicht ungefiltert in die Abfrage fließen zu lassen.
    - die ExecuteNonQuery-Methode vom Reader auszuführen, da du keine Daten liest.

    Kannst du das bitte genauer erklären, weiß nicht was ich machen soll :D

    Rootbob91 schrieb:

    Ist das außerdem richtig, dass du allen Usern den Dienstgrad zuweisen willst, da du nirgendwo eine WHERE Bedingung einbaust.

    Nein eigentlich nur dem makierten, muss ich dann das so machen:

    VB.NET-Quellcode

    1. UPDATE user WHERE Name='" & ListBox1.Text & "'" SET

    Pumuckl schrieb:

    weiß nicht was ich machen soll


    So sehe das mit "Using" und "ExecuteNonQuery" aus:

    VB.NET-Quellcode

    1. Private Function UpdateUserDienstgrad(ByVal dienstgrad As String, ByVal RowID As Short) As Boolean
    2. Using connection As MySqlConnection = New MySqlConnection(connectstring)
    3. Using command As MySqlCommand = New MySqlCommand
    4. Dim returnValue As Boolean
    5. command.CommandText = "UPDATE `user` SET `Dienstgrad` = @dienstgrad WHERE `ID` = @RowID;"
    6. command.Connection = connection
    7. command.CommandType = CommandType.Text
    8. command.Parameters.AddWithValue("@dienstgrad", dienstgrad)
    9. command.Parameters.AddWithValue("@RowID", rowid)
    10. Try
    11. connection.Open
    12. command.ExecuteNonQuery
    13. returnValue = True
    14. Catch exception As MySqlException
    15. returnValue = False
    16. MessageBox.Show("Fehler beim INSERT" + exception.Message)
    17. Finally
    18. connection.Close
    19. End Try
    20. Return returnValue
    21. End Using
    22. End Using
    23. End Function

    Pumuckl schrieb:

    hmm, aber ich versteh nicht, warum mein Code nicht geht? Hat jemand da einen Fehler gefunden?


    Vielleicht einfach nur deswegen, weil der SQL-Query fehlerhaft ist.

    Siehe w3schools.com/sql/sql_update.asp

    Die Lektüre von w3schools.com/sql/default.asp ist dringend anzuraten.

    Poste doch der Einfacheit halber mal die komplette Funktion/Subroutine.
    Meine Zuweisungen in Zeile 5 & 6 werden nicht funzen, da ich nicht weiss, was für Imports bei seinem Code genutzt werden.

    Aber ... das kann ja auch garnicht funktionieren.

    Zeile 10 wird cmd definiert.
    Zeile 18 wird dessen ExecureReader-Methode aufgerufen.

    Diesem Objekt wurde aber nie ein Command zugeteilt.
    Das sollte zwar in Zeile 16 versucht werden, aber das ist halt nicht das Objekt cmd sondern Command (wo auch immer das her kommen mag)

    Da cmd.ExecuteReader in Zeile 18 keinen Command hat und der Reader auch gleich wieder unverrichteter Dinge geschlossen wird (Zeile 21: dreader.Close()) kann es auch keine Fehlermeldung geben.
    Es wurde ja nichts gemacht.

    Schau Dir bitte nochmal meinen Post an -> Problem beim Speichern von Daten
    Münze die MySql-Geschichten auf Deinen Datenbank-Adapter um. Das sollte rel. einfach zu bewerkstelligen sein.
    Ansonsten Poste bitte Deinen kompletten Code.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    3. Dim con As New SqlConnection
    4. Dim cmd As New SqlCommand
    5. Dim SQL As String
    6. con.ConnectionString = "DataSource = ADRESSE; Database = admtool; UID = BENUTZER; PWD = PASSWORT;"
    7. cmd.Connection = con
    8. con.Open()
    9. Try
    10. SQL = "UPDATE user SET Dienstgrad='" & text_rang.Text & "'"
    11. Command.Connection = con
    12. Command.CommandText = SQL
    13. Adapter.SelectCommand = Command
    14. dreader = cmd.ExecuteReader
    15. dreader.Close()
    16. con.Close()
    17. MessageBox.Show("Die Daten wurden erfolgreich gespeichert!", "Speichern", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1)
    18. Catch ex As Exception
    19. MessageBox.Show(ex.Message)
    20. End Try
    21. End Sub
    22. End Class

    @ErfinderDesRades:

    Es wird ja gar keine Methode zum schreiben aufgerufen.
    Der SQL-Query wird einem (nicht naeher ersichtlichen) Command zugeordnet und spaeter wird cmd.ExecuteReader definiert (aber nicht aufgerufen) und gleich danach wieder geschlossen.

    Da passiert einfach nichts, was Exceptions triggern könnte.