VB6\ADODB\Requête SQL\1 seul critère de sélection [Résolu]

Signaler
Messages postés
181
Date d'inscription
jeudi 30 mai 2002
Statut
Membre
Dernière intervention
19 août 2012
-
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
-
Bonjour à tous,

Je n'en suis qu'à mes débuts des SGBD et j'essaie d'écrire quelques simples requêtes. J'ai donc une fonction 'Requete_Execute(...)' qui s'exécute avec comme paramètre String, une séquence SQL (sSQL) :

Public Function Requete_Execute(myCnx As ADODB.Connection, ByVal sSQL As String) As ADODB.Recordset
'! Nota : myCnx est déjà ouverte

    '# Exécution de la requête:
    Set Requete_Execute =   New ADODB.Recordset
    With Requete_Execute
        '# (La requète SQL est dans sSQL)
        '# L'exécution:
        .CursorLocation = adUseClient
        .Open sSQL, myCnx, adOpenStatic, adLockReadOnly
    End With
    
    '# Gestion des erreurs:
'    If Requete_Execute.BOF And Requete_Execute.EOF Then
    If Requete_Execute.RecordCount < 1 Then
        GoTo Requete_Execute_Fin
    End If

    '# Par précaution après Open:
    'Requete_Execute.MoveLast
    Requete_Execute.MoveFirst
    
Requete_Execute_Fin:
End Function


Ensuite, je lance un bouton de commande pour essayer.
Pour le moment je teste le fichier exemple BIBLIO.MDB donné chez Microsoft.
Dans cette DB, il y a une table " Authors " avec les champs "Au_ID","Author" et "Year Born".

Voici le bouton de commande Essai pour tester ma fonction 'Requete_Execute(...)'

Private Sub CmdEssai_Click()
Dim myRs As ADODB.Recordset, sSQL As String
'! Nota : MaCnx As ADODB.Connection est déjà ouverte (Provider  =Microsoft.Jet.OLEDB.4.0)

    '# Construction de la requête:
    sSQL =  "Select * From Authors"
    'sSQL = "Select Author From Authors Where Author Like " & """C*"""
    
    '# Envoi et récupération de la requête:
    Set myRs = Requete_Execute(MaCnx, sSQL)
    '# Puis affichage de la requête dans un LV:
    Call LV_Affiche_Recordset(Me.ListView1, myRs)

Set myRs = Nothing
End Sub

(Je ne décris pas la procédure LV_Affiche_Recordset qui n'a que peu d'intérêt dans cet exemple)
Dans un premier temps, je lance la requête sSQL = "Select * From Authors", et tout s'affiche correctement (donc tous les champs de la table).

Par contre, si je veux donner un critère, par exemple, tous les noms qui commencent par un "C" (ou "c") dans le champ "Author" de la table "Authors" avec la requête "Select Author From Authors Where Author Like " & """C*""", le résultat est zéro (ma liste est vide, et myRs.RecordCount=0). Alors qu'il existe des "Author" qui commence par la lette 'C'.

Aurais-je écrit une mauvaise syntaxe?

titicar

4 réponses

Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
75
Salut

C'est presque bon.
SQL possède ses propres règles et caractères :
% remplace le * de Windows
_ remplace le ?

Exemple pour les champs qui commencent par la lettre C
Like 'C%'
Exemple pour les champs qui accepte n'importe quel caractère ou chiffre (mais un seul) à l'emplacement 3
Like 'AB_DEF'

Méfiance :
Like est sensible à la case. 'C' n'est donc pas 'c'.
Il faut alors avoir recours aux crochets [ et ] dans lesquels tu vas pouvoir mettre les caractères recherchés (mais un seul)
Exemple pour les champs qui contient la lettre 'C' ou 'c' en troisième position et peuvent avoir d'autres caractères ensuite :
Like 'AB[Cc]%'
Exemple pour les champs qui contient la lettre 'C' ou 'c' en troisième position et peuvent avoir d'autres caractères ensuite :
Like 'AB[Cc]%'
Exemple pour les champs qui contiennent une des lettres de l'alphabet en majuscule en troisième position :
Like '__[A-B]%'

Tu peux aussi exclure certains caractères :
Exemple pour les champs qui ne doivent pas contenir la lettre 'C' ou 'c' en troisième position et peuvent avoir d'autres caractères ensuite :
Like 'AB[^Cc]%'
ou, à vérifier, je ne suis plus sûr :
Like 'AB[^C^c]%'

Tu noteras aussi que la délimitation du contenu d'un champ de type texte peut se faire avec les guillemets '
Cela simplifie l'écriture sous VB.
Exemple
sSQL = " Where monChamp Like 'C%'"

Internet regorge de sites donnant les bases et méthodes de SQL.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
75
PS : % remplace le *
Uniquement dans les Like.
Le "Select * From ..." reste une *
Messages postés
181
Date d'inscription
jeudi 30 mai 2002
Statut
Membre
Dernière intervention
19 août 2012

Merci Jack

J'ai fait une batterie de tests et tout fonctionne.
Par contre, on dirait que les minuscules/majuscules sont confondus:
Exemple :
'! Like du genre 'AB[Cc]%'
'! Champ Author recherché = "Cope, Ken" '(champ Au_ID=963)
sSQL = "Select Author From Authors Where Author Like " & "'Co[P]e, K%'" '->Nb=1 malgré P majuscule?
'sSQL = "Select Author From Authors Where Author Like " & "'Co[p]e, K%'" '->Nb=1, OK
'sSQL = "Select Author From Authors Where Author Like " & "'Co[Pp]e, K%'" '->Nb=1, OK

Tous donnent le même résultat : "Cope, Ken", ce qui n'est pas un mal en soit car généralement, je ne tiens pas compte de la 'casse'.

titicar
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
75
Ah bah peut-être. J'étais resté sur cette idée.
Le Like de VB, lui, est sensible. J'ai dû confondre (voir StrComp).