数据量太大,怎么分批显示?(50分)

  • 主题发起人 主题发起人 nywjx
  • 开始时间 开始时间
N

nywjx

Unregistered / Unconfirmed
GUEST, unregistred user!
我使用paradox或者sql server2000,读取数据后显示在listview中,
尽管我使用了beginupdate和endupdate,但是当数据量大的时候还是会
等待很长时间。
我想这样解决:读取数据后,首先显示前100条记录,用户按“下一页”
后,再显示101到200条。。。。如此类推。
不知有没有这样的方法?怎么做?和数据库(paradox或者sqlserver)
本身有关吗?
 
用存储过程来实现。
CREATE proc page
@pagenum int
as
SET NOCOUNT ON /*-----这一句很重要哦:)),不然它只会认 insert #change......这个数据集:))*/
declare @sql nvarchar(500) --声明动态sql执行语句
declare @pagecount int --当前页数

--取得当前数据库的记录总数
declare @row_num int
begin
select @row_num=count(*) from cat_list

--创建临时表,作为数据过滤
create table #change (T_id int)

--判断当前页数
if @row_num>6 --大于页面显示记录数,则分页
begin
set @row_num=@pagenum*6

if @row_num=6
select top 6 * from cat_list
else
begin
set @row_num=(@pagenum-1)*6
set @pagecount=@row_num
set @sql=N'insert #change (T_id) select top '+cast(@pagecount as char(100))+' T_id from cat_list where T_id not in (select T_id from #change)'
exec sp_executesql @sql
select top 6 * from cat_list where T_id not in (select T_id from #change)
end
end
else --只现实全部的数据
select * from cat_list
end
GO

这是从《动网先锋》上抄的,原本用于ASP的分页,但这个存储过程可以很容易的在DELPHI
中调用,以实现记录分页。
你可详细参考这个地址:
http://www.aspsky.net/article/list.asp?id=2742
 
用SQL语句:
SQL Server中:
select top 100 id from A //假设有一个id字段
where id not in(Select top 90 id from A)//取90~100的数据
Oracle中:
Select *
(select rownum rrr,A.* from A) ttt
where ttt.rrr between 90 and 100
 
用ado分页方法,设置两个属性。
AdoQuery1.Recordset.PageSize
AdoQuery1.Recordset.AbsolutePage
可以实现分页。
但是用这个属性之前AdoQuery1已经打开还是比较慢。

关注!!!
 
好像这几种方法都是基于数据库的,有没有用程序控制的?因为要用在paradox数据表中。
 
是否可以写两个线程,一个是读数据线程,一个是显示数据线程,当读到一定量的数据后,可以
显示,而读数据线程在后台继续进行?
 
请看
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1207640
注:这个方法是ADO的,所以SQLSERVER2000是可以用的
 
我的想法可能比较简单:
可以不用DBGrid或者其它有数据感知功能的控件来显示数据,使用如
StringGrid之类的控件,然后就用For循环加Next来读取数据记录,再显
示在StringGrid之中不就行了?

代码大致如下:(在IE中临时所写,可能有些不对的。)
//保存一个目前数据位置的变量RecordPostion
Button1Click
begin
For i:=0 to 20 do
begin
With table1 Do
begin
Moveby(RecordPostion);
StringGrid.Cells[0,i] := fieldbyname('xxx').AsString;
StringGrid.Cells[1,i] := fieldbyname('xxx').AsString;
StringGrid.Cells[2,i] := fieldbyname('xxx').AsString;
Next;
end;
end;
end;
 
娃娃:你这办法不可以行。因为所有的记录还是一次性取到内存中。这要好多的时间
 
procedure showrecords(iRows, iPage: integer);
begin
query.close;
query.sql.text := 'select top ' + inttostr(iRow) + ' * from table1 where id not in (select top ' + IntToStr(iPage*iRow) + ' from table1)';
query.open;
end;

 
我建议用多线程吧,那样会很爽的。
 
后退
顶部