Quickie - заменить все вхождения '(апостроф) на' '(два апострофа) в AnsiString (C ++) - PullRequest
5 голосов
/ 21 января 2009

Я думаю, вы можете угадать проблему, с которой я столкнулся Я вставляю имена файлов в базу данных sql в C ++ Builder. Некоторые файлы имеют апостроф в названии. Это нарушает SQL-запрос вставки. Обычный способ исправить это состоит в удвоении и апострофах, которые вы хотите включить в значение поля.

Например, если я хочу добавить 'george's' в поле 'owner', запрос sql будет "вставить в значения таблицы (владельца) ('george''s')"

Я в порядке с этим битом. Мне просто нужно заменить одиночные апострофы на двойные. AnsiString, похоже, не имеет встроенной функции для этого. Есть ли простой способ сделать это без необходимости включать новый заголовочный файл?

Ответы [ 5 ]

6 голосов
/ 21 января 2009

На самом деле я получил ответ сам ...

item = StringReplace( item, "'", "''", TReplaceFlags() <<rfReplaceAll );

(поэтому в AnsiString есть встроенная функция замены)

Редактировать: Добавлены теги кода, чтобы мы могли различать различные кавычки

1 голос
/ 21 января 2009

Я не использовал AnsiString, но в основном я бы сделал следующее:

  • Обратный поиск одинарных кавычек в вашей строке
  • Посмотрите налево и направо от текущего индекса одинарных кавычек
  • Если там нет ни одной кавычки, вставьте одну кавычку после текущего индекса
  • Продолжайте цикл пока не достигнете индекса 0.
0 голосов
/ 21 января 2009

Что произойдет, если вы замените его таким образом

item = StringReplace( item, "'", "\'", TReplaceFlags() );
0 голосов
/ 21 января 2009

В C ++ Builder вы ищете функцию AnsiQuotedStr, в SysUtils. Его обратное значение AnsiExtractQuotedStr. Они не являются методами самого типа AnsiString, потому что они не нуждаются в глубоких знаниях внутренних типов этого типа.

Что еще более важно, вы должны использовать параметризованные запросы . Если компоненты, которые вы используете для доступа к базе данных, не поддерживают их, приобретите другую библиотеку базы данных. Нет недостатка в выборе баз данных, так что вы можете позволить себе быть разборчивыми в функциях, а параметризованные запросы должны быть в верхней части списка.

Обратите внимание, что, несмотря на свои имена, функции AnsiX принимают параметры UnicodeString, а не AnsiString, в Delphi и C ++ Builder 2009.

0 голосов
/ 21 января 2009

Обычный способ сделать это - использовать подготовленные операторы вместо генерации собственного sql. Посмотрите SQL-инъекция по одной причине, почему это плохо. По сути, если где-либо в вашем приложении вы забыли удвоить кавычки в любом операторе sql, и злоумышленник может каким-то образом передать значение в этот оператор sql, ваша база данных взломана. (См. этот комикс xkcd для смешного примера того, что может произойти.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...