带有datagridview的for循环中的异常

时间:2014-03-07 09:40:13

标签: c# exception datagridview

我想按下按钮后更新数据库中的记录。要更新的记录存在于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());
    }
}

1 个答案:

答案 0 :(得分:2)

在for循环结束时使用cmd.Parameters.Clear();

来自documentation;

  

从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_dueorder_no列值参数化,就像您对paid_today列所做的那样。