VC查询数据库时出现异常但没有被catch

monkst 2005-07-15 11:47:33
查看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);

...全文
228 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ustbzhangwei 2005-08-05
  • 打赏
  • 举报
回复

使用VARIANT,建议判断VARIANT里面的数据类型
VARIANT v
if(v.vt == VT_XXXX) //VT_XXXX代表期望的数据类型
{
}
然后再用
monkst 2005-08-05
  • 打赏
  • 举报
回复
我也认为是转为variant_t 时出现了问题,但如何避免它?能catch 或其它判断吗?
sboom 2005-07-30
  • 打赏
  • 举报
回复
或许不是数据库异常,是MFC异常
monkst 2005-07-27
  • 打赏
  • 举报
回复
catch(...) 里面是什么?
能直接写...吗?

FatSpiders(蜘蛛仔) 你的代码与我的有什么不同呢?
monkst 2005-07-25
  • 打赏
  • 举报
回复
xiao_xiao_zi(笑小子) 的理解是对的,一开始就有这个信息
variant_t::_variant_t(IDispatch * 0x00000000, unsigned char 1) line 1048 + 12 bytes

但问题时,这个是什么错误?应该怎么catch??
forswear 2005-07-25
  • 打赏
  • 举报
回复
catch(...)试试,它应该扑捉到前面没有被catch到的错误!
FatSpiders 2005-07-25
  • 打赏
  • 举报
回复
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;
}


亿云力科技 2005-07-22
  • 打赏
  • 举报
回复
试试catch(...)能否捕获到
xiao_xiao_zi 2005-07-22
  • 打赏
  • 举报
回复
看你的stack,应该是_variant_t出错了
这个错误是不会被你的代码catch的
你捕获的是_com_error
m_pRecordset->Open(bstrSQL,(IDispatch*)m_pConnection,adOpenDynamic,adLockOptimistic,adCmdText);
中 (IDispatch*)m_pConnection 会把转化成一个_variant_t类型,估计是这里出错了
clovexmu 2005-07-20
  • 打赏
  • 举报
回复
把数据库装在自己的机器上,如果错误还没有避免,那么就是代码的问题了.
monkst 2005-07-19
  • 打赏
  • 举报
回复
肯定正确的,绝大部份运行都是正常的,只是有时不正常。
我感觉的网络不太稳定,所以数据库连接已失效了。但不知道为什么没有被catch 呢。

m_pConnection->execute 出错则是可以被catch的
zhaobin8218 2005-07-15
  • 打赏
  • 举报
回复
看看 pConnection 连接字符串是否正确。有时格式不对也会报错的

4,018

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