Имя переменной «parameter» уже объявлено. Имя переменной должно быть уникальным исключением

#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 в базе данных.