Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Contourner les apostrophes lors d'une recherche dans un Recordset

13 réponses
Avatar
IM
Bonjour,



N'ayant pas programmé depuis longtemps, je ne me souviens plus
des astuces pour contourner le problème des apostrophes (dans les phrases en
français) lors d'une recherche dans un Recordset. Toute suggestion serait
grandement appréciée!



Merci d'avance!

10 réponses

1 2
Avatar
Driss HANIB
Salut IM
je crois qu'il faut les doubler..

Driss

"IM" a écrit dans le message de
news:mj1wh.71397$
Bonjour,



N'ayant pas programmé depuis longtemps, je ne me souviens plus
des astuces pour contourner le problème des apostrophes (dans les phrases


en
français) lors d'une recherche dans un Recordset. Toute suggestion serait
grandement appréciée!



Merci d'avance!




Avatar
Jean-marc
IM wrote:
Bonjour,



N'ayant pas programmé depuis longtemps, je ne me souviens
plus des astuces pour contourner le problème des apostrophes (dans
les phrases en français) lors d'une recherche dans un Recordset.
Toute suggestion serait grandement appréciée!



Hello,

je complète la réponse de Driss: le sujet a été maintes fois
évoqué ici, et il faut effectivement les doubler:
par exemple:
http://groups.google.fr/group/microsoft.public.fr.vb/browse_frm/thread/f1ba1749e5c05e15/b2271a6f63b4931e?lnk=gst&q=apostrophe+sql&rnum=1&hl=fr#b2271a6f63b4931e

Dim sqlClause

sqlClause="L'ile au trésor"

' double les apostrophes
sqlClause = Replace(sqlClause, "'", "''")

' et le tour est joué !
set rs = db.OpenRecordset("SELECT * FROM TABLE WHERE CHAMP = '" &
sqlClause & "'"

Voila :-)

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/
Avatar
Daniel AUBRY
Bonjour,

1) cas avec une apostrohe :
on encadre avec des doubles cotes

SaisieTitre.Text = "C'est aujourd'hui"

