【问题标题】:In ADO.Net, iterating over a loop inside a sql connection is causing error“参数”变量名称已被声明。变量名必须唯一例外
【发布时间】:2023-03-03 10:36:01
【问题描述】:

我正在编写一个程序来维护我们商店的药品库存。

我有一个添加到购物车列表,它打开 SQL 连接并从参数为 @medicine 的整个库存中删除 1 个数量

我的 addToCart listBox 的代码是这样的

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 语句?

【问题讨论】:

  • 我建议您使用表值参数批量执行此操作

标签: sql .net .net-core ado.net


【解决方案1】:

不要一遍又一遍地添加参数,而是添加一次,然后设置它的值。 "AddWithValue is Evil" 反正。

...
SqlParameter sqlParameter = cmd.Parameters.Add("@medicine", SqlDbType.<data type>, <length>)
foreach (string item in cartMedicine)
{
    sqlParameter.Value = item;
    cmd.ExecuteNonQuery();
}
...

&lt;data type&gt;&lt;length&gt; 替换为数据库中medicine.quantity 数据类型的正确值。

【讨论】:

    猜你喜欢
    • 2020-02-01
    • 2015-05-26
    • 2019-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    相关资源
    最近更新 更多