MySQL nach UPDATE keine Daten mehr abrufbar

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    MySQL nach UPDATE keine Daten mehr abrufbar

    Hallo zusammen,

    ich bin neu hier, und auch ziemlich neu was VB angeht.

    Ich habe ein kleines Projekt bei dem ich Adressdaten aus einer mySQL Datenbank auslese, ggf. ändere
    und speichere. Das mache ich u.a. in einem einfachen Datagridview. Das abrufen und speichern der Daten funktioniert problemlos. Allerdings nachdem ich Daten über den DataAdapter per UPDATE Befehl gespeichert habe, werden keine Daten mehr angezeigt, auch nicht nach erneutem öffnen der Form. Erst nachdem ich das Pogramm neu debugge werden die Daten wieder angezeigt.
    Hier mal der Quellcode zum abrufen der Daten.

    VB.NET-Quellcode

    1. Conn.ConnectionString = dbconnect
    2. da = New MySqlDataAdapter("", Conn)
    3. da.SelectCommand.CommandText = "SELECT * FROM adressen"
    4. da.SelectCommand.CommandType = CommandType.Text
    5. dt = New DataTable("Ergebnis_adressen")
    6. ds.Tables.Add(dt)
    7. da.Fill(dt)
    8. Me.DataGridView1.DataSource = dt


    und hier der Code zum speichern:

    VB.NET-Quellcode

    1. Dim cmdb As MySqlCommandBuilder
    2. cmdb = New MySqlCommandBuilder(da)
    3. da.Update(dt)


    Hat jemand eine Idee warum die Daten nach Update nicht mehr geladen bzw. angezeigt werden?
    Wie gesagt abrufen (vor update) und speichern funktioniert problemlos.
    Danke im Voraus!
    vermutlich wird eine andere DataTable befüllt als jene, an die gebunden ist.
    Sowas hier:

    VB.NET-Quellcode

    1. dt = New DataTable("Ergebnis_adressen")
    2. ds.Tables.Add(dt)
    führt ziemlich sicher ins Chaos.
    Weisst du, was das Schlüsselwort New bewirkt?
    nach jedem Durchlauf hat ds nun eine befüllte DataTable mehr.
    Glaub ich wenigstens - könnte ja auch einen Fehler geben, weil die DataTables werden ja alle unter demselben Namen zugefügt. 8|

    ich empfehle immer, nur mit typisierten Datasets zu arbeiten, und keinesfalls zu versuchen, ein Dataset dynamisch aufzubauen.

    Entweder man generiert das typDataset aus einer Datenbank - das ist wohl die übliche Vorgehensweise: "Datenbank in 10 Minuten" auf Movie-Tuts

    Oder - was ich empfehle: man lässt die DB erstmal weg, und erstellt das Datenmodell im Dataset-Designer: Datenbänkerei-Einstieg
    Danke für die schnelle Antwort.

    Solange ich keinen Update Befehl abgesetzt habe, kann ich das Form öffnen und schliessen so oft
    ich will, das Datagridview wird immer wieder mit den Daten richtig gefüllt. Erst nach dem Update, und
    anschließendem erneutem öffnen der Form sind die Daten nicht mehr da, allerdings die Überschriften
    werden richtig dargestellt, was darauf hindeutet, dass die Verbindung zur Datenbank stattgefunden hat.

    DataAdapter, Dataset, Datatables, etc. werden alle innerhalb der Form deklariert. Sehe ich es richtig,
    dass diese nach schliessen der Form gelöscht werden? Somit dürften dann ja auch keinen doppelten
    Deklarationen beim erneuten öffnen vorkommen.

    Muss ich nach dem Update-Befehl noch irgendetwas machen?

    Hier nochmal der komplette Code des Forms

    VB.NET-Quellcode

    1. Imports MySql.Data.MySqlClient
    2. Public Class adressliste
    3. Dim Conn As New MySqlConnection
    4. Dim da As MySqlDataAdapter
    5. Dim ds As New DataSet
    6. Dim dt As New DataTable
    7. Private Sub adressliste_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    8. Conn.ConnectionString = dbconnet
    9. da = New MySqlDataAdapter("", Conn)
    10. da.SelectCommand.CommandText = "SELECT * FROM adressen"
    11. da.SelectCommand.CommandType = CommandType.Text
    12. dt = New DataTable("Ergebnis_adressen")
    13. ds.Tables.Add(dt)
    14. da.Fill(dt)
    15. Me.DataGridView1.DataSource = dt
    16. End Sub
    17. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    18. Dim cmdb As MySqlCommandBuilder
    19. cmdb = New MySqlCommandBuilder(da)
    20. da.Update(dt)
    21. End Sub
    22. End Class
    keine Ahnung - sieht harmlos aus. :|

    also bei Button1_Click - und - wups! - ist das DGV leer?
    ist ja irre.

    prinzipiell täte ich noch bisserl umstrukturieren, nämlich den CommandBuilder bereits im Form_Load auf den DataAdapter setzen.
    Ich weiß nicht wirklich, was passiert, wenn auf denselben DA immer ein neuer CommandBuilder aufgesetzt wird - ist auf jeden Fall unnötig.


    Aber bitte Frage beanworten: Click und wups, ja?
    Mit dem Commandbuilder habe ich geändert, danke!

    Die Daten sind erst weg, wenn ich das Form neu öffne. Solange ich das Form offen habe,
    sind die Daten da. Ich kann auch in einer Zeile etwas ändern, dann über den Button das
    Update auslösen, und anschließend in einer anderen Zeile etwas ändern, und wieder das
    Update auslösen. Die Daten landen immer richtig in der Datenbank.

    Einzig nachdem ich dann die Daten neu anzeigen lassen will, in diesem Fall über erneutes
    öffnen der Form, werden keine angezeigt.

    Ich bekomme beim erneuten öffnen der Form auch die Zeile für einen neuen Datensatz
    angezeigt, und kann diesen auch eingeben und speichern. Landet auch in der Datenbank.
    Ah!
    Vermutlich Installations-Problem.
    Ich hab glaub exakt dasselbe mit SqLite. Das scheint zunächst auch zu funzen, aber beim erneuten Datenabruf nach einem Update fliegt eine ObjectDisposed-Exception.

    Bei dir fliegt vmtl auch die ObjectDisposed-Exception, nur im Form_Load wird sie verschluckt.
    Verlege mal das Laden in einen weiteren Button-Click.

    (na, vermutlich ist vlt. übertrieben, aber immerhin eine Möglichkeit.)
    Mit dem weiteren Button habe ich ausprobiert, leider keine Änderung.

    Seltsamerweise werden die Daten nur nicht neu geladen, wenn auch Daten
    gespeichert wurden. Wenn ich den update Befehl absetze, ohne das Daten
    geändert wurden, sprich gespeichert werden, werden auch die Daten komplett
    wieder angezeigt.
    das mag daran liegen, dass, wenn keine Änderungen vorliegen, auch kein Command an die DB ausgeführt wird - Dataset hat ja eine Änderungsverfolgung.

    Aber bei dir kommt auch beim LoadDataButton_Click keine Exception (enttäuscht sei :wacko: ) Also Der Button soll die DataTable löschen und neu befüllen.
    Und wenn du dann LoadData clickst, eine Änderung machst, Update klickst, und dann wieder LoadData - dann sollte die Exception kommen.

    Was natürlich nix daran ändert, dass MySql bei dir spinnt.
    Weil bei mir funzen solche Sachen :P.
    Ich hab das Daten laden selber aus dem Formload genommen und auf einen eigenen Button
    gelegt, und zusätzlich einen Refresh button eingefügt. Beide Subs werden über Buttons
    ausgelöst. Leider keine Besserung :( :

    VB.NET-Quellcode

    1. Private Sub DataLoads()
    2. Conn.ConnectionString = dbconnet
    3. da = New MySqlDataAdapter("", Conn)
    4. da.SelectCommand.CommandText = "SELECT * FROM adressen"
    5. da.SelectCommand.CommandType = CommandType.Text
    6. dt = New DataTable("Ergebnis_adressen")
    7. ds.Tables.Add(dt)
    8. da.Fill(dt)
    9. Me.DataGridView1.DataSource = dt
    10. End Sub
    11. Private Sub DataRefresh()
    12. dt.Clear()
    13. Conn.ConnectionString = dbconnet
    14. da.SelectCommand.CommandText = "SELECT * FROM adressen"
    15. da.SelectCommand.CommandType = CommandType.Text
    16. Me.DataGridView1.DataBindings.Clear()
    17. da.Fill(dt)
    18. Me.DataGridView1.DataSource = dt
    19. End Sub


    Welchen mysql-connektor hast Du denn installiert?
    Ich nutze vb 2010 express!?
    ich auch 2010, aber mit x86-Prozessor.
    welchen Connector hab ich vergessen. Hab da auf der mySql-Site herumgeguckt, und was gesucht, was meinem System zu entsprechen schien.

    ah - sogar dafür ist der ObjectBrowser gut:
    C:\Program Files\MySQL\MySQL Connector Net 6.8.3\Assemblies\v4.0\MySql.Data.dll
    Es läuft !!! :D :D

    Ich hab den Connetor nochmal komplett deinstalliert, und von der mysql homepage geladen
    und neu installiert. Danach die mysql.data.dll komplett aus dem Projekt gelöscht, und aus dem Verzeichnis

    ..\MySQL Connector Net 6.8.3\Assemblies\v4.0\MySql.Data.dll

    wieder neu hinzugefügt.

    Vielen Dank für die Bemühungen!
    oh, gut!

    Wenn du jetzt noch dein Code anguckst, siehst du: Der ist total redundant.
    Du solltest die Konfiguration des Datasets und des DataAdapter in die Sub New legen, dass das ein für allemal abgehandelt ist, und da nix mehr dran gefummelt wird.
    Dann brauchst du zum Befüllen nur dt.Clear: adapter.Fill(dt) - und das kann sowohl im Form_load aufgerufen werden als auch im buttonClick.
    und zum Speichern nur: adapter.Update(dt)