ResultSet.updateString läuft nicht

xrax

Erfahrenes Mitglied
Hallo zusammen,

ich weis nicht was hier falsch läuft und wäre für Hinweise dankbar.

Es geht mir darum einen Wert im ResultSet up zu daten ohne dies in der DB machen zu müssen.

Das Statement erzeuge ich so:

Code:
conn = DriverManager.getConnection("jdbc:mysql://" + host+ "/" + db,user,pass);
stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);
Meine UpDatversuch sieht so aus:

Code:
while(resSet.next()){
System.out.println("1.mid="+resSet.getString("mid"));
resSet.updateString("mid","abcdef");
System.out.println("2.mid="+resSet.getString("mid"));}
OUT:
1.mid=123456
2.mid=123456

Aber es müßte doch
2.mid=abcdef heissen.

Wo ist mein Fehler?

Gruß und Dank
xrax
 
Dir fehtl ein resSet.updateRow() um das ganze abzuschließen. Btw. DriverManager ist foo. Besser eine Implementierung von DataSource benutzen.

Gruß
Ollie
 
Hallo Oliver,

besten Dank für die schnelle Antwort.

Mit updateRow() schreibt er die Änderung in die DB.
Geht es nicht das ich die Änderung nur im resultSet halte, ohne änderung in der DB?


Gruß
xrax
 
Die Frage ist: Wozu? Wenn du die "geänderten" Informationen an einen Client zurückgeben willst, tust du das besser in einer "untechnischen" Datenstruktur. Zumindest mit einer, die nicht am JDBC Api hängt.

Du willst ja scheinbar effektiv gar kein update machen, daher ist der Ansatz diese Methode dafür zu nutzen grundsätzlich fragwürdig ;).

REINHAUN!
 
Fragwürdig finde ich eher das Verhalten dieser Methode .. Richtig (tm) wäre, wenn ich den gleichen Inhalt via get selbstverständlich erhalte, den ich vorher mit set dem "Update-Puffer" uebergeben habe. Manchmal finde ich es erstaunlich wie Java-Implementeure es schaffen an der Realität vorbei zu entwickeln :) Ich weiss du kannst auch nix für
 
NACK. Ich vermute, er benutzt einfach die API falsch. Ich hab es nicht ausprobiert, aber wenn das ResultSet mit dem Typ TYPE_SCROLL_INSENSITIVE erzeugt wird, ist das ResultSet laut API
...scrollable but generally not sensitive to changes made by others.
Meine Antwort bezog sich ja auf die Annahme, er würde über dieses Programmiermodell die DB updaten wollen.

Aber nochmal. Für mich ist das der falsche Hammer für den Nagel.
 
...scrollable but generally not sensitive to changes made by others.

Upps-, das hab ich nich gelesen :-(

Danke für die Hilfe. Der Denkanstoss hst mich zu einer besseren Lösung gebracht.

Gruß
xrax
 
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é
 
Zuletzt bearbeitet:
Zurück