开始出现的问题是一直出现这样的错:
然后 break 就到了:
inline HRESULT Recordset15::Close ( ) {
HRESULT _hr = raw_Close();
if (FAILED(_hr)) _com_issue_errorex(_hr, this, __uuidof(this));//但我觉得出错点是这句
return _hr;//出错点指向这句
}
再查看堆栈那边
void CADOConn::ExitConnect()
{
// 关闭记录集和连接
if (m_pRecordset != NULL)
m_pRecordset->Close();
m_pConnection->Close(); //出错点指向这里
// 释放环境
::CoUninitialize();
}
然后就针对 m_pConnection->Close(); 添加的try/catch,结果没有抛出异常,而且还是出现了一样的中断!
后来想想一直报错的是record的close,所以抱着尝试的心态在 m_pRecordset->Close(); 外添加了try/catch 后(代码如下),看到如下错误抛出,顿时明白了!
void CADOConn::ExitConnect()
{
// 关闭记录集和连接
try{
if (m_pRecordset != NULL)
m_pRecordset->Close();
}catch(_com_error e)
{
AfxMessageBox(e.Description());
}
m_pConnection->Close();
// 释放环境
::CoUninitialize();
}
我在调用CADOConn类对象时,使用了
_RecordsetPtr rsWell = m_pAdoConn->GetRecordSet("data_well");
....
....
rsWell->Close();//去掉这一句就没有问题了
在GetRecordSet() 函数中对 m_pRecordset 进行了实例化,并打开,原则上就不应该在该类的外部对这个记录集进行关闭。对此,
我也有一个疑问,就是对于同一个连接,我有多个记录集的时候,当然都需要通过GetRecordSet() 的方法去获得记录集,那么这个类的对象中的m_pRecordset 到底指向我的哪个记录集呢?在外部使用的时候有其他的指针倒是不影响使用,但是在最后几个记录集都需要关闭,那么光是这个类中的ExitConnect() 中仅关闭一个记录集肯定是不够的,那么就还是需要在外部关闭了?日后望高手指点!
// 执行查询
_RecordsetPtr& CADOConn::GetRecordSet(_bstr_t bstrSQL)
{
try
{
// 连接数据库,如果Connection对象为空,则重新连接数据库
if(m_pConnection==NULL)
OnInitADOConn();
// 创建记录集对象
m_pRecordset.CreateInstance(__uuidof(Recordset));
// 取得表中的记录
m_pRecordset->CursorLocation = adUseClient;
m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenKeyset,adLockBatchOptimistic,adCmdTable);
}
// 捕捉异常
catch(_com_error e)
{
// 显示错误信息
AfxMessageBox(e.Description());
}
// 返回记录集
return m_pRecordset;
}
解决方法:外部调用ADO操作类,及使用其记录集时,因为是获取一个指针,本身的打开记录集不是在外部完成的,所以关闭记录集同样交给ADO操作类自身完成,不需要再在外部手动关闭记录集!