Беда с кавычками при запросе по средствам Delphi из БД mySQL

448
03 февраля 2017, 04:50

Вычитал на одном форуме, что избегания попадания кавычек из БД, лишь прибегать к функции StringReplace и иного пути, какого-нибудь хитрого экранирования, я не нашёл.

Пример:

 ADOQuery2.SQL.Add('SELECT `number`, `family`, `name`, `patronymic`, `job` ');
 ADOQuery2.SQL.Add('FROM `users` ');
 ADOQuery2.SQL.Add('WHERE `job` = :job ');
 ADOQuery2.Parameters.ParamByName('job').Value:= Edit1.text; //тут попадают кавычки.

Естественно ошибка.

Пример рабочего запроса в mySQL выглядит так:

WHERE `job` = 'Детский Сад "Солнышко"'

Предлагали сделать такое:

ADOQuery2.Parameters.ParamByName('job').Value:= StringReplace(Edit1.text, '"', '""', [rfReplaceAll]);`  

Но не помогло, так как в запрос идёт уже две кавычки.

Вопрос в том, как "обернуть", оформить вот такой рабочий запрос, из кода Dephi?

WHERE `job` = 'Детский Сад "Солнышко"'

Заранее благодарю за внимание к вопросцу.

Answer 1

Попробуйте функцию QuotedStr или AnsiQuotedStr из стандартного модуля SysUtils. Они как раз для этого и предназначены.

A Quote character is inserted at the beginning and end of S, and each Quote character in the string is doubled. To remove the quotes from a quoted string, use the AnsiDequotedStr routine.

На выходе функции получится такая строка:

Детский Сад "Солнышко" -> "Детский Сад ""Солнышко"""

Answer 2

Странно, prepared statements должны работать без экранирования. Одну кавычку можно заменить тремя, тогда должно работать.

ADOQuery2.Parameters.ParamByName('job').Value:= StringReplace(Edit1.text, '"', '"""', [rfReplaceAll]);
READ ALSO
Хэширование алгоритмом CRC

Хэширование алгоритмом CRC

Объясните как работает этот алгоритм ибо хорошей, понятной информации по этому алгоритму я не нашелВсе описывают в математических формулах,...

437
как нарисовать SVG Elliptical Arcs

как нарисовать SVG Elliptical Arcs

Пытаюсь понять как преобразовать данные для прорисовки эллипса из svg к виду для прорисовки в addArc(float left, float top, float right, float bottom, float startAngle, float sweepAngle)Все...

367
Ошибка при создании массива generics

Ошибка при создании массива generics

Предположим, есть такой код:

411
Как использовать Graphics в Java? [требует правки]

Как использовать Graphics в Java? [требует правки]

Как использовать Graphics в Java?

329