如何得到SQL查询返回的记录数?(50分)

  • 主题发起人 主题发起人 tqz
  • 开始时间 开始时间
T

tqz

Unregistered / Unconfirmed
GUEST, unregistred user!
我试过rowsaffacted,可总是返回-1.SQL server 6.5
 
看到tqz简直不敢回答,恕我胆大妄为.
Query1.recordcount
 
query.recordcount是正确的
 
Xixi, tqz这是给大家送分哪!
不过据说recordcount有时候是个非常耗时的操作,:)
 
在有些数据库中, Recordcount得到的是-1 . :)
 
大家别笑我。在数据库方面我基本是白痴。
可是...
SeaSky说的对,Recordcount得到的是-1 。
不信大家试试,select * from XXX 查询SQL Server返回的Recordcount总是
-1.
不过SQL中倒是可以
Select * from XXX compute count(ID)
只是TQuery无法返回Count多出来的一行。
另外可以写select Count(ID) from XXX
这样就要多查询一次了。
 
SELECT之后,先query.last,再query.first,就可以得到正确的recordcount.
 
先 Query.Last
Query.RecordCount 还返回 -1 就把 Delphi 做掉.
 
遗憾遗憾, 居然已经有人抢先了.
我发一条信息要10+n分钟.
 
看看我问过的问题
http://www.gislab.ecnu.edu.cn/delphibbs/DispQ.asp?LID=96871
 
多谢多谢,只是不知
Query1.Last;
Query1.First;
i:=Query1.RecordCount;
这样效率如何。
 
to Tqz : 你想快吗, 试试我的办法:
http://www.gislab.ecnu.edu.cn/delphibbs/DispQ.asp?LID=96871

http://www.gislab.ecnu.edu.cn/delphibbs/DispQ.asp?LID=92343
主要看你做什么用, 我的做法是
case
当大于50条: result := '大于50条';
当小于50条: result := recordcount ;
end ;
在sybase 中试过,

我不知道在MS SQlServer中,有什么不同,
你试一下几个过程:

1.查一个大于200条的查询结果集 ;
query.open ;
last ;
recordcount = ? ; (可能还是-1, 如果是正确的数, 下面的过程对你的帮助就很大).
2. 查一个小于50条的查询结果集 ;
query.open ;
last ;
recordcount = ? ;
3. 查一个大于50条的查询结果集 ;
query.Open ;
moveby(50);
recordcount = ? ;
4. 查一个小于50条的查询结果集 ;
query.open ;
moveby(50);
Recordcount = ?

试试就知道结论了 , (把结果告诉我好吗?)

另外打开一个查询后 ,在另一个tquery中执行
Select @@rowcount 试试;
记得SQl server中的@@rowcount系统变量是反映最新处理行数.


 
seasky:看过你的方法了。其实我就是这么做的,分页显示。只是我想显示
一共有多少页。
你提供的4种方法:
1,2,3:OK
4:-1 :(

Select @@rowcount 跟RecordCount的情况一样。
看来只有放弃追求效率的想法了。
 
奇怪 , 你搞反了吧, 3 没有到达记录尾 居然OK ?
4 肯定已经Eof了, 但是 -1 ?

如果你没有搞错, 那就有些不可思议了.
 
Sorry,是我错,3,4反了。
 
这样说的话, 要想提高效率就有一种办法,
move(200),
如果是 -1 则报大于200,(其实, 很多情况下, 没有人愿意连续看200条的);
如果有数 则报该数.

灵活处理一下嘛!!
 
想不到一个recordcount有这么大的学问,长进不少,谢了.
 
To SeaSky: 很多情况下 MoveBy(200), RecordCount 10 分钟后返回的可能是
1234567 :)
 
To Randolph
我指的是Ms Sql server 可以简单的这么做,

如果是Sybase, 则稍微复杂一些, 因为Sybase 的Recordcount一定
是卸载所有纪录;

所以你说的不错, 通用的方法 ,

with Dataset do
first;
If EOF then
result :=0
else Begin
next;
if EOF then
result := 1
else Begin
MoveBy(200);
if EOF then // 移动200步距离,
result:= recordcount
else
result:= 9999999 ; (大于200)
end;
First; //返回
end;
 
诸位还有没有补充意见?
我的方案是:
1 用Select Count(XX) from XXX得到纪录数
or
2 不去找纪录数
决定不碰RecordCount
 
后退
顶部