Probleme utilisation de l'objet adodb.connection en vba

Résolu
GarnierFlorian Messages postés 129 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 26 juillet 2011 - 31 août 2010 à 10:15
GarnierFlorian Messages postés 129 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 26 juillet 2011 - 2 sept. 2010 à 11:45
Bonjour à tous !

En gros, je fais ma connexion à mes tables foxpro, et je souhaite ensuite utiliser une procédure qui va exécuter une requete auquel j'ai besoin de passer la connexion en paramètre !

Mais du coup j'ai toujours une erreur : "Incompatibilité de type"

Je vous mets juste le bout de code qui nous intéresse (en tout cas pour moi^^) :

Sub ExecutionRequete(type_requete As String)
    Dim connect As Object
        
    'On fait appel à la fonction permettant de se connecter aux tables
    connect =  Connexion(CHEMIN)
        
        If flag_connect = True Then
        
            If type_requete =  "select" Then
                 AfficherResult(connect)    
            ElseIf type_requete   = "insert" Then
                InsertSQL (connect)
            ElseIf type_requete = "update" Then
                UpdateSQL (connect)
            Else
                DeleteSQL (connect)
            End If
            
            'Enregistrement des modifications des feuilles excel
            Application.DisplayAlerts = False
            ActiveWorkbook.Save
            Application.DisplayAlerts = True
            
            'On ferme la connexion aux tables
            Deconnexion
        Else
            MsgBox "Il n'existe aucune connexion", vbOKOnly, "Connexion inexistante"
        End If
        
    
End Sub

'FONCTION PERMETTANT DE SE CONNECTER SUR UNE BASE FOX PRO
Function Connexion(chemin_rep As String)

'chemin est une constante indiquant tout simplement le répertoire de la table
Set connect_foxpro = New connection

With connect_foxpro
    .ConnectionString "Provider vfpoledb; Data Source =" + chemin_rep
    .Open
End With

flag_connect = True

End Function


J'ai mit en évidence ce qui me semble poser problème ?! Quand je passe au pas à pas, il me surligne en bleu cette méthode, et si je la passe en commentaire, il fait pareil avec les fonctions qui viennent derriere (donc pour moi c'et bien qu'il veut pas passer la connexion en paramètre !)

Juste une précision, j'ai aussi essayé de déclarer ma variable connect en objet, et là il bug sur le end function de ma fonction Connexion :" Variable objet ou variable de bloc non définie"

J'espère avoir été assez clair,

et je vous remerci d'avance !!

Peace :)
 

19 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
1 sept. 2010 à 19:49
Ta ligne
rs.Open cmd, CursorType:=adOpenStatic
est nettement différente de celle dont je te parle dans ma précédente réponse.

As-tu essayé de la modifier pour avoir une syntaxe complète ?
3
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
31 août 2010 à 12:53
Salut

Actuellement, tel que ton programme se présente, tu n'utilises pas ADODB mais DAO, qui est obsolète.
Si tu veux utiliser ADODB, il faut l'ajouter dans les références de ton projet : "Micorosoft ActiveX Data Objects 2.8 Library"

Ensuite, il faut convenablement dimensionner tes objets.
Set connect_foxpro = New ADODB.Connection


Dim connect As Object
Alors que cette variable semble représenter un chemin et nom d'un fichier.
Pourquoi pas le dimensionner en String ?

ConnectionString : Simplifie toi la vie et utilise cet http://logiciel.codes-sources.com/logiciels/MzTools-233.aspx, gratuit pour VB6 et VBA : Dedans, une petite procédure te permettra de définir proprement les paramètres de ta connexion et de la tester : il te retournera la ConnectionString qui va bien.

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)
0
GarnierFlorian Messages postés 129 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 26 juillet 2011
31 août 2010 à 13:59
Je ne comprends pas, j'ai bien ajouté la référence "Micorosoft ActiveX Data Objects 2.8 Library", donc en quoi je peux différencier DAO et ADO ?

Je pensais pourtant avoir fait mes connexions en ADO :S

J'utilise des ADODB.COnnection et ADODB.Command !

Enfin si je peux avoir un peu plus d'explication je suis preneur :$

Pour l'utilitaire, je vais regarder tout ça :)

Merci pour ta réponse en attendant :)

Peace



 
0
GarnierFlorian Messages postés 129 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 26 juillet 2011
31 août 2010 à 14:10
Bon, je viens d'installer MzTools et je l'ai pas encore utilisé qu'il me plait déjà^^

Merci beaucoup !!

Peace
 
0

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

Posez votre question
GarnierFlorian Messages postés 129 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 26 juillet 2011
31 août 2010 à 14:20
Voila les modifications que j'ai faite au niveau de ma fonction Connexion :

