• 全部
  • 基础类
  • 应用实例
  • 新技术前沿

使用ADO执行SELECT语句后的结果

monday 2007-03-06 11:40:02
一个表有600多万条记录,用ADO执行

select * from ttt where t1='200701013456'

这样的语句。我用if not rs.bof and not rs.eof then这样的条件(VB)来判断是否有记录返回。

现在的问题是,当SQL SERVER服务器CPU符合过高时,且实际并没有符合条件的记录,可是not rs.bof and not rs.eof这个条件却为真。

为什么?
...全文
479 点赞 收藏 17
写回复
17 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
monday 2007-03-21
该为客户端游标需要大量的时间来测试,因为这个情况想要模拟出来还真是困难。
回复
monday 2007-03-09
to vieri_ch(尘雨-自在飞花轻似梦,无边丝雨细如愁),你没看清问题就乱回答一通,请先反省你自己的错误先。
回复
monday 2007-03-09
to hui_hui_2007(平安是福),上一记录集一定关闭了,用的是服务端游标。请详细解释这种情况可能和游标的关系。
回复
monday 2007-03-09
to dljinsui(风在发端),我还懒的理你,回答问题没看清问题就象模象样的回答一通,是卖弄还是怎么?
回复
hunhun02 2007-03-09
学习
回复
尘雨 2007-03-09
模拟测试了楼主的CPU负荷高的时候,接近100%,数据量600万,进行查询,没有出现楼主的情况。

只是在设置了异步模式的时候,rs的各种属性的值有变化,但也没有出现楼主的情况

顺便提个建议,楼主的情绪还是平和一些,能理解你遇到问题,却暂时无法解决的烦躁,但同样心平气和的解决问题不是一件难事,即便别人的建议你不认同,请保持心平气和
回复
dljinsui 2007-03-09
这样的口气不应搭理他。
回复
hui_hui_2007 2007-03-09
我一般写程序都是用客户端游标,好象服务器游标是无法得到确定的记录数的,不过不太确切.
你将类型改成客户端看看还出不出这个问题,如果不出了,就是游标的问题了.
回复
尘雨 2007-03-09
可能我的回答没有解决你的问题,而你认为我的过错在于没有看清楚并理解你的问题?

或许就如同你说的 当SQL SERVER服务器CPU符合过高时 造成的
你可以从游标类型,锁定类型,客户端游标设置,是否设置了异步方式看看能否找到确实原因
-----------------------------
这是我回答的时候提供的一个解决思路,我提到客户端游标的问题,和异步方式。如果你认为这些对你解决问题没有任何帮助,但为何在后面的回复其他人提问中又提到了服务端游标和客户端游标的问题?

如果我确有过错,我不会回避,理解问题并解决问题本身就是建立在互相沟通以及提供更多相关信息的基础之上。但是如果我的回答中的提供了部分思路,你确认为我仍然没有理解,那为何不提供更多有关问题的信息,也许更多朋友会参与进来提供解决方案。


现在的问题是,当SQL SERVER服务器CPU符合过高时,且实际并没有符合条件的记录,可是not rs.bof and not rs.eof这个条件却为真。
-----------------------------------
你的问题分解如下

出现问题的场景
1,数据600多万
2,服务端游标
3, select语句
4。sql server 服务器CPU负荷过高
5。select查询返回结果没有符合条件的
问题
6。使用标准的判断结果集是否为空的检查结果与预期相反
(not rs.bof and not rs.eof这个条件为真)
------------------
这是我对你问题的理解。我首先进行了模拟场景的测试,并得到与你的问题相反的结果

我提供了几个思路供你从游标,锁定类型,是否异步模式几个方面查找,难道这样也有错误吗?

即便我所理解的是错误的,你完全可以指出错误在哪里,然后提供更多信息。

心平气和的解决问题,而不是互相指责。
回复
hui_hui_2007 2007-03-08
楼主没用客户端游标吧.
回复
hui_hui_2007 2007-03-08
只有客户端游标的情况下,取记录数才是有意义的,否则不会正确的.
你用的是服务器端游标吧.

还有:上一个记录集一定关了吗?
回复
monday 2007-03-08
没用。请详细解释
回复
monday 2007-03-07
请注意,我的问题不是BOF和EOF的判断语法问题!请仔细看问题的描述!
回复
monday 2007-03-07
正常情况来说,如果SELECT返回的结果是有记录的,那么BOF和EOF都为FALSE。
我问的是在服务器CPU负荷为100%的情况下,SELECT返回的结果按正常来说应该是没有记录的,这时BOF和EOF都应为TRUE,可是实际情况相反。

我要问的是这个情况是为什么!
回复
尘雨 2007-03-06
if not rs.eof then
就可以了,你那种方式,只有数据游标向前向后都可能跳转的,才需要判断
如果select之后,就判断,仅仅需要eof
回复
尘雨 2007-03-06
楼主激动了一点
--------------
set conn=createobject("adodb.connection")
conn.cursorlocation=3
set rs=createobject("adodb.recordset")
rs.cursorlocation=3
rs.cursortype=3
rs.locktype=3
connsql="Provider=SQLOLEDB.1;Password=;Persist Security Info=True;User ID=sa;Initial Catalog=test;Data Source=(local)"
conn.open connsql
sql="select * from a where 1=0"
rs.open sql,conn,,,1
msgbox "eof=" & rs.eof
msgbox "bof=" & rs.bof
msgbox "not bof and not eof=" & ((not rs.bof) and (not rs.eof))
rs.close
conn.close
set rs=nothing
set conn=nothing
这段代码你可以存为vbs测试一下,我的测试结果是
eof=TRUE
Bof=TRUE
not bof and not eof=FALSE
和你的情况不一样
或许就如同你说的 当SQL SERVER服务器CPU符合过高时 造成的
你可以从游标类型,锁定类型,客户端游标设置,是否设置了异步方式看看能否找到确实原因

回复
monday 2007-03-06
楼上的请看清问题再回答。出现这种情况时,BOF和EOF都为FALSE。
回复
相关推荐
发帖
MS-SQL Server
创建于2007-09-28

3.3w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
帖子事件
创建了帖子
2007-03-06 11:40
社区公告
暂无公告