Incompatibilité d'une application entre win 2000 et XP

cs_UniMax Messages postés 3 Date d'inscription jeudi 13 septembre 2007 Statut Membre Dernière intervention 18 septembre 2007 - 13 sept. 2007 à 14:14
cs_UniMax Messages postés 3 Date d'inscription jeudi 13 septembre 2007 Statut Membre Dernière intervention 18 septembre 2007 - 18 sept. 2007 à 14:39
Bonjour à tous,

J'ai développé (en partie) une application VB6 / MySQL sous windows 2000 et elle fonctionne très bien. Le souci intervient lorsque je veux l'executer sous windows XP.
L'appli plante notemment au moment d'executer des requêtes avec des COUNT, MIN ou MAX.

Voici la fonction que j'utilise pour l'execution des requetes :
(je pense que la ligne en gras y est pour quelque chose)

' Exécution d'une requête SQL de sélection et renvoi d'un objet Recordset
Public Function ExecuteSQLSelection(ByVal SQLQuery As String) As ADODB.Recordset
    Dim rs As New ADODB.Recordset
   
On Error GoTo lblError
    rs.CursorLocation = adUseClient
    Call rs.Open(SQLQuery, cnx, adOpenStatic, adLockOptimistic)
    Set ExecuteSQLSelection = rs
    Exit Function
   
lblError:
   Call HandleError(SQLQuery)
End Function

Et voici un exemple d'une requête qui plante :
query = "INSERT IGNORE INTO e_tmp_fpc_a_passer " & _
                    "SELECT r1.idFlowRef " & _
                    "FROM `e_flow_ref` r1, e_flow_ref r2 " & _
                    "WHERE r1.flowType = 'numDep_vs' " & _                      "AND r1.sequence (SELECT MAX(r3.Sequence) FROM e_flow_ref r3 WHERE r3.flowType 'numDep_vs' AND r3.PDL = r1.PDL) " & _
                      "AND r1.PDL = r2.PDL " & _
                      "AND r2.flowType = 'souscr' " & _
                      "AND r2.state = '" & strFlowState & "' " & _
                    "UNION " & _
                    "SELECT r.idFlowRef " & _
                    "FROM `e_flow_ref` r " & _
                    "WHERE r.flowType = 'numDep_vr' " & _
                      "AND r.state = '" & strFlowState & "' " & _
                    "LIMIT " & fTypesFlux.txt_nbNumDep.Text
            General.maBD.ExecuteSQLAction (query)
        'Sélection des lignes de fichier
            query = "SELECT MIN(IF(libelleHPHC<>'',r.ligneFichier1, CONCAT_WS(';',CONCAT('      ',r.PDL), RPAD(numTel,20,' '),'-'))) AS `ligneFichier` " & _
                    "FROM `e_flow_ref` r, " & _
                         "`e_flow_num_dep` n, " & _
                         "`e_tmp_fpc_a_passer` t " & _
                    "WHERE r.idFlowRef = t.idFlowRef " & _
                      "AND r.idFlowRef = n.idFlowRef " & _
                    "GROUP BY r.PDL " & _
                    "ORDER BY `ligneFichier`"
 Set rs = General.maBD.ExecuteSQLSelection(query)
    If (rs.state = adStateClosed) Then
        Call MsgBox(strCriticalSQLError, vbCritical, strCriticalTitle)
        a_lngRows(disco, 0) = 0
    ElseIf (Not rs.Supports(adBookmark)) Then
        Call MsgBox(strCriticalBookmarkNotSupported, vbCritical, strCriticalTitle)
        a_lngRows(disco, 0) = 0
    End If

Quand je dis ca plante, en fait il ne se passe plus rien et quand j'utilise la commande "show processlist" de MySQL je vois qu'il m'execute la requete suivante : "Select * from e_flow_ref", c'est à dire pas du tout ce que je lui demande de faire.
Avez-vous déjà rencontré ce type de problème ? est ce que ca viendrait d'une dll ou quelque chose comme ca ?

