Toute l'actualité de [self-access.com] en direct sur votre ordinateur !  Vous êtes ici : Accueil » Visual Basic » Initiation à VB » L'art de la concaténation » Concaténation et valeurs TexteConnexion
 


Concaténation VB, SQL et type Texte

Sur la page précédente, vous avez pu voir comment créer une instruction SQL de façon dynamique, en injectant une valeur variable en VB. Cette variable était de type Numérique (un entier long), qui est le type le plus simple généralement.

Nous allons compléter la pratique en faisant la même chose avec une valeur de type Texte. La technique est exactement la même, avec une variante sur la gestion des apostrophes...

Etape 1

Comme vous l'avez vu précédemment, il faut d'abord penser SQL. Je reprends l'exemple précédent, mais cette fois je suppose que le champ clef de ma table est de type Texte. En SQL, les champs Texte sont délimités par une apostrophe (c'est la seule nouveauté ici).

Notre instruction SQL pure devient donc quelque chose comme :

Conseil
En langage SQL, sous Access, les valeurs Texte peuvent être délimitées par des apostrophes ou par des guillemets. Mais comme les guillemets sont également utilisés en Visual Basic, il vaut mieux se rabattre sur les apostrophes pour la partie SQL, on évitera quelques risques d'erreur !

Etape 2

On peut intégrer l'instruction SQL en Visual Basic (la variable sql est toujours déclarée par Dim sql As String) :

 

Etape 3

Repérez la valeur variable. Ici, il s'agit de la valeur AB99 ; les apostrophes ne font pas partie de la valeur brute.

Il s'agit maintenant de découper la chaîne de caractères autour de la valeur brute. La découpe se fait comme ceci :

Et vous obtenez donc les 3 segments ci-dessous :

Etape 4

Les segments invariables (donc les chaînes de caractères "pures") doivent maintenant être rectifiés pour être correctement "fermés" par des guillemets. Vous obtenez :

Attention
Il ne doit pas y avoir d'espace entre les apostrophes et les guillemets rouges.
Prévoyez aussi le cas où la valeur brute pourrait contenir des apostrophes.

Voyez pourquoi en bas de page...

Etape 5

On peut remplacer la valeur fixe AB99 par une variable :

Cette fois, notre variable est supposée recevoir des combinaisons lettres/chiffres. Elle doit donc être déclarée de type String, par : Dim valeur As String.

Etape 6

Et hop, il ne reste plus qu'à concaténer les 3 segments :

Et voici le programme final :

  1. Sub ExecutionSQL()
  2.   Dim sql As String
  3.   Dim valeur As String
  4.  
  5.   ' Initialisation des variables
  6.   valeur = "AB99"
  7.   sql = "DELETE * FROM [la table] WHERE [la clef] = '" & valeur & "';"
  8.  
  9.   ' Exécution de l'instruction SQL
  10.   CurrentDb.Execute sql
  11. End Sub

Attention aux espaces !

Quand vous concaténez des valeurs Texte, il faut être vigilant sur la gestion des apostrophes, des guillemets et des espaces (ce problème n'existe pas avec les valeurs numériques). Imaginons que vous ayez placé un ou plusieurs espaces entre les apostrophes et les guillemets. Votre listing final deviendrait :

  1. Sub ExecutionSQL()
  2.   Dim sql As String
  3.   Dim valeur As String
  4.  
  5.   ' Initialisation des variables
  6.   valeur = "AB99"
  7.   sql = "DELETE * FROM [la table] WHERE [la clef] = ' " & valeur & " ';"
  8.  
  9.   ' Exécution de l'instruction SQL
  10.   CurrentDb.Execute sql
  11. End Sub

Comparez la ligne 7 de ce programme à la ligne 7 du programme précédent. Dans le premier programme (correct), la chaîne SQL redevient après concaténation :

sql = "DELETE * FROM [la table] WHERE [la clef] = 'AB99'"

Dans le deuxième programme (incorrect), la chaîne SQL devient par contre :

sql = "DELETE * FROM [la table] WHERE [la clef] = ' AB99 '"

... et la suppression ne marchera pas, parce qu'elle cherche une clef dont la valeur est espace + AB99 + espace, au lieu de AB99 seulement.

Attention aux apostrophes !

Un autre problème peut apparaître si votre variable Texte contient une ou plusieurs apostrophes. Par exemple, si valeur vaut "AB'99", la chaîne SQL - après concaténation - devient :

sql = "DELETE * FROM [la table] WHERE [la clef] = 'AB'99'"

et le moteur SQL aura un problème de délimiteurs pour identifier la chaîne AB'99. Pour traiter ce problème, la règle en SQL consiste à doubler les apostrophes "intérieurs" pour ne pas les confondre avec les apostrophes délimiteurs (vous avez vu la même chose avec les guillemets VB, sur cette page).

Vous pouvez donc remplacer systématiquement toutes les apostrophes par des doubles apostrophes, dans les valeurs à injecter. Et la fonction Replace() est l'outil qu'il vous faut pour ça, elle équivaut à un Edition / Remplacer. La fonction reçoit 3 paramètres minimum :

  • la chaîne originale à traiter ;
  • la valeur à chercher dans cette chaîne (dans notre cas : une seule apostrophe) ;
  • et enfin la valeur de remplacement (dans notre cas : 2 apostrophes).

En l'appliquant à toutes vos valeurs Texte, vous vous assurez que les injections de valeurs ne "casseront" pas les instructions SQL. Une fois amélioré, votre code final peut ressembler à ceci :

  1. Sub ExecutionSQL()
  2.   Dim sql As String
  3.   Dim valeur As String
  4.  
  5.   ' Initialisation des variables
  6.   valeur = "AB99"
  7.   sql = "DELETE * FROM [la table] WHERE [la clef] = '" & Replace(valeur, "'", "''") & "';"
  8.  
  9.   ' Exécution de l'instruction SQL
  10.   CurrentDb.Execute sql
  11. End Sub

Mes livres sur Access...
[cliquez pour plus d'infos]





Hit-Parade 
 
[ Copyright 1997-2018 hervé inisan, self-access.com Reproduction interdite ]