本人信誉极好,敬请放心!我现在遇到如此棘手问题,我希望实现数据库三层的功能,举例:我在com(中间层)中建立几条和数据库的连接,然后在利用_RecordsetPtr获取查询后的结果集指针,这样结果集便在com中获取,那么我又如何将他以参数的形式在传递给客户端呢?我想这肯定得需要将_RecordsetPtr转换成OleVaraint,可是这是否能转,又如何转换呢?请赐教

解决方案 »

  1.   

    声明[out,retval]IDispatch **pRSSTDMETHODIMP CGetCurrData::ReadData(BSTR name, BSTR pwd, BSTR dsn, 
    BSTR sel, BSTR sel_table, BSTR sel_from, 
    BSTR sel_where, int sign, IDispatch **pRS)
    {
    AFX_MANAGE_STATE(AfxGetStaticModuleState()) // TODO: Add your implementation code here
    _bstr_t temp;
    _bstr_t strSQL;
    if(sign==0)
    {
    strSQL=sel;
    }
    else
    {
    temp="SELECT ";
    temp+=sel_table;
    temp+=" FROM ";
    temp+=sel_from;
    if(sel_where==L"")
    {
    temp+=" WHERE ";
    temp+=sel_where;
    }
    strSQL=temp;
    }
    HRESULT hr;
    _RecordsetPtr pORS;
    _ConnectionPtr pConn; try{ pConn.CreateInstance(__uuidof(Connection)); pORS.CreateInstance(__uuidof(Recordset)); hr=pConn->Open(dsn,name,pwd,-1);
    if(FAILED(hr))  _com_raise_error (hr);

    pORS->CursorLocation = adUseClient;
    pORS->Open(_variant_t(strSQL),(IDispatch*)pConn,adOpenStatic,
                       adLockReadOnly,adCmdText);
    if (FAILED(hr)) _com_raise_error (hr); }catch(_com_error &e)
    {
    if (m_spObjectContext != NULL) m_spObjectContext->SetAbort();
    return e.Error();
    }
    // pORS->putref_ActiveConnection(NULL);
    *pRS=(IDispatch *)pORS.Detach();
    if (m_spObjectContext != NULL) m_spObjectContext->SetComplete();
    return S_OK;
    }
      

  2.   

    _RecordsetPtr转换成OleVaraint1。可以直接用 IRecordset* 不要用 智能指针
    在idl中 import "xxx.idl"; // 定义了IRecordset 哪个idl
    [out,retval]IRecordset** pRS 2。当然 [out,retval]IDispatch **pRS 这个也可以 3。象 QueryInterface的方式也行 
    [in]REFIID rguid, [out, iid_is(rguid)]void** ppv
      

  3.   

    以上两位,我是要求com和client运行在两台计算机上,那么你们的方法也行吗?那么他们又如何将_RecordsetPtr所指向的内容通过DCOM传到client。我可以和你们交流一下吗?因为我非常急于解决此问题,解决后必有高分相赠!我可以知道你们的qq吗?