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

Résolu
cs_titicar Messages postés 181 Date d'inscription jeudi 30 mai 2002 Statut Membre Dernière intervention 19 août 2012 - 16 août 2012 à 18:54
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 - 17 août 2012 à 14:45
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

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
16 août 2012 à 19:50
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)
3
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
16 août 2012 à 19:52
PS : % remplace le *
Uniquement dans les Like.
Le "Select * From ..." reste une *
3
cs_titicar Messages postés 181 Date d'inscription jeudi 30 mai 2002 Statut Membre Dernière intervention 19 août 2012
17 août 2012 à 11:25
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
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
17 août 2012 à 14:45
Ah bah peut-être. J'étais resté sur cette idée.
Le Like de VB, lui, est sensible. J'ai dû confondre (voir StrComp).
0
Rejoignez-nous