SQL = "Update Titre"
SQL = SQL & " set Titre = """ & SaisieTitre.Text & """
SQL = SQL & " where NumeroDVD = " & NumeroDVD

2) cas d'une double cote :
on encadre avec des simples cotes

SaisieTitre.Text = "Un disque de 2" et demi"

SQL = "Update Titre"
SQL = SQL & " set Titre = '" & SaisieTitre.Text & "'"
SQL = SQL & " where NumeroDVD = " & NumeroDVD

3) cas d'une simple cote et double cote :
là je sèche

SaisieTitre.Text = "Un disque de 2" et demi acheté aujourd'hui"

SQL = "Update Titre"
SQL = SQL & " set Titre = ????????????????????????????
SQL = SQL & " where NumeroDVD = " & NumeroDVD

Dany


"Driss HANIB" a écrit dans le message de news:

Salut IM
je crois qu'il faut les doubler..

Driss

"IM" a écrit dans le message de
news:mj1wh.71397$
Bonjour,



N'ayant pas programmé depuis longtemps, je ne me souviens
plus
des astuces pour contourner le problème des apostrophes (dans les phrases


en
français) lors d'une recherche dans un Recordset. Toute suggestion serait
grandement appréciée!



Merci d'avance!








Avatar
andre.araste
Bonjour

Pour éviter l'erreur due à la présence d'apostrophes dans un recordset il
faut laisser l'erreur système 3077 se produire et la gérer de la façon
suivante en utilisant l'instruction Replace de VB6

Private Sub DBCombo1_DblClick(Area As Integer)
On Error GoTo Erreur
Data1.Recordset.FindFirst "Nom =( ' " & DBCombo1.BoundText & " ' ) "
Exit Sub
Erreur:
Design = DBCombo1.BoundText
Design = Replace(Design, " ' ", " '+ chr$(39)+' ")
Label1 = Design
Data1.Recordset.FindFirst " Nom = (' " & Design & " ' ) "
End Sub

En réalité il n'y a pas d'espace entre les symboles "'"" et ('" "')"

Avec VB5 Replace n'est pqs reconnu, il faut décomposer la chaîne et la
reconstituer ensuite avec chr$(39) pour '
--
Bonne réception.

http://perso.orange.fr/andre.araste/
Membre du Club Win's: http://www.clubwins.org
Avertissement: Je ne vends rien.

"IM" a écrit dans le message de news:
mj1wh.71397$
Bonjour,



N'ayant pas programmé depuis longtemps, je ne me souviens plus
des astuces pour contourner le problème des apostrophes (dans les phrases
en français) lors d'une recherche dans un Recordset. Toute suggestion
serait grandement appréciée!



Merci d'avance!




Avatar
Daniel AUBRY
Le remplacement n'est pas satisfaisant.

Si je veux stocker le mot AUJOURD'HUI dans une base c'est ce mot la et pas
autre chose.
C'est pourquoi on peux tester le contenu auparavant et adapter le SQL en
conséquence.
Le seul problème, comme je l'ai écrit plus haut, c'est quand la chaine de
caractères
contient à la fois simple et double cote ...................

Dany

"andre.araste" a écrit dans le message de news:
45c0d45f$0$5104$
Bonjour

Pour éviter l'erreur due à la présence d'apostrophes dans un recordset il
faut laisser l'erreur système 3077 se produire et la gérer de la façon
suivante en utilisant l'instruction Replace de VB6

Private Sub DBCombo1_DblClick(Area As Integer)
On Error GoTo Erreur
Data1.Recordset.FindFirst "Nom =( ' " & DBCombo1.BoundText & " ' ) "
Exit Sub
Erreur:
Design = DBCombo1.BoundText
Design = Replace(Design, " ' ", " '+ chr$(39)+' ")
Label1 = Design
Data1.Recordset.FindFirst " Nom = (' " & Design & " ' ) "
End Sub

En réalité il n'y a pas d'espace entre les symboles "'"" et ('" "')"

Avec VB5 Replace n'est pqs reconnu, il faut décomposer la chaîne et la
reconstituer ensuite avec chr$(39) pour '
--
Bonne réception.

http://perso.orange.fr/andre.araste/
Membre du Club Win's: http://www.clubwins.org
Avertissement: Je ne vends rien.

"IM" a écrit dans le message de news:
mj1wh.71397$
Bonjour,



N'ayant pas programmé depuis longtemps, je ne me souviens plus
des astuces pour contourner le problème des apostrophes (dans les phrases
en français) lors d'une recherche dans un Recordset. Toute suggestion
serait grandement appréciée!



Merci d'avance!








Avatar
Jean-marc
Daniel AUBRY wrote:
Le remplacement n'est pas satisfaisant.

Si je veux stocker le mot AUJOURD'HUI dans une base c'est ce mot la
et pas autre chose.
C'est pourquoi on peux tester le contenu auparavant et adapter le SQL
en conséquence.
Le seul problème, comme je l'ai écrit plus haut, c'est quand la
chaine de caractères
contient à la fois simple et double cote ...................



Hello Daniel,

Ce n'est pas vraiement un problème, car en SQL, le séparateur de
chaine, c'est le single quote (apostrophe) (et seulement celui la!).
les guillemets (") ne sont PAS le séparateur de chaine en SQL.
Si certaines bases le supportent, c'est un abus. Ce n'est pas ce
qui est défini par SQL.

De toute façon, si clause est une chaine de caractère
et B un champ TEXTE, alors on peut TOUJOURS ecrire:
(valable dans absolument tous les cas)

SQL = "SELECT * FROM A WHERE B = '" & clause & "'"

Et la variable clause peut contenir autant de quillemets que tu veux.
Le seul souci est si clause contient des apostrophes.
Et pour gérer cela, on peut dans TOUS les cas écrire:

clause = Replace(clause, "'", "''")

Ca va juste doubler les apostrophes si il y en a et sinon, ca
ne change pas la chaine.

Cette méthode est générique, fontionne avec TOUTES les DB qui
supportent SQL, ne nécessite pas de gestion d'erreur, est 100%
portable et s'applique dans TOUS les cas :-)

Absoluement toutes les applications DB utilisent cette "astuce",
qui n'een est même pas une. C'est une convention, parfaitement
définie par la norme SQL, toutes bases confondues.

Elle n'a donc que des avantages :-)

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/
Avatar
Jean-marc
Daniel AUBRY wrote:
Le remplacement n'est pas satisfaisant.

Si je veux stocker le mot AUJOURD'HUI dans une base c'est ce mot la
et pas autre chose.
C'est pourquoi on peux tester le contenu auparavant et adapter le SQL
en conséquence.
Le seul problème, comme je l'ai écrit plus haut, c'est quand la
chaine de caractères
contient à la fois simple et double cote ...................



Hello Daniel,

Ce n'est pas vraiement un problème, car en SQL, le séparateur de
chaine, c'est le single quote (apostrophe) (et seulement celui la!).
les guillemets (") ne sont PAS le séparateur de chaine en SQL.
Si certaines bases le supportent, c'est un abus. Ce n'est pas ce
qui est défini par SQL.

De toute façon, si clause est une chaine de caractère
et B un champ TEXTE, alors on peut TOUJOURS ecrire:
(valable dans absolument tous les cas)

SQL = "SELECT * FROM A WHERE B = '" & clause & "'"

Et la variable clause peut contenir autant de quillemets que tu veux.
Le seul souci est si clause contient des apostrophes.
Et pour gérer cela, on peut dans TOUS les cas écrire:

clause = Replace(clause, "'", "''")

Ca va juste doubler les apostrophes si il y en a et sinon, ca
ne change pas la chaine.

Cette méthode est générique, fontionne avec TOUTES les DB qui
supportent SQL, ne nécessite pas de gestion d'erreur, est 100%
portable et s'applique dans TOUS les cas :-)

Absoluement toutes les applications DB utilisent cette "astuce",
qui n'een est même pas une. C'est une convention, parfaitement
définie par la norme SQL, toutes bases confondues.

Elle n'a donc que des avantages :-)

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/
Avatar
Daniel AUBRY
Hello Jean-Marc,

Pas tout à fait d'accord avec toi.
Si je met en oeuvre ta technique :

clause1 = "Un disque de 2" et demi acheté aujourd'hui"

MsgBox clause1

clause2 = Replace(clause1, "'", "''")

MsgBox clause2

clause1 et clause2 sont bien différents.

Ecrire le mot aujourd'hui ---> aujourd"hui ne me convient pas.

Dany

"Jean-marc" a écrit dans le message
de news: 45c0e925$0$29866$
Daniel AUBRY wrote:
Le remplacement n'est pas satisfaisant.

Si je veux stocker le mot AUJOURD'HUI dans une base c'est ce mot la
et pas autre chose.
C'est pourquoi on peux tester le contenu auparavant et adapter le SQL
en conséquence.
Le seul problème, comme je l'ai écrit plus haut, c'est quand la
chaine de caractères
contient à la fois simple et double cote ...................



Hello Daniel,

Ce n'est pas vraiement un problème, car en SQL, le séparateur de
chaine, c'est le single quote (apostrophe) (et seulement celui la!).
les guillemets (") ne sont PAS le séparateur de chaine en SQL.
Si certaines bases le supportent, c'est un abus. Ce n'est pas ce
qui est défini par SQL.

De toute façon, si clause est une chaine de caractère
et B un champ TEXTE, alors on peut TOUJOURS ecrire:
(valable dans absolument tous les cas)

SQL = "SELECT * FROM A WHERE B = '" & clause & "'"

Et la variable clause peut contenir autant de quillemets que tu veux.
Le seul souci est si clause contient des apostrophes.
Et pour gérer cela, on peut dans TOUS les cas écrire:

clause = Replace(clause, "'", "''")

Ca va juste doubler les apostrophes si il y en a et sinon, ca
ne change pas la chaine.

Cette méthode est générique, fontionne avec TOUTES les DB qui
supportent SQL, ne nécessite pas de gestion d'erreur, est 100%
portable et s'applique dans TOUS les cas :-)

Absoluement toutes les applications DB utilisent cette "astuce",
qui n'een est même pas une. C'est une convention, parfaitement
définie par la norme SQL, toutes bases confondues.

Elle n'a donc que des avantages :-)

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/





Avatar
Jean-marc
Daniel AUBRY wrote:
Hello Jean-Marc,

Pas tout à fait d'accord avec toi.
Si je met en oeuvre ta technique :

clause1 = "Un disque de 2" et demi acheté aujourd'hui"

MsgBox clause1

clause2 = Replace(clause1, "'", "''")

MsgBox clause2

clause1 et clause2 sont bien différents.

Ecrire le mot aujourd'hui ---> aujourd"hui ne me convient pas.





Je suis désolé de ne pas me faire comprendre ...
Ca n'écrira pas ->aujourd"hui<-
Ca écrira ->ajourd'hui<-

Le plus simple:
faire une base de donnée, une table Table1, avec un champ Titre.

Puis le programme suivant en VB:

Dim db As Database
Dim rs As Recordset
Dim szTitle As String

Set db = OpenDatabase("c:bd1.mdb")
Set rs = db.OpenRecordset("Table1")


szTitle = "L'ile au trésor, un livre d'aujourd'hui!"

rs.AddNew
rs.Fields("Titre") = szTitle
rs.Update
rs.Close

szTitle = Replace(szTitle, "'", "''")

Set rs = db.OpenRecordset("SELECT * FROM TABLE1 WHERE Titre = '" &
szTitle & "'")
MsgBox rs.Fields("Titre")


rs.Close
db.Close

Le résultat, c'est que la table contient bien ce que tu veux, et que
la requête fonctionne...

J'espère que c'est plus clair :-(

Bonne soirée!

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/
Avatar
Daniel AUBRY
Ok Jean Marc, ça marche en DAO.

J'ai réécris ton code en ADO et cela plante à l'enregistrement (bien sur)

Dim Connect As New ADODB.Connection
Dim Cmd As New ADODB.Command
Dim Rs As New ADODB.Recordset

ChaineConnect = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & "d:Mes
Documentstoto.mdb" & ";"

Connect.ConnectionString = ChaineConnect
Connect.Open
Cmd.ActiveConnection = Connect

szTitle = "L'ile au trésor, un livre d'aujourd'hui !"

SQL = "Insert into Table1"
SQL = SQL & " (Titre)"
SQL = SQL & " values ('"
SQL = SQL & szTitle & "')"

Cmd.CommandText = SQL
Set Rs = Cmd.Execute
Set Rs = Nothing

szTitle = Replace(szTitle, "'", "''")

SQL = "Select * from Table1 where Titre = '" & szTitle & "'"

Cmd.CommandText = SQL
Set Rs = Cmd.Execute

MsgBox Rs!Titre
Set Rs = Nothing
Connect.Close

"Jean-marc" a écrit dans le message
de news: 45c0fbc9$0$11816$
Daniel AUBRY wrote:
Hello Jean-Marc,

Pas tout à fait d'accord avec toi.
Si je met en oeuvre ta technique :

clause1 = "Un disque de 2" et demi acheté aujourd'hui"

MsgBox clause1

clause2 = Replace(clause1, "'", "''")

MsgBox clause2

clause1 et clause2 sont bien différents.

Ecrire le mot aujourd'hui ---> aujourd"hui ne me convient pas.





Je suis désolé de ne pas me faire comprendre ...
Ca n'écrira pas ->aujourd"hui<-
Ca écrira ->ajourd'hui<-

Le plus simple:
faire une base de donnée, une table Table1, avec un champ Titre.

Puis le programme suivant en VB:

Dim db As Database
Dim rs As Recordset
Dim szTitle As String

Set db = OpenDatabase("c:bd1.mdb")
Set rs = db.OpenRecordset("Table1")


szTitle = "L'ile au trésor, un livre d'aujourd'hui!"

rs.AddNew
rs.Fields("Titre") = szTitle
rs.Update
rs.Close

szTitle = Replace(szTitle, "'", "''")

Set rs = db.OpenRecordset("SELECT * FROM TABLE1 WHERE Titre = '" &
szTitle & "'")
MsgBox rs.Fields("Titre")


rs.Close
db.Close

Le résultat, c'est que la table contient bien ce que tu veux, et que
la requête fonctionne...

J'espère que c'est plus clair :-(

Bonne soirée!

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/




1 2