FireDAC分页查询


FireDAC原生支持分页查询,不用写分页查询SQL,只要设置FetchOptions.RecsSkip(跳过的行数)和RecsMax(分页大小)允许通过结果集进行分页。

打开游标后,将跳过第一个RecsSkip。其余的记录,最多RecsMax将被获取。当Prepared后,更改RecsSkip和RecsMax属性值不起作用。因此,在

获取下一行页之前,该命令必须未准备,然后再执行。

//分页大小为20,查询第一页

FDQuery1.FetchOptions.RecsSklp:=0;

FDQuery1.FetchOptions.RecsMax:=20;

FDQuery1.Open;

//查询第2页

FDQuery1.Disconnect;

FDQuery1.FetchOptions.RecsSkip:=20;

FDQuery1.Open;

//查询第3页

FDQuery1.Disconnect;

FDQuery1.FetchOptions.RecsSkip:=40;

FDQuery1.Open;

可以简单封装一个分页查询过程,其中PageSize为分页大小,PageIndex页码,0为第一页,RecsSkip可以通过PageSize*PageIndex计算出来

procedure PagingQuery(Query:TFDQuery;PageSize,PageIndex:integer);

begin

  Query.Disconnect;

  Query.FetchOptions.RecsSkip:=PageSize*PageIndex;

  Query.FetchOptions.RecsMax:=PageSize;

  Query.Open;

end;

procedure OpenAndGetAnyPage(PageIndex,PageSize:Integer;SqlText:string);

var

  Qry:TFDQuery;

begin

  Qry:=TFDQuery.create(Self);

  try

    Qry.Connection:=Conn;//数据库连接控件

    Qry.FetchOptions.RecsSkip:=PageSize*PageIndex;//跳过的记录数(PageIndex 0-N)

    Qry.FetchOptions.RecsMax:=PageSize;//每页最大记录(大于0)

    Qry.Sql.Text:=SqlText;

    Qry.Prepare;//准备

    Qry.Open;//打开(不用用Open(SQL)的方式,必须先Prepare)

    //遍历数据

    while not Qry.Eof do

    begin

      //TODO处理

      Qry.next;

    end;

  Finally

    Qry.Free;

  end;

end;

相关