'FONCTION PERMETTANT DE SE CONNECTER SUR UNE BASE FOX PRO
Function Connexion()

'chemin est une constante indiquant tout simplement le répertoire de la table
Set connect_foxpro = New connection

With connect_foxpro
    .ConnectionString = "Provider=ADsDSOObject;Location=K:\GARNIER\FG\Basefoxpro;Mode=ReadWrite;"
    .Open
End With

flag_connect = True

Connexion = connect_foxpro

End Function


Le provider me semble un peu bizare et j'ai du modifier un peu la chaine parce que sinon j'avais un message d'erreur

Si tu peux me dire Jack ce que tu en penses, je t'en serais reconnaissant !!

Peace
 
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
31 août 2010 à 15:10
Set connect_foxpro = New connection

"Connection" est un mot clé associé à DAO.
Les objets ADO commencent par ADODB.QuelqueChose

Je t'ai donné la syntaxe dans ma première réponse (pas bien de lire en diagonale)
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
31 août 2010 à 15:19
Dans le principe, tu peux faire cette succession de passage de controle :
Dim connect As Object
connect = Connexion(CHEMIN)
puis
Function Connexion()
    Set connect_foxpro = New ADODB.Connection
    ...
    Connexion = connect_foxpro  ' Je pense qu'il faut un Set en tête de ligne
End Function
mais il faut impérativement que ces trois objets aient la même définition.
Le premier, Object : trop générique
Le deuxième, la fonction Connexion : pas typée
Le dernier, connect_foxpro : Le seul est être du bon type (ou le sera bientôt)

Tous doivent être dimensionnés/typés en ADODB.Connection :
    Dim connect As ADODB.Connection
    Function Connexion() As ADODB.Connection
    Set connect_foxpro = New ADODB.Connection

Au fait, connect_foxpro est dimensionné où ?
0
GarnierFlorian Messages postés 129 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 26 juillet 2011
31 août 2010 à 15:47
Ah oui exact !! En fait, c'était une erreur de ma part pour "connection" au lieu de "ADODB.connection" ! Pour le reste j'avais bien précédé mes éléments de ADODB !!

C'est vrai que c'est pas cool de lire en diagonale :X ^^

Et encore merci pour ton petit add-on ;)

Par contre je vois pas ce que tu entends dans ta derniere question ? Si tu me demandes où je le déclare, c'est simplement au début de mon module de cette manière :

Dim connect_foxpro As ADODB.connection


Mais là du coup ça fonctionne ! ma connexion se passe bien !!

Par contre, j'ai une erreur à la ligne suivante :

'Exécute la requête
        rs.Open cmd, CursorType:=adOpenStatic


Le message d'erreur est :
Une ou plusieurs erreurs se sont produites lors du traitements de la demande.


Si y a besoin je peux mettre toute ma procédure !

En attendant, je vais essayer de voir d'où cette erreur peut venir, mais j'ai l'impression que ça reste quand meme un soucis au niveau de ma connexion !


Merci d'avance !

Peace



 
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
31 août 2010 à 20:15
Méthode classique d'utilisation d'un RecordSet en ADODB (exemple perso) :
    SQL = "select distinct nom from Databases "
    Set rsDB = New ADODB.Recordset
    rsDB.CursorLocation = adUseClient
    rsDB.Open SQL, gCN, adOpenStatic, adLockReadOnly

A toi de voir l'utilité de ces 3 paramètres.
0
GarnierFlorian Messages postés 129 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 26 juillet 2011
1 sept. 2010 à 08:46
Bonjour !

Ba pourtant c'est bien ce que je fais :

