用ADOQuery查询,查询结果可能有几万条,数据是否一次性下载到本地?
如果一次性下载到本地,显示在dbgrid里,这样查询速度很慢。
如何想通过BDE查询的一样,点击dbgrid的向下箭头时才下载到本地,
就是如何做分页显示?

解决方案 »

  1.   

    page_count  每页要显示的记录条数
    fPage  每页的第一条记录
    count     页数select top (per_page_count*count) * from table1 where id not in (select top fpage id from table1只是个想法没试过,不过完善一下应该可行吧
      

  2.   

    这样是可以,不过这样要到数据库中查询多次,而且sql语句较难控制
    我的想法是能否作成象BDE的功能一样,能自动记住状态,要的时候再去取
      

  3.   

    /*以下是我以前自己写的一个存储过程,希望对你有所帮助
    其中t_myTable的id是一个int自增型字段,在我的应用中,是根据这个id来分页的
    */
    CREATE PROCEDURE sp_SearchResults 
      @PageSize int,
      @CurrentPage int,
      @RecordCount int Output,
      @PageCount int Output
    ASdeclare @BeginRow int
    declare @EndRow int
    declare @BeginID int
    declare @EndID intset @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_myTableGO
      

  4.   

    我的原意不是要分页,而是执行了select * from tablename时速度很慢,想分批来取数据
      

  5.   

    to wlw88(飞扬): 此话差矣,须知对于大量的数据,有很大一部分时间消耗在传输的过程中,如果在服务端就将数据进行分页处理,只将需要的数据传回客户端,那这里面的效率提高就不是一点点的问题了。再说,麻烦和效率到底哪个重要?这也是需要进行取舍的。to yfjyz(dd): 我的那个存储过程你看了没有,难道对你一点帮助都没有?呵呵
      

  6.   

    to hthunter(核桃)(我将要认识一个好mm)
    set @RecordCount = (select count(*) from t_myTable)
    相当于每次查询都要进行count(*),对于一个上千万数据表,怎么能受得了呢?
      

  7.   

    to yfjyz(dd):对于已索引的数据库表,select count(*) 操作基本上是不占用时间的,你可以自己做一下测试
      

  8.   

    to hthunter兄弟,select count(*) from t_myTable这个sql语句难道会使用索引吗?
    这跟索引是没有关系的!
      

  9.   

    ok, 关于select count(*)的效率问题,我所知的事实就是那样,但我目前找不到有力的证据证明我的观点。不过实践就是最有力的证据,你不是说你有上千万条的数据,你执行一下不就知道结果了?
    或者你确实要证实这个问题的话,可以转到数据库开发的板块(如sql server)讨论。不过你一定要认为自己的想法是对的,那我也不会强求,呵呵
      

  10.   

    hthunter兄弟:
     首先,很感谢你对我问题的关心!
     我们姑且不说这个问题如何解决好,先说select count(*)的问题:
      
      select count(*) 是全表扫描,怎么不会占用什么时间呢?看来我们要请权威
    人士为我们做公证喽
      

  11.   

    当然,如果已对字段id建了索引(或者如果id是关键字也会自动建立索引),那使用select count(id) 的效率要比select count(*)高
      

  12.   

    sql server里的identityid列是这样的,但oracle里不行的
      

  13.   

    TSimpleDataSet
    TClientDataSet
    每调用一次GetNextPacket就可以获得PacketRecords指定个数的记录,直到获得全部记录如果PacketRecords为-1就获得全部记录。 
    如果用MSSQLServer就用select top n from xxx获得前几行数据,或者用hthunter(核桃)的方法,
    如果用Mysql就极简单了
    select * from table LIMIT 5,10;  返回6-15行的数据。
      

  14.   

    李维的delphi7上讲好像用express能够指定每次查回来的记录条数,记不清了。
      

  15.   

    我的数据库是oracle的,不是很好控制,而且数据量比较大,这样效率很低
      

  16.   

    前几天才考了个过程,不知是那位高人的,声称速度极快,大量数据也是如此: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
      

  17.   

    我的想法是做一个可以跨数据库的分页组件或函数,不管是sql server或oracle照样能
    适应
      

  18.   

    ado是支持异步查询的。
    bde中的查询要放到线程中才能分页,如果不放到线程中是不会自动分页的
      

  19.   

    to  wangxd(东东):
    能给个ado异步查询的例子吗?
      

  20.   

    试一试使用tclientdataset 来控制来到本地来的数据量,