如何在运行时使用TFDQuery的RecsSkip和RecsMax属性

时间:2018-04-19 12:35:17

标签: delphi firedac delphi-10.2-tokyo skip-take

我正在寻找跳过并在TFDQuery中选择。 我找到的属性是.FetchOptions.RecsSkip和.FetchOptions.RecsMax。我使用东京10.2.3 和数据库 Firebird 3

我在运行时进行查询,我希望将开始记录设为5并获得8条下一条记录。

我喜欢:

结果不会跳过第5条记录

var
  qryTest: TFDQuery;
begin
 qryTest:= TFDQuery.Create(self);
 qryTest.Connection := self.FDConnection;

 qryTest.sql.Text:= ' select * from salutationdescriptions order by ID';
 qryTest.Disconnect();
 qryTest.FetchOptions.RecsSkip:= 5;
 qryTest.FetchOptions.RecsMax:= 8;
 qryTest.Open();

但是这给出了前8个记录的结果。不会跳过5个第一个记录。

好的,我同样但现在我在设计时设置TFQQuery(表单上的组件)并添加选项' select * from salutationdescriptions order by ID'在组件中。

运行代码:

跳过第5条记录

  qryItem.Close;
  qryItem.Disconnect();
  qryItem.FetchOptions.RecsSkip:= 5;
  qryItem.FetchOptions.RecsMax:= 8;
  qryItem.Open();

我得到的结果还可以。这跳过了前5条记录。 当我添加qryItem.sql.text时,它不会跳过前5条记录

这不会跳过第5条记录

  qryItem.Close;
  qryItem.sql.Text:= ' select * from salutationdescriptions order by ID';
  qryItem.Disconnect();
  qryItem.FetchOptions.RecsSkip:= 5;
  qryItem.FetchOptions.RecsMax:= 8;
  qryItem.Open();

这不会跳过5首记录。

我必须在属性中设置一些内容吗?

我想在运行时使用RecsSkip和RecsMax。有什么建议吗?

发现问题

在SQL.Text中的

我必须以'选择......开头 '之间没有空格并选择

1 个答案:

答案 0 :(得分:2)

正如您已经发现的那样,问题出在SQL命令的前导空间中。这是因为命令生成器不考虑前导命令空间。有一个像这样的代码(修改和广泛简化以供我解释):

function TFDPhysCommandGenerator.GenerateLimitSelect(ASkip, ARows: Integer;
  AOneMore: Boolean; var AOptions: TFDPhysLimitOptions): string;
begin
  if (True) and (CompareText(Copy(FCommandText, 1, 6), 'SELECT') = 0) then
    Result := GetLimitSelect(FCommandText, ASkip, ARows, AOptions)
  else
    Result := FCommandText;
end;

你可能会看到问题所在。仅当从查询命令文本分配的 FCommandText 字段以 SELECT 字开头时,命令生成器才会返回DBMS的本机 LIMIT 命令。这不是你的情况(由于前导空格),因此生成器按原样返回命令。

这是我报告为RSP-20403的FireDAC错误。由于有更多这样的检查,我认为最简单的解决方法是直接在其构造函数中修改SQL命令,如:

constructor TFDPhysCommandGenerator.Create(const ACommand: IFDPhysCommand);
begin
  ...
  FCommandText := Trim(ACommand.SQLText);
  ...
end;

现在,EMBT如何解决这个问题。