请问各位大侠,我在delphi在访问sql server数据库,用TDBgrid控件显示查询结果。结果数据集比较大,因此想要分页显示,使每页显示50条记录,该如何实现?

解决方案 »

  1.   

    可以调用sql server存储过程来实现
      

  2.   

    /*--利用SQL未公开的存储过程实现分页

    方法简单且效率高,已知的问题就是要多返回一个空的记录集 解决的方法是在前台调用时,用 set recordset=recordset.nextrecordset
    的方法跳过第一个记录集

    此方法由J9988提供,我只是将它改成了方便调用的存储过程--邹建 2004.05--*/
    CREATE procedure p_splitpage   
    @sql nvarchar(4000), --要执行的sql语句
    @currentpage int=2,  --要显示的页码
    @pagesize int=10, --每页的大小
    @pagecount int=0 out --总页数
    as
    set nocount on
    declare @p1 intexec sp_cursoropen @p1 output,@sql,@scrollopt=1,@ccopt=1,@rowcount=@pagecount outputselect @pagecount=ceiling(1.0*@pagecount/@pagesize)
    ,@currentpage=(@currentpage-1)*@pagesize+1
    select @currentpage
    exec sp_cursorfetch @p1,16,@currentpage,@pagesize 
    exec sp_cursorclose @p1
    GO
      

  3.   

    不用感知控件,用ListView来控制
      

  4.   

    用SQL 语句+CLIENTDATASET实现
      

  5.   

    只用sql语句完全可以实现
    ADOQuery1.SQL.Clear;
     pageCount := (page-1) * 100;
    /////  分页查询语句
     ADOQuery1.SQL.Add(format('select top 100 * from Alarm_Command_Log where log_serial_number not in (select top %d log_serial_number  from Alarm_Command_Log order by log_serial_number)  order by log_serial_number',[pageCount]));
      page := page + 1;
      adoquery1.Active := true;  count := count + 1;
    end;
      

  6.   

    请问Erice兄台,我在用CLIENTDATASET时进行分页显示时,第一次显示10行,但以后各页都是在第一页的基础上增加10行,第二页显示20行,第3页显示30行..等等。该怎么处理呢?我用的以下文句实现
    ClientDataSet1.fetchondemand:=false;
    ClientDataSet1.getnextpacket;
      

  7.   

    李唯老师在分布式一书中讲的TClientDataSet有错误,服务器会为客户端保存状态,
    所以,我用SQL +TClientDataSet作成分叶:客户端:
    var
      i:Integer;
      t_sql,str1,strend:wideString;
      quedata:olevariant;
      //2004-2-10为了优化程序性能   速度已提高到52秒
      lStart, lEnd : Integer;
    begin
      //inherited;
    //   lStart := GetTickCount;
         if not dmmain.DSquery.Active then exit;    screen.Cursor := crhourglass;
       //关掉与DBGRID 的互动
       dmmain.dsquery.DisableControls;
       t_sql:='select top ' + trim(ComboBox1.Text) +' *  from  TableName '+sWhere;
       t_sql := t_sql+ ' and  id > '+ inttostr(localcount);
      try
       ipubtemp.ty_query(t_sql,quedata);
        if not varisnull(quedata) then
        begin
         if dmmain.dsquery.Active then dmmain.dsquery.Close;
          dmmain.dsquery.Open;
          dmmain.dsquery.AppendData(quedata,true);
           dmmain.dsquery.Last;
          dmmain.dsquery.EnableControls;
          //得到此次查询的键值
          LocalCount := GetKeyFieldValue('id');   //传入具体字段
        edtRecNo.Text := '当前共有'+inttostr(dmmain.dsquery.recordcount) +'条';
        end else
        begin
           //不再有数据
            dmmain.dsquery.EnableControls;        //ydy  必须要
           btnpagedown.Enabled := false;
           screen.Cursor :=  crdefault;
          exit;
        end;
      except
      dmmain.dsquery.EnableControls;
        dbgrid1.Refresh;
      end;
      dmmain.dsquery.EnableControls;
      dbgrid1.Refresh;
      screen.Cursor :=  crdefault;
    ---------------------------
    见笑了!!!
      

  8.   

    兄台说的方法,必须要有一个ID字段,且是order by ID。但我现在没有这个我现在是一次用存储过程将所有的数据全部取出来了,想用TCLIENTDATASET实现分页,
      

  9.   

    兄台说的方法,必须要有一个ID字段,且是order by ID。但我现在没有这个ID字段。我现在是一次用存储过程将所有的数据全部取出来了,想用TCLIENTDATASET实现分页,有没有办法?
      

  10.   

    请问 wanyingsong兄,set recordset=recordset.nextrecordset语句加在什么地方?delphi中好象不能这么加吧。