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;