2009-05-26 4 views
2

Dans la requête SQL suivante en utilisant la classe PreparedStatement:Comment gérer les caractères spéciaux dans un Java PrepareStatement?

String query_descrip = "insert into timitemdescription (itemkey, languageid, longdesc, shortdesc) values (?, 1033, ?,?)"; 
PreparedStatement pstmt2 = con.prepareStatement(query_descrip); 
pstmt2.setInt(1, rs4); 
pstmt2.setString(2, itemdescription); 
pstmt2.setString(3, itemdescription.substring(0,39)); 
pstmt2.executeUpdate();  

Je reçois parfois des apostrophes et des guillemets simples et doubles dans mes descriptions de poste. par exemple, mon dernier problème avec un article est un "moniteur Planar 22." Bien sûr, la chaîne a été mal interprétée et a pensé que la valeur de description était juste "Planar 22" Quelle est la meilleure façon de gérer les caractères spéciaux dans une chaîne

J'ai lu que certaines personnes utilisaient regex, mais elles semblaient être spécifiques au cas par cas.Une autre façon de travailler est de lire le tableau de caractères caractère par caractère.

UPDDATE Après quelques tests plus approfondis, il s'est avéré qu'il y avait plus de problèmes dans mon code, mais aussi un problème d'encodage d'URL. étant peuplé par le code jsp, il essaierait de déplacer le champ de description vers un formulaire en ligne, il le tronque sur le formulaire plutôt que sur la requête. jTDS a également corrigé le problème de réception des caractères spéciaux. Parce que jTDS est un pot, il a également aidé à éviter de redémarrer la machine. Je vais attribuer le fil JTDS la prime puisque c'est ce que j'ai partiellement utilisé.

merci à l'avance

+1

Quel pilote et base de données JDBC utilisez-vous? – Yishai

+0

J'utilise MS SQL Server 2000 Pilote pour JDBC et SQL Server 2005 – phill

+0

pourquoi ma question est downvoted? – phill

Répondre

15

Puisque vous utilisez PreparedStatement, vous n'avez rien à faire du tout, il sera traité pour vous par le pilote JDBC. La seule chose que vous devez faire attention est les caractères non-ASCII, en particulier vous devez vous assurer que les tables de DB utilisent un encodage pour les colonnes textuelles qui peuvent gérer tous les caractères que vous allez utiliser. Mais c'est un problème SQL, pas un problème Java.

+0

lorsque je passe la description de l'élément dans l'instruction préparée, les chaînes avec des guillemets doubles ne sont pas échappées et interprétées comme le terminateur de valeur. Connaissez-vous des solutions de contournement pour cela? – phill

+0

Quel serveur SQL et quel pilote utilisez-vous? Si ce n'est vraiment pas échapper correctement les chaînes, il est sérieusement défectueux (peut-être d'autres façons aussi) et je envisagerais de passer à un autre. –

+0

J'utilise le pilote MS SQL Server 2000 pour JDBC et SQL Server 2005 – phill

3

Vous n'avez pas besoin de gérer ces caractères spécialement si vous les liez en tant que paramètres à PreparedStatement, comme vous le faites. C'est l'un des principaux avantages de l'approche de déclaration préparée.

3

Comme les autres l'ont dit, vous n'avez rien à faire pour gérer les caractères spéciaux. Vous devez essayer un autre pilote JDBC. Essayez le jTDS driver et voyez si cela vous aide avec votre instruction PreparedStatement. C'est un pilote de base de données open source pour SQL Server. Je l'utilise au travail maintenant et il fonctionne comme un champion et est conforme à la spécification JDBC contrairement au pilote MS.

+0

pourriez-vous suggérer un exemple de code ou de liens qui implémente le fichier jar pour une instruction préparée? – phill

+0

L'exemple de code que vous avez maintenant fonctionnerait. La seule chose qui serait différente serait l'URL du pilote que vous utilisez pour créer la connexion. –

+0

lorsque j'essaie d'exécuter Class.forName ("net.sourceforge.jtds.jdbc.Driver"); dans une clause try..catch, il ne cesse de me dire "doit être pris ou jeté" des idées? – phill

0

Je suis assez certain que le problème n'est pas le code que vous avez publié. Pour aider à résoudre les problèmes:

  1. Avez-vous essayé d'exécuter l'extrait de code ci-dessus dans un débogueur? Quelle est la valeur de "itemdescription" avant de le passer à l'appel de la base de données?
  2. Comment vérifiez-vous réellement la valeur dans la base de données? Est-ce plus de code Java? Ou regardez-vous avec SQLCMD ou quelque chose comme ça?
Questions connexes