FireDAC查询将SQL语句中的特殊字符删除到SQL Server

问题描述

我已经在Delphi 10.3中使用FireDAC和EMS Rad Server反复打开此问题。我没有在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:41:01 PM-&K[[773'

其中fdTemp是TFDQuery,而DTS是表的主键。 如果我使用sql语句并在Mgt Studio中运行它,那么它就可以正常工作。但是,从Delphi运行时,将影响0行,因为没有任何匹配where子句的内容

有人有什么主意吗?

解决方法

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

您可以通过将db.collection.aggregate([ { $project: { obj: { $map: { input: { $objectToArray: "$data.status" },in: { k: "$$this.k",count: { $sum: "$$this.v.count" } } } } } },{ $unwind: "$obj" },{ $group: { _id: "$obj.k",count: { "$sum": "$obj.count" } } } ]) 设置为false来抑制这种情况。

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