Frage

Ich habe versucht, den folgenden Code ein, um herauszufinden, warum ist nicht alle Daten in meinem ResultSet zu erzeugen:

String sql = "SELECT STUDENT FROM SCHOOL WHERE SCHOOL = ? ";
PreparedStatement prepStmt = conn.prepareStatement(sql);
prepStmt.setString(1, "Waterloo");
ResultSet rs = prepStmt.executeQuery();

Auf der anderen Seite sind die folgenden Läufe richtig:

String sql = "SELECT STUDENT FROM SCHOOL WHERE SCHOOL = 'Waterloo' ";
PreparedStatement prepStmt = conn.prepareStatement(sql);
ResultSet rs = prepStmt.executeQuery();

Der Datentyp für die Schule ist CHAR (9 Byte). Statt setString, habe ich auch versucht:

String sql = "SELECT STUDENT FROM SCHOOL WHERE SCHOOL = ? ";
PreparedStatement prepStmt = conn.prepareStatement(sql);
String school = "Waterloo";
Reader reader = new CharArrayReader(school.toCharArray());
prepStmt.setCharacterStream(1, reader, 9);
prepStmt.setString(1, "Waterloo");
ResultSet rs = prepStmt.executeQuery();

bin ich ganz fest, was als nächstes zu untersuchen; der Eclipse-Debugger sagt die SQL-Abfrage nicht einmal nach setString oder setCharacterStream nicht ändert. Ich bin mir nicht sicher, ob es ist, weil Parameter Einstellung nicht funktioniert, oder wenn der Debugger einfach keine Änderungen in der PreparedStatement abholen.

Jede Hilfe wird sehr geschätzt, danke!

War es hilfreich?

Lösung

Ich denke, das Problem ist, dass Ihr Datentyp CHAR (9) und „Waterloo“ hat nur 8 Zeichen. Ich gehe davon aus, dass dies die erwarteten Ergebnisse (LIKE und%) zurück. Oder fügen Sie den fehlenden Raum.

String sql = "SELECT STUDENT FROM SCHOOL WHERE SCHOOL LIKE ? ";
PreparedStatement prepStmt = conn.prepareStatement(sql);
prepStmt.setString(1, "Waterloo%");
ResultSet rs = prepStmt.executeQuery();

Der beste Weg, um zu verwenden varchar würde statt verkohlen, wenn Ihre Strings haben eine flexible Länge. Dann würde der PreparedStatement wie erwartet.

Eine Abhilfe wäre die Oracle-spezifische setFixedCHAR Methode zu verwenden (aber es ist besser, den Datentyp varchar, wenn möglich, zu ändern).

Im Folgenden ist von Oracle PreparedStatement JavaDoc:


CHAR-Daten in der Datenbank ist mit der Spaltenbreite aufgefüllt. Dies führt zu einer Einschränkung der setCHAR () Methode zu binden Zeichendaten in die WHERE-Klausel einer SELECT-Anweisung in Verwendung - die Zeichendaten in dem WHERE-Klausel auch auf die Spaltenbreite aufgefüllt werden muss, um eine Übereinstimmung in der SELECT-Anweisung zu erzeugen. Dies ist besonders problematisch, wenn Sie nicht die Spaltenbreite kennen.

setFixedCHAR () Heilmittel dies. Diese Methode führt einen unwattierter Vergleich.

Weitere Informationen:

  • Denken Sie daran, Ihre vorbereitete Anweisung Objekt OraclePreparedStatement werfen die setFixedCHAR () -Methode zu verwenden.
  • Es besteht keine Notwendigkeit setFixedCHAR () für eine INSERT-Anweisung zu verwenden. Die Datenbank immer automatisch die Daten an die Spaltenbreite Pads, wie sie es einfügt.

Das folgende Beispiel zeigt den Unterschied zwischen der setString (), setCHAR () und setFixedCHAR () Methoden.

// Schema is : create table my_table (col1 char(10));
//             insert into my_table values ('JDBC');
PreparedStatement pstmt = conn.prepareStatement
("select count() from my_table where col1 = ?");
ResultSet rs;

pstmt.setString (1, "JDBC");  // Set the Bind Value
rs = pstmt.executeQuery();    // This does not match any row
// ... do something with rs
CHAR ch = new CHAR("JDBC      ", null);
((OraclePreparedStatement)pstmt).setCHAR(1, ch); // Pad it to 10 bytes
rs = pstmt.executeQuery();     // This matches one row
// ... do something with rs
((OraclePreparedStatement)pstmt).setFixedCHAR(1, "JDBC");
rs = pstmt.executeQuery();     // This matches one row
// ... do something with rs
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top