(提问率N高)用ADOQuery查询后,如何做分页显示?

yfjyz 2004-01-06 10:58:19
用ADOQuery查询,查询结果可能有几万条,数据是否一次性下载到本地?
如果一次性下载到本地,显示在dbgrid里,这样查询速度很慢。
如何想通过BDE查询的一样,点击dbgrid的向下箭头时才下载到本地,
就是如何做分页显示?
...全文
199 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
linux1949 2004-01-12
  • 打赏
  • 举报
回复
看看李维的书吧,他讲的比较详细!
fenglaile 2004-01-12
  • 打赏
  • 举报
回复
试一试使用tclientdataset 来控制来到本地来的数据量,
yfjyz 2004-01-11
  • 打赏
  • 举报
回复
to wangxd(东东):
能给个ado异步查询的例子吗?
98049522 2004-01-08
  • 打赏
  • 举报
回复
up
wangxd 2004-01-08
  • 打赏
  • 举报
回复
ado是支持异步查询的。
bde中的查询要放到线程中才能分页,如果不放到线程中是不会自动分页的
yfjyz 2004-01-08
  • 打赏
  • 举报
回复
我的想法是做一个可以跨数据库的分页组件或函数,不管是sql server或oracle照样能
适应
XXSingle 2004-01-08
  • 打赏
  • 举报
回复
前几天才考了个过程,不知是那位高人的,声称速度极快,大量数据也是如此:

create procedure sp_vlist @cpbmb varchar(6),@crbh varchar(2) with encryption as
set nocount on
declare @sqlcmd varchar(148)
if object_id('tempdb..##vlist') is not null
drop table ##vlist
set @sqlcmd='select identity(int, 1,1) as id, * into ##vlist from '+@cpbmb+' where crbh='''+@crbh+''' order by cpxh
create index ##vlist_id on ##vlist(id)'
exec(@sqlcmd)
set nocount off
yfjyz 2004-01-08
  • 打赏
  • 举报
回复
我的数据库是oracle的,不是很好控制,而且数据量比较大,这样效率很低
wlw88 2004-01-07
  • 打赏
  • 举报
回复
目前来说,分页和不分页没有什么区别,效率也高不哪里去,而且分页太麻烦。建议不要分页。
luckyboy97 2004-01-07
  • 打赏
  • 举报
回复
没考虑过
只能帮你顶一下
hthunter 2004-01-07
  • 打赏
  • 举报
回复
/*以下是我以前自己写的一个存储过程,希望对你有所帮助
其中t_myTable的id是一个int自增型字段,在我的应用中,是根据这个id来分页的
*/
CREATE PROCEDURE sp_SearchResults
@PageSize int,
@CurrentPage int,
@RecordCount int Output,
@PageCount int Output
AS

declare @BeginRow int
declare @EndRow int
declare @BeginID int
declare @EndID int

set @RecordCount = (select count(*) from t_myTable)

set @PageCount = Round((@RecordCount / @PageSize), 0) + 1

--如果@PageSize刚刚能整除@RecordCount,则@PageCount减1
if @RecordCount = ((@PageCount - 1) * @PageSize)
set @PageCount = @PageCount - 1

--如果当前页的数值大于总页数,则把当前页重设为总页数的值
if (@CurrentPage > @PageCount)
set @CurrentPage = @PageCount

--当结果集不为空时,查询返回当前页的结果集
if @RecordCount > 0
begin
--取的当前页的开始位置和结束位置
set nocount on
set @BeginRow = @PageSize * (@CurrentPage - 1) + 1
set rowcount @BeginRow
select @BeginID = id from t_myTable order by id
set @EndRow = @PageSize * @CurrentPage
if @EndRow >= @RecordCount
set @EndRow = @RecordCount
set rowcount @EndRow
select @EndID = id from t_myTable order by id
set rowcount 0
set nocount off
--取位置结束

--根据开始位置和结束位置返回当前页的记录
select *
from t_myTable
where id between @BeginID and @EndID
order by id
end
else
select * from t_myTable

GO
yfjyz 2004-01-07
  • 打赏
  • 举报
回复
这样是可以,不过这样要到数据库中查询多次,而且sql语句较难控制
我的想法是能否作成象BDE的功能一样,能自动记住状态,要的时候再去取
jjgaodeng 2004-01-07
  • 打赏
  • 举报
回复
page_count 每页要显示的记录条数
fPage 每页的第一条记录
count 页数

select top (per_page_count*count) * from table1 where id not in (select top fpage id from table1

只是个想法没试过,不过完善一下应该可行吧
yfjyz 2004-01-07
  • 打赏
  • 举报
回复
不是一次性下载到本地,那要如何分页控制呢?
herofy 2004-01-07
  • 打赏
  • 举报
回复
李维的delphi7上讲好像用express能够指定每次查回来的记录条数,记不清了。
getit911 2004-01-07
  • 打赏
  • 举报
回复
TSimpleDataSet
TClientDataSet
每调用一次GetNextPacket就可以获得PacketRecords指定个数的记录,直到获得全部记录如果PacketRecords为-1就获得全部记录。
如果用MSSQLServer就用select top n from xxx获得前几行数据,或者用hthunter(核桃)的方法,
如果用Mysql就极简单了
select * from table LIMIT 5,10; 返回6-15行的数据。
angelior 2004-01-07
  • 打赏
  • 举报
回复
俺不懂,過來學學
yfjyz 2004-01-07
  • 打赏
  • 举报
回复
sql server里的identityid列是这样的,但oracle里不行的
hthunter 2004-01-07
  • 打赏
  • 举报
回复
当然,如果已对字段id建了索引(或者如果id是关键字也会自动建立索引),那使用select count(id) 的效率要比select count(*)高
yfjyz 2004-01-07
  • 打赏
  • 举报
回复
hthunter兄弟:
首先,很感谢你对我问题的关心!
我们姑且不说这个问题如何解决好,先说select count(*)的问题:

select count(*) 是全表扫描,怎么不会占用什么时间呢?看来我们要请权威
人士为我们做公证喽
加载更多回复(9)

2,497

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