FireDAC 查询将 SQL 语句中的特殊字符丢弃到 SQL 服务器

FireDAC Query dropping special characters in SQL statement to SQL Server

我在 Delphi 10.3 中使用 FireDAC 和 EMS Rad 服务器断断续续地解决了这个问题。我没有在 Delphi 10.2 或更低版本中体验过它,但我没有在任何地方使用 FireDAC,而是在 Delphi 10.3 中。 我遇到的问题是一些特殊字符似乎在到达数据库之前从 SQL 语句中被删除。

例如,如果我 运行:

update messageread set
MessageDeliveredDateTime = '8/11/2020 6:33:45 PM'
where messageread.dts in ('5/7/2020 12:48:20 PM-!+[[786',   '5/7/2020 12:47:06 PM-!#[[782', '5/7/2020 12:43:35 PM-&K[[775', '5/7/2020 12:41:01 PM-&K[[773')

在 SQL 服务器上执行的是:

update messageread set MessageDeliveredDateTime = '8/11/2020 6:33:45 PM' where messageread.dts in ('5/7/2020 12:48:20 PM-+[[786',   '5/7/2020 12:47:06 PM-[[782',   '5/7/2020 12:43:35 PM-[[775',   '5/7/2020 12:41:01 PM-[[773')

它似乎在“-”之后删除了 2 个字符。因为它是 2 个字符,所以我觉得它是一些 Unicode 的东西。 过去,我通过使用参数化查询解决了这个问题,但在这种情况下,它仍然无济于事。我目前 运行ning 的 Delphi 代码是:

fdTemp.SQL.Text := 'update messageread set MessageDeliveredDateTime = ' + QuotedStr(DateTimeToStr(now)) + ' where messageread.dts in (' + sUpdateDTS + ')';
fdTemp.ExecSQL;
sUpdateDTS = '5/7/2020 12:48:20 PM-!+[[786',    '5/7/2020 12:47:06 PM-!#[[782', '5/7/2020 12:43:35 PM-&K[[775', '5/7/2020 12:41:01 PM-&K[[773'

其中fdTemp是TFDQuery,DTS是table的主键。 如果我在 Mgt Studio 中使用 SQL 语句和 运行 它,它就可以正常工作。但是,当 Delphi 中的 运行 时,0 行会受到影响,因为没有任何内容与 where 子句匹配。

有人知道吗?

SQL命令中的某些字符在FireDAC中具有特殊含义,因此必须以特殊方式输入。在您的情况下,以 & 开头的标识符被视为宏。

您可以通过将 ResourceOptions.MacroCreate 设置为 false 来抑制它。

有关 FireDAC 中特殊字符处理的更多信息,请参阅文档: Special Character Processing