Insérer des quotes (') dans une info sous Access ?

Résolu
DenisPhil Messages postés 20 Date d'inscription mardi 13 mai 2008 Statut Membre Dernière intervention 21 août 2009 - 22 juil. 2009 à 15:20
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 - 28 juil. 2009 à 10:45
Bonjour à tous.
Dans une table Acces, un champ peut-il contenir des quotes ?
Une requête du genre :
insert into Table1 (ch1, ch2) values ('Je l'ai trouvé', 'Tu l'as trouvé');
ne fonctionne pas car les quotes intérieures aux textes sont considérées comme des caractères de début/fin des textes par Access...
Alors, comment 'protéger' ces quotes ?

Avec MYSQL, il suffit d'insérer un antislash ('\') devant la quote à protéger mais ce truc ne fonctionne pas avec Access...
Merci d'avance
A voir également:

12 réponses

cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
26 juil. 2009 à 12:40
voilà une solution sans QuotedStr et qui marche bien....
chez moi..


procedure TForm1.Button2Click(Sender: TObject);
begin
try
AdoQuery1.Close;

with AdoQuery1.SQL do
begin
Clear;
Add('INSERT INTO table1(champ1, champ2) ');
Add('VALUES (:v0, :v1)');
AdoQuery1.ParamCheck := True;
AdoQuery1.Parameters.ParamByName('v0').Value := 'ils l''ont cherché';
AdoQuery1.Parameters.ParamByName('v1').Value := 'Tu l''as trouvé';
try
AdoQuery1.ExecSQL;
except on
E: Exception do
Showmessage('Erreur d''insertion : ' + E.Message);
end;
end;
finally
ShowMessage('terminé !');
end;
end;


cantador
3
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
27 juil. 2009 à 09:29
c'est ton extraction qui ne va pas car même en mettant la donnée dans une variable, ça marche aussi :

procedure TForm1.Button2Click(Sender: TObject);
var
ChStr: string;
begin
try
ChStr := 'ils l''ont cherché';
AdoQuery1.Close;

with AdoQuery1.SQL do
begin
Clear;
Add('INSERT INTO table1(champ1, champ2) ');
Add('VALUES (:p0, :p1)');
AdoQuery1.ParamCheck := True;
AdoQuery1.Parameters.ParamByName('p0').Value := 'Je l''ai trouvé';
AdoQuery1.Parameters.ParamByName('p1').Value := ChStr;
try
AdoQuery1.ExecSQL;
except on
E: Exception do
Showmessage('Erreur d''insertion : ' + E.Message);
end;
end;
finally
ShowMessage('terminé !');
end;
end;


cantador
3
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
28 juil. 2009 à 10:45
oui, c'était juste pour confirmer le traitement en passant par une variable..

@+

cantador
3
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
22 juil. 2009 à 19:30
bonsoir,
avec access tout est différent..
"'Tu l'as trouvé'"

pas testé..

cantador
0

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

Posez votre question
DenisPhil Messages postés 20 Date d'inscription mardi 13 mai 2008 Statut Membre Dernière intervention 21 août 2009
22 juil. 2009 à 21:08
Bonsoir Cantador,
j'ai essayé de mettre les textes entre guillemets (comme tu le dis) mais ça ne marche pas : Acces refuse.

Il y a bien la solution de secours :
- remplacer le (ou les) quote(s) par des arobas (@), par exemple, au moment de l'insertion du texte dans la table et
- faire la manoeuvre inverse au moment de son utilisation mas je trouve le procédé (qui fonctionne) un peu lourd !

Y aurait-il une autre solution ?
Merci d'avance
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
22 juil. 2009 à 22:11
un petit truc..
tu crées ta requête avec l'assitant d'access et lorsque celle-ci fonctionne bien, tu la transformes en SQL (menu access)
et tu récupères la bonne syntaxe..


cantador
0
DenisPhil Messages postés 20 Date d'inscription mardi 13 mai 2008 Statut Membre Dernière intervention 21 août 2009
23 juil. 2009 à 00:36
Bonsoir,
je ne dois pas être suffisamment informé des possibilités d'Access...
- J'ai bien créé, avec l'assistant d'Access, une table, en décrivant les champs (2 dans ce cas) et en saisissant des valeurs, tj avec l'assistant.
- A l'aide de la 'formule' créée par Access, j'ai saisi des textes comprenant des quotes et ils ont été acceptés;
- J'ai encore le formulaire de saisie dans cette table mais je n'ai pas trouvé comment visualiser une requête (un 'insert' dans ce cas) pour insérer des données !

Merci de me donner des précisions...
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
23 juil. 2009 à 15:20
convertis ta requête en SQL dans access

cantador
0
DenisPhil Messages postés 20 Date d'inscription mardi 13 mai 2008 Statut Membre Dernière intervention 21 août 2009
23 juil. 2009 à 17:17
Bonjour,
j'ai fait une 'macro' dans Access qui 'ExecSQL' et le sql est :
insert into Endereçamento (Nome, Cidade) values ('gigi', 'ils l'ont cherché');
- le 2e texte contient une quote : Access me dit qu'il y a une erreur (normal !);
- avec un 2e texte = 'ils l''ont cherché', avec 2 quotes : ça passe. Access accepte et le résultat en consultation est : 'ils l'ont cherché';
- la solution parait être de doubler les quotes avant l'insertion dans la table Access...
- en Delphi, avec un doublement des quotes rencontrées, l'insert se passe bien, c'est déjà un progrès MAIS la double quote reste, elle n'est pas transformée en simple quote comme avec la 'macro' d'Access...
Je continue mes essais...
Merci de ton aide.
0
DenisPhil Messages postés 20 Date d'inscription mardi 13 mai 2008 Statut Membre Dernière intervention 21 août 2009
26 juil. 2009 à 15:02
Bonjour Cantador,
merci de t'intéresser à mon pb... même le dimanche.
En fait, j'ai un fichier séquentiel, externe au programme et de format '.txt', que je lis et avec lequel je crée une table Access pour une utilisation ultérieure.
J'ai donc testé ta solution et voila le résultat que j'obtiens :
- avec le 'vrai' SQL suivant :
[i]with ADOQuery1.SQL do begin
Clear;
Add('insert into Messages (langue, Numess, texte)');
Add(' values (:Vlan, :Vmes, :Vtxt)'); end;
ADOQuery1.ParamCheck := True;
ADOQuery1.Parameters.ParamByName('Vlan').Value := LG;
ADOQuery1.Parameters.ParamByName('Vmes').Value := copy(ligne, 3, 4);
txt := StringReplace(copy(ligne, 7, p-7), QUOTE, QUOTE_DOUBLE, Mode);
ADOQuery1.Parameters.ParamByName('Vtxt').Value := txt;
try
ADOQuery1.ExecSQL;
except/i
... etc
les double-quotes que j'ai insérées dans le texte avant l'insert, restent dans la base Access créée ! Rien de changé donc.

- Mais, avec le SQL suivant :
[i]with ADOQuery1.SQL do begin
Clear;
Add('insert into Messages (langue, Numess, texte)');
Add(' values (:Vlan, :Vmes, :Vtxt)'); end;
ADOQuery1.ParamCheck : = True;
ADOQuery1.Parameters.ParamByName('Vlan').Value := LG;
ADOQuery1.Parameters.ParamByName('Vmes').Value := copy(ligne, 3, 4);
// txt := StringReplace(copy(ligne, 7, p-7), QUOTE, QUOTE_DOUBLE, Mode);
ADOQuery1.Parameters.ParamByName('Vtxt').Value := 'Je l''ai trouvé';
try
ADOQuery1.ExecSQL;
except/i
... etc
le texte renseigné redevient mono-quote (comme dans ton exemple) dans la base Access créée !

Le pb viendrait donc d'une différence de traitement entre
- un champ en clair et
- un champ contenu dans une variable.
Access ferait la différence entre ces deux alimentations de champs !!!
Ou bien, c'est Delphi qui crée différemment les deux champs ???
Encore merci de ton aide et bon dimanche.
Denis
0
DenisPhil Messages postés 20 Date d'inscription mardi 13 mai 2008 Statut Membre Dernière intervention 21 août 2009
26 juil. 2009 à 15:59
(re)Bonjour,
dans ton dernier message, tu dis "une solution sans QuotedStr" et je crois que tu as raison : c'est cette fonction qui fait pb.
Avec le SQL suivant (extrait) :
...
Add(QuotedStr(txt) + VIRG);
...
les doubles quotes restent intactes dans la base Access mais

Avec le SQL suivant :
...
Add(QUOTE + txt + QUOTE + VIRG);
...
(j'ai défini QUOTE et VIRG comme constantes)
les doubles quotes redeviennent simples ! C'est gagné !

Je crois que j'ai résolu mon pb avec ton aide.
Merci et à +
Denis
0
DenisPhil Messages postés 20 Date d'inscription mardi 13 mai 2008 Statut Membre Dernière intervention 21 août 2009
27 juil. 2009 à 23:36
Bonsoir Cantador,
oui, c'est l'utilisation de QuotedStr() qui perturbe le fonctionnement et non l'utilisation d'une variable ou pas.

Je crois que, maintenant, la question est résolue, non ?
Encore merci
Denis
0
Rejoignez-nous