我的查询是类似
"select * from mv_view"
mv_view是一个多表联合视图.一直也没遇到啥问题,但是昨天用sql monitor抓错误的时候,发现查询被改成了
"select *,mv_view.rowid from mv_view"
并且触发了Oracle 1445错误,然后自动去掉rowid重新查询,成功!
后来找到了原因:
MSADO的 _RecordsetPtr的成员函数Open定义如下:
其中参数LockType是一个枚举,指定数据库锁定方式
之前使用的参数全部都是乐观锁adLockOptimistic,尝试换成adLockReadOnly后发现不会再自动添加rowid了.
原因是在ADO认为记录可能被Update时就会自动添加rowid,使用了adLockReadOnly参数相当于告知ADO记录不会被Update,ADO就不会自动添加rowid.
如果要Update 怎么办呢?那当然不能用只读锁,那就只能修改数据库视图,为视图加入唯一索引了.
PS:根据资料显示adLockReadOnly能够明显提高查询速度