'PROCEDURE AFFICHANT LE RESULTAT DES REQUETES
Sub SelectSQL()
    On Error GoTo SelectSQL_Error
        nbrecords = 0
        'Préparation de l'objet command
        Set cmd = New ADODB.Command
        Set cmd.ActiveConnection = connect_foxpro
        cmd.CommandText = REQ_SELECT
        'On déclare le recordset
        Set rs = New ADODB.Recordset
        'Exécute la requête
        rs.CursorLocation = adUseClient
        rs.Open cmd, CursorType:=adOpenStatic        
        'On sélectionne la feuille de destination
        ActiveWorkbook.Sheets(NOM_FEUILLE_SELECT).Activate
        'On efface l'ensemble du contenu précédent
        ActiveSheet.Cells.Clear
        'On vérifie que l'on a bien récupéré des enregistrements
        If Not rs.EOF Then
            rs.MoveFirst
            Set targetrange = ActiveWorkbook.Sheets(NOM_FEUILLE_SELECT).Cells(1, 1)
            'Mise en place des noms de champs comme entêtes de colonne
            For intcolindex = 0 To rs.Fields.Count - 1
                targetrange.Offset(0, intcolindex).Value = UCase(rs.Fields(intcolindex).Name)
            Next
            Application.StatusBar = "Extraction des enregistrements ..."
            'Intègre le contenu du jeu d'enregistrements dans la feuille de calcul Excel
            targetrange.Offset(1, 0).CopyFromRecordset rs
            'On réajuste les lignes et les colonnes
            Sheets(NOM_FEUILLE_SELECT).Columns("A:CH").AutoFit
            Sheets(NOM_FEUILLE_SELECT).UsedRange.EntireRow.AutoFit
            Application.StatusBar = "Extraction terminée !"
            'On récupère le nombre d'éléments traités :
            nbrecords = rs.RecordCount
            MsgBox "Import de " & nbrecords & " enregistrement(s) !"
         Else
            MsgBox "Il n'y a aucun enregistrement correspondant.", vbInformation, "Enregistrement impossible"
        End If
        Application.StatusBar = ""
        ' Ferme le jeu d'enregistrements s'il est toujours ouvert
        If CBool(rs.State And adStateOpen) Then
            rs.Close
        End If
        ActiveWorkbook.Sheets(NOM_FEUILLE_PRINCIPAL).Activate
        'on enregistre les modifications des feuilles excel
        Application.DisplayAlerts = False
        ActiveWorkbook.Save
        Application.DisplayAlerts = True
        
        Set rs = Nothing
        Set targetrange = Nothing
        Set cmd = Nothing
   On Error GoTo 0
   Exit Sub

SelectSQL_Error:
    MsgBox "(Erreur n°" & Err.Number & ") " & Err.Description

End Sub


Donc du coup je vois pas ce qui pose problème !

Mais merci de ton aide !

Peace 
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
1 sept. 2010 à 12:58
Es-tu sûr que les objets CommandText s'utilisent comme cela avec un RecordSet ?
Je n'en ai pas la pratique.
Pour moi, le premier paramètre d'un "Open" de RecordSet sous-entend une syntaxe SQL, pas un objet.
0
GarnierFlorian Messages postés 129 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 26 juillet 2011
1 sept. 2010 à 15:29
Ba oui c'est censé améliorer l'exécution de la requete.

Je te donne le lien suivant qui est bien je pense :

 Objet command

En fait avant, j'avais une seule procédure, je fesais ma connexion dans cette procédure, et tout se passait très bien !

Depuis que je passe par une fonction connexion ça me renvoi des erreurs^^ j'en ai marre^^

Voici mon bout de code lorsque ça marchait :

Option Explicit

Dim targetrange As Range
Dim intcolindex As Integer
Dim nbrecords As Integer
Dim che_fic As String

Dim cnx As ADODB.Connection
Dim cmd As ADODB.Command
Dim rs As ADODB.Recordset

Sub AfficherResult(nomTab As String)

    nbrecords = 0
    
    'Connexion à la base
    Set cnx = New Connection
    'chemin est une constante indiquant tout simplement le répertoire de la table
    With cnx
        .ConnectionString "Provider vfpoledb; Data Source =" + CHEMIN + nomTab
        .Open
    End With
    
    'Préparation de l'objet command
    Set cmd = New ADODB.Command
    Set cmd.ActiveConnection = cnx
    
    cmd.CommandText = REQ_SELECT
    
    'On déclare le recordset
    Set rs = New ADODB.Recordset
    
    'Exécute la requête
    rs.Open cmd, CursorType:=adOpenStatic
    
    'On sélectionne la feuille de destination
    ActiveWorkbook.Sheets(NOM_FEUILLE_SELECT).Activate
    
    'On efface l'ensemble du contenu précédent
    ActiveSheet.Cells.Clear
    
    'On vérifie que l'on a bien récupéré des enregistrements
    If Not rs.EOF Then
    
        rs.MoveFirst
        Set targetrange = ActiveWorkbook.Sheets(NOM_FEUILLE_SELECT).Cells(1, 1)
        
        'Mise en place des noms de champs comme entêtes de colonne
        For intcolindex = 0 To rs.Fields.Count - 1
            targetrange.Offset(0, intcolindex).Value = UCase(rs.Fields(intcolindex).Name)
        Next
        
        Application.StatusBar = "Extraction des enregistrements ..."
        'Intègre le contenu du jeu d'enregistrements dans la feuille de calcul Excel
        targetrange.Offset(1, 0).CopyFromRecordset rs
        
        'On réajuste les lignes et les colonnes
        Sheets(NOM_FEUILLE_SELECT).Columns("A:CH").AutoFit
        Sheets(NOM_FEUILLE_SELECT).UsedRange.EntireRow.AutoFit
        
        'On récupère le nombre d'éléments traités :
        nbrecords = rs.RecordCount
        MsgBox "Import de " & nbrecords & " enregistrement(s) !"
        
     Else
        MsgBox "Il n'y a aucun enregistrement correspondant.", vbInformation, "Enregistrement impossible"
        
    End If
    
    Application.StatusBar = ""
    ' Ferme le jeu d'enregistrements s'il est toujours ouvert
    If CBool(rs.State And adStateOpen) Then
        rs.Close
    End If
    
    ActiveWorkbook.Sheets(NOM_FEUILLE_PRINCIPAL).Activate
    
    'Enregistrement des modifications des feuilles excel
    Application.DisplayAlerts = False
    ActiveWorkbook.Save
    Application.DisplayAlerts = True
    
    cnx.Close
    
    Set cnx = Nothing
    Set rs = Nothing
    Set targetrange = Nothing
    Set cmd = Nothing

