Member 13872723 Ответов: 3

Экранирование одинарной кавычки при вставке в базу данных access


У меня есть приложение, которое считывает данные кандидатов на работу из электронной таблицы Excel через ODBC и заполняет их в таблице доступа через ODBC.
Проблема, с которой я сейчас сталкиваюсь, заключается в том, что некоторые текстовые поля в Excel содержат одинарные кавычки.
Как я могу динамически вставлять такие данные в Access?

Спасибо

Что я уже пробовал:

Visual Studio deugging Online help.

Patrice T

Покажите свой код

Richard MacCutchan

Удалите одинарные кавычки.

3 Ответов

Рейтинг:
26

OriginalGriff

С помощью параметризованных запросов или через DataTable.
Единственный раз, когда это создает проблемы, - это когда вы объединяете строки, и это плохая идея в любое время.
Никогда не объединяйте строки для построения команды SQL. Это оставляет вас широко открытыми для случайной или преднамеренной атаки SQL-инъекции, которая может уничтожить всю вашу базу данных. Вместо этого всегда используйте параметризованные запросы.

Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:

SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку в том, что касается SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x';DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?


Maciej Los

5ed!

Рейтинг:
2

Maciej Los

Пожалуйста, обратитесь к этому: Сообщение об ошибке при использовании специальных символов в базах данных Access[^]

MSDN писал:

Обходной путь


Чтобы решить эту проблему, не используйте специальные символы. Если необходимо использовать специальные символы в выражениях запросов, заключите их в квадратные скобки ([]Например, если вы хотите использовать знак больше, чем (>), использовать [>].


Кстати: я полностью согласен с OriginalGriff, особенно в том, что касается использования параметризованный запрос[^].


Рейтинг:
1

LLLLGGGG

Заменить "'" на """.

Код C++ для такой замены очень легко написать:

void escapeTicks(std::wstring *s)
{
    for (size_t i = 0;(*s)[i] != 0;)
    {
        if ((*s)[i] == L'\'')
        {
            (*s).insert(i, L"'");
            i += 2;
        }
        else
        {
            i++;
        }
    }
}


Я еще не тестировал код, но он должен работать
На самом деле старый код не работал. Спасибо анонимному комментатору (имя не появляется в комментарии) У меня есть хороший код.

Источник: Escaping ' in Access SQL - переполнение стека[^]


Member 13872723

к сожалению, он довольно глючный.
Вот моя уточненная версия.

void escapeTicks(std::wstring *s)
{
for (size_t i = 0;(*s)[i] != 0;)
{
если ((*s)[i] == L'\")
{
(*с).вставить(я, Л"'");
i += 2;
}
еще
{
я++;
}
}
}

LLLLGGGG

Да, как только я прочитал "это довольно глючно", я понял, что написал ужасный кусок кода. Жаль, что.
Вы не возражаете, если я обновлю свой ответ с помощью вашего кода (используя правильную атрибуцию, конечно)? К сожалению, я не вижу вашего имени в комментарии.

Member 13872723

Без проблем. Меня зовут Сатиш Венкатесан