变量名' @ product_Id'已经宣布。变量名在查询批处理或存储过程中必须是唯一的

时间:2015-03-23 13:18:45

标签: c# sql-server winforms datagridview

我将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)
        {
        }
    }
}

3 个答案:

答案 0 :(得分:3)

可能

AddWithValue("product_Id"...

应该是

AddWithValue("@product_Id"...

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

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

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

不要忘记使用using statement来处置命令对象。

答案 1 :(得分:1)

我在这里的范围内看不到command。可能它是一个类变量。这是你问题的一部分。

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

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

其次,你看起来会导致问题。您不能反复添加相同的参数。如果您想insert多行,请添加多个insert语句。在command循环中创建for

答案 2 :(得分:1)

问题是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();
}