Hallo zusammen ^^,
eigentlich will ich keine Leichen wiederbeleben ABER .... ähnliches Problem, welches ich nicht verstehe.
Ich verwende jdbc4 und java 1.7 EDIT: und MSsql ... glatt vergessen
Das ResultSet wird so erzeugt:
Code:
createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
Änderungen werden z.B. via
Code:
updateString("B_Vorwort", editorPaneVorwort.getText());
eingefügt.
Laut Beschreibung müssten die Änderungen, wie oben bereits von xrax angenommen, durch eine Abfrage des ResultSet erkennbar sein... sind sie aber nicht. Es wird der "alte" Wert zurückgegeben. (noch nicht das eigentliche Problem...)
Fall 1:
Jemand ändert den Datensatz auf der Datenbank, in diesem Fall das Vorwort, von z.B. "Test" auf "Test2".
Jetzt wird das Vorwort von der Java-Anwendung aus auf "Test Hallo" geändert und anschließend gespeichert in dem das ResultSet updateRow() ausführt.
Hier das erste problem: updateRow() wird ausgeführt ohne eine Fehler zu melden. Lädt die Java-Anwendung den Datensatz neu, steht "Test2" im ResultSet -> die Änderung via updateRow() ist also nicht angekommen.
Zu diesem Problem habe ich keine Info gefunden, nicht einmal im Ansatz.
Dann habe ich ein wenig experimentiert und konnte das Problem zufällig umgehen, was aber weitere Fragen aufwirft.
Fall 2:
Jemand ändert den Datensatz auf der Datenbank, in diesem Fall das Vorwort, von z.B. "Test" auf "Test2".
Jetzt wird das Vorwort von der Java-Anwendung aus auf "Test Hallo" geändert.
Code:
System.out.println(rst.getString("b_vorwort"));
rst.refreshRow();
System.out.println(rst.getString("b_vorwort"));
rst.updateRow();
erwartet hätte ich jetzt als erste Ausgabe "Test", gefolgt von "Test2" um dann nach dem updateRow() wieder "Test2" zu sehen.
Die erste Ausgabe gibt den zu erst geladenen Inhalt wieder (egal ob updateString() was in das ResultSet geschrieben haben soll... hatten wir ja oben schon)
Dann müsste refreshRow() die aktuellen Daten von der Datenbank holen, also "Test2".
Ein updateRow() müsste also entweder gar nicht oder aber alte Daten in die Datenbank schreiben.
Das Ergebnis sieht etwas anders aus: "Test" -> "Test2" -> "Test Hallo"
Laut Beschreibung müsste das refreshRow() auf dem ResultSet jedoch jedes updateXXX() was vor dem updateRow() ausgeführt wurde, verwerfen. Tut es aber nicht.
Mir kam in den Sinn, dass der Aufruf von refreshRow() vielleicht bei der Verbindung etwas wiederherstellt, was durch die Manipulation auf der DB kaputt gegangen sein könnte. Daher habe ich mal probiert updateRow() zwei mal hintereinander auszuführen, aber ohne erfolg. Die Daten, nach Manipulation auf der DB, werden nur geschrieben wenn ich vorher das refreshRow() aufrufe.
Ich bin zwar glücklich dass das Programm oberflächlich tut was es soll, aber unzufrieden mit der Lösung und dem riesen Fragezeichen.
Hoffe jemand kann da ein wenig Licht ins Dunkel bringen...
Gruß
André