我有这个问题:
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预期......"。
答案 0 :(得分:0)
我最好的猜测是,由于您使用的" (引号)字符串转义,驱动程序拒绝您的查询。例如,FireDAC MS Access元数据类在内部使用' (撇号)来转义字符串值。如果我是对的,那么在使用FireDAC应用程序以及MS Access中可执行的字符串常量编写SQL查询时会遇到问题,因为对于FireDAC,您可以编写这样的查询(撇号必须在德尔福代码):
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)