Problème de requète sql avec la fonction where

Résolu
Signaler
Messages postés
15
Date d'inscription
jeudi 27 avril 2006
Statut
Membre
Dernière intervention
24 mai 2007
-
Messages postés
15
Date d'inscription
jeudi 27 avril 2006
Statut
Membre
Dernière intervention
24 mai 2007
-
Bonjour à tous.

    Je viens vous voir car j'ai un léger souci de requête SQL en
utilisant la fonction where. Je vous expose mon problème. J'effectue une connexion
à une base de donnée MYSQL avec VB6, en utilisant ODBC. Jusqu'à là, aucun
problème. J'effectue des requêtes simples du genre :


    If requête("select distinct
nomclasse from classe;", rs) Then

    ......

    ......

    ......

ici aucun soucis tout fonctionne parfaitement.

    Le problème se corse quand j'augmente l'importance de mes requêtes
et que j'y inclus une fonction Where, du genre :

    If requête("SELECT nom, prenom FROM utilisateur, classe
WHERE utilisateur.iduser = classe.iduser AND nomclasse='" & id_classe
& "';", rs) Then

    ......

    ......

    ......

la j'obtient l'erreur suivante quand je lance l'application :



 [mysql][ODBC 3.51 driver][mysqld-4.1.9-max] erreur
de syntaxe près de '1TSI1"' à la ligne 1.
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->


    J’ai donc essayer de remplacer '" & id_classe &
"' par '1TSI1' mais j'obtient exactement la même erreur.

De plus j'ai testé la requête SQL dans MYSQL grâce à EasyPHP et elle
fonctionne.
    Donc je ne comprends pas du tout d'où peut venir le problème, j'ai cherché sur
ce forum et j'ai trouvé quelqu'un qui avait le même problème que moi;


[infomsg_PB-REQUETE-MYSQL-AVEC-VB-NET_658740.aspx http://www.vbfrance.com/infomsg_PB-REQUETE-MYSQL-AVEC-VB-NET_658740.aspx]






Mais c'était un problème avec les # des dates donc ne m'aide
pas. J’ai aussi essayer de savoir si cela venais de la jointure mais sa ne semble pas être
le cas.
    Donc voila je ne sais vraiment pas comment me sortir de ce problème c'est
pourquoi je fais appel à votre aide pour réussir à m'en sortir. J'aimerais
pouvoir bénéficié d'explication de votre part.
    Je vous remercie d'avance et vous souhaite une bonne journée.


PS: le message prend la valeur du nom de la classe selectionné, ici j'ai pris 1TSI1 comme exemple.



Ti_flo



 

13 réponses

Messages postés
15
Date d'inscription
jeudi 27 avril 2006
Statut
Membre
Dernière intervention
24 mai 2007

C'est bon j'ai réussi à trouver la réponse.
    J'explique ici mon erreur, ça pourra toujours aider quelqu'un qui aura commise
la même erreur que moi.

La requête suivante est dans sa syntaxe bonne :


If requête("SELECT nom, prenom FROM utilisateur, classe WHERE
utilisateur.iduser = classe.iduser AND nomclasse='" & id_classe &
"';", rs) Then

    En fait mon erreur résidait comme l'avait souligné jack se trouvait belle et
bien dans ma fonction requête. Après avoir lu divers message sur la fonction
replace je l'avais utiliser dans ma fonction requête (pour éviter d'avoir à la
répéter), et la ce matin je décide de la supprimer entièrement pour voir si
elle fonctionne sans la variable replace... et la réponse est oui tout fonctionne.
    Bon j'avoue j'ai encor quelques soucis dans mon programme (pas des messages
d'erreur, mais j'obtient pas le résultat escompter).




Merci pour votre aide jack et MPI et bonne journée à vous.


Amicalement Ti_flo (sa fonctionne enfin ^^)
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->
Messages postés
15
Date d'inscription
jeudi 27 avril 2006
Statut
Membre
Dernière intervention
24 mai 2007

Bonjour
Je pensais avoir mis la fonction requête pour montré l'erreur mais j'ai oublié. Désolé.
je colle juste la partie qui faisait buggué mon application.

    rs_sql = Replace(rs_sql, "'", "[%]", 1, -1)
    rs_sql = Replace(rs_sql, "|", "'", 1, -1)
    rs_sql = Replace(rs_sql, "''", "' '", 1, -1)
    rs_sql = Replace(rs_sql, "[%]", "''", 1, -1)

J'ai tout supprimé et hop sa à marché.
Bonne journée.
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
81
Salut
Déjà, on découvre ta ligne de commande qui fait appel à une fonction personnelle nommée "requête".
On suppose que cette fonction te renvoie True (mais pourquoi ?)
Qu'y a t-il dans cette fonction ?
Ton exemple avec "1TSI1" est-il représentatif ?
Analyse bien le vrai message d'erreur : N'y aurait-il pas un ' qui se balade quand ce texte ?
Car dans ce cas, oui, la requête provoque une erreur de syntaxe puisque le nombre de ' est impair.
(Peut-être idem pour le " )

D'autre part, tu spécifies plusieurs tables dans ta requête : Or, les noms des champs ne précisent pas depuis quelle table extraire le champ.
S'il n'y a pas de champ qui porte le même nom dans ces diverses tables, pas de soucis. Mais si le champ "nomclasse" (exemple) existe dans plusieurs tables, SQL ne sait pas choisir.
Donc, devant chaque champ, précise bien le nom de la table d'où tu l'extraies, exemple :
"SELECT utilisateur.nom, utilisateur.prenom " & _
"  FROM utilisateur, classe " & _
" WHERE utilisateur.iduser = classe.iduser " & _ 
"   AND classe.nomclasse = '" & id_classe & "';"

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

Champion du monde de boule de cristal - 2005
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
81
PS : Et on suppose aussi que le terme 'id_classe' correspond à une variable ou un objet dans ton appli VB
Tu l'as mis entre " donc il appartient au monde VB et pas SQL ...
Messages postés
15
Date d'inscription
jeudi 27 avril 2006
Statut
Membre
Dernière intervention
24 mai 2007

Bonsoir à toi jack.

    Tout d’abord pour ce qui est de la variable id_classe elle
prend la valeur qui se trouve dans la combo liste :

Private Sub cmb_classe_Click()

id_classe = cmb_classe.Text

    Pour la fonction requête elle me renvoie bien true, elle me permet de vérifier
si la connexion est établie et de vérifié que je parcours tout les
enregistrements de la base.


    Pour l'exemple avec 1TSI1 est bien représentatif, je
m'explique. Dans un combo liste j'ai les noms des classes d'un lycée; 1TSI1,
1TSI2 ...

quand je clic sur l'un de ces noms la variable id_classe prend immédiatement la
valeurs de la classe choisie (en chaîne de caractère).

    Dans ma requête, à l'endroit du where si je n'utiliserait pas ma
variable classe mais directement un nom de classe la syntaxe serait :

where  nomclasse='1TSI1'; avec la fonction je dois utiliser la
concaténation ce qui me fait where nomclasse = '" & id_classe &
"';


    Sinon je n'est pas besoin de fixer mes champs dans le select
car ils ne se trouve pas dans classe et dans utilisateur donc il n'y a pas
répétition.


    Ce que je comprend vraiment pas, c'est pourquoi une requête
simple fonctionne mais que si je met un where sa foire, je ne pense pas que
cela puisse venir de fonction requête, je ne vois pas pourquoi car sa marche
avec une requête simple. Pour l'erreur de syntaxe je ne vois vraiment pas au
niveau de ma requête
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
19
As-tu la possibilité de tester ton code sur une autre machine ?

Je m'explique...
Au bureau, j'avais commencé à développer une application avec ADO (fichiers Excel et fichiers texte) et lorsque je mettais une clause Where, ça ne fonctionnait pas. J'ai essayé toutes sortes de méthodes (OLE, ODBC) et le Where ne fonctionnait jamais.
Après quelques jours, j'ai essayé mon code chez moi et ça fonctionnait très bien. Je l'ai essayé sur différent PC au bureau et ça fonctionnait très bien...

J'ai demandé au technicien de réparer le tout... On a réinstallé MDAC et divers autres "patchs" mais ça n'a jamais réglé le problème... J'en suis toujours au même niveau et le where ne fonctionne toujours pas sur cette machine (???)

Je n'ai donc aucune explication à te donner, seulement mon expérience ...

MPi
Messages postés
15
Date d'inscription
jeudi 27 avril 2006
Statut
Membre
Dernière intervention
24 mai 2007

Bonsoir MPI, quand tu dis que sa ne fonctionnait pas au bureau, tu avais un message d'erreur ? Si oui de quel genre ?
je vais essayer dans la journée pour voir si cela fonctionne, merci du conseil.
je vous redirais ça demain.
merci et bonne nuit.
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
19
Je ne me rappelle pas du message d'erreur s'il y en avait un...
Je pourrais essayer à nouveau et voir, mais ça n'ira pas avant Jeudi

MPi
Messages postés
15
Date d'inscription
jeudi 27 avril 2006
Statut
Membre
Dernière intervention
24 mai 2007

Bonjour tous le monde.
Bon après avoir essayer sur une autre machine j'obtient toujours le même message d'erreur :
[mysql][ODBC 3.51 driver][mysqld-4.1.9-max] erreur de syntaxe près de '1TSI1"' à la ligne 1.
je vais voir avec ma version EasyPHP car j'ai aperçu mysql 4.1.9 max, le problème vient peut-être de ma base elle même.
Je dois dire que je commence à perdre espoir :'(.
Bonne journée

Amicalement Ti_flo
<!--[if !supportLineBreakNewLine]-->
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
19
Peut-être que l'erreur provient de ta Function requête()
Si tu ne mets pas de Where, tu n'as que 2 guillemets, en mettant le where, tu te retrouves avec plusieurs, en plus des apostrophes.

Es-tu certain que ta Function gère bien ce genre de paramètre ?
As-tu essayé en affectant ta requête SQL à une variable String et passer celle-ci en paramètre plutôt que de passer le texte en dur ?

MPi
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
81
Re
Le principal est que tu y retrouves tes petits, mais honnètement, sans savoir ce que tu fais dans ta fonction 'requète', c'est à dire là où se produit l'erreur, impossible que cela puisse aider qqun ...
Moi, ce qui me saute aux yeux dans le message d'erreur, c'est le " juste avant la fin du message . . .
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
81
Salut
Bah oui, normal.
Rappel de tes replaces (en courrier new pour bien voir les ' ) :
    rs_sql = Replace(rs_sql, "'", "[%]", 1, -1)
    rs_sql = Replace(rs_sql, "|", "'", 1, -1)
    rs_sql = Replace(rs_sql, "''", "' '", 1, -1)
    rs_sql = Replace(rs_sql, "[%]", "''", 1, -1)
Ta requète, après triturage de ta fonction donnait ceci :
SELECT nom, prenom FROM utilisateur, classe WHERE utilisateur.iduser = classe.iduser AND nomclasse=''1STSI1'';
Les doubles '' sont incorrects

Avec ce code, il aurait fallu que tu nous dises ce que tu croyais faire.
L'utilisation des crochets [ et ] en SQL n'est pas anodin (bien qu'ici les [%] apparaissent puis disparaissent).
Par exemple, [%] dans une chaine permet de rechercher le caractère % sans qu'il soit interprété comme le symbole 'parmi'.

Tu vois, si tu avais dévoilé ce code dès le début, le temps que ça t'aurait fait gagné !
Bonne continuation.

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

Champion du monde de boule de cristal - 2005
Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
15
Date d'inscription
jeudi 27 avril 2006
Statut
Membre
Dernière intervention
24 mai 2007

Oui en effet, j'aurais gagné mon temps à la dévoiler plus tôt, mais comme mes premières requêtes fonctionnaient bien je ne pensais pas que l'erreur puisse venir de ma fonction requête. Je te remercie beaucoup pour ton explication Jack, sa devient plus clair dans ma tête maintenant.
Merci

Amicalement Ti_flo