Параметры FDQuery в Delphi 10 Сиэтл
У меня есть этот запрос:
SELECT * FROM Vente WHERE
(DatePart ("d", Vente.DateDebut)=01) and
(DatePart ("m", Vente.DateDebut)=06) and
(DatePart ("yyyy", Vente.DateDebut)=2017);
Этот запрос работает нормально в MS Access 2010, но когда я пытаюсь извинить его из TFDQuery
компонент, это дает мне ошибку:
[FireDAC] [Phys] [ODBC] [Microsoft] [Pilote ODBC Microsoft Access] Слишком мало параметров. 3 Ожидается...
В чем проблема? Как я могу это исправить?
Обновить:
Кажется, проблема в DatePart ()
функция, потому что я пытаюсь также это:
SELECT DatePart ("d", Vente.DateDebut) FROM Vente
И это дает мне ту же ошибку, просто с "3 ожидается..." становится "1 ожидается...".
1 ответ
Я думаю, что драйвер отклоняет ваш запрос из-за того, что " (кавычка) экранирует строку, которую вы использовали. Например, класс метаданных FireDAC MS Access внутренне использует ' (apostrophe) для экранирования строковых значений. Если я прав, вы' У вас будут проблемы при написании SQL-запросов со строковыми константами, исполняемыми как в приложении FireDAC, так и в MS Access, потому что для FireDAC вы будете писать запрос следующим образом (апостроф должен быть экранирован в коде Delphi):
SELECT DatePart(''d'', Vente.DateDebut) FROM Vente
Что не понимает MS Access. Требуются кавычки, которые, в свою очередь, неприемлемы для FireDAC:
SELECT DatePart("d", Vente.DateDebut) FROM Vente
Я не знаю, как можно было бы писать команды со строковыми константами для FireDAC, а также для MS Access. Это должно работать в FireDAC (не в MS Access):
SELECT * FROM Vente WHERE
({EXTRACT(DAY, Vente.DateDebut)} = :Day) AND
({EXTRACT(MONTH, Vente.DateDebut)} = :Month) AND
({EXTRACT(YEAR, Vente.DateDebut)} = :Year)
После предварительной обработки для MS Access он должен создать такую команду (обратите внимание на апостроф):
SELECT * FROM Vente WHERE
(DATEPART('d', Vente.DateDebut) = :Day) AND
(DATEPART('m', Vente.DateDebut) = :Month) AND
(DATEPART('yyyy', Vente.DateDebut) = :Year)