Problème dre chargement DB2 d'un String avec guillemet

cs_acoue Messages postés 15 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 18 novembre 2005 - 7 janv. 2004 à 12:44
ioiomatic Messages postés 44 Date d'inscription mardi 13 janvier 2004 Statut Membre Derniè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.
A voir également:

7 réponses

nicowatt Messages postés 74 Date d'inscription mercredi 15 janvier 2003 Statut Membre Dernière intervention 18 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 ?

Bonne journée...

NicoWatt...
0
cs_acoue Messages postés 15 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 18 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);

While (rs1.next)
{
req2= "INSERT INTOTable2(....) VALUES ( '" + rsz1.getString(1) + "')";
Con2.executeUpdate(req2);
}
...

Si tu pouvais m'aider de nouveau ....

Bonne journée
Anthony
0
nicowatt Messages postés 74 Date d'inscription mercredi 15 janvier 2003 Statut Membre Dernière intervention 18 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 ! ;-))

Bonne soirée...

NicoWatt...
0
cs_acoue Messages postés 15 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 18 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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ioiomatic Messages postés 44 Date d'inscription mardi 13 janvier 2004 Statut Membre Dernière intervention 9 mars 2004 3
13 janv. 2004 à 15:13
Salut,

As-tu essayé tout simplement la syntaxe suivante ?

Insert into ta_table(ton_champ) values('rue de l\\'illusion')

=>avec le backslash juste devant la quote

++
0
ioiomatic Messages postés 44 Date d'inscription mardi 13 janvier 2004 Statut Membre Dernière intervention 9 mars 2004 3
13 janv. 2004 à 15:24
désolé,
faute de frappe: pas deux backslash mais un seul
0
ioiomatic Messages postés 44 Date d'inscription mardi 13 janvier 2004 Statut Membre Dernière intervention 9 mars 2004 3
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);
}
0