IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

transmettre une connexion DAO à un activeX


Sujet :

Windows

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Septembre 2006
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 2
    Points : 1
    Points
    1
    Par défaut transmettre une connexion DAO à un activeX
    Bonjour tout le monde, je suis nouveau z'ici. J'espère que des âmes charitables auront la grâce de se pencher sur mon épineux problème. Y'en a un peu long, désolé.

    Je n'arrive pas à faire passer des informations à des composants activeX "maison". Voilà la situation actuelle (qui fonctionne).


    Plusieurs composants activeX ont été créés, avec Visual Basic 6.0. Ils implémentent tous une même interface, qui comprend, entre autres, la fonction suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Public Sub InterfaceActiveX_SetNomDatabaseData(NomDatabase As String)
        m_NomDatabaseData = NomDatabase
        If m_ConnectData.State = adStateClosed Then
            m_ConnectData.ConnectionString = NomDatabase
            m_ConnectData.Open
        End If
    End Sub
    m_ConnectData est un objet de type Connection. Le but de chaque activeX, en gros, c'est d'aller chercher des infos dans une base de donnée et de les afficher. En théorie, c'est peut-être pas à ça que doivent servir les activeX, mais le logiciel a été fait comme ça, tout chambouler serait un peu long et fastidieux.


    Après j'ai le projet principal, codé en C++ avec Visual C++ 6.0. Ce projet s'occupe d'instancier les activeX et de leur passer les bonnes informations. J'ai donc une fonction de ce genre dans ce projet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    void CInterfaceActiveX::SetNomDatabaseData(CString sNomDatabase)
    {
        OLECHAR FAR* szMember = L"InterfaceActiveX_SetNomDatabaseData";
        static BYTE parms[] = VTS_BSTR;
        CString strChaineConnexion;
    
        /* ici il y a du code permettant de donner la bonne valeur 
        à strChaineConnexion, quelque chose de ce genre :
        "DRIVER={SQL Server};SERVER=machin;database=bidule;UID=truc;PWD=tralala"
        */
    
        InvokeHelper(__GetDispID(szMember), DISPATCH_METHOD, 
                     VT_EMPTY, NULL, parms, strChaineConnexion);
    }
    Dans cette situation, tout se passe bien. Le projet principal crée un ou plusieurs activeX, il donne la chaîne de connexion, et chaque activeX va gentiment se connecter dans son coin, pour récupèrer des données et les afficher. C'est très youpi.



    Le problème c'est que les activeX sont créés, puis détruits puis recréés, assez souvent durant l'exécution du logiciel. Donc on se retrouve avec des connexions de bases de données qui s'ouvrent et se ferment à chaque fois. Et la pauvre base de données a du mal. Au début on avait un gentil fichier Access en local, ça ne le dérangeait pas d'avoir des dizaines de connexion qui durent très peu de temps chacune. Mais là on va passer à une grosse base SQL sur un serveur, donc il faudrait essayer de se limiter. Une exécution du logiciel = une seule connexion.

    L'idéal serait que le projet principal se connecte à la base de données (en fait il le fait déjà, car il a lui aussi besoin d'y récupérer des infos) et qu'ensuite cette connexion soit donnée aux différents activeX. La tâche d'établir la connexion doit être transférée au module de niveau supérieur. Donc mon code devrait ressembler à ça :

    dans les activeX :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Public Sub InterfaceActiveX_SetConnectionData(ConnectData As Connection)
        m_ConnectData = ConnectData
    End Sub
    et dans mon projet principal :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void CInterfaceActiveX::SetNomDatabaseData(CString sNomDatabase)
    {
        OLECHAR FAR* szMember = L"InterfaceActiveX_SetConnectionData";
    
        static BYTE parms[] = VTS_CONNECTION;  //sauf que ce nom n'existe pas.
    
        InvokeHelper(__GetDispID(szMember), DISPATCH_METHOD, 
                     VT_EMPTY, NULL, parms, theApp.m_DatabaseData);
    }
    theApp.m_DatabaseData est un objet de type CDaoDatabase. Au moment où la fonction SetNomDatabaseData est exécutée, la connexion de m_DatabaseData est déjà ouverte. Il y a d'autres parties du code qui l'utilisent avant, et ça marche très bien.



    D'après ce que j'ai compris, la variable parms sert à spécifier les types de paramètres que l'on passe à la fonction exécutée par l'activeX. Dans la situation précédente, je devais passer la string de connection, donc il fallait indiquer : VTS_BSTR. On peut utiliser d'autres types assez simple, du genre VTS_I4 ou VTS_I2 pour des entiers, VTS_BOOL pour des booléens, etc... Mais je n'ai pas trouvé de nom du style VTS_CONNECTION ou VTS_DAO_CONNECTION.

    J'ai essayé avec VTS_VARIANT
    J'ai un message d'erreur à l'exécution, au moment où le logiciel essaie de transmettre la connexion :
    "Types non correspondant"

    avec VTS_UNKNOWN
    message d'erreur : "L'instruction à "0x51ec8b55" emploie l'adresse mémoire "0x51ec8b55". La mémoire ne peut pas être "read". Appuyez sur OK pour fermer, sur Annuler pour déboguer."

    avec VTS_PVARIANT, et en mettant comme paramètre &(theApp.m_DatabaseData) au lieu de theApp.m_DatabaseData
    message d'erreur : "Types non correspondant"


    Et j'ai essayé aussi en changeant la fonction InterfaceActiveX_SetConnectionData. Au lieu de déclarer le paramètre ConnectData comme une Connection, je la déclare comme un Variant.

    Dans ce cas, avec VTS_VARIANT et VTS_PVARIANT, j'ai ce message d'erreur :
    "La variable utilise un type Automation non géré par Visual Basic"

    avec VTS_UNKNOWN
    message d'erreur : "L'instruction à "0xb8fc4d89" emploie l'adresse mémoire "0xb8fc4d89". La mémoire ne peut pas être "read". Appuyez sur OK pour fermer, sur Annuler pour déboguer."


    Voili voilà. Ma question est donc : puis-je transmettre à un activeX un objet représentant une connexion Dao ouverte ? Si oui comment ?

    Merci d'avance pour vos réponses.

  2. #2
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 683
    Points
    10 683
    Billets dans le blog
    3
    Par défaut
    Il faut donner à VB un objet qu'il connait. Apparement, l'object utilisé est basé sur ADO en VB6 ("ADODB.Connection"), alors qu'en C++ tu utilises un autre type d'objet basé sur DAO (CDaoDatabase). Bref tu mélanges les choux et les carottes.
    Essaye d'utiliser ADO avec les MFC, ou alors trouve l'équivalent de CDaoDatabase pour VB6.

    (J'ai jamais utilisé ni l'un ni l'autre, donc peut être qu'il y a plus simple / j'ai dit une bêtise)

  3. #3
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 683
    Points
    10 683
    Billets dans le blog
    3

  4. #4
    mat.M
    Invité(e)
    Par défaut
    void CInterfaceActiveX::SetNomDatabaseData(CString sNomDatabase)

    ->Il faut utiliser un BSTR et non un CString

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Septembre 2006
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Pour Aurélien : à priori, dans VB, quand on déclare une variable en tant que "Connection", c'est une connection DAO. Et quand on déclare une variable en tant que "ADODB.Connection" c'est de l'ADO. C'est ce que j'ai cru comprendre dans l'aide. Donc je pense que je manipule le même objet autant dans mes activeX que dans le projet principal. Enfin j'espère...

    Ceci dit je devrais peut être essayer de travailler que avec des connections ADO, et de voir si je peux les transmettre du projet principal vers les activeX. On va voir ça.


    pour mat.M : La fonction CInterfaceActiveX::SetNomDatabaseData fonctionne déjà comme ça. (Je suppose qu'elle fonctionnerait aussi avec un BSTR). Enfin de toutes façons c'est pas le problème. Transmettre des chaînes de caractère, j'y arrive déjà. Ce que je veux c'est transmettre une connexion de base de données ouverte.


    Merci pour ces quelques réponses. Ca résout pas complètement mon problème mais ça me donne des pistes.

  6. #6
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 683
    Points
    10 683
    Billets dans le blog
    3
    Par défaut
    C'est de l'activeX, donc les méthodes des objets doivent être les même en VB et C++, à la syntaxe près.

Discussions similaires

  1. ActiveX pour une connexion RDP
    Par tinkerbell85 dans le forum Windows
    Réponses: 3
    Dernier message: 28/08/2007, 09h42
  2. Réccupération du mot de passe d'une connexion
    Par zinaif dans le forum Bases de données
    Réponses: 1
    Dernier message: 02/12/2002, 18h32
  3. [Réseau] Créer une connexion Internet
    Par Tranber dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 17/10/2002, 17h01
  4. Je ne peux établir une connexion cliente sous Linux.
    Par Anonymous dans le forum CORBA
    Réponses: 5
    Dernier message: 16/04/2002, 15h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo