以下信息是调试时出现的:MSVCRT! 77bfa61d()
MSVCRT! 77bfc25d()
MSJETOLEDB40! 1b57259e()
MSADO15! 4dd1c69f()
MSADO15! 4dd21607()
MSADO15! 4dd1679a()
MSADO15! 4dd2be60()
MSADO15! 4dd1f363()
MSADO15! 4dd172cf()
ADODB::Recordset15::Open(const _variant_t & {"SELECT * FROM StudyInfo WHERE StudyPatientID = '00000004' ORDER BY StudyAllInOne DESC" VT_BSTR}, const _variant_t & {0x03b212f0 VT_DISPATCH}, ADODB::CursorTypeEnum adOpenStatic, ADODB::LockTypeEnum adLockOptimistic, long 8) line 679 + 135 bytes
CADORecordset::Open(_com_ptr_t<_com_IIID<ADODB::_Connection,&_GUID_00000550_0000_0010_8000_00aa006d2ea4> > {0x03b212f0}, const char * 0x0389c7c0, int 0) line 181 + 128 bytes
CADORecordset::Open(const char * 0x0389c7c0, int 0) line 215 + 37 bytes
CExpDBSetOpt::Open(CString {"SELECT * FROM StudyInfo WHERE StudyPatientID = '00000004' ORDER BY StudyAllInOne DESC"}) line 36 + 30 bytes
CExpSdOpt::SearchOperate(CString {"StudyPatientID = '00000004'"}, CString {"StudyInfo"}, CString {"StudyAllInOne"}) line 71 + 26 bytes感谢大家了!

解决方案 »

  1.   

    不好说啊。你最好将你操作数据库的程序,用try...catch包起来,这样可以捕捉错误,然后查看一下错误原因就比较容易解决了。
    try
    {
    }
    catch(_com_error &e)
    {
       
    }
      

  2.   

    我按照你说的办法做了,catch中加了下面语句:
    dump_com_error(e);
    return FALSE;
    但是没有捕获到什么错误。
    说是运行时库的DLL错误。从上面的调试信息看,ADODB::Recordset15::Open()当时没有死掉,而是到了MSVCRT! 77bfa61d()才死的。
      

  3.   

    SELECT * FROM StudyInfo WHERE StudyPatientID = '00000004' ORDER BY StudyAllInOne DESC,这句查询是不是正确,自己先在查询里试试
      

  4.   

    调试中死掉后出现以下提示:Unhandled exception in XProcess.exe(MSVCRT.DLL):0xC0000005:Access Violation.
      

  5.   

    建议你按照以下步骤:1、定义宏
    #define FAILED_THROW( exp )  { HRESULT hr; if (FAILED(hr = exp)) _com_issue_error(hr); }2、对所有返回HRESULT的操作,都进行检查,例如:
    FAILED_THROW( m_pConnection.CreateInstance("ADODB.Connection") )
    FAILED_THROW( m_pConnection->Open(bstrConnection, "", "", adModeUnknown) )FAILED_THROW( pRs->Open(sql, m_pConnection.GetInterfacePtr(), adOpenForwardOnly, adLockReadOnly, adCmdText) )
    FAILED_THROW( pRs->Update() )
    FAILED_THROW( pRs->MoveNext() )
    FAILED_THROW( pRs->Close() )3、在最外层加上
    try
    {
        ...
    }
    catch(_com_error& e)
    {
    ::MessageBox(NULL, e.ErrorMessage(), "Error Report", MB_OK);
    }
      

  6.   

    balloy(), thanks. Let me try!
      

  7.   


    代码如下(微软的ADO)(那个TRY是我加的,希望捕获到错误,但是没有得到):
    在return Open(m_pConnection, lpstrExec, nOption);执行后有时死。如何加FAILED_THROW? 大部分函数返回的都是BOOL类型的。BOOL CADORecordset::Open(LPCTSTR lpstrExec, int nOption)
    {
    try
    {
    ASSERT(m_pConnection != NULL);
    ASSERT(m_pConnection->GetState() != adStateClosed);
    return Open(m_pConnection, lpstrExec, nOption);
    }
    catch(_com_error &e)
    {
    dump_com_error(e);
    return FALSE;
    }
    }
      

  8.   

    return Open(m_pConnection, lpstrExec, nOption);
    改为
    FAILED_THROW( Open(m_pConnection, lpstrExec, nOption) )
      

  9.   

    #define CATCH_ERROR \
    { \
    CString strComError; \
    strComError.Format("错误编号: %08lx\n错误信息: %s\n错误源: %s\n错误描述: %s", \
    e.Error(),                  \
    e.ErrorMessage(),           \
    (LPCSTR) e.Source(),        \
    (LPCSTR) e.Description());  \
    ::MessageBox(NULL,strComError,"错误",MB_ICONEXCLAMATION); \
    }'''''''''''''''  HRESULT hr;
       try
      {
       CoInitialize(NULL);//一定要加啊!!!
      hr = m_pConnection.CreateInstance("ADODB.Connection");///创建Connection对象
      if(SUCCEEDED(hr))
      {
      hr = m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=db1.mdb","","",adModeUnknown);///连接数据库
      
      }
      }
      catch(_com_error e)///捕捉异常
      {
    CATCH_ERROR;
    return false;
      }