C# datagridview的for循环中出现异常

C# datagridview的for循环中出现异常,c#,exception,datagridview,C#,Exception,Datagridview,我想在按下按钮后更新数据库中的记录。要更新的记录显示在datagridview中。datagridview中有3行。第一条记录成功地得到更新,但当循环第二次重复时,它会显示一个异常 “已定义参数'@p_t'。” 以下是我正在使用的代码片段: private void button1_Click(object sender, EventArgs e) { con.Open(); cmd.Connection = con; try { for (int

我想在按下按钮后更新数据库中的记录。要更新的记录显示在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());
    }
}
private void按钮1\u单击(对象发送者,事件参数e)
{
con.Open();
cmd.Connection=con;
尝试
{
对于(int i=0;i
使用
cmd.Parameters.Clear()位于for循环的末尾

来自

从SqlParameterCollection中删除所有SqlParameter对象

因为在第二次迭代中,
cmd
已经有了
@p\u 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();
}
for(int i=0;i
我不知道是否有特殊原因,但通常如果要迭代所有行,需要使用
I
而不是
I


还参数化了您的
balance\u due
order\u no
列值,就像您对
paid\u today
列所做的那样。

有一次,我使用了相同的插入方法,但没有使用cmd.parameter.clear(),但在本例中没有。你能告诉我为什么…?@HaiderKhattak,因为我不知道你的
INSERT
代码,但你可能会在每次迭代中创建一个新的
SqlCommand
实例。喜欢<代码>对于(…){SqlComamnd cmd=new SqlCommand();}