Comportement bizarre de la méthode "Fields" d'un recordset

Résolu
Signaler
Messages postés
29
Date d'inscription
mercredi 25 avril 2007
Statut
Membre
Dernière intervention
22 avril 2008
-
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
-
Bonjour,
J'ai un souci sur lequel je tourne en rond depuis un moment.

Dans le cadre d'une appli tournant sous Excel 2000 (SP3) -et Windows XP-, je récupère des datas d'une base de données MySQL a l'aide d'une certaine requète pour les insérer dans un menu défilant d'un Userform.

Le hic, c'est que sur 3 PC, tout fonctionne bien, et sur 5 autres, ca ne marche pas!! (A priori, les PC sont les mêmes et ont recu les mêmes maquettes d'Install)

Après investigations, il semblerait que la méthode Fields de recordset (ou du moins le .value de cette méthode) ait un comportement différent dans chaque cas:
-- rst.fields(0).valuereste avec la bonne valeur quand ca marche.
-- rst.fields(0).value quand on execute le rst.MoveNextmais, hélas, devient "" (avec driver ODBC 3.51.16 ) ensuite, ou null (avec driver ODBC 3.51.25 ).

PS: Dans les 2 cas la requète s'execute bien puisque je vois, en pas a pas, les valeurs que je veux au moment du rst.MoveNext

