Java OraclePreparedStatement Problem

Helios co.

Lt. Commander
Registriert
März 2005
Beiträge
1.863
Hallo @all,

folgender Codeschnippselzeigt wo mein Problem ist:
Code:
String selectQuery = "select id from tabelle where term = '"+term+"'";

OraclePreparedStatement ps   =(OraclePreparedStatement)oracon.prepareStatement(selectQuery);
		ResultSet rset = ps.executeQuery();

Das Ding klappt so weit auch, aber wenn der Term beispielsweise wie folgt aussieht:
Code:
I've
dann kriege ich eine Exception:
Code:
ORA-00933: SQL-Befehl wurde nicht korrekt beendet

Mir ist schon klar warum es dazu kommt. Dummerweise ist " ' " im "I've zugleich ein gültiges Symbol in der Query. Dadurch wird die Query falsch.

Meine Frage ist nun, ob es eine Alternative bzgl. des "I've" gibt? Natürlich außer den Term zu löschen ;)
 
Mhh meine Idee wäre es beim Eintragen abzufangen und zu ersetzten... Vielleicht gibts auch ne Funktion dafür oder ähnliches.
 
Das ist nicht ganz Sinn und Zweck des PreparedStatements :)

Ich habe schon lange nichts mehr mit Datenbanken gemacht, aber setString sollte den übergebenen String eigentlich entsprechend escapen...

Code:
String selectQuery = "select id from tabelle where term = ?";

OraclePreparedStatement ps = (OraclePreparedStatement)oracon.prepareStatement(selectQuery);

ps.setString(1, term);

ResultSet rset = ps.executeQuery();
 
Mhh meine Idee wäre es beim Eintragen abzufangen und zu ersetzten.
Hmm jap, das ist so die letzte BruteForce Methode. Wenn garnix gehen sollte werde ich es auch so versuchen müssen :(


Das ist nicht ganz Sinn und Zweck des PreparedStatements
Wieso nicht? Es ist doch für das massenweiseEInfügen oder Selecten von Daten gedacht und dass ohne komplexeQuery Definitionen.

Welceh Alternative für das beschriebene Szenario gibt es sonst?


aber setString sollte den übergebenen String eigentlich entsprechend escapen...
Leider nicht. Das Prob liegt definitiv an dieser Stelle. Wenn ich den so erstellen Query-String ausgebe ist der Fehler direkt sichtbar :(

Schon mal einen Dank für eure Vorschläge!
 
Helios co. schrieb:
Wieso nicht? Es ist doch für das massenweiseEInfügen oder Selecten von Daten gedacht und dass ohne komplexeQuery Definitionen.

Ja, das ist richtig, wenn du bind variables (die Fragezeichen im SQL) verwendest. Dann muss die DB den String nicht erneut parsen. Zudem speichert die DB das Statement mit dem Ausführungsplan ab und verwendet dieses dann wieder. Wenn du den SQL String aber selbst zusammenschusterst, dann nicht.

Helios co. schrieb:
Leider nicht. Das Prob liegt definitiv an dieser Stelle. Wenn ich den so erstellen Query-String ausgebe ist der Fehler direkt sichtbar :(

Schon mal einen Dank für eure Vorschläge!

Ob setString die Strings escaped hängt meines Wissens vom Datenbanktreiber ab und ist nicht einheitlich geregelt. Kommt denn nach wie vor "ORA-00933: SQL-Befehl wurde nicht korrekt beendet"?
 
Ja es kommt im Prinzip weiterhin. Meine primitive Lösung ist jetzt die, dass ich statisch den Term bevor er in die Query gesetzt wird überprüfe. Hat der der Term irgendwelceh unerwünschte Zeichen werden diese entfernt.

Das tötet die gesamte Performance, aber etwas besseres ist mir leider nicht eingefallen bis jetzt :(
 
Im Prinzip?!? Kommt nun der gleiche Fehler oder nicht?

Ich habe mal einen Blick in die Doku geworfen: http://download.oracle.com/docs/cd/...l/Statement.html#setEscapeProcessing(boolean)

setEscapeProcessing steuert, ob ein String escaped wird oder nicht. Da es default-mäßig an ist, sollte es das eigentlich auch tun... Und da PreparedStatements u.a. verwendet werden, um SQL-Injections zu vermeiden, sollte setString sich auch um die Quotes kümmern...
 
Wie gesagt, ich fange die Terme ab, die zu dem Fehler führen. Damit ist der Fehler so nicht mehr da und es funzt alles prima. Aber es ist keine gute Lösung!
 
Zurück
Oben