我在用ATL编写COM组件,需要把ADO的功能集成进来,访问数据库,如何做?或者有其他的方法实现。比如说,我要实现几个接口,1、返回指定表名称的数据库Column信息(列明、数据类型).2、能按条件输出行,并能通过com组件添加新纪录及修改纪录。
    请赐教!

解决方案 »

  1.   

    最简单的办法:#import "C:\Program Files\Common Files\System\ADO\msado15.dll" no_namespace rename("EOF", "EndOfFile")实在是太多了,你到MSDN里面查吧:)
      

  2.   

    _variant_t vNull(DISP_E_PARAMNOTFOUND,VT_ERROR);
    //打开指定表
    recordset->PutRefActiveConnection(activeConnection);
    recordset->PutSource(sql);//一个sql字符串
    recordset->CacheSize=1000;
    try
    {
    recordset->Open(vNull,vNull,adOpenDynamic,adLockOptimistic,adCmdText);
    }
    catch( _com_error e)
    {
    _variant_t error(e.Description());
    }
    在stdafx.h里面要象楼上的那样添加
    如果要在idl里面使用ado的对象,就还要在idl里面添加
    importlib("c:\Program Files\Common Files\System\ado\msado15.dll");
      

  3.   

    自己拼装SQL语句来做,想怎么查,就怎么查!
    如果查询处理很复杂的话,可以用存储过程或者触发器来做。
      

  4.   

    如果用ADO,你就不如在VB里面用。ADO简直就是量身为VB那些自动化服务器打造的。
    如果你用ATL,为什么不用OLE DB呢?
      

  5.   

    服务器
    STDMETHODIMP 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;
    }客户端
    try{
    // Convert Management_name to Management_id
    IGetCurrDataPtr pGMS;
    hr=pGMS.CreateInstance(CLSID_GetCurrData);
    if(FAILED(hr))  _com_raise_error (hr);
    pORS = pGMS->ReadData(name,pwd,dsn,strSQL,L"",L"",L"",0);
    if(pORS->EndOfFile==VARIANT_FALSE)
    {
    vName=pORS->Fields->GetItem("MANAGEMENT_ID")->Value;
    }
    }catch(_com_error &e) //end try
    {
    if (m_spObjectContext != NULL) m_spObjectContext->SetAbort();
    AfxMessageBox(e.Description());
    return e.Error();
    }stdafx.h
    #import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
         named_guids no_namespace rename ("EOF", "EndOfFile")
    #import "e:\baobiao\dbsel\dbsel.tlb" named_guids no_namespace