Быстрый способ — заменить все вхождения ' (апострофа) на '' (два апострофа) в AnsiString (C++)
-
19-08-2019 - |
Вопрос
Я думаю, вы догадались, в чем моя проблема.Я вставляю имена файлов в базу данных sql в C++ Builder.В названии некоторых файлов есть апостроф.Это нарушает запрос на вставку sql.Обычный способ исправить это — удвоить число апострофов, которые вы хотите включить в значение поля.
Например, если я хочу добавить «Джорджа» в поле «Владелец», запрос sql будет выглядеть так: «Вставить в таблицу (владельца) значения («Джорджа»)»
Меня это устраивает.Мне просто нужно заменить одинарные апострофы двойными.Похоже, что в AnsiString нет встроенной функции для этого.Есть ли простой способ сделать это без необходимости включать целый новый файл заголовка?
Решение
На самом деле я получил ответ сам ...
item = StringReplace( item, "'", "''", TReplaceFlags() <<rfReplaceAll );
(поэтому в AnsiString есть встроенная функция замены)
Изменить: добавлены теги кода, чтобы мы могли различать разные кавычки
Другие советы
Я не использовал AnsiString, но в основном я бы сделал следующее:
- Обратный поиск одинарных кавычек в вашей строке
- Посмотрите слева и справа от текущего индекса одинарных кавычек.
- Если там еще нет ни одной кавычки, вставьте одинарную кавычку после текущего индекса.
- Продолжайте цикл, пока не дойдете до индекса 0.
Обычный способ сделать это - использовать подготовленные операторы вместо генерации собственного sql. Найдите SQL-инъекцию по одной причине, почему это плохо. По сути, если где-либо в вашем приложении вы забыли удвоить кавычки в любом операторе sql, и злоумышленник может каким-то образом передать значение в этот оператор sql, ваша база данных взломана. (См. этот комикс xkcd для забавного примера того, что может произойти.)
В C ++ Builder вы ищете функцию AnsiQuotedStr
в SysUtils
. Его обратное AnsiExtractQuotedStr
. Они не являются методами самого типа AnsiString
, потому что они не нуждаются в глубоких знаниях внутренних типов этого типа.
Более того, вы должны использовать параметризованные запросы . Если компоненты, которые вы используете для доступа к базе данных, не поддерживают их, приобретите другую библиотеку базы данных. Нет недостатка в выборе баз данных, поэтому вы можете позволить себе быть разборчивыми в функциях, а параметризованные запросы должны быть в верхней части списка.
Обратите внимание, что, несмотря на свои имена, функции AnsiX
принимают UnicodeString
параметры, а не <=>, в Delphi и C ++ Builder 2009.
Что произойдет, если вы замените его таким образом
item = StringReplace( item, "'", "\'", TReplaceFlags() );