我如何通过COM将ADO获取的结果集传递给客户端,敬请指教.

解决方案 »

  1.   

    ADO是OLEDB的COM封装,注意传输量对分布系统的影响
    声明[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;
    }