Delphi 10西雅图中的FDQuery参数

时间:2017-06-30 13:19:40

标签: delphi ms-access ms-access-2010 delphi-10-seattle firedac

我有这个问题:

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 个答案:

答案 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)