.net bigner Ответов: 3

Как я могу справиться со следующим исключением в C#?


txtCustomerName = " Mc ' Donald";
string strsql = " Update Tbproposal set CustomerName ='" +txtCustomerName +"'";
DataHelper.ExecuteQuery(strsql);

Когда я выполняю этот запрос,я сталкиваюсь со следующей проблемой кода th'enter'e. Неправильный синтаксис рядом с "Дональдом".
Msg 105, Уровень 15, Состояние 1, Строка 1
Незамкнутая кавычка после строки символов ".

Я знаю, в чем причина. но хочу знать, как я могу это решить.

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

Я хочу разобраться с этим в своем текстовом поле.

3 Ответов

Рейтинг:
22

Karthik_Mahalingam

временное исправление-это

string txtCustomerName = "Mc'' Donald";


но приведенный выше код таков не рекомендуемый, так как он уязвим для SQL-инъекция[^] атаки.
всегда использовать Использование параметризованных запросов для предотвращения атак SQL-инъекций [^]

Вам придется написать метод внутри вашего DataHelper класс для обработки sql command как
static void ExecuteCommand(SqlCommand cmd)
   {
       SqlConnection con = new SqlConnection();
       con.ConnectionString = "Your Connectoin string";
       cmd.Connection = con;
       con.Open();
       cmd.ExecuteNonQuery();
       con.Close();
   }

и вызовите его, как показано ниже
string customerName = txtCustomerName.Text;
      string strsql = "Update Tbproposal set CustomerName = @customer";
      SqlCommand cmd = new SqlCommand(strsql);
      cmd.Parameters.Add("@customer", customerName);
      DataHelper.ExecuteCommand(cmd);


Sergey Alexandrovich Kryukov

5ед.
—СА

Karthik_Mahalingam

Спасибо Сергей

Sergey Alexandrovich Kryukov

Я также добавил Решение 3, чтобы объяснить некоторые предпосылки и предоставить больше ссылок.
—СА

Рейтинг:
2

Sergey Alexandrovich Kryukov

Вы уже получили несколько советов, связанных с SQL-инъекцией. Это плохо: ваш запрос составлен путем конкатенации со строками, взятыми из пользовательского интерфейса. Не только повторная конкатенация строк неэффективна (потому что строки неизменный; должен ли я объяснять, почему это делает повторную конкатенацию плохой?), но гораздо важнее, что она открывает двери для SQL-инъекция-очень известный подвиг. Вам просто нужно понять предысторию.

Вот как это работает: http://xkcd.com/327.

Вы уловили идею? Строка, взятая из элемента управления, может быть чем угодно, включая... фрагмент SQL-кода.

Что же делать? Просто читайте об этой проблеме и главном средстве ее решения: параметризованные операторы: http://en.wikipedia.org/wiki/SQL_injection.

С ADO.NET, используйте это: http://msdn.microsoft.com/en-us/library/ff648339.aspx.

Пожалуйста, смотрите мои прошлые ответы для получения более подробной информации:
ЭРОР в обновление в COM.Метод executenonquery();,
привет имя не отображается в имени?.

См. также (ссылки предоставлены нашим членом Ричардом Димингом):
Трой Хант: все, что вы хотели знать о SQL-инъекции (но боялись спросить),
Как я могу объяснить SQL-инъекцию без технического жаргона? - Обмен Стеками Информационной Безопасности,
Шпаргалка по параметризации запросов-OWASP[^],
Механика атаки SQL-инъекций | Pluralsight — YouTube.

—СА


Karthik_Mahalingam

Счетчик 5 для получения дополнительной информации

Sergey Alexandrovich Kryukov

Спасибо, Картик.
—СА

Рейтинг:
1

Bernhard Hiller

Ну, как всегда с SQL-запросами, которые получают некоторые значения из графического интерфейса: используйте параметризованный запрос вместо простой конкатенации строк. Это будет обрабатывать все эти экранирование, форматы DateTime/number, предотвращение SQL-инъекций и т. д. для тебя.