我想按下按钮后更新数据库中的记录。要更新的记录存在于datagridview中。 datagridview中有3行。第一条记录成功获取更新,但第二次重复循环时,它显示
的异常“参数'@p_t'已经定义。”
这是我正在使用的片段:
private void button1_Click(object sender, EventArgs e)
{
con.Open();
cmd.Connection = con;
try
{
for (int i = 0; i < dataGridView1.Rows.Count - 1; i++)
{
cmd.CommandText = "update sale_order set paid_today=@p_t, balance_due=(" + dataGridView1.Rows[i].Cells[3].Value + "-" + dataGridView1.Rows[i].Cells[4].Value + ") where order_no=" + dataGridView1.Rows[i].Cells[0].Value + "";
cmd.Parameters.AddWithValue("@p_t", dataGridView1.Rows[i].Cells[4].FormattedValue);
cmd.ExecuteNonQuery();
}
con.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
答案 0 :(得分:2)
在for循环结束时使用cmd.Parameters.Clear();
。
从SqlParameterCollection中删除所有SqlParameter对象。
因为在您的第二次迭代中,您的cmd
已经有@p_t
参数。您需要在每次迭代中清除参数。
for (int i = 0; i < dataGridView1.Rows.Count - 1; i++)
{
cmd.CommandText = "update sale_order set paid_today=@p_t, balance_due=(" + dataGridView1.Rows[i].Cells[3].Value + "-" + dataGridView1.Rows[i].Cells[4].Value + ") where order_no=" + dataGridView1.Rows[i].Cells[0].Value + "";
cmd.Parameters.AddWithValue("@p_t", dataGridView1.Rows[i].Cells[4].FormattedValue);
cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
}
我不知道是否有特殊原因,但通常如果要迭代所有行,则需要使用i < dataGridView1.Rows.Count
代替i < dataGridView1.Rows.Count - 1
还为balance_due
和order_no
列值参数化,就像您对paid_today
列所做的那样。