Différences requêtes SQL VB - ACCESS

manu_katz Messages postés 7 Date d'inscription samedi 9 octobre 2004 Statut Membre Dernière intervention 29 novembre 2004 - 17 nov. 2004 à 15:50
manu_katz Messages postés 7 Date d'inscription samedi 9 octobre 2004 Statut Membre Dernière intervention 29 novembre 2004 - 29 nov. 2004 à 02:06
Bonjour à tous,

Voici mon problème : je travaille sur une application Visual Basic 6.0 qui est connecté par ODBC avec une base ACCESS 2002. Or, certaines requêtes que je teste sous Access fonctionnent parfaitement et, quand je les utilise avec VB, ne renvoient aucun résultat (mais ne correspondent pas à un EOF()).

Prenons un exemple, je recherche les enregistrements compris entre telle date et telle date. La requête SQL sous access me donne bien des enregistrements. La même requête passé sous VB en utilisant la connexion ODBC me spécifie que je ne suis pas en EOF (donc, pas en fin de fichier, donc j'ai bien des résultats) mais me donne un .recordcount = -1 !

Ceci se produit également lorsque j'utilise le caractère générique * avec un LIKE dans ma requête (pour afficher tous les enregistrements contenant une certaine chaîne de caractères, par exemple).

J'avoue ne pas comprendre pourquoi les résultats sont différents entre les 2 méthodes (Access tout seul d'un côté et VB qui pilote une base Access d'autre part).

Certains ont-ils déjà constaté des symptômes similaires et, si oui, ont-ils trouvé la solution à ce problème ??

J'attends vos réponses...

Manu

12 réponses

gandalflegris007 Messages postés 211 Date d'inscription lundi 31 mars 2003 Statut Membre Dernière intervention 11 juin 2007
17 nov. 2004 à 15:58
salut Manu,

je ne vais pas t'être d'un ultime secours mais si ça peut t'aider à te décoincer :
j'ai déjà été confronté à des soucis sur des requêtes basées sur des paramètres date. Et bien souvent ça vient du format.
exemple :
Dim MaDate as date
select * from matable where ladate = #" & madate & "#;"
il y a des chances qu'il ne te sorte pas les bons résultats.
par contre
select * from matable where ladate = #" & format(madate,"m/d/yyyy" & "#;"
te donne des résultats corrects.

Essaie déjà ça histoire d'écarter une piste ...

Guich
0
gandalflegris007 Messages postés 211 Date d'inscription lundi 31 mars 2003 Statut Membre Dernière intervention 11 juin 2007
17 nov. 2004 à 15:58
Xcuz, j'ai oublié de fermer la parenthèse :
select * from matable where ladate = #" & format(madate,"m/d/yyyy") & "#;"
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
17 nov. 2004 à 16:14
Salut,

Pour le caractere generique * avec like, essaie de le remplacer par %
@+
Julien
-----------------------------------------------------------
:big) Essai ca sinon on trouvera autre chose ;)
-----------------------------------------------------------
0
manu_katz Messages postés 7 Date d'inscription samedi 9 octobre 2004 Statut Membre Dernière intervention 29 novembre 2004
17 nov. 2004 à 22:21
Merci à tous les 2. Je file direct essayer vos propositions et je vous tiens au courant... :big)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
manu_katz Messages postés 7 Date d'inscription samedi 9 octobre 2004 Statut Membre Dernière intervention 29 novembre 2004
18 nov. 2004 à 00:02
Alors, je viens d'essayer tout ça et je vous livre mes conclusions :

Concernant le caractère générique, il faut effectivement utiliser % au lieu de *. C'est d'autant plus étrange que sous access, il reconnaît * comme caractère générique à utiliser avec LIKE et non % ! En tout cas, merci à toi pour cette aide, jrivet.

Concernant mes problèmes de date, j'ai essayé ta proposition, gandalflegris007, mais elle donne le même résultat que celle que j'utilise. Je continue mes recherches, il doit y avoir autre chose qui cloche. Quoiqu'il en soit, merci aussi pour ton aide.
0
JoePatent Messages postés 171 Date d'inscription jeudi 30 janvier 2003 Statut Membre Dernière intervention 20 juillet 2008
19 nov. 2004 à 16:39
Si ton probleme est seulement au niveau du recordCount, il s'agit de ton type de curseur.

Prenons un recordet du nom de RS.

objConn.Open connStr

RS.CursorType = adOpenStatic ' On choisit ce curseur afin de permettre le RecordCount
RS.Open "select * from table", objConn

http://www.joepatent.comJoe Patent
0
manu_katz Messages postés 7 Date d'inscription samedi 9 octobre 2004 Statut Membre Dernière intervention 29 novembre 2004
23 nov. 2004 à 00:21
Je crois que je viens de comprendre mon problème mais pas encore d'en trouver la solution...

En fait, dès que j'ai plus de 99 enregistrements comme réponse à ma requête, il me renvoie un .recordcount = -1 !!!

On m'avait déjà parlé d'un problème de ce type mais on m'avait dit qu'il suffisait de faire :

.MoveLast
.MoveFirst


pour qu'il prenne en compte la totalité des enregistrements, quel que soit le nombre de réponses. Apparemment, ce n'est pas le cas...

Si vous avez des idées, n'hésitez pas à m'en faire part parce que, là, j'avoue que je suis un peu à court d'idées...
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
23 nov. 2004 à 09:27
salut,

je sais pas si ca va pouvoir t avancer mais pour tester si un recordset est vide tu peux essayer aussi :
If rs.BOF and Rs.EOF Then msgbox "Rs est vide"

@+
Julien
-----------------------------------------------------------
:big) Essai ca sinon on trouvera autre chose ;)
-----------------------------------------------------------
0
manu_katz Messages postés 7 Date d'inscription samedi 9 octobre 2004 Statut Membre Dernière intervention 29 novembre 2004
23 nov. 2004 à 10:06
Ben, le problème c'est que mon recordset n'est pas vide puisque je teste rs.EOF() pour savoir si je poursuit l'exécution. Or :

- quand je reçois moins de 100 réponses à ma requête, ma commande rs.EOF() me spécifie bien que j'ai des réponses et mon rs.RecordCount me ramène bien le bon nombre de réponses,

- quand je reçois 100 réponses ou plus à ma requête, ma commande rs.EOF() me spécifie bien que j'ai des réponses mais mon rs.RecordCount vaut -1.

J'ai bien trouvé une page sur internet qui semble prendre en compte ce problème (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/office97/html/connectionstrategies.asp, paragraphe Limiting Dynasets to 100 Records et suivant) mais je ne comprends pas trop ce que je dois faire. Il me semble qu'ils parlent d'utiliser 2 recordset au lieu d'un seul mais l'explication est peu claire. Ils parlent aussi de faire un rs.MoveLast avant toute chose pour prendre en compte tous les enregistrements mais je le fais déjà.

HELP !?! :sad)
0
manu_katz Messages postés 7 Date d'inscription samedi 9 octobre 2004 Statut Membre Dernière intervention 29 novembre 2004
28 nov. 2004 à 10:48
Personne d'autre que moi n'a constaté ce problème ??

Vous ne recevez jamais plus de 100 réponses à vos requêtes ou quoi ? :big)

A moins que ce soit lié à un mauvais paramétrage de ODBC mais, dans ce cas, je ne vois pas à quel endroit je peux préciser le nombre maxi de réponses à gérer...
0
JoePatent Messages postés 171 Date d'inscription jeudi 30 janvier 2003 Statut Membre Dernière intervention 20 juillet 2008
28 nov. 2004 à 22:34
Moi j'ai plusieurs milliers d'enregistrements a gerer et je n'ai jamais constater ton probleme.

Poste ton projet et on pourra le verifier.

As-tu regarder du coté du curseur tel que j'ai mentionné auparavant ?

RS.CursorType = adOpenStatic au lieu de dynamique...
0
manu_katz Messages postés 7 Date d'inscription samedi 9 octobre 2004 Statut Membre Dernière intervention 29 novembre 2004
29 nov. 2004 à 02:06
Tout d'abord, merci pour ton aide.

En fait, j'ai essayé les instructions que tu me proposes mais il me met une erreur sur .CursorType :

Erreur de compilation - Méthode ou membre de données introuvable !


D'où penses-tu que cela provienne ?
0
Rejoignez-nous