查看call stack 出现:
_variant_t::_variant_t(IDispatch * 0x00000000, unsigned char 1) line 1048 + 12 bytes
CJHC_ServerDlg::isNeedModify(CString {"SHJYC"}) line 3215 + 25 bytes
CJHC_ServerDlg::OnTimer(unsigned int 3) line 1628 + 44 bytes
CWnd::OnWndMsg(unsigned int 275, unsigned int 3, long 0, long * 0x00050b48) line 1829
CWnd::WindowProc(unsigned int 275, unsigned int 3, long 0) line 1585 + 30 bytes
AfxCallWndProc(CWnd * 0x00052758 {CJHC_ServerDlg hWnd=???}, HWND__ * 0x001602ea, unsigned int 275, unsigned int 3, long 0) line 215 + 26 bytes
AfxWndProc(HWND__ * 0x001602ea, unsigned int 275, unsigned int 3, long 0) line 368
AfxWndProcBase(HWND__ * 0x001602ea, unsigned int 275, unsigned int 3, long 0) line 220 + 21 bytes
USER32! 77df1ef0()
USER32! 77df204c()
USER32! 77df21af()
USER32! 77e08012()
USER32! 77e0fd24()
USER32! 77e0f76a()
USER32! 77e0f637()
USER32! 77e165db()
USER32! 77e16568()
CWinApp::DoMessageBox(const char * 0x004755bc, unsigned int 48, unsigned int 0) line 113 + 25 bytes
AfxMessageBox(const char * 0x0scadaline 3230
CJHC_ServerDlg::OnTimer(unsigned int 3) line 1628 + 44 bytes
CWnd::OnWndMsg(unsigned int 275, unsigned int 3, long 0, long * 0x000524b8) line 1829
CWnd::WindowProc(unsigned int 275, unsigned int 3, long 0) line 1585 + 30 bytes
AfxCallWndProc(CWnd * 0x00052758 {CJHC_ServerDlg hWnd=???}, HWND__ * 0x001602ea, unsigned int 275, unsigned int 3, long 0) line 215 + 26 bytes
AfxWndProc(HWND__ * 0x001602ea, unsigned int 275, unsigned int 3, long 0) line 368
AfxWndProcBase(HWND__ * 0x001602ea, unsigned int 275, unsigned int 3, long 0) line 220 + 21 bytes
USER32! 77df1ef0()
USER32! 77df204c()
USER32! 77df5f69()
CWnd::RunModalLoop(unsigned long 4) line 3478 + 19 bytes
CDialog::DoModal() line 536 + 12 bytes
CJHC_ServerApp::InitInstance() line 65 + 11 bytes
AfxWinMain(HINSTANCE__ * 0x00400000, HINSTANCE__ * 0x00000000, char * 0x00133114, int 1) line 39 + 11 bytes
WinMain(HINSTANCE__ * 0x00400000, HINSTANCE__ * 0x00000000, char * 0x00133114, int 1) line 30
WinMainCRTStartup() line 330 + 54 bytes
KERNEL32! 77e71af6()
我的程序代码是:
try
{                  

CString ComString; //(char*)_bstr_t(SencondCom);
m_pRecordset.CreateInstance(_uuidof(Recordset));//初始化Recordset指针
CString sqlstr="select needcom from T_Comremote where manid='"+manid+"'";
//只发送30分钟内的数据。
BSTR bstrSQL = sqlstr.AllocSysString(); 
m_pRecordset->Open(bstrSQL,(IDispatch*)m_pConnection,adOpenDynamic,adLockOptimistic,adCmdText); 
//adOpenDynamic:动态 adLockOptimistic乐观封锁法 adCmdText:文本查询语句
if(!m_pRecordset->adoEOF)
{

}
m_pRecordset->Close();   //关闭数据记录
return needCom;
}catch(_com_error e)
{
//出错,重新连接
ConnectToODBC();
return needCom;
}m_pRecordset->Open(bstrSQL,(IDispatch*)m_pConnection,adOpenDynamic,adLockOptimistic,adCmdText); 
//adOpenDynamic:动态 adLockOptimistic乐观封锁法 adCmdText:文本查询语句
出错的是这一句,请问该怎么处理?
m_pRecordset->Open(bstrSQL,(IDispatch*)m_pConnection,adOpenDynamic,adLockOptimistic,adCmdText);

解决方案 »

  1.   

    看看 pConnection 连接字符串是否正确。有时格式不对也会报错的
      

  2.   

    肯定正确的,绝大部份运行都是正常的,只是有时不正常。
    我感觉的网络不太稳定,所以数据库连接已失效了。但不知道为什么没有被catch 呢。m_pConnection->execute 出错则是可以被catch的
      

  3.   

    看你的stack,应该是_variant_t出错了
    这个错误是不会被你的代码catch的
    你捕获的是_com_error
    m_pRecordset->Open(bstrSQL,(IDispatch*)m_pConnection,adOpenDynamic,adLockOptimistic,adCmdText);
    中 (IDispatch*)m_pConnection 会把转化成一个_variant_t类型,估计是这里出错了
      

  4.   

    xiao_xiao_zi(笑小子)  的理解是对的,一开始就有这个信息
    variant_t::_variant_t(IDispatch * 0x00000000, unsigned char 1) line 1048 + 12 bytes但问题时,这个是什么错误?应该怎么catch??
      

  5.   

    HRESULT hr;
    try
    {
    hr = m_pConnection.CreateInstance("ADODB.Connection");
                    ///创建Connection对象
    if(SUCCEEDED(hr))
    {
    m_pConnection->ConnectionTimeout=3;  
                                    ///set the timeout 3 seconds, 
    hr = m_pConnection->Open(_bstr_t(LPCTSTR   ("Provider=SQLOLEDB.1;Data Source="+CString(servername)+";"
    " Initial Catalog="+CString(database)+"; User ID="+CString(username)+";PWD="+CString(pwd)+"")),"","",adModeUnknown);
    }
    }
    catch(_com_error e)///捕捉异常
    {
    CString temp;
    temp.Format("连接数据库错误信息:%s",e.ErrorMessage());
    ::MessageBox(NULL,temp,"提示信息",NULL);
    return false;
    }
      

  6.   

    catch(...)试试,它应该扑捉到前面没有被catch到的错误!
      

  7.   

    catch(...)  里面是什么?
    能直接写...吗? FatSpiders(蜘蛛仔)  你的代码与我的有什么不同呢?
      

  8.   

    或许不是数据库异常,是MFC异常
      

  9.   

    我也认为是转为variant_t 时出现了问题,但如何避免它?能catch 或其它判断吗?
      

  10.   


    使用VARIANT,建议判断VARIANT里面的数据类型
    VARIANT v
    if(v.vt == VT_XXXX) //VT_XXXX代表期望的数据类型
    {
    }
    然后再用