End Sub


Si tu vois ce qui pourrait, après modification, empecher ma sub de fonctionner, je suis preneur !!

Peace
0
GarnierFlorian Messages postés 129 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 26 juillet 2011
1 sept. 2010 à 15:31
Mince :/ C'était ce lien que je voulais te donner :

Objet command

Peace
0
GarnierFlorian Messages postés 129 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 26 juillet 2011
1 sept. 2010 à 15:57
Par contre, j'ai sincérement l'impression que c'est au niveau du provider que ça ne va pas !

 .ConnectionString = "Provider=ADsDSOObject;Location=K:\GARNIER\FG\Basefoxpro;Mode=ReadWrite;"
    .Open


Je l'ai directement généré avec MzTools mais je suis pas sur à 100% que ma chaine soit bonne !!

Peace


 
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
1 sept. 2010 à 16:11
Si tu résumais la ligne sur laquelle se produit l'erreur et quel est ce n° d'erreur.

Concernant la chaine de connexion, si l'assistant ADO de MzTools a pu établir une connexion avec succès (bouton test) avec la base, je ne vois pas pourquoi ton programme ne pourrait en faire autant.
Dans cette chaine de connexion que tu remets en cause, où ce trouve le nom de la DB ?
Es-tu sûr d'être connecté après un Open de la connexion ? --> Teste cnx.State pour en être sûr.

Vérifie, par l'exemple d'autres sources, que les Command s'utilisent bien comme cela, avec le même nombre d'arguments.
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
1 sept. 2010 à 16:15
Il y a même un exemple tout cuit (avec TOUS les paramètres) dans le dernier lien que tu m'as passé, chapitre VII-8-3 Méthodes.
0
GarnierFlorian Messages postés 129 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 26 juillet 2011
1 sept. 2010 à 16:25
Mon erreur vient de la ligne suivante :

rs.Open cmd, CursorType:=adOpenStatic


L'erreur est :
Une ou plusieurs erreurs se sont produites lors du traitement de la commande


Ma connexion est bien ouverte,
connection.state
me renvoi "1", qui désigne la connexion comme "open".

Pour la chaine de connexion,oui ça a bien marché quand j'appui sur le bouton, mais je sais pas si je l'ai bien fait :$

Et puis, je n'ai pas de noms de BDD, puisque je travaille sur des tables foxpro !

Bon ba je vais m'approcher un peu plus de cette connexion pour voir !

Peace
0
GarnierFlorian Messages postés 129 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 26 juillet 2011
2 sept. 2010 à 11:36
Bonjour !

Bon j'ai reprit exactement la même syntaxe que tu m'avait donné (en esperant que gCN représente bien la connexion), et j'ai le meme message d'erreur :/

Et sinon je vais voir avec l'exemple tout cuit, mais je savais pas trop si c'était bon, etant donné que je ne suis pas certains du provider qu'ils utilisent..

Peace


 
0
GarnierFlorian Messages postés 129 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 26 juillet 2011
2 sept. 2010 à 11:45
Ca y est c'est bon !!!!!

Finalement j'ai continué à faire des tests avec ta méthode (sans utiliser l'objet command), et en travaillant sur la chaine de connexion ça a fini par marché.. J'ai certains paramètres qui était rajouté sur la chaine, et en fait certains devaient me poser problème !

Et du coup, j'ai réessayeer en passant par l'objet command une fois que ça marchait bien, et finalement, ça ne marche pas ! Donc je supposequ'il doit y avoir un problème dans mon utilisation de l'objet command ?!

En tout cas merci de ton aide, j'aurais pas réussi sans toi :) !!

Peace

 
0
Rejoignez-nous