Ошибка Delphi FireDAC при загрузке SQLite3.dll

Я уже загрузил последнюю версию SQLite.dll с страницы загрузки SQLite и попытался загрузить его с помощью TFDPhysDriverLink.VendorLib

Но когда я запускаю приложение, которое содержит следующий код:

procedure TForm1.FormCreate(Sender: TObject);
begin
  FDConnection1.Close;
  FDPhysSQLiteDriverLink1.Release;
  FDPhysSQLiteDriverLink1.VendorLib:= 'Path\SQLite3.dll';
  FDQuery1.Open('SELECT *, ROW_NUMBER() OVER() Col FROM TableName');
end;

Выбрасывает:

[FireDAC] [Phys] [SQLite] ОШИБКА: рядом (: синтаксическая ошибка

Это означает, что оконная функция ROW_NUMBER() не распознается.

  • Что я делаю не так?
  • Как я могу заставить FireDAC использовать последнюю версию SQLite.dll?

person Ilyes    schedule 13.10.2020    source источник
comment
Вы проверяли документацию, чтобы узнать, поддерживает ли SQLite этот синтаксис вообще? И если это так, я считаю, что это OVER() причина проблемы.   -  person Ken White    schedule 13.10.2020
comment
SELECT *, ROW_NUMBER() OVER() Col FROM TableName точно не является допустимым SQL.   -  person Arnaud Bouchez    schedule 13.10.2020
comment
Как насчет SELECT *, ROW_NUMBER() OVER (ORDER BY Col) FROM TableName? См. Встроенные оконные функции.   -  person Peter Wolf    schedule 13.10.2020
comment
Нет, SELECT *, ROW_NUMBER() OVER() Col FROM TableName является допустимым SQL @ArnaudBouchez, и даже SELECT *, ROW_NUMBER() OVER( ORDER BY ColumnName) Col FROM TableName не работает   -  person Ilyes    schedule 13.10.2020
comment
Какая версия SQLite? SELECT sqlite_version()   -  person Peter Wolf    schedule 13.10.2020
comment
@PeterWolf FireDAC вернет 3.8.7.4, поэтому я пытаюсь загрузить SQLite.dll   -  person Ilyes    schedule 13.10.2020
comment
После настройки связи с физическим драйвером откройте соединение в среде IDE с вкладкой Информация и посмотрите, что он загружает и почему. В IDE нужна 32-битная версия.   -  person Brian    schedule 13.10.2020
comment
IDE загрузит статически связанный файл .dll @Brian DLL = <sqlite3_x86.obj statically linked>   -  person Ilyes    schedule 13.10.2020
comment
Вы указали абсолютный путь?   -  person Olivier    schedule 13.10.2020
comment
Да @Olivier я сделал   -  person Ilyes    schedule 13.10.2020
comment
@ moskito-x Вы действительно задаете такой вопрос? Свойство TFDConnection.Connected будет True автоматически при вызове метода TFDQuery.Open(). Извините, но это не связано с вопросом.   -  person Ilyes    schedule 13.10.2020
comment
просто попробуйте: FDPhysSQLiteDriverLink1.VendorLib:= 'Path\SQLite3.dll'; FDConnection1.Open; .....   -  person moskito-x    schedule 13.10.2020
comment
Кажется, вам нужно перекомпилировать FireDAC, который действительно хромает. См. Ответ на вопрос Firedac не распознает новую функцию ALTER в sqlite3.   -  person Peter Wolf    schedule 13.10.2020
comment
С Sydney больше не нужно менять FireDAC.inc. .   -  person Olivier    schedule 13.10.2020
comment
Уловка тоже не сработала @PeterWolf   -  person Ilyes    schedule 13.10.2020
comment
Вы поместили DLL рядом с исполняемым файлом, как указано в doc ? Не используйте VendorLib.   -  person Olivier    schedule 13.10.2020
comment
Я не понимаю, как OVER() может быть допустимым синтаксисом, из sqlite.org/windowfunctions.html точка зрения. Вам нужно какое-то выражение внутри OVER.   -  person Arnaud Bouchez    schedule 14.10.2020
comment
Прочтите документы еще раз @ArnaudBouchez и особенно предоставленные примеры. OVER и OVER() действительны.   -  person Ilyes    schedule 15.10.2020
comment
Так что, возможно, FireDAC проверяет SQL перед его выполнением и не знает о оконных функциях. Есть альтернативные библиотеки с прямым доступом к SQLite3.   -  person Arnaud Bouchez    schedule 15.10.2020
comment
Проблема в том, что FireDAC продолжает использовать статическое вылизывание @ArnaudBouchez   -  person Ilyes    schedule 15.10.2020


Ответы (2)


SQLite не поддерживает ROW_NUMBER. Посмотрите ответы на этот вопрос, вы, вероятно, найдите что-нибудь для замены ROW_NUMBER.

person fpiette    schedule 13.10.2020
comment
Это утверждение неверно. SQLite поддерживает ROW_NUMBER, начиная с версии 3.25.0. Это также то, что говорит самый популярный ответ на вопрос, с которым вы связались. - person Peter Wolf; 13.10.2020
comment
Прочтите документы sqlite.org/releaselog/3_25_0.html - person Ilyes; 13.10.2020

Если вы получили эту ошибку, значит, SQlite3.dll был загружен нормально.

Просто используйте поле RowID, которое всегда существует для любой стандартной таблицы SQLite3 - если вы явно не создали их с помощью СОЗДАТЬ ТАБЛИЦУ БЕЗ ROWID заявление.

Я бы просто написал:

 FDQuery1.Open('SELECT *, RowID FROM TableName');

Обратите внимание, что если в вашей таблице есть явный INTEGER PRIMARY KEY столбец, он фактически отобразит внутренний RowID столбец. Обратитесь к документации SQLite3, чтобы узнать, как это работает.

person Arnaud Bouchez    schedule 13.10.2020
comment
Нет, я не хочу использовать ROWID, вместо этого я хочу использовать оконную функцию. ROW_NUMBER() OVER() - это просто пример оконных функций. - person Ilyes; 13.10.2020