Как использовать свойства RecsSkip и RecsMax TFDQuery во время выполнения
Я искал пропустить и принять выбор в 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 salutationdes описания по идентификатору" в компоненте.
Запустите код:
Это пропустить 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 ответ
Как вы уже выяснили, проблема в пробеле в команде 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;
Там вы можете увидеть проблему. Генератор команд возвращает собственную команду LIMIT СУБД только в том случае, если поле FCommandText, назначенное из текста команды запроса, начинается словом SELECT. Это не ваш случай (из-за начального пробела), поэтому генератор возвращает команду как есть.
Это ошибка FireDAC, о которой я сообщил как RSP-20403. Так как таких проверок больше, я думаю, что самым простым решением для этого было бы обрезать команду SQL непосредственно в ее конструкторе, например:
constructor TFDPhysCommandGenerator.Create(const ACommand: IFDPhysCommand);
begin
...
FCommandText := Trim(ACommand.SQLText);
...
end;
Так что теперь на EMBT, как это исправить.