【问题标题】:FireDAC Query dropping special characters in SQL statement to SQL ServerFireDAC 查询将 SQL 语句中的特殊字符删除到 SQL Server
【发布时间】:2020-12-01 17:28:57
【问题描述】:

我在 Delphi 10.3 中使用 FireDAC 和 EMS Rad 服务器时断时续地解决了这个问题。我没有在 Delphi 10.2 或更低版本中体验过它,但除了 Delphi 10.3 之外,我没有在任何地方使用 FireDAC。 我遇到的问题是一些特殊字符似乎在它们到达数据库之前被从 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 的东西。 过去,我通过使用参数化查询来解决这个问题,但在这种情况下,它仍然没有帮助。我目前正在运行的 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 是表的主键。 如果我采用 SQL 语句并在 Mgt Studio 中运行它,它就可以正常工作。但是,当从 Delphi 运行时,0 行会受到影响,因为没有任何内容与 where 子句匹配。

有人知道吗?

【问题讨论】:

    标签: sql-server delphi firedac delphi-10.3-rio


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-09-14
      • 1970-01-01
      • 2013-12-15
      • 2016-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多