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

Messages postés
181
Date d'inscription
jeudi 30 mai 2002
Dernière intervention
19 août 2012
- - Dernière réponse : cs_Jack
Messages postés
14010
Date d'inscription
samedi 29 décembre 2001
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
Afficher la suite 

Votre réponse

4 réponses

Meilleure réponse
Messages postés
14010
Date d'inscription
samedi 29 décembre 2001
Dernière intervention
28 août 2015
3
Merci
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)

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 106 internautes ce mois-ci

Commenter la réponse de cs_Jack
Messages postés
14010
Date d'inscription
samedi 29 décembre 2001
Dernière intervention
28 août 2015
3
Merci
PS : % remplace le *
Uniquement dans les Like.
Le "Select * From ..." reste une *

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 106 internautes ce mois-ci

Commenter la réponse de cs_Jack
Messages postés
181
Date d'inscription
jeudi 30 mai 2002
Dernière intervention
19 août 2012
0
Merci
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
Commenter la réponse de cs_titicar
Messages postés
14010
Date d'inscription
samedi 29 décembre 2001
Dernière intervention
28 août 2015
0
Merci
Ah bah peut-être. J'étais resté sur cette idée.
Le Like de VB, lui, est sensible. J'ai dû confondre (voir StrComp).
Commenter la réponse de cs_Jack

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.