您的位置:首页 > 编程语言 > Delphi

大容量数据分页显示的探索

2009-08-07 08:49 239 查看
     最近在帮别人开发一个程序的时候遇到了10w以上数据显示的问题,若是直接用ADOConnection+Adoquery+Datasource+DBGrid来显示确实简单,但是在读取数据的时候明显比较慢,而且问题是每一次打开数据连接,ADO会把所有的数据读入到DataSet中。尽管现在数据是10w多一点,时间上还可以忍受,但是未来数据量达到100w后,那应该是不堪设想的,所有就想到了分页显示的问题。­

      经过网络搜索有,有几种方法可以解决这个问题:­

     1、通过ADO自带的MaxRecords来限制,用Page来分页,可以再DBGrid中实现分页,但是发现这个方法也不是很,因为在整个过程中ADO还是把所有数据先读取,然后在DBGrid中实现了显示的分页,不符合我的要求。(想法:这个方面自己没有深入研究,也许是我的知识技能肤浅而没有实现吧)。­

     2、用过DataSetProvider和Clientdataset来实现分页,用语句:­

           ADOtable1.RecNo:=NextRecords;//下一页的开头记录位置­

          ClientDataset.Data :=DataSetProvider1.GetRecords(10, recsout, MetaDataOption);来实现,确实也可以,问题是数据在Datasetprovider中还是全部读取,在Clientdataset中倒是显示需要的内容,所以放弃。(想法同上)­

      3、有人提出来,大容量数据分页最好在数据存储的时候就进行。个人认为这个想法确实很好,具体怎么进行,我的想法是:若我想以20条记录为一页,那么就用关键字id来进行记录,每20页为同样的关键字;在分页查询时只要以id的增加来进行分页,实现简单,效率不错。­

       4、目前我的用法,采用Delphi盒子中jasonmale­的方法:

             一般来说,我们在发送sql语言时,限制取得数据笔数,如取20笔(SQLSERVEER中使用Top关键字,PG中使用limited)。如果取下一页怎么办。这里就需要确定这次查询的数据字符中有确定唯一性值(关键字key),取下一页使用同样的SQL语句,但WHERE条件中需要key>界面上最后一笔的关键记录值, 同时又限制记录数量20个。
如SQLSERVER例子:第一次查出记录 select top 20 key field1,field2 from table 
key, field1 field 2
A     fv1    fv2
B     fv11   fv22
C    ...
D...
下一页 : select top 20 key,field1,field2 where key>'D'
...
上一页: select top 20 key ... where key<'A'
最后一页:select top 20 key.... order by key desc
有一个问题,如果关键是二个,并且非字符类型,怎么办。一样,先使用SQL中函数把非字符类型转换成固定格式的字符串(注意,FLOAT和INTEGER的转换需要统一长度的字符),再把多个关键字联合(+)成一个虚拟字段就OK了。

             这种方法对于已经存在大容量数据的程序来说也是不错的方法,我就根据这种方法完成了开发,读取时只读取规定的记录数量,而没有全部读取(这一点是关键),内存占用不高,并且效率也不错。这是现在对分页技术的一点点探索与尝试。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息