Daten aus Datagridview in MySQL Datenbank speichern

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von Philipp.

    Daten aus Datagridview in MySQL Datenbank speichern

    Guten Abend,


    ich stehe auf dem Schlauch, aber eigentlich kann es nicht mehr weit sein, denn es funktioniert schon so gut wie...

    Also: Ich möchte eine Datenbanktabelle in ein Datagridview laden, verändern und anschließend auf dem Server speichern. Lokale Geschichten und Datasets habe ich mittlerweile ganz gut hinbekommen - aber hier scheitert es die ganze Zeit...

    Ich benutze für die MySQL Datenbank eine MariaDB - Ist ja quasi MySQL und ich hoffe, dass nicht hier das Problem liegt. Würde mich wundern...

    Zunächst mal mein Code:

    VB.NET-Quellcode

    1. Imports MySql
    2. Imports MySql.Data
    3. Imports MySql.Data.MySqlClient
    4. Dim con As MySqlConnection
    5. Dim ada As New MySqlDataAdapter
    6. Dim table As New DataTable
    7. Dim bSource As New BindingSource
    8. Dim cmd As MySqlCommand
    9. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    10. con = New MySqlConnection
    11. con.ConnectionString = "server=192.168.178.2;userid=User;password=Passwort;database=TestDB"
    12. Try
    13. con.Open()
    14. Dim query As String
    15. query = "select * from TestDB.Test"
    16. cmd = New MySqlCommand(query, con)
    17. ada.SelectCommand = cmd
    18. ada.Fill(table)
    19. bSource.DataSource = table
    20. DataGridView1.DataSource = bSource
    21. ada.Update(table)
    22. con.Close()
    23. Catch ex As Exception
    24. MessageBox.Show(ex.Message)
    25. Finally
    26. con.Dispose()
    27. End Try
    28. End Sub
    29. Private Sub Button1_Click_1(sender As Object, e As EventArgs) Handles Button1.Click
    30. Try
    31. con.Open()
    32. DataGridView1.EndEdit()
    33. table.AcceptChanges()
    34. ada.Update(table)
    35. con.Close()
    36. Catch ex As Exception
    37. MessageBox.Show(ex.Message)
    38. Finally
    39. con.Dispose()
    40. End Try
    41. End Sub
    42. End Class


    Das Laden der Daten ins Datagridview klappt wunderbar. Genau so wie ich es mir vorstelle. Das Speichern der Daten funktioniert gar nicht :o Und ich verstehe nicht warum - Ich benutze die Update Methode in der ich die entsprechend einsetze -> Eigentlich ja selbsterklärend. Aber doch klappt es nicht...


    Ich hoffe ihr könnt mir fix auf die Sprünge helfen.

    Grüße
    Philipp


    Edit: Bezüglich der Zugangsdaten im Code: Ja das ist sicher nicht das eleganteste... Es handelt sich um eine Anwendung im lokalen Netzwerk und ist daher - meiner Meinung nach erstmal verkraftbar. Falls man dieses Problem "einfach" beheben kann bin ich da gerne offen -> Der Umweg über ein PHP Script oder ähnliches würde vermutlich den vb.Net Code deutlich komplizierter machen, wenn ich mich nicht irre. Außerdem bin ich mit php nicht so bewandert... :)

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

    weisst du, was .AcceptChanges() macht?
    Lass mich raten: Nein, du weisst es nicht.
    Also weg damit - und - oh wunder! - alles gut.

    (die Lehre fürs Leben daraus: Was du nicht kennst, davon Doku lesen oder nicht verwenden.)

    Falls .AcceptChanges() dich interessiert, und Doku unverständlich: einfach fragen
    Ich muss mich outen, dass ich obwohl ich die (übersetzte) Doku gelesen habe auch nicht verstehe, warum das nicht funktioniert.
    Nun habe ich in einem StackOverflow-Beitrag folgenden Hinweis gefunden, mit dem kann ich mir erklären was Du meinst.
    The purpose of AcceptChanges() is to let the DataTable know that its data has been saved to the database.

    Nur warum bringt MS es nicht hin, verständliche Erklärungen abzuliefern? Das war eine rethorische Frage.
    Da widerspreche ich und bin der Meinung, dass die Aussage von Mikrosaft näher an der (vollständigen) Wahrheit dran ist.
    Letztenendes muss man m.E. wissen, was einem die DataTable antworten würde, wenn man sie fragt, ob es irgendwelche Änderungen gab. Wie lautet die Antwort, wenn:
    • das Programm gestartet wird und die Tabelle leer ist
    • wenn sie mit Daten befüllt wird
    • wenn man .AcceptChanges() aufruft
    Sobald man die richtigen Antworten kennt, weiß man auch, warum sich das Programm ggf. anders verhält als man es erwartet. Denn letztenendes sollte man sich nicht nur als Programmierer die o.g. Frage(n) stellen, sondern im Programm wird auch von anderer Seite diese Frage an die DataTable gestellt und aufgrund der Antwort entsprechend weiterverfahren.
    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.

    Dksksm schrieb:

    The purpose of AcceptChanges() is to let the DataTable know that its data has been saved to the database.
    Jo, dassis absolut richtig, und wie du richtig bemerkst, gleichzeitig auch (absolut) unverständlich - gut, dass du nachfragst.
    Also wenn die DataTable "weiss", dass ihre Daten in der Datenbank gespeichert sind, dann folgt daraus für den TableAdapter, dass er diese Datatable nicht mehr updaten muss.
    Logisch, oder?
    Und das Ergebnis ist eben, dass wenn du .AcceptChanges aufrufst, dass dann der DataAdapter diese Änderungen nicht mehr abschickt.
    Daher wie gesagt:

    ErfinderDesRades schrieb:

    Also weg damit - und - oh wunder! - alles gut.
    Hast du das mal ausprobiert?



    Übrigens der DataAdapter, nachdem er die DataTable-Änderungen dann doch verschickt hat - weil du .AcceptChanges rausgenommen hast - er ruft dann selbständig .AcceptChanges auf.
    In anneren Worten: .AcceptChanges() ist eine Methode nur für den internen Gebrauch - für Programmierer eiglich nicht vorgesehen, ausser in Spezialfällen.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Vielen Dank, für den Hinweis mit dem .AcceptChanges - ich habe die doku dazu zwar gelesen aber offensichtlich falsch verstanden. Na klar.

    Wenn ich den Code unverändert lasse und ausschließlich die Zeile mit accept changes rauslasse kommt folgende Fehlermeldung, nachdem ich eine Zeile im Datagridview bearbeitet habe und dann auf "Update" klicke:

    "Für ein Update ist ein gültiger UpdateCommand erforderlich, wenn eine DataRow-Sammlung mit modifizierten Zeilen weitergegeben wird."


    Es funktioniert also leider immernoch nicht -> Der Updatecommand ist also offenbar nicht gültig. Ist dort etwas mit der DataTable nicht richtig umgesetzt... :o

    Danke auf jedenfall schonmal mit dem Hinweis, dass .AcceptChanges hier überhaupt nicht das macht was ich erwartet habe... :o

    Grüße
    Philipp
    Jo, damit bist du einen Schritt weiter.
    Nun musst du allerdings Datenbank-Grundlagen lernen: Eine Datenbank-Tabelle, die keinen Primärschlüssel definiert hat, ist grundsätzlich nicht updateable.
    Daher hat der DataAdapter vmtl. kein UpdateCommand, und daher die Fehlermeldung.
    Datenbank-Basics ganz allgemein, zum Wesen des Primärschlüssels: Grundlagen: Relationale Datenmodellierung
    Daraus folgt (vermutlich), dass du deiner Db-Tablelle einen PrimKey verpassen musst.
    Datenbankseitig habe ich meiner Datenbank einen Primärschlüssel verpasst, also Primärschlüssel und Autoinkrement.
    Muss ich diesen meinem Skript noch extra mitteilen? Ich bin davon ausgegangen, dass mir das der Adapter abnimmt.

    Wie gesagt: ich nutze MariaDB - ich sag es nur dazu falls daher Probleme rühren könnten.
    Jo, glaub, du musst noch einen CommandBuilder erstellen, ähnlich so:

    VB.NET-Quellcode

    1. '[myAdp As MySqlDataAdapter]
    2. dim cmb = New MySqlCommandBuilder(myAdp)
    Genaue Syntax musst iwie ausse Doku rauskriegen, oder aus ObjectBrowser.
    Muss man nix mit machen - einfach den CommandBuilder mit dem DataAdapter erstellen, und dann hat letzterer auf einmal UpdateCommand, DeleteCommand, InsertCommad

    ErfinderDesRades schrieb:

    einfach den CommandBuilder mit dem DataAdapter erstellen, und dann hat letzterer auf einmal UpdateCommand, DeleteCommand, InsertCommad<br />



    Jo. Das wars. In meinem Fall:

    VB.NET-Quellcode

    1. dim cmb = New MySqlCommandBuilder(ada)


    *Vollzitat entfernt und CodeTag gesetzt* ~NoFear23m

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Nofear23m“ ()