问题描述
我已经在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