* Est-ce que c'est déjà arrivé a quelqu'un? (j'ai cherché dans le forum mais les 2 seuls topics ressemblant un peu sont sans réponse)
* Est-ce que c'est mon code qui n'est pas bon?
* Est-ce que c'est un problème de conf et dans ce cas-là, d'ou ca pourrait venir?

Je suis dans une impasse et ce serait génial si quelqu'un pouvait m'en sortir.

Voici la partie de mon code en question:

La requète est toute simple:
    sql = "SELECT row_criteria FROM " & TableName

et la routine appelée est:
Public Sub RowCriteriaSpecific(ByVal sql As String, ByVal param_control As Object)
    Dim rst As ADODB.Recordset
   
    Set rst = New ADODB.Recordset
    rst.Open sql, cnx_specific    'cnx_specific est global et initialisé auparavant
    param_control.Clear
    While Not (rst.EOF)        If rst.Fields(0) "ColName" Or rst.Fields(0) "Desc_Column" Or rst.Fields(0) = "Type_Criteria" Then
        Else
            param_control.AddItem rst.Fields(0)
        End If
        rst.MoveNext      ' C'est uniquement a cette ligne que je peux voir la bonne valeur
    Wend          ' Ici, c'est déjà fini. On a sur l'espion, soit "" soit null en fonction du driver
End Sub

Merci de votre aide.

13 réponses

Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
48
salut,

à tenter.. :

Public Sub RowCriteriaSpecific(ByVal sql As String, ByVal param_control As Object)
    Dim rst As New ADODB.Recordset
    Dim sValue As String
    
    param_control.Clear
    
    With rst
        .Open sql, cnx_specific    'cnx_specific est global et initialisé
auparavant
        .movelast
        .movefirst
        
        While Not (.EOF)
            sValue = .fields("row_criteria").Value
            If LenB(sValue) = 0 Then
                Debug.Print "RETOUR VIDE OU
NULL"
            ElseIf (sValue = "ColName") Or (sValue = "Desc_Column") Or (sValue = "Type_Criteria") Then
                Debug.Print "CAS PARTICULIER :
" & sValue
            Else
                param_control.AddItem sValue
            End If
            .MoveNext
        Wend
        .close
    End With
    Set rst = nothing
End Sub

++
Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
Messages postés
1411
Date d'inscription
mercredi 6 août 2003
Statut
Membre
Dernière intervention
3 mars 2019
1
Salut,

As-tu essayé avec Microsoft.Jet.OLEDB.4.0 ?

Bonne prog
++
Messages postés
1241
Date d'inscription
mardi 10 octobre 2006
Statut
Membre
Dernière intervention
27 août 2013
6
Bonjour,
' avant de commencer ta boucle,

Pense à faire :

rs.movelast

tester si rs.recordcount <>-1

et ensuite rs.movefirst
While Not (rst.EOF)
       
If rst.Fields(0) "ColName" Or rst.Fields(0) "Desc_Column" Or
rst.Fields(0) = "Type_Criteria" Then  'C'est normal qu'il n'y ait rien ici?
        Else
            param_control.AddItem rst.Fields(0)
        End If
        rst.MoveNext      ' C'est uniquement a cette ligne que je peux voir la bonne valeur
    Wend          ' Ici, c'est déjà fini. On a sur l'espion, soit "" soit null en fonction du driver

Sinon peut-être que ton problème vient de ta requête, tu peux toujours tester en remplaçnt "SELECT row_criteria FROM " & TableName pas select *
Mais je ne suis vraiment pas sûr que ça vienne de là..

L'expérience, c'est une connerie par jour, mais jamais la même..
Messages postés
1411
Date d'inscription
mercredi 6 août 2003
Statut
Membre
Dernière intervention
3 mars 2019
1
Autre idée, peux-tu consulter manuellement ta base de données ? Peut-être que row_criteria est vide dans un des enregistrements et qu'il celui-ci se retrouve simplement au debut du recordset.

Bonne prog
++
Messages postés
29
Date d'inscription
mercredi 25 avril 2007
Statut
Membre
Dernière intervention
22 avril 2008

Tout d'abord. Merci a vous pour vos réponses rapides.

@ bouv:
-- Je ne connais pas Microsoft.Jet.OLEDB.4.0. Je vais me documenter la-dessus, voir si c'est dispo sur nos plateformes (je maitrise pas les install qui sont faites sur les PC), et si oui, voir si ca corrige mon bug. Mais ca va me prendre un peu de temps.

-- Sinon, j'ai le moyen de consulter ma base en effet et les champs sont bien remplis. Le début de mon recordset n'est pas vide. Et le même symptome se produit quelque soit l'endroit ou je me trouve dans ma boucle.
D'ailleurs, le problème est que le vide que je vois ne l'est qu'a un instant t1 du code car a un instant t2, on voit que c'est bien rempli.

@lolokun:
je vais tester si rs.recordcount <>-1 et je te tiens au courant. Et oui, c'est normal qu'il n'y ait rien dans le then car je l'ai supprimé (Inutile a la compréhension) pour raccourcir. Mais c'est la seule chose que j'ai supprimée.

Je le sens vraiment mal ce bug. (en tout cas, merci a vous 2 de vous pencher sur mon pb)
Messages postés
1241
Date d'inscription
mardi 10 octobre 2006
Statut
Membre
Dernière intervention
27 août 2013
6
Ok.



Heuu sinon un autre point peut-être à vérifier..Si y'a bien les mises à jours SP2 sur tous les postes.


Et autre chose, comment as-tu réalisé le package d'installation??

L'expérience, c'est une connerie par jour, mais jamais la même..
Messages postés
584
Date d'inscription
jeudi 28 décembre 2006
Statut
Membre
Dernière intervention
29 avril 2010
1
with rst


if (.recordcount > 0) then
    .movefirst
    While Not (rst.EOF)
   
        If .Fields(0).value "ColName" Or .Fields(0).value "Desc_Column" Or .Fields(0).value = "Type_Criteria" Then  '
        Else
            param_control.AddItem .Fields(0).value
        End If
       .MoveNext      ' C'est uniquement a cette ligne que je peux voir la bonne valeur
    Wend       
end if
end with

+ Je te suggère de toujours spécifié le .value a la fin
+ Aussi tu peux peut-etre essayer avec le nom du champs au lieu de ca position
 rst.fields("row_criteria").value a place de rst.fields(0).value.
+ Afin d'alléger ton code tu deverais peut-etre utiliser un with







C'est uniquement a cette ligne que je peux voir la bonne valeur, Qu'est-ce que tu veux dire ?



<hr size ="2" width="100%" />  zen69 aka Ortho Le Profett
  [site web]
Messages postés
29
Date d'inscription
mercredi 25 avril 2007
Statut
Membre
Dernière intervention
22 avril 2008

Merci a vous tous pour vos réponses. Ce week end, je ne peux hélas pas lire en détail ni essayer tout ca, car je n'ai ni connection, ni ordi (a part pour 1 min ^^).
Je regarde tout ca Lundi et je vous tiens au courant.
Merci encore.
 
  Acta_6
Messages postés
29
Date d'inscription
mercredi 25 avril 2007
Statut
Membre
Dernière intervention
22 avril 2008

Bonjour a vous

Zen69 a écrit: C'est uniquement a cette ligne que je peux voir la bonne valeur, Qu'est-ce que tu veux dire ?

Ben j'ai placé un espion sur rst.fields(0).value et je déroule mon code en pas a pas.
Et il n'y a qu'après avoir exécuté le rst.MoveNext que je vois la bonne valeur (ie le contenu de mon champ)
Sinon, dès que je continue de dérouler le code, la valeur passe a "" ou null (que la ligne suivante soit un wend ou une affectation quelconque)

Par contre, je vais prendre en compte tes remarques.
C'est d'ailleurs a peu près les mêmes qui sont suggérées par PCPT.
Merci a vous 2

Bref, j'ai modifié le code, j'attends d'avoir accés a un des 5 ordis qui marche pas pour tester si ca résoud mon problème (de toute facon, ca sera plus propre ainsi)

@ lolokun:
Oui, ca, j'ai vérifié, ya bien la mise a jour SP2 sur les postes (enfin, je vais refaire la vérif moi-même mais chaque propriétaire du poste m'a dit que c'était bon)
Quant au package de livraison, mon responsable a mis a disposition le zip d'install de Mysql qu'il a télécharger et l'install lui-même partout (pour l'instant). Je n'ai qu'a installer mon outil ensuite.

