Apostrophes dans une requête
Les instructions SQL échouent lorsque mes champs contiennent des apostrophes. Que faire ?
Le problème
Voici un exemple de code VBA qui construit une chaîne SQL et l’exécute.
1 2 3 4 5 6 7 8 |
Dim strSQL As String Dim strNom As String Dim strPrenom As String strNom = "INISAN" strPrenom = "Hervé" strSQL = "INSERT INTO table1 (nom, prenom) VALUES ('" & strNom & "', '" & strPrenom & "')" CurrentDb.Execute strSQL |
La chaîne SQL finale est :
INSERT INTO table1 (nom, prenom) VALUES ('INISAN', 'Hervé')
et à la fin de l’opération, un nouvel enregistrement est inséré dans la table.
Les champs nom
et prenom
de la table étant de type Texte, il faut les délimiter par des guillemets ou des apostrophes.
Problème : si le nom ou le prénom contiennent une ou plusieurs apostrophes, l’instruction SQL échoue. Essayez de remplacer INISAN
par D'ARTAGNAN
pour voir !
La solution
La parade consiste à doubler les apostrophes ne servant pas de délimiteur, de façon à obtenir par exemple D''ARTAGNAN
.
Ceci peut s’automatiser grâce à la fonction VBA Replace()
(dont vous trouverez le détail dans l’aide en ligne d’Access). Voici un exemple de code amélioré :
1 2 3 4 5 6 7 8 9 10 |
Dim strSQL As String Dim strNom As String Dim strPrenom As String strNom = "D'ARTAGNAN" strPrenom = "Hervé" strNom = Replace(strNom, "'", "''", 1, -1, vbTextCompare) strPrenom = Replace(strPrenom, "'", "''", 1, -1, vbTextCompare) strSQL = "INSERT INTO table1 (nom, prenom) VALUES ('" & strNom & "', '" & strPrenom & "')" CurrentDb.Execute strSQLSQL |
La chaîne SQL devient après retraitement :
INSERT INTO table1 (nom, prenom) VALUES ('D''ARTAGNAN', 'Hervé')
A vous d’aménager le code en fonction de vos besoins, bien sûr : la fonction Replace()
peut être intégrée directement dans une chaîne SQL, à condition de remplacer vbTextCompare
par sa valeur numérique 1
.