none
Utilisation d'une DLL (VB.Net) en objet COM dans VC++ 6.0 RRS feed

  • Discussion générale

  • Bonjour,

    J'ai une DLL VB.Net qui est une bibliothèque à différents types de SGBD (Oracle, Postgres, SQLServer, ...) et avec différnets fournisseurs (ODBC, Oledb, .Net Provider, ODP, ...). j'ai construit un objet COM (de la DLL) pour l'exploité dans des projets VC++ 6.0

    J'arrive à établir une connexion et envoyer des requêtes (insert, update et delete) sans problème, mais pour la récupération de données j'ai quelques soucis.

     

    Ma question est, comment exploiter un Recordset (le cas que j'ai testé ci-dessous, mais sans réussir parce que je n'arrive pas à lié le Recordset à l'objet connexion) ou un autre objet pour récupérer un lot de données?

    Code VB.Net : j'ai un fonction qui reçoit une requete (string) et un ADODB.RecordSet et retourne un integer (j'ai fais comme ça parce que je n'arrive pas à exploiter un retour de la fonction (SelectQuery) de type RecordSet dans le C++)

    Public Function SelectQuery(ByVal requete As String, ByVal recordSetOut As Recordset) As Integer Implements IVWConnexion.SelectQuery
            Dim tableRetour As DataTable
            Try
                tableRetour = ConnectionObject.ExecuteQuery(requete)
                recordSetOut = ConvertToRecordset(tableRetour)
                Return 1
            Catch ex As Exception
                Return 0
            End Try

        End Function

    Code C++:

        ADODB::_RecordsetPtr recordset;
        hr = recordset.CreateInstance(__uuidof(ADODB::Recordset));

       _bstr_t requete = "select *  from type_entrepot";
            retour = Connexion->SelectQuery(requete,recordset);
           
            if (retour == 1)
            {
                while(!recordset->ADOEOF)
                {
                    _variant_t var;
                    var = recordset->Fields->GetItem(L"value")->GetValue();
                    printf("%s\n", (char*)var.bstrVal);
                    recordset->MoveNext();
                }
            }
            Connexion->CloseConnection();

    J'ai une erreur au niveau de la fonction SelectQuery

    error C2664: 'SelectQuery' : cannot convert parameter 2 from 'class _com_ptr_t<class _com_IIID<struct ADODB::_Recordset,&struct __s_GUID _GUID_00000556_0000_0010_8000_00aa006d2ea4> >' to 'struct _Record
    set *'
            No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called

    PS: dans le fichier MaDLL.tli de l'objet COM, le code correspondant à la fonction SelectQuery est le suivant:

    inline long IVWConnexion::SelectQuery ( _bstr_t Requete, struct _Recordset * recordSetOut ) {
        long _result;
        HRESULT _hr = raw_SelectQuery(Requete, recordSetOut, &_result);
        if (FAILED(_hr)) _com_issue_errorex(_hr, this, __uuidof(this));
        return _result;
    }


    Cordialement
    vendredi 24 juin 2011 08:31

Toutes les réponses

  • Le plus simple est de fournir dans ton objet COM des fonctions d'accès permettant de parcourir ton RecordSet, et d'y accéder zone par zone, avec des fonctions telles que

     

    Public Function GetValue(ByVal pRow As Integer, ByVal pColumn As Integer) As String...

     


    Didier
    mardi 28 juin 2011 14:57
  • Merci pour votre réponse od68, ce n'est pas ce que je voulais mais c'est une solution.
    Cordialement
    mardi 12 juillet 2011 14:50