#sql #.net #.net-core #ado.net
#sql #.net #.net-core #ado.net
Вопрос:
Я пишу программу для ведения учета лекарств в нашем магазине.
У меня есть список добавления в корзину, который открывает SQL-соединение и удаляет 1 количество из всего запаса, где параметр @medicine
Код моего списка AddToCart выглядит следующим образом
using (SqlConnection conn = new SqlConnection(cstring))
{
using(SqlCommand cmd = new SqlCommand("Update Medicine set Quantity = Quantity - 1 where Name = @medicine", conn))
{
conn.Open();
foreach(string item in cartMedicine)
{
cmd.Parameters.AddWithValue("@medicine", item);
cmd.ExecuteNonQuery();
}
conn.Close();
listMedicine.Items.Clear();
}
}
Теперь я хочу зациклить свой cartMedicine
список, чтобы получить все имена, сохраненные в списке, одно за другим. Но я получаю сообщение об ошибке, которое,
Имя переменной ‘@medicine’ уже объявлено. Имена переменных должны быть уникальными в пакете запросов или хранимой процедуре. ‘
Как я могу использовать одну и ту же логику предоставления инструкции Adhoc каждый раз для каждого инвентаря в списке моего товара?
Комментарии:
1. Я предлагаю вам использовать табличный параметр, чтобы сделать это массово
Ответ №1:
Не добавляйте параметр снова и снова, а добавьте его один раз, а затем просто установите его значение. «AddWithValue — это зло» в любом случае.
...
SqlParameter sqlParameter = cmd.Parameters.Add("@medicine", SqlDbType.<data type>, <length>)
foreach (string item in cartMedicine)
{
sqlParameter.Value = item;
cmd.ExecuteNonQuery();
}
...
Замените <data type>
и <length>
соответствующими значениями для типа данных medicine.quantity
в базе данных.