IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB 6 et antérieur Discussion :

[VB6] Problème avec l'opérateur LIKE en SQL


Sujet :

VB 6 et antérieur

  1. #1
    Membre habitué Avatar de MGD_Software
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2006
    Messages : 137
    Points : 139
    Points
    139
    Par défaut [VB6] Problème avec l'opérateur LIKE en SQL
    Bonjour.

    Je pensais avoir une bonne expérience dans l'utilisation de SQL en VB. Mais je me trouve confronté à un phénomène bizarre et je voudrais savoir si quelqu'un a déjà eu ce problème. Peut-être aussi qu'un oeil neuf verra tout de suite un truc qui crève les yeux et que je ne vois pas.

    Soit une connexion ADODB nommée gcnxConnect ouverte sur une base de données Access 2000. Cette base renferme une table "T_Membres" qui contient les noms et adresses d'adhérents à une association. J'ai des soucis avec une requête sur cette table qui ne ramène jamais aucun enregistrement si on utilise la clause WHERE avec LIKE et un masque contenant des caractères génériques.

    Lisez bien le code ci-dessous, écrit et exécuté dans le volet de débogage. Les trois requêtes ont été écrites par copier-coller, il n'y a donc normalement aucun différence de syntaxe, excepté le masque de sélection.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    sReq = "SELECT * FROM T_Membres WHERE Ville LIKE 'cournonterral'"
    Rs.Open sReq, gcnxConnect, adOpenForwardOnly, adLockReadOnly
    Print Rs.EOF
    False
    Rs.Close
    
    sReq = "SELECT * FROM T_Membres WHERE Ville LIKE 'cour*'"
    Rs.Open sReq, gcnxConnect, adOpenForwardOnly, adLockReadOnly
    Print Rs.EOF
    True
    Rs.Close
    
    sReq = "SELECT * FROM T_Membres WHERE Ville LIKE 'cournon?erral'"
    Rs.Open sReq, gcnxConnect, adOpenForwardOnly, adLockReadOnly
    Print Rs.EOF
    True
    Rs.Close
    Comme on peut le constater, le seul cas où on ramène des enregistrements est celui où il n'y a pas de caractères génériques. L'inverse serait logique, mais dans ce sens ce n'est pas possible puisque les enregistrements ramenés dans la première requête répondent forcément aux deux autres filtres.

    Le plus curieux est que les trois requêtes, exécutées sous access (copier-coller direct dans le texte SQL du générateur de requetes d'Access), fournissent toutes des résultats corrects.

    Je suis perplexe...

  2. #2
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    3 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 3 317
    Points : 20 144
    Points
    20 144
    Par défaut
    bonjour

    tu peux tester

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sReq = "SELECT * FROM T_Membres WHERE Ville LIKE 'cour%'"
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sReq = "SELECT * FROM T_Membres WHERE Ville LIKE 'cournon%erral'"

    bon week end
    michel

  3. #3
    Expert éminent
    Avatar de ThierryAIM
    Homme Profil pro
    Inscrit en
    Septembre 2002
    Messages
    3 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2002
    Messages : 3 673
    Points : 8 524
    Points
    8 524
    Par défaut
    Pour MSJet4 et Access :
    utiliser % à la place de *
    utiliser _ à la place de ?
    Vous vous posez une question, la réponse est peut-être ici :
    Toutes les FAQs VB
    Les Cours et Tutoriels VB6/VBScript
    Les Sources VB6


    Je ne réponds pas aux questions techniques par MP. Utilisez les forums. Merci de votre compréhension

  4. #4
    Membre habitué Avatar de MGD_Software
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2006
    Messages : 137
    Points : 139
    Points
    139
    Par défaut
    Bon, il semble que le % marche pour remplacer un nombre quelconque de caractères quelconques. C'est d'autant plus frustrant que l'astérisque fonctionne dans la clause FILTER (Rs.Filter="Ville LIKE 'cou*'" fonctionne très bien), et que la documentation ADO donne des exemples avec l'astérisque .

    Extrait de l'aide en ligne sur LIKE de VBA Access 2003 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Plusieurs caractères; a*a ramène aa, aBa, aBBBa mais pas aBC  
                         *ab* ramène abc, AABB, Xab mais pas aZb, bac  
    Caractère spécial :a[*]a ramène a*a mais pas  aaa  
    Plusieurs caractères: ab* ramène abcdefg, abc mais pas  cab, aab  
    Caractère isolé: a?a ramène  aaa, a3a, aBa mais pas  aBBBa  
    Chiffre isolé: a#a ramène  a0a, a1a, a2a mais pas  aaa, a10a  
    Plage de caractères: [a-z] ramène  f, p, j mais pas  2, &  
    Hors d'une plage: [!a-z] ramène  9, &, % mais pas  b, a  
    Pas un chiffre: [!0-9] ramène  A, a, &, ~ mais pas  0, 1, 9  
    Combinaison: a[!b-m]# ramène  An9, az0, a99 mais pas  abc, aj0
    Alors si on ne peut plus faire confiance à l'aide en ligne, comment-fait-on si on n'a pas Développez-com ?!!

    Merci Thierry.
    Mais pour les autres ? (où as tu trouvé la doc qui donne % et _ ?)
    Quel est le masque pour 1 chiffre quelconque (l'équivalent de #) ?
    Comment masque-t-on les caractères spéciaux (genre : je veux ramener les enregistrements qui contiennent un % ou un _ : quelle est le filtre ?)
    Si le dièse est un caractère spécial, quid des formats de date (#07-22-2006#) ? - Bien que l'on n'emploie pas normalement de date avec LIKE...

    Finalement, j'étais beaucoup plus performant avec DAO que j'ai utilisé près de 10 ans sans problème. Le mieux est souvent l'ennemi du bien.

  5. #5
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    3 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 3 317
    Points : 20 144
    Points
    20 144
    Par défaut
    rebonjour

    Comment masque-t-on les caractères spéciaux (genre : je veux ramener les enregistrements qui contiennent un %
    dans ce cas il faut encadrer le caractere spécial par des crochets [%]


    http://office.microsoft.com/fr-fr/as...322841036.aspx



    bon apres midi
    michel

  6. #6
    Expert éminent
    Avatar de ThierryAIM
    Homme Profil pro
    Inscrit en
    Septembre 2002
    Messages
    3 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2002
    Messages : 3 673
    Points : 8 524
    Points
    8 524
    Par défaut
    ADO utilise la norme SQL-92 ANSI, en lieu et place de l'ancienne norme SQL-89 ANSI
    Tu peux trouver pas mal d'infos sur le site de Microsoft

    Pour rechercher des caractères spéciaux (genre #), il faut le mettre entre []

    exemple (rechercher tous les codes dans une table se terminant par #) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM Table WHERE Code LIKE '%[#]' ORDER BY Code ASC
    Vous vous posez une question, la réponse est peut-être ici :
    Toutes les FAQs VB
    Les Cours et Tutoriels VB6/VBScript
    Les Sources VB6


    Je ne réponds pas aux questions techniques par MP. Utilisez les forums. Merci de votre compréhension

  7. #7
    Expert éminent
    Avatar de ThierryAIM
    Homme Profil pro
    Inscrit en
    Septembre 2002
    Messages
    3 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2002
    Messages : 3 673
    Points : 8 524
    Points
    8 524
    Par défaut
    Je n'ai pas encore l'habitude de te voir avec des plumes, Michel, mais je vais m'y faire

    Et si ce n'est pas ça qu'on appelle une équipe performante, alors je rends mon tablier (tu m'as grillé de quelques mn, j'ai été interrompu dans la rédaction de mon message )
    Vous vous posez une question, la réponse est peut-être ici :
    Toutes les FAQs VB
    Les Cours et Tutoriels VB6/VBScript
    Les Sources VB6


    Je ne réponds pas aux questions techniques par MP. Utilisez les forums. Merci de votre compréhension

  8. #8
    Membre habitué Avatar de MGD_Software
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2006
    Messages : 137
    Points : 139
    Points
    139
    Par défaut
    Merci pour les réponses. C'est ce que je cherchais, notamment le lien fourni par SilkyRoad, que je n'ai pas réussi à trouver tout seul.

    Il faut noter que dans cette page, il est dit qu'on peut utiliser * ou %. On dit plus bas qu'on ne peut utiliser % qu'avec Jet 4.x, mais il n'est pas dit qu'on ne peut plus utiliser * et ?

    Du coup j'ai un doute pour tous les autres. Et des soucis de portabilité de mes anciennes applis en DAO !
    On verra à l'usage. Pour le moment, j'ai ce qu'il me faut. Merci encore.

  9. #9
    Expert éminent
    Avatar de ThierryAIM
    Homme Profil pro
    Inscrit en
    Septembre 2002
    Messages
    3 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2002
    Messages : 3 673
    Points : 8 524
    Points
    8 524
    Par défaut
    http://office.microsoft.com/fr-fr/as...345621036.aspx

    pour complément d'info

    Ici il est dit qu'ADO utilise SQL-92
    Vous vous posez une question, la réponse est peut-être ici :
    Toutes les FAQs VB
    Les Cours et Tutoriels VB6/VBScript
    Les Sources VB6


    Je ne réponds pas aux questions techniques par MP. Utilisez les forums. Merci de votre compréhension

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 26/02/2013, 11h40
  2. [VB6] Problème avec la touche 0 dans une MaskEdBox
    Par bb62 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 02/03/2006, 09h47
  3. [VB6] Problème avec requête Update
    Par bb62 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 02/02/2006, 03h40
  4. Problème avec les opérateurs
    Par jules_lenoir dans le forum Langage
    Réponses: 4
    Dernier message: 26/01/2006, 16h56
  5. [SQL-Server] Problème avec odbc et ma connexion SQL Server
    Par vodevil dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 09/12/2005, 10h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo