_com_error at memory location / 对象关闭时,不允许操作。

开始出现的问题是一直出现这样的错:


然后 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操作类自身完成,不需要再在外部手动关闭记录集!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值