C/S 两层中TAdoDataSet 怎么分段下载记录?

解决方案 »

  1.   

    设置光标位置为服务器光标,光标类型可设置静态光标或者动态光标或者keyset光标,不过这三者是有区别的。然后设置MaxRecords为你想一次下载的数据量。
      

  2.   

    方法很多,可参考:1、
    const
      Options : TGetRecordOptions = [grMetaData,grReset];var
      RecsOut: integer;
    begin
      ......
      ClientDataSet1.Close;
      ClientDataSet1.Data := DataSetProvider1.GetRecords(5, RecsOut, Byte(Options));
      Edit1.Text := inttostr(RecsOut);
      ClientDataSet1.Open;
      ......
    end;2、http://bdn.borland.com/article/0,1410,20846,00.html
    http://bdn.borland.com/article/0,1410,22571,00.html
      

  3.   

    ADO分页,大概是这样
    Try
    AdoDataSet.Open;
    AdoDataSet.Recordset.PageSize:=10;             //每页10笔记录
    AdoDataSet.Recordset.AbsolutePage:=2;          //设置当前为第2页
    ShowMessage(AdoDataSet.Fields[0].AsString);    //区第2页第一笔记录
    AdoDataSet.Recordset.PageCount;  //得到总页数
      

  4.   

    好像是不可能的,除非你自己用SQL语句分页。
      

  5.   

    To: pinyu(品雨), leejiey(李杰)
      设定MaxRecords后, Delphi 会将数据集的CommandText解释执行如下:
      
      SET ROWCOUNT 10 SET NO_BROWSETABLE ON
      你的数据集的CommandText(SELECT * FROM tblItem ...)    我如何取到10条之后的呢?TO: cdhuanglei(落花岛上花倒落) 
      我要的是C/S结构中的两层的TADODataSet的实现, 并且既使三层中, 你的写法也是有问题的,你实现的只是从中间层到客户端的分段下载记录, 在这之前, 其实所有记录已下载到中间层了. 所以在三层中其实也有这个问题.
      

  6.   

    TO: DebugXP(武林高手,系用公筷架~~~) 
      你的方法好像也不行, 不只你是否这样实现过?
      

  7.   

    TO: liangjinliang() 
      其实我自己也写了一个这样的控件, 但是觉得效果不是很明显. 不知你是否有什么好的思路?
      

  8.   

    A b s o l u t e P a g e 改变当前P a g e的位置,设定这个属性可以存取特定P a g e中的数据
    个可擦写的属性
    P a g e C o u n t 数据表中所有的数据除以P a g e S i z e之后所得到的P a g e页数。这是
    属性
    P a g e S i z e 指明每一个P a g e中包含的数据笔数。这是一个可擦写的属性
    因此要使用A D O页面定位功能,程序员只需要使用下面的步骤即可:
    □ 取得A D O的R e c o r d s e t对象。
    □ 设定R e c o r d s e t对象的P a g e S i z e属性值,以决定一个页面包含多少笔数
    □ 存取R e c o r d s e t对象的P a g e C o u n t以便了解数据表被切割成多少的页面
    □ 设定R e c o r d s e t对象的A b s o l u t e P a g e属性值以决定要存取的页面数据。
      

  9.   

    TO: helodd(真可爱)
      AbsolutePage, PageSize 的方式我试了一下, 好像不行!
      

  10.   

    j 老师的分页方法
    /*--分页方法:回复人: j9988(j9988) 
    --*/
    declare @sqlstr nvarchar(4000), --查询字符串
    @pagecount int, --第N页
    @pagesize int --每页行数select @pagecount=3,@pagesize=10
    ,@sqlstr='select * from sysobjects'set nocount on
    declare @P1 int, --P1是游标的id
    @rowcount intexec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1,@rowcount=@rowcount output
    select @rowcount as 总行数,ceiling(1.0*@rowcount/@pagesize) as 页数,@pagecount as 当前页
    set @pagecount=(@pagecount-1)*@pagesize+1
    exec sp_cursorfetch @P1,16,@pagecount,@pagesize 
    exec sp_cursorclose @P1
      

  11.   

    TO: helodd(真可爱) 
    谢谢你的回复, 我看看是否满足我的需求.
      

  12.   

    To: massoft(投币一元,不找零钱)
      如何处理呢?
      

  13.   

    设置ADOConnection.ConnectOptions := coAsyncConnect;试试,默认为coConnectUnspecified。
      

  14.   

    DECLARE @SQL varchar(8000)
    SET @SQL='SELECT TOP '+cast(@每页大小 AS varchar)+' * FROM 表 WHERE 主键列 NOT IN (SELECT TOP '+cast((@每页大小-1)*@第几页 AS varchar)+' 主键列 FROM 表 )'EXEC(@SQL)