Question

J'ai essayé de comprendre pourquoi le code suivant ne génère aucune donnée dans mon ResultSet:

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

Par contre, les pistes suivantes correctement:

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

Le type de données pour l'école est CHAR (9 octets). Au lieu de setString, j'ai aussi essayé:

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();

Je suis complètement bloqué sur ce qu'il faut enquêter sur la prochaine; le débogueur Eclipse dit la requête SQL ne change pas même après setString ou setCharacterStream. Je ne suis pas sûr que ce soit parce que le réglage des paramètres ne fonctionne pas, ou si le débogueur peut tout simplement pas détecter les changements dans le PreparedStatement.

Toute aide sera grandement appréciée, merci!

Était-ce utile?

La solution

Je pense que le problème est que votre type de données est CHAR (9) et « Waterloo » a seulement 8 caractères. Je suppose que cela retournerait les résultats attendus (comme et%). Vous pouvez également ajouter l'espace manquant.

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

La meilleure façon serait par l'utilisation varchar au lieu de char si vos cordes ont une longueur flexible. Ensuite, le PreparedStatement fonctionnerait comme prévu.

Une solution serait d'utiliser la méthode setFixedCHAR spécifique Oracle (mais il est préférable de changer le type de données varchar si possible).

Ce qui suit est de PreparedStatement de JavaDoc Oracle:


CHAR données dans la base de données est complétée à la largeur de la colonne. Cela conduit à une limitation dans l'utilisation de la méthode setCHAR () pour les données de caractères se lient dans la clause WHERE d'une instruction SELECT - les données de caractère dans la clause WHERE doit également être rembourré à la largeur de la colonne pour produire une correspondance dans l'instruction SELECT. Ceci est particulièrement gênant si vous ne connaissez pas la largeur de la colonne.

remèdes setFixedCHAR () cela. Cette méthode exécute une comparaison non rembourrée.

Notes:

  • Ne pas oublier les objet instruction prêt à OraclePreparedStatement utiliser la méthode setFixedCHAR ().
  • Il n'y a pas besoin d'utiliser setFixedCHAR () pour une instruction INSERT. La base de données toujours Tapis automatiquement les données de la largeur de colonne tel qu'il insère.

L'exemple suivant illustre la différence entre les méthodes setString (), setCHAR () et setFixedCHAR ().

// 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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top