我将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)
{
}
}
}
答案 0 :(得分:3)
可能
AddWithValue("product_Id"...
应该是
AddWithValue("@product_Id"...
顺便说一句,由于您在for循环中添加参数,因此需要在for循环的顶部清除它们。这就是您需要取消注释command.Parameters.Clear()
部分的原因。如果没有Clear
方法,则会尝试一遍又一遍地向同一个命令添加相同的参数名称,并且在第二次迭代中会出现错误。
作为另一种解决方案,您可以在循环之外声明参数名称,并在循环内添加它的值。
尽量不要使用AddWithValue
。 It 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();
}