MySQL Update - Daten überschreiben alle Datensätze

  • SQL

Es gibt 41 Antworten in diesem Thema. Der letzte Beitrag () ist von Marcus Gräfe.

    MySQL Update - Daten überschreiben alle Datensätze

    Hallo ihr lieben,

    ich habe da mal wieder ein Problem ^^ Ich stehe wie ein Ochse vor dem Berg und komme nicht auf den Fehler?

    Aber erstmal ein paar Infos zum Programm.

    Das ganze soll zu Speichern von Kundendaten dienen. In VB2010 Express erstellt. Und die Datenbank ist eine MySQL Datenbank bei all-inkl.com (nur für Testzwecke) Später soll diese auf dem Lokalem Homeserver laufen.

    Alles läuft, also keine Probleme, bis auf die Sache, dass ich die Kundendaten zwar verändern kann, aber das Update überschreibt alle Daten in der Datenbank mit dem Ausgewählten Daten.

    Heißt, Kunde A wird bearbeitet und gespeichert. Danach haben alle weiteren Kunden alle Daten von Kunde A und nicht mehr ihre eigene?

    Der Update Code schaut so aus:

    VB.NET-Quellcode

    1. open()
    2. Try
    3. SQL = "UPDATE daten set name='" & text_name.Text & "', an='" & text_an.Text & "', ort='" & text_ort.Text & "', plz='" & text_plz.Text & "', tele='" & text_tele.Text & "', mobil='" & text_mobil.Text & "', email='" & text_email.Text & "', geb='" & text_geb.Text & "', kfz='" & text_kfz.Text & "', marke='" & text_marke.Text & "', gestell='" & text_gestell.Text & "', bau='" & text_bau.Text & "'"
    4. Command.Connection = MySql
    5. Command.CommandText = SQL
    6. Adapter.SelectCommand = Command
    7. Data = Command.ExecuteReader()
    8. Data.Close()
    9. MySql.Close()
    10. MsgBox("Die Daten wurden erfolgreich bearbeitet", vbInformation, "Erfolg")
    11. Catch ex As Exception
    12. MsgBox(ex.Message, vbCritical, "Fehler")
    13. End Try


    Ich denke mal, das kann wohl keine große Sache sein, scheinbar mach ich hier aber was falsch? :S

    Die Datenbank hat am Anfang die id (welche Automatisch immer erhöht wird, sodass man dort keine Nummer eingeben muss) daher erscheint diese nicht im Quelltext. Aber auch beim test diese Manuell zu ändern, hatte es den gleichen fehler.

    Hier die DB: (Image)
    lovoyu.de/db.png

    Daten können abgeändert werden, aber wie gesagt, diese werden dann in alle Datensätze geschrieben? Und somit alle Daten verfälscht. Habt ihr eine Idee?
    Ihr sucht Webspace für eure Projekte? Dann sagt bescheid - kostenfrei und ohne Werbung!
    Da fehlt eine Where-Bedingung! Ohne Where werden natürlich alle Daten upgedated.
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    Ok ich versuche das ganze mit ID weil diese Zuordnug eindeutig ist.

    Allerdings mag der Code meine Erweiterung nicht (WHERE id = `id`) da ich hinter dem Code dieses Where gesetzt habe. Leider bin ich jetzt nur mit dem Phone Online aber ich versuche den Code mal zu posten:


    SQL = "UPDATE daten set name='" & text_name.Text & "', an='" & text_an.Text & "', ort='" & text_ort.Text & "', plz='" & text_plz.Text & "', tele='" & text_tele.Text & "', mobil='" & text_mobil.Text & "', email='" & text_email.Text & "', geb='" & text_geb.Text & "', kfz='" & text_kfz.Text & "', marke='" & text_marke.Text & "', gestell='" & text_gestell.Text & "', bau='" & text_bau.Text &, WHERE id='id'"'"

    Und hier sagt er dann eine end off Anweisung erwartet. Aber warum? Die Where Anweisung kommt doch in die diese Anweisung rein? Das finde ich jetzt verwirrend ^^
    Ihr sucht Webspace für eure Projekte? Dann sagt bescheid - kostenfrei und ohne Werbung!
    Setz mal ein Breakpoint und schau dir den Wert die Variable SQL an.
    Hint: , und Leerzeichen

    Tipp & Trick: DbParameter
    Hey @chenjung
    Also die Stelle wird es wohl sein
    , WHERE id='id'"'"
    Das Komma ist überflüssig an dieser Stelle, da wir keine weiteren Parameter übergeben bzw. keine weiteren Spalten updaten. Deswegen die End Off Anweisung.
    Mit der ID musst du auch nochmal schauen, momentan würde ja statisch "id" drin stehen, in deinem String. ('" & id & "'")
    Aber wie Slice gesagt hat, schau dir mal den String an der in deiner SQL - Variable steht, kopier diesen und versuch über das Management Studio mal den Befehl abzufeuern.

    Gruß,
    Drahuverar
    Option Strict On!
    Danke für eure Antworten, ich werd das nacher mal testen und melde mich dann noch mal :)

    PS: habe die Leerzeichen zwischen den , entfernt. Nun werden die Daten zwar nicht mehr gelöscht aber abändern geht noch nicht so ganz. ^^

    VB.NET-Quellcode

    1. SQL = "UPDATE daten SET name='" & text_name.Text & "',an='" & text_an.Text & "',ort='" & text_ort.Text & "',plz='" & text_plz.Text & "',tele='" & text_tele.Text & "',mobil='" & text_mobil.Text & "',email='" & text_email.Text & "',geb='" & text_geb.Text & "',kfz='" & text_kfz.Text & "',marke='" & text_marke.Text & "',gestell='" & text_gestell.Text & "',bau='" & text_bau.Text & "',lass='" & Text_lass.Text &[u] "' WHERE name = 'name'"[/u]



    Update: Es geht nun. Keine Ahnung wie, aber es geht xD
    Ihr sucht Webspace für eure Projekte? Dann sagt bescheid - kostenfrei und ohne Werbung!

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „chenjung“ ()

    Fragst du jetzt nur den Namen ab? Was ist, wenn mehrere denselben Namen haben? Da würde ich ein eindeutiges Feld nehmen, wie eben die ID.
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    Ohje, mit solche einer Haltung sollte man m.M.n. niemals anfangen eine Anwendung zu schreiben.
    Sieh es lieber so: Mach es "richtig" und lerne daraus für die Zukunft, selbst wenn es nur ein kleines Programm für dich alleine ist.
    @slice das Problem ist: wenn man das Ganze z.b. mit PHP löst, dann muss man immer mit dem Server verbunden sein, wenn das nicht gegeben ist, funktuoniert die Anwendung nicht, aber man sollte dann den Benutzer sich anmelden lassen anstatt die Anmeldedaten Hardcoded im Code zu speichern.

    Lg Mokki
    ​Smartnotr - ein intelligentes Notizprogramm
    zum Thread

    @Mokki Ich hab ja nicht von irgendeinem zwischen Layer gesprochen, sondern eben von den Punkt mit "Passwörter/Zugangsdaten im Code". Ebenso die Art wie der Query zusammen gebaut wird, da Fehler zu finden, oder zu verstehen warum ein Fehler "aufeinmal" gelöst ist, ist extrem schwierig. Gerade deswegen hab ich den DbParamerter Link gepostet, im schlimmsten Fall kann man auch noch mit String.Format arbeiten, aber das Konstrukt oben ist die reinste Hölle.

    chenjung schrieb:

    das ist bisher die Lösung -> "' where name='" & ListBox1.Text & "'"

    Warum nimmst du denn jetzt nicht die ID? Wie gesagt, der Name ist eine ganz schlechte Idee für so ein Update. Dir liegt doch sicher die ID des aktuellen Datensatzes vor, den der User bearbeitet.
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    Zur Zeit stehe ich wie ein Ochse vor dem Berg ^^

    Habe auf einer neuen Form 2 Listboxen (1. Kundendaten und die 2. Dienstleistungen - als Pakete bezeichnet, da diese die KFZ Reinigungsdienste beschreiben).

    Soweit alles gut, beim Starten werden die beiden Auswahlboxen mit Infos gefüllt (sprich die Datensätze werden geladen). Soweit so gut, allerdings, kann ich bei den Pakten keine Daten in die Textbox laden? Bei den Kundendaten geht es gut, aber nur bei den KFZ Pakten nicht?

    Hier die beiden Listboxen

    VB.NET-Quellcode

    1. Private Sub Form4_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    2. open()
    3. If open() = True Then
    4. SQL = "select * FROM daten"
    5. Command.Connection = MySql
    6. Command.CommandText = SQL
    7. Adapter.SelectCommand = Command
    8. Data = Command.ExecuteReader()
    9. Do While Data.Read
    10. ListBox1.Items.Add(Data("name").ToString)
    11. Loop
    12. Data.Close()
    13. MySql.Close()
    14. Else
    15. 'button_add.Enabled = False
    16. 'Button2_Click.Enabled = False
    17. button_select.Enabled = False
    18. MsgBox("Digga, da stimmt was nicht :(", vbCritical, "Fehler")
    19. End If
    20. If open() = True Then
    21. SQL = "Select * FROM autopaket "
    22. Command.Connection = MySql
    23. Command.CommandText = SQL
    24. Adapter.SelectCommand = Command
    25. Data = Command.ExecuteReader()
    26. Do While Data.Read
    27. ListBox2.Items.Add(Data("paname").ToString)
    28. Loop
    29. Data.Close()
    30. MySql.Close()
    31. Else
    32. 'button_add.Enabled = False
    33. 'Button2_Click.Enabled = False
    34. Button_sel2.Enabled = False
    35. MsgBox("Digga, da stimmt was nicht :(", vbCritical, "Fehler")
    36. End If
    37. End Sub


    Und hier der die Buttons:

    Kundendaten laden und die in die Textboxen füllen (geht Einwandfrei)

    VB.NET-Quellcode

    1. Private Sub Button_select_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_select.Click
    2. open()
    3. Try
    4. SQL = "Select * FROM daten where name='" & ListBox1.Text & "'"
    5. Command.Connection = MySql
    6. Command.CommandText = SQL
    7. Adapter.SelectCommand = Command
    8. Data = Command.ExecuteReader()
    9. If Data.HasRows Then
    10. Data.Read()
    11. text_kunr.Text = Data("kunr").ToString
    12. text_name.Text = Data("name").ToString
    13. text_an.Text = Data("an").ToString
    14. text_ort.Text = Data("ort").ToString
    15. text_plz.Text = Data("plz").ToString
    16. End If
    17. Data.Close()
    18. MySql.Close()
    19. Catch ex As Exception
    20. End Try
    21. End Sub


    Der 2. Button welcher die Pakte laden soll, was nicht gehen will (keine Fehlermeldung oder der gleichen!)

    VB.NET-Quellcode

    1. Private Sub Button_sel2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_sel2.Click
    2. open()
    3. Try
    4. SQL = "Select * FROM autopaket where paname='" & ListBox1.Text & "'"
    5. Command.Connection = MySql
    6. Command.CommandText = SQL
    7. Adapter.SelectCommand = Command
    8. Data = Command.ExecuteReader()
    9. If Data.HasRows Then
    10. Data.Read()
    11. text_pabe.Text = Data("pabe").ToString
    12. End If
    13. Data.Close()
    14. MySql.Close()
    15. Catch ex As Exception
    16. MsgBox(ex.Message, vbCritical, "Fehler")
    17. End Try
    18. End Sub


    Ich seh den Wald vor lauter Bäumen nicht mehr ^^
    Ihr sucht Webspace für eure Projekte? Dann sagt bescheid - kostenfrei und ohne Werbung!

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

    Was macht die Funktion open?


    Zudem bzgl. Funktionsaufruf:

    chenjung schrieb:

    If open() = True Then


    Wenn du per IF den Rückgabewert einer Funktion abfragst, wird diese ebenfalls ausgeführt.

    Sprich

    chenjung schrieb:

    open()
    If open() = True Then ...
    If open() = True Then ...


    Du rufst hier die funktion 3x auf. So gewollt?

    Ansonsten: Hast du in der Datenbank beim Ausführen von "Select * FROM autopaket" Datensätze die zurückgegeben werden + eine Spalte names "paname"?


    generell ist dein Code zu verbessern. - aber gerade keine Zeit zum Ändern.
    Wenn das Leben wirklich nur aus Nullen und Einsen besteht, dann laufen sicherlich genügen Nullen frei herum. :D
    Signature-Move 8o
    kein Problem mit privaten Konversationen zu Thema XY :thumbup: