Datumsänderungen werden in MySql nicht übernommen

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

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von 3daycliff.

    Datumsänderungen werden in MySql nicht übernommen

    Hallo, vielleicht kann mir jemand weiterhelfen, ich habe mich in den letzten zwei Tagen durch die Doku von MySql und anderen Dingen gewühlt, aber habe bisher keine Lösung oder wenigstens eine Erklärung gefunden. Folgendes Problem, das in einem anderen Projekt auftrat und das ich in einer Demoanwendung nachstellen konnte:

    Eine MySQl-DB enthält eine Tabelle mit vier Rows: ID, name, datum, datum_geaendert.

    datum ist DATETIME mit Default Now(), datum_geandert ist TIMESTAMP mit Default CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

    Damit ist eigentlich schon klar, was passieren soll: in datum_geaendert soll automatisch das aktuelle Datum eingetragen werden, wenn ein Eintrag in derselben Zeile geändert wurde.

    Beim initialen Befüllen der Tabelle läuft alles korrekt: in datum und datum_geaendert wird das korrekte Datum eingetragen.

    Wenn ich vom Prompt aus den MySQL-Server konnektiere und per Update einen Eintrag in "name" ändere, läuft alles, wie es soll:

    "name" wird geändert, "datum_geaendert" ebenfalls und "datum" bleibt, wie es war.

    Dasselbe korrekte Verhalten passiert, wenn das über eine MySQL-GUI, z.B. die Workbench oder SqlYog, mache.

    Dann habe ich das alles in eine VB.Net-Anwendung gepackt:

    Zuerst schmutzig und nicht parametrisiert: Button und Textbox auf die Form gezogen, im Button die mysql-Connection und den sql-update-String definiert, damit die Eingabe in der Textbox in die Spalte "name" geschrieben wird. Der Update-String geht nur in die Spalte "name", die "datum" und "datum_geandert" werden nicht angesprochen.

    Klappt einwandfrei, das Datum in "datum_geaendert" wird aktualisiert, das Datum in "datum" bleibt unverändert.

    So weit, so gut.

    Dann habe ich ein Dataset erstellt, ein Datagridview auf die Form gezogen, Bindingsource, Tableadapter usw. werden generiert.

    Im usercode steht auch brav bindingsource.EndEdit und tableadapter.Update(dataset).

    Gestartet, in der Spalte "name" etwas geändert, zur sicherheit eine andere Spalte im DGV auch noch angeklickt und dann gespeichert.

    Blick in die Datenbank: "name" wurde geändert, aber datum_geaendert nicht. Anders gesagt: CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP wurde nicht ausgeführt.

    Und ich habe keine Ahnung, warum das schmutzig und zu Fuß funktioniert, über ein Dataset bzw. ein DGV nicht.

    Wie immer dankbar für jeden Hinweis,
    Gruß, Volkmar

    Volkmar schrieb:

    Und ich habe keine Ahnung, warum das schmutzig und zu Fuß funktioniert, über ein Dataset bzw. ein DGV nicht.

    Ich spekuliere mal: Intern produziert das ganze Binding-Geraffel vermutlich immer so etwas in der Art wie UPDATE ... SET name = ?, datum_geaendert = ?, ... und schon ist MySQL das ON UPDATE CURRENT_TIMESTAMP egal, weil explizit ein Wert angegeben wurde. Ohne das jetzt getestet zu haben, könntest du versuchen, das Feld vor dem eigentlichen update auf NULL zu setzen.