Простая проблема SQL: создание оператора вставки SQL с текстовой строкой, содержащей символы - PullRequest
1 голос
/ 10 сентября 2011

Я следую синтаксису

INSERT INTO Table1
VALUES (value1, value2, value3…)

До сих пор это работало нормально. Но теперь у меня есть некоторые значения, которые содержат нормальный текст на английском языке, такой как «Я иду домой». Символ 'разрушает команду SQL в C #. Я написал следующее:

command.CommandText = "INSERT INTO Bio VALUES ('" + name + "','"I'm going home" + "');

оценивается как

INSERT INTO Bio VALUES ('Peter','I'm going home')

, который, очевидно, не будет работать. Как сделать так, чтобы специальный символ не разрушал операторы SQL?

Ответы [ 5 ]

8 голосов
/ 10 сентября 2011

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

4 голосов
/ 10 сентября 2011

Узнайте о параметризованных запросах для вашего провайдера. Они существуют для Odbc, OleDb, Sql и т. Д.

command.CommandText = "INSERT INTO Bio Values (@name, @text)";
command.Parameters.Add(/* appropriate param type for your provider */); // add for @name, @text, etc.
// execute query
1 голос
/ 10 сентября 2011

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

INSERT INTO myTable (Column1) VALUES ('Hello I''m Jack');

Однако я предлагаю вам использовать параметры.

command.CommandText = "INSERT INTO Bio VALUES (@Name, @OtherValue)";
command.Parameters.AddWithValue("Name", name);
command.Parameters.AddWithValue("OtherValue", "I'm going home");

Еще одно замечание в пользу использования параметров заключается в том, что вы свободны от бремени форматирования и прочего.Я имею в виду значения даты, уникальные идентификаторы и т. Д.

1 голос
/ 10 сентября 2011

Используйте две одинарные кавычки всякий раз, когда есть одна кавычка, которую вы хотите экранировать

Кроме того, вместо того, чтобы строить такие запросы, как этот, вы должны использовать параметризованные запросы на языке по вашему выбору.Побег персонажей сам открывает дверь для SQL-инъекций.

0 голосов
/ 10 сентября 2011

Я использую

HttpUtility.HtmlEncode(text)

Это делает все то, что вводит SQL, исчезает, и это кажется проще, чем использовать параметры.Не забудьте использовать

HttpUtility.HtmlDecode(text)

, чтобы получить свой вклад обратно в форму, в которой вы его получили

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