Быстрый способ — заменить все вхождения ' (апострофа) на '' (два апострофа) в AnsiString (C++)

StackOverflow https://stackoverflow.com/questions/463816

  •  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() );
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top