Merci d'avance pour vos réponses.

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
13 sept. 2007 à 19:18
Salut
Je ne pense pas que le problème vienne de VB.
De toute façon, il est préférable de compiler l'EXE sous le même OS que celui sur lequel il sera utilisé car certains appels aux API ont évolués.
Si le plantage a lieu sur la ligne en gras peut venir de plusieurs raisons :
- Tu as déplacé l'EXE sur la nouvelle machine sans avoir utiliser l'empaquetage : Dans ce cas, les dépendances (comme ADO) n'ont pas été installées
- Les versions ADO de tes machines ne sont pas de même niveau : Là aussi, une histoire d'empaquetage résoud le problème
- Ta chaine de connexion (ConnectionString) est incompatible avec la version ADO installée

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

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
cs_UniMax Messages postés 3 Date d'inscription jeudi 13 septembre 2007 Statut Membre Dernière intervention 18 septembre 2007
14 sept. 2007 à 09:17
Je ne sais pas si ca vient de là car j'ai installé vb6 sur ma machine XP et je suis reparti des sources. J'ai utilisé les mêmes composants et les mêmes références. Je suis perdu
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
14 sept. 2007 à 20:05
Re
En détaillant ton code, je remarque des choses bien compliquées pour pas grand chose :
Pourquoi vouloir passer par une Function pour exécuter ta requète ?
Oui, ça peut fonctionner, mais c'est lourd
Les Insert ou Delete se font avec maConnexion.Execute RequèteSQL, Retour
où Retour est une variable de type Long qui te fournira le nombre de lignes touchées par ta commande.
Cela peut-être pratique pour savoir si la commande s'est bien exécutée.
Les Select se font avec un RecordSet :
    Dim rs As ADODB.Recordset
    Set rs = New ADODB.Recordset
    rs.CursorLocation = adUseClient
    RequèteSQL = "Select * From maTable"
    rs.Open RequèteSQL, maConnexion, adOpenStatic, adLockReadOnly

Si tu dois réutiliser le 'rs' dans la même procédure, il suffit de le refermer avant de lui refaire un Open :
    rs.Close

Dans ton extrait de code, je ne vois pas la déclaration de la connexion.
C'est une étape importante :
   Dim maConnexion As ADODB.Connection
   Set maConnexion = New ADODB.Connection
   maConnexion.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                                                       "Persist Security Info=False;" & _
                                                       "Data Source=" & monFichierMDB
   maConnexion.Open
La version du moteur Jet (ici 4) dépend du niveau de mise à jour de ADO.
Vérifie que tu as bien installé le SP6 de VB6 qui t'amènera cette mise à jour ADO

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

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
cs_UniMax Messages postés 3 Date d'inscription jeudi 13 septembre 2007 Statut Membre Dernière intervention 18 septembre 2007
18 sept. 2007 à 14:39
Salut,

En fait je passe par des fonctions car se sont des modules déjà tout fait là où je bosse et ces modules sont communs a plusieurs applications, donc je suis contraint de les utiliser.

J'initialise ma chaine de connexion comme ceci :
'Construction de la chaîne de connexion
Private Const ODBC_DRIVER As String = "DRIVER={MySQL ODBC 3.51 Driver};"
Private Const ODBC_SERVER As String = "SERVER="
Private Const ODBC_UID As String = ";UID="
Private Const ODBC_PASSWORD As String = ";PASSWORD="
Private Const ODBC_OPTION As String = ";OPTION=2051"
Private Const ODBC_PORT As String = ";PORT="

Les autres constantes sont stockées dans un fichier de config selon le serveur utilisé.


'Génération de la nouvelle chaîne de connexion
    m_strConnectionString = _
        ODBC_DRIVER & _
        ODBC_SERVER & strServer & _
        ODBC_UID & strUID & _
        ODBC_PASSWORD & strPassword & _
        ODBC_OPTION & _
        ODBC_PORT & strPort


'Connexion au serveur MySQL
    Call Connect


End Sub


' Connexion au serveur MySQL
Public Sub Connect()
   
    Set cnx = New ADODB.Connection
    Call cnx.Open(m_strConnectionString)


End Sub


Voila je ne sais pas si cela va t'être d'une grande aide
En tout cas merci d'avoir répondu jusqu'a présent
0
Rejoignez-nous