#c# #sql-server
#c# #sql-сервер
Вопрос:
private void btn_add_store_Click(object sender, EventArgs e)
{
cmd = new SqlCommand("Insert into Product values(" sa_code ",'" pro_name "'," quantity ",'" price "','" notes "')", con);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
}
Комментарии:
1. Удалите символ ‘ в строковых частях » «.
2. @Malekel Добро пожаловать в StackOverflow. Пожалуйста, не предоставляйте код в виде изображения. Пожалуйста, включите код и связанную с ним ошибку в информацию о трассировке стека.
3. Вы должны скопировать и вставить код в вопрос вместо публикации изображения. Также это может быть проблема с одним из значений, которые вы объединяете в запрос, поэтому вам действительно следует использовать параметры вместо этого.
4. У вас неправильный синтаксис sql.
Insert into Products(code, proName...) values
5. Вы также должны включить список имен столбцов в таблицу, чтобы убедиться, что вы вставляете значения в правильном порядке.
Ответ №1:
Не видя, каким было окончательное составленное значение CommandText
, трудно комментировать конкретно, поскольку это будет зависеть от передаваемых значений, но в конечном счете проблема здесь в том, что это зависит от передаваемых значений. Вы никогда не должны объединять значения для создания SQL, в основном — это делает вас уязвимыми для злонамеренной SQL-инъекции или случайных ошибок из-за таких вещей, как кавычки в полях. Существует также вторичная проблема неоднозначного порядка столбцов. Я не могу достаточно убедительно утверждать, что здесь следует использовать параметры (а также называть столбцы); например:
insert into Product (Code, ProductName, Quantity, Price, Notes)
values (@sa_code, @pro_name, @quantity, @price, @notes);
Но тогда нам нужно передать эти параметры в; такой инструмент, как Dapper, сделает это безболезненным:
using Dapper; // at the top of the file
...
con.Execute(@"
insert into Product (Code, ProductName, Quantity, Price, Notes)
values (@sa_code, @pro_name, @quantity, @price, @notes);",
new { sa_code, pro_name, quantity, price, notes });
Здесь Dapper будет иметь дело с добавлением всех параметров для вас; он также будет обрабатывать открытие и закрытие соединения от вашего имени.
Комментарии:
1. Отсутствие одинарных кавычек
sa_code
может быть правильным, если это целое число.2. @juharr на самом деле, еще раз взглянув на изображение, я, возможно, ошибся в цитате, но: я утверждаю, что это все еще правильное исправление 🙂
3. @juharr перефразировал для ясности
4. О, определенно, они должны включать столбцы и использовать параметры, я просто говорю, что трудно определить точную проблему, поскольку кавычки сбалансированы, и мы не знаем типы или значения, которые объединяются (которые могут включать одинарные кавычки, которые не экранируются)
5. Я попробовал решение, но появляются ошибки, я изменил код, и он успешно сработал, вот код: cmd = new SqlCommand («Вставить в значения продукта (Код, название, количество, цена, примечания) (‘» sa_code. Текст «‘,'» pro_name. Текст «‘,'» количество. Текст «‘,'» цена. Текст «‘,'» примечания. Text «‘)», con); con. Открыть(); cmd. ExecuteNonQuery(); con. Закрыть();
Ответ №2:
cmd = new SqlCommand("Insert into Product(Code, Name, Quantity, Price, Notes)values('" sa_code.Text "','" pro_name.Text "','" quantity.Text "','" price.Text "','" notes.Text "')", con);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
//это правильный ответ