以下信息是调试时出现的: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感谢大家了!
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感谢大家了!
try
{
}
catch(_com_error &e)
{
}
dump_com_error(e);
return FALSE;
但是没有捕获到什么错误。
说是运行时库的DLL错误。从上面的调试信息看,ADODB::Recordset15::Open()当时没有死掉,而是到了MSVCRT! 77bfa61d()才死的。
#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);
}
代码如下(微软的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;
}
}
改为
FAILED_THROW( Open(m_pConnection, lpstrExec, nOption) )
{ \
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;
}