Запрос FireDAC, отбрасывающий специальные символы в операторе SQL на SQL Server

Я неоднократно сталкивался с этой проблемой в Delphi 10.3, используя FireDAC и EMS Rad Server. Я не испытывал этого в 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. Раньше я работал над этим, используя параметризованные запросы, но в данном случае это все равно не помогает. Код 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.

Есть у кого-нибудь идеи?


person KenDavis    schedule 12.08.2020    source источник


Ответы (1)


Некоторые символы в командах SQL имеют особое значение в FireDAC и, следовательно, должны вводиться особым образом. В вашем случае идентификатор, начинающийся с &, рассматривается как макрос.

Вы можете подавить это, установив для ResourceOptions.MacroCreate значение false.

Дополнительную информацию об обработке специальных символов в FireDAC можно найти в документации: Special Обработка персонажей

person Uwe Raabe    schedule 12.08.2020