代码: CString strConn=_T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Spring.mdb");
CString strSql=_T("");
strSql.Format("select * from User where UserName=%s",(LPCTSTR) m_UserName);
::CoInitialize(NULL);
_ConnectionPtr pConn=NULL;
_RecordsetPtr pRecordSet=NULL;
try
{
pConn.CreateInstance(__uuidof (Connection));
    pConn->Open((_bstr_t)strConn,"","",adConnectUnspecified);
pConn->Close(); }
catch(_com_error& e)
{
AfxMessageBox("not right");
return ;
}
::CoUninitialize();
第一次用ado,不知道哪里出问题了,debug 的时候发现pConn在CreateInstance后仍然是0,导致总是抛出异常
   到底是什么问题呢?

解决方案 »

  1.   

    try
    {
    m_pAccessConnection.CreateInstance(__uuidof(Connection));
    _bstr_t bstrConnectionString="driver={Microsoft Access Driver (*.mdb)};dbq=db.mdb;";
    m_pAccessConnection->Open(bstrConnectionString,_bstr_t("管理员"),_bstr_t("aaa"),adConnectUnspecified);
    }
    catch ( _com_error &e )
    {
    _bstr_t bstrSource (e.Source());
    _bstr_t bstrDescription (e.Description());
    CString strError;
    strError.Format("无法连接Access数据库。\r\n错误代码是:%08lx\r\n错误的原因是:%s\r\n错误源是:%s\r\n错误的描述是:%s\r\n", e.Error (), e.ErrorMessage (), (LPCTSTR) bstrSource, (LPCTSTR) bstrDescription);
    MessageBox (strError, bstrDescription,MB_OK);
    return false;
    }
    catch(CException &e)
    {
    e.ReportError();
    e.Delete();
    return false;
    }
    catch (...)
    {
    TRACE ( "*** 无法解决的错误 ***" );
    return false;
    }
    return true;
      

  2.   

    用这个试一下吧,返回0不一定是错误
    HRESULT hr = pConn.CreateInstance(__uuidof(Connection));
    if(FAILED(hr))
        AfxMessageBox("Failed");
    如果失败那是你的COM环境没初始化好
    然后做
    try
    {
        pConn->Open((_bstr_t)strConn,"","",adConnectUnspecified); }
    catch(_com_error& e)
    {
    AfxMessageBox("not right");
    return ;
    }
      

  3.   

    ::CoInitialize(NULL);
    _ConnectionPtr pConn=NULL;
    _RecordsetPtr pRecordSet=NULL;好象是你自己把pConn给清空了,为什么?去掉该行即可
    _ConnectionPtr pConn=NULL;
    _RecordsetPtr pRecordSet=NULL;
      

  4.   

    用这个试一下吧,返回0不一定是错误
    HRESULT hr = pConn.CreateInstance(__uuidof(Connection));
    if(FAILED(hr))
        AfxMessageBox("Failed");
    如果失败那是你的COM环境没初始化好
    然后做
    try
    {
        pConn->Open((_bstr_t)strConn,"","",adConnectUnspecified); }
    catch(_com_error& e)
    {
    AfxMessageBox("not right");
    return ;
    }
      

  5.   

    我是在单线程中调用FAILED()我试过,失败,com环境怎么初始化??要作什么设置?
      

  6.   

    你的初始化是对的,一般来说::CoInitialize(NULL)是没什么错误的,你可以判断返回值。