Problème dre chargement DB2 d'un String avec guillemet
cs_acoue
Messages postés15Date d'inscriptionlundi 17 novembre 2003StatutMembreDernière intervention18 novembre 2005
-
7 janv. 2004 à 12:44
ioiomatic
Messages postés44Date d'inscriptionmardi 13 janvier 2004StatutMembreDernière intervention 9 mars 2004
-
13 janv. 2004 à 15:51
Bonjour,
je dois charger du texte dans une champ de type VARCHAR, d'une base DB2.
j'utilise l'instruction :
INSERT INTO NomTable (NomChamp) VALUES('valeur');
Le problème est que ce chargement c'est une application Java qui l'exécute, et que dés qu'un guillemet se trouve dans la valeur (ex : rue de l'illusion), la valeur à insérée est découpée en deux ('rue del' et illusion') et ceci me renvoie une erreur ([IBM][CLI Driver][DB2/NT] SQL1216N Graphic data and graphic functions are not supported for this database. SQLSTATE=56031).
J'aimerai connaître une fonction SQL fonctionnant sous DB2 pour permettre le passage des guillemetes dans une chaîne de caractères, ou pouvoir travailler avaec java cette chaîne pour que DB2 l'accèpte.
Merci de me repondre, cette requête est assez importante pour moi.
nicowatt
Messages postés74Date d'inscriptionmercredi 15 janvier 2003StatutMembreDernière intervention18 janvier 2013 7 janv. 2004 à 14:31
Slut' !!!
- @ premiere vue, j'aurai résoud le problème en executant un replaceAll et en placant un caractère d'échappement triple (2 pr java et 1 pour sql) Mais cela paraît un peu lourd et pas éllégant du tout.
- Ensuite, j'aurai changé la requête:
INSERT INTO NomTable (NomChamp) VALUES('valeur');
par :
INSERT INTO NomTable (NomChamp) VALUES("valeur");
(Ici j'ai mis des quotes doubles)
Cela évite que SQL soit altéré par l'arrivée spontannée d'un guillemet simple !
- Après seulement, j'aurai cherché une autre méthode :
Par exemple l'existance d'une methode de type addslashes() et stripslashes() comme dans PHP...
Et si elles n'existent pas, je les aurai réécrites... (et publiées)
Si tout ca ne va toujours pas, on peut chercher autre chose, mais cela devrai suffire je pense ! Non ?
cs_acoue
Messages postés15Date d'inscriptionlundi 17 novembre 2003StatutMembreDernière intervention18 novembre 2005 8 janv. 2004 à 08:17
Merci pour ta réponse, seulement comme tu le dit ta przmière méthode est un peu lourde, ta deuxiéme j'y avais pensé mais comme je te l'ai dit je construit ma requete dans une methode java, donc je la stocke dans un string et les guillemets double sont les delimiteur de string. En fait ma requete est construit a partit d'éléments de ResulSet. Il ne me reste que la troisieme méthode mais j'aurai aimé trouvé quelque chose de plus rapide.... si cela existe.
Voici comment est organisé mon code.
...
String req1, req2;
req1 = "SELECT champ1 FROM table 1";
ResultSet rs1= Connexion1.executeQuery(req1);
nicowatt
Messages postés74Date d'inscriptionmercredi 15 janvier 2003StatutMembreDernière intervention18 janvier 2013 8 janv. 2004 à 19:33
Me revoil@ !!!
Essaie un peu avec cette requête:
req2= "INSERT INTOTable2(....) VALUES ( \"" + rsz1.getString(1) + "\")";
Je mets une double quote en échappement...
Ca devrai marcher, mais tu retrouveras tout de même une erreur si quelq'un rentre une double quote...
Essaie, et dis moi si ca te conviens, sinon je TE PROMETS de trouver une solution + efficace (en prenant un peu + de tps ! ;-))
cs_acoue
Messages postés15Date d'inscriptionlundi 17 novembre 2003StatutMembreDernière intervention18 novembre 2005 9 janv. 2004 à 09:01
Merci pour ta solution, mais je ne l'ai pas essayer, entre temps j'ai developper deux methodes que j'appelle dans mon gargement. Je diffuse les sources, on ne sait jamais.
Bon j'avoue c de la bidouille mais ca fonctionne. La première compte le nombre de cote dans la chaine --> permet de sovoir si il faut lancer la deuxieme, qui double la cote. Elle sont independantes.
*******************************
public int nbre(String s)
{
String in = s;
String tmp = null;
int nb = 0;
for (int i = 0; i < in.length() ; i++)
{
tmp = in.substring(i,i+1);
if (tmp.equals("'")) nb ++;
}
return nb;
}
*********************************
public String Remplacer(String s)
{
String in = s;
String out="";
String tmp = null;
for (int i = 0; i < in.length() ; i++)
{
tmp = in.substring(i,i+1);
if (tmp.equals("'"))
{
out = out + tmp +"'";
} else
{
out = out + tmp;
}
}
return out;
}
**********************************
Merci tout de meme de ton aide.
Anthony
Vous n’avez pas trouvé la réponse que vous recherchez ?
ioiomatic
Messages postés44Date d'inscriptionmardi 13 janvier 2004StatutMembreDernière intervention 9 mars 20043 13 janv. 2004 à 15:51
j'oubliais ( décidemment où ai-je ma tête),
tu dois travailler sur des listes entières de données
Pour récuperer un caractère précis, il y aurait éventuellement la classe StringTokenizer via laquelle tu considères la quote qui fait tout planter comme étant un délimiteur dans ta chaine de caractère, tu récupères les token ( chaines de caractères séparées par la quote en question) que tu concatène pour avoir une chaine de carac sans cette quote:
"grossièrement" ça donnerait:
String RetirerQuote(String chaine_de_carac){
StringTokenizer st = new StringTokenizer(chaine_de_carac, "'");
String s = st.nextToken();
String s2 = st.nextToken();
return s.concat(s2);
}