找了好久,终于找到问题所在,只是不知道怎么解决,请耐心看,我已经简化了,谢谢视图类中:注:下面这个事件可以成功,100%正确,连接成功void CMyView::OnTestTest()    //一菜单命令,可以执行 
{
 _ConnectionPtr m_pConnection;
 HRESULT hr;
     
hr=m_pConnection.CreateInstance("ADODB.Connection"); if(SUCCEEDED(hr))
 {
    hr=m_pConnection->Open((_bstr_t)strConnection,"","",-1);  //strConnection是我的连接串,100%正确,会弹出连接成功的消息框呵
   AfxMessageBox("连接成功");      
 } else
{
AfxMessageBox("连接失败");
}
     
}
注: 下面这个就不会连接成功
一个全局线程函数,视图类一事件驱动它: UINT StartUpdateBookThreadProc(LPVOID pParam)
{
    CMyView *pView=(CMyView*)pParam;   //为视图类的指针
    pView->OnTestTest();       //注:会弹出连接不成功    
return 0;}请大虾帮忙

解决方案 »

  1.   

    写成全局函数试试看.
    还有就是你catch一下,看看具体是什么错误.最好调用一次GetLastError();才好找到具体的原因
      

  2.   

    你连接数据库好像不对吧?// 成员变量:_ConnectionPtr m_pConnection;#if _WIN32_WINNT >= 0x0400
    CoInitializeEx(NULL, COINIT_MULTITHREADED);
    #else
    CoInitialize(NULL);
    #endif m_pConnection.CreateInstance(__uuidof(Connection)); try
    {
    m_pConnection->ConnectionTimeout = 8; CString strModulePath;
    GetModuleFileName(NULL, strModulePath.GetBufferSetLength(_MAX_PATH), _MAX_PATH);
    strModulePath.ReleaseBuffer(); int nFindPos = strModulePath.ReverseFind('\\');
    if(nFindPos != -1)
    {
    strModulePath = strModulePath.Left(nFindPos);
    } CString strConnect;
    strConnect.LoadString(IDS_CON_STR_MDB);
    strConnect += strModulePath + "\\MediconBackup\\Data\\Studio.mdb";
    m_pConnection->Open(LPCTSTR(strConnect),"","",adModeUnknown);
    }
    catch(_com_error e)
    {
    AfxMessageBox("数据库连接失败!");
    m_pConnection = NULL; return FALSE;
    }--------------------------------------------------------------------------//调用 HRESULT hResult = NULL;
    _RecordsetPtr pRecordset = NULL;
    pRecordset.CreateInstance("ADODB.Recordset");
    hResult = pRecordset->Open("SELECT * FROM [TableName]",_variant_t((IDispatch *) m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText);
      

  3.   

    我是贴主:谢谢你们回复`~ 在视图类中我知道ADO怎么用~~~我也写了好多功能,完全没有问题.....我只是说,在一个“全局的线程函数”中调用视图类中成员函数, 而该成员函数有用ADO连接数据库,那么,连接怎么会不成功呢???~
      

  4.   

    算了,我自己解决了问题很简单,是我太菜:(问题就是:  每天启一个新的线程,必须 AfxOleInit();  一下~~  自己领分~~
      

  5.   

    看看这个,说不定哪天用得着!多个线程可以共用一个连接的。但是其作用的机制和CoInitializeEx()初始化com的不同而不同。
    它的参数dwCoInit      
    可以取如下的值:
    COINIT_MULTITHREADED 
    Initializes the thread for multi-threaded object concurrency (see Res). 
    COINIT_APARTMENTTHREADED 
    Initializes the thread for apartment-threaded object concurrency (see Res). 
    COINIT_DISABLE_OLE1DDE 
    Disables DDE for Ole1 support. 
    COINIT_SPEED_OVER_MEMORY 
    Trades memory for speed. 
    其中,如果选择COINIT_APARTMENTTHREADED 那就不需要你自己写并行控制机制,因为它是把对数据库的访问串行化了,如果选择COINIT_MULTITHREADED 则可以实现访问的并行性,但要在各个线程见同步,以防冲突。详见MSDN。
      

  6.   

    线程里面初始化CoInitialize(NULL);
    行不行呢?
      

  7.   

    在线程开始必须调用CoInitialize