Параметры 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)
Другие вопросы по тегам