Bon, je vais peut-être avoir une machine, je file faire mes tests et je reviens vous dire ce que ca a donné.
Messages postés
29
Date d'inscription
mercredi 25 avril 2007
Statut
Membre
Dernière intervention
22 avril 2008

Ca y est. J'ai fait quelques tests:
-- Donc 1ère chose, j'ai trouvé pourquoi, ca marchait sur certains PC et pas sur les autres. Mea Culpa: la version de Mysql n'est pas la même. Ca marche sur la 5.0.0alpha mais pas sur la 5.0.41 (mon responsable m'a dit qu'il avait changé l'install).
Bref, ceci explique la différence mais ne résout pas mon pb. Sorry, j'avais vérifié les conf Excel et XP mais pas Mysql.

-- Ensuite, pour répondre a lolokun, zen69 et PCPT, j'ai bien mis un .MoveLast avant tout. Mais celui-ci plante en me mettant une erreur d'exécution:
L'ensemble des lignes ne prend pas en charge les récupérations arrière.
Et le .recordcount est bien égal a -1
Qu'est-ce que ca veut dire? La base serait-elle mal faite?? Ou est le souci?? C'est bizarre que toutes les requètes se fassent correctement quand même.

-- Par contre, pour finir, et c'est une très bonne nouvelle (même si du coup ca va générer beaucoup de travail pour répercuter dans les autres requètes), quand j'utilise la solution complète de PCPT, ca fonctionne!!!!!
Le fields("row_criteria") a la place de fields(0), ne suffit pas. Mais si, en plus, on passe par une valeur tampon pour stocker le fields("row_criteria").value, la liste se rempli bien. J'arrive pas a comprendre comment c'est possible mais ca marche donc, je suis heureux.

Merci donc a tout le monde!!
Un petit gout amer toutefois car certaines questions reste en suspens mais au moins, j'ai une solution . Merciiiiiiiii.
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
48
pour les questions en suspens...
peux-tu nous montrer ta chaîne de connexion pour cnx_specific stp

également vérifier au niveau des droits de chaque poste (enfin assez pour avoir une idée, qui marche qui marche pas) ainsi que les parefeu locaux....

tu peux également essayer la connexion à ta base avec ma source ADO HELPER, au moins pour tester....
orienté objet, çà devrait pas te faire perdre trop de temps

++
Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
Messages postés
29
Date d'inscription
mercredi 25 avril 2007
Statut
Membre
Dernière intervention
22 avril 2008

Merci PCPT.
Alors, en ce qui concerne cnx_specific, voici la chaine de connexion:

cnx_specific.ConnectionString = "UID=" & sUser & ";PWD=;DRIVER=MySQL ODBC 3.51 Driver;Server=" & sDatabasePath & ";Port=" & sDatabasePort & ";Database=" & sDbName & ";"

Pour une utilisation provisoire, il n'y a pas de mot de passe pour l'instant.
Même "politique" pour les droits d'accés a la base. Tous les privilèges sont accordés a l'utilisateur du poste. J'ai vérifié, chaque compte a tous les droits et est défini en majuscule et minuscule (au cas ou).
Chaque poste a été monté avec la même maquette et les même droits utilisateur (sauf 1 qui a les droits admin avec son compte mais ne marche pas quand même)
L'installation de Mysql a été faite sous un même compte admin par la même personne sur chaque poste. La seule différence (normalement) est que 2 postes sont avec Mysql 5.0.0alpha, et 5 avec Mysql 5.0.41 (et le code fonctionne sur les 2 postes avec la 5.0.0alpha)

Pour ADO HELPER, je vais essayer de tester ca dès que mon responsable me laisse respirer.
(j'aurais pas du lui dire tout de suite qu'une solution avait été trouvé )

@+.
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
48
essaye comme çà :

const sPassword as string = vbnullstring'<- à modifier provisoirement ^^
cnx_specific.ConnectionString " Driver{MySQL ODBC 3.51 Driver};Server= " & sDatabasePath & " ;Port =" & sDatabasePort & ";Database= " & sDbName & " ;User =" & sUser & ";Password= " & sPassword & ";Option =3;"

sDatabasePort=3306 par défaut
Option, perso j'utilise 1 + 2 + 8 + 32 + 2048 + 16384 mais je ne peux pas tester avec une base distante pour le moment

une piste également est de voir ce qui a changé entre l'alpha et la nouvelle version
et si tu peux te permettre, éventuellement downgrader un des PC...

bon courage ++
Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp