【问题标题】:The variable name '@product_Id' has already been declared. Variable names must be unique within a query batch or stored procedure变量名称“@product_Id”已被声明。变量名称在查询批处理或存储过程中必须是唯一的
【发布时间】:2015-05-26 12:06:37
【问题描述】:

我将 datagridview 中的数据插入到数据库表中。但是我在标题中写的异常中出现的错误。值也保存在数据库表中。

private void btnSavePurchases_Click(object sender, EventArgs e)
{
    if ((string.IsNullOrEmpty(txtPGrandTotal.Text)) || (txtPGrandTotal.Text == "0")) 
    {
        MessageBox.Show("No record available");
    }
    else
    { 
        try
        {           
            string query1 = "INSERT INTO purchases (productId) values (@product_Id)";
            command = DBConnectivity.getCommandForQuery(query1, connection);
            for (int i = 0; i < dGvPurchases.Rows.Count; i++)
            {
                //   command.Parameters.Clear();
                command.Parameters.AddWithValue("product_Id", dGvPurchases.Rows[i].Cells[9].Value);
                command.ExecuteNonQuery();
            }            
        }
        catch (Exception ex)
        {
        }
    }
}

【问题讨论】:

  • 继续添加product_id 参数,用于您的for 循环的每次迭代。不要这样做! 定义参数一次,在循环外,在循环内只设置值.....

标签: c# sql-server winforms datagridview


【解决方案1】:

我在此处范围内的任何地方都看不到command。可能它是一个类变量。这是您问题的一部分。

command 变量的构造移动到您的方法内部:

var command = DBConnectivity.getCommandForQuery(...);
^^^

其次,您的 for 外观会导致问题。您不能一遍又一遍地添加相同的参数。如果要insert 多行,请添加多个insert 语句。在for 循环内创建command

【讨论】:

    【解决方案2】:

    大概

    AddWithValue("product_Id"...
    

    应该是

    AddWithValue("@product_Id"...
    

    顺便说一句,由于您在 for 循环中添加参数,因此您需要在 for 循环的顶部清除它们。这就是为什么您需要取消注释您的 command.Parameters.Clear() 部分。如果没有Clear 方法,您尝试一遍又一遍地将相同的参数名称添加到同一命令中,您将在第二次迭代中得到错误。

    作为另一种解决方案,您可以在循环之外声明参数名称并将其值添加到循环内。

    并且尽可能不要使用AddWithValueIt may generate unexpected results sometimes。使用.Add() 重载来指定您的数据库类型及其大小。

    不要忘记使用using statement 来处理您的命令对象。

    【讨论】:

    • AddWithValue("product_Id" 和 AddWithValue("@product_Id" 都可以工作。问题出在 for 循环上,正如您也指出的那样。
    • @ShellShock 确实,但作为最佳实践,最好精确匹配,最好使用@ 将它们指定作为参数IMO..
    【解决方案3】:

    问题是command.Parameters.AddWithValue 将参数添加到参数列表中。您不能两次添加参数。由于您多次调用该命令,因此在循环外定义参数并在循环内设置值:

    string query1 = "INSERT INTO purchases (productId) values (@product_Id)";
    command = DBConnectivity.getCommandForQuery(query1, connection);
    
    // Define the Parameter just once
    var param = command.Parameters.Add("@product_Id", SqlDbType.Int);
    
    for (int i = 0; i < dGvPurchases.Rows.Count; i++)
    {  // set value while looping
       param.Value = dGvPurchases.Rows[i].Cells[9].Value;
       command.ExecuteNonQuery();
    }     
    

    【讨论】:

    • 参数化查询 '(@product_Id int)INSERT INTO 购买 (productId) 值(@prod' 需要参数 '@product_Id',但未提供。
    猜你喜欢
    • 2020-02-01
    • 2019-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2020-08-23
    相关资源
    最近更新 更多