代码:
_RecordsetPtr m_pRecordset;
m_pRecordset.CreateInstance(__uuidof(Recordset));
m_pRecordset->CursorLocation = adUseClient;
m_pRecordset->Open(_bstr_t("select count(*) from v$parameter"),_variant_t((IDispatch *)m_pConnection,true),adOpenStatic, adLockOptimistic, adCmdUnknown);
m_pRecordset->Close();
m_pRecordset->Open(_bstr_t("select value from v$parameter where name like 'proc%'"),_variant_t((IDispatch *)m_pConnection,true),adOpenStatic, adLockOptimistic, adCmdUnknown);
m_pRecordset->Close();
m_pRecordset->Open(_bstr_t("select count(*) from v$parameter"),_variant_t((IDispatch *)m_pConnection,true),adOpenStatic,adLockReadOnly,adCmdUnknown);
m_pRecordset->Close();
连接数据库之后,执行红色部分,然后监视窗口报
CCardDlg.exe 中的 0x7c812afb 处最可能的异常: Microsoft C++ exception: long @ 0x0012dfdc 。
虽然查询结构正确,但是感觉不爽
然后baidu,google,看到这么一句话
不让你直接获得count的原因是那代价高昂
所以不要指望既可以插入又可以获得count了
然后试着把adLockOptimistic改成adLockReadOnly,发现监视没有上面那句话了,
参考1:
.LockType
LockType 属性
指示编辑过程中对记录使用的锁定类型。
设置和返回值
设置或返回以下某个 LockTypeEnum 的值。
常量 说明
adLockReadOnly 默认值,只读。无法更改数据。
adLockPessimistic 保守式记录锁定(逐条)。提供者执行必要的操作确保成功编辑记录,通常采用编辑时立即锁定数据源的记录的方式。
adLockOptimistic 开放式记录锁定(逐条)。提供者使用开放式锁定,只在调用 Update 方法时锁定记录。
adLockBatchOptimistic 开放式批更新。用于与立即更新模式相反的批更新模式。
.CursorLocation
CursorLocation 属性
设置或返回游标服务的位置。
设置和返回值
设置或返回可设置为以下某个常量的长整型值。
常量 说明
adUseNone 没有使用游标服务。(该常量已过时并且只为了向后兼容才出现)。
adUseClient 使用由本地游标库提供的客户端游标。本地游标服务通常允许使用的许多功能可能是驱动程序提供的游标无法使用的,因此使用该设置对于那些将要启用的功能是有好处的。AdUseClient 具有向后兼容性,也支持同义的 adUseClientBatch。
adUseServer 默认值。使用数据提供者的或驱动程序提供的游标。这些游标有时非常灵活,对于其他用户对数据源所作的更改具有额外的敏感性。但是,Microsoft Client Cursor Provider(如已断开关联的记录集)的某些功能无法由服务器端游标模拟,通过该设置将无法使用这些功能。
参考2:
http://topic.youkuaiyun.com/u/20090719/11/d79cfe87-06a7-41e3-b74f-0f9d9689b41f.html
http://topic.youkuaiyun.com/t/20041024/16/3486160.html