通过调用存储过程插入两个或多个 GridView 行时出错

Error when inserting two or more GridView rows by calling a stored procedure

我正在尝试通过调用存储过程将 GridView 数据插入 table。当 GridView 只有一行时,代码工作得很好,但是当它有多行时,我怎么会收到错误消息。错误够诡异了,

Procedure or function sp_InsertOrderDetail has too many arguments specified.

private void inserOrderDetails()
{
conn = DB_Connect.GetConnection();

    if (validatition())
    {
        SqlCommand cmd = conn.CreateCommand();
        cmd.Connection = conn;
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.CommandText = "[dbo].[sp_InsertOrderDetail]";

        foreach (GridViewRow row in grdRequest.Rows)
        {
            //cmd.Parameters.Add("@OrderID", SqlDbType.Int, 32, "OrderID").Value = row.Cells[0].Text;
            cmd.Parameters.Add("@OrderID", SqlDbType.Int, 32, "OrderID").Value = lblOrderID.Text;
            cmd.Parameters.Add("@ItemID", SqlDbType.Int, 32, "ItemID").Value = row.Cells[1].Text;

            try
            {
                if (conn.State.ToString() == "Closed")
                {
                    conn.Open();
                }
                cmd.ExecuteNonQuery();

                //WebMsgBox.Show("Sucessfully saved.");
            }
            catch (Exception ex)
            {
                WebMsgBox.Show("Saving failed." + ex);
            }

            conn.Close();
            //refresh();
        }
    }
    else
    {
        WebMsgBox.Show("Please, Fill all data fields before saving.");
    }
}

谢谢,干杯!

清除参数:

foreach (GridViewRow row in grdRequest.Rows)
        {
            cmd.Parameters.Clear();
            cmd.Parameters.Add("@OrderID", SqlDbType.Int, 32, "OrderID").Value = lblOrderID.Text;
            cmd.Parameters.Add("@ItemID", SqlDbType.Int, 32, "ItemID").Value = row.Cells[1].Text;

您不断向 foreach 中的同一个 cmd 对象添加参数。

我将在循环外声明参数如下

cmd.Parameters.Add("@OrderID", SqlDbType.Int);
cmd.Parameters.Add("@ItemID", SqlDbType.Int);

然后在foreach中,做

cmd.Parameters["@OrderID"].Value = lblOrderID.Text;
cmd.Parameters["@ItemID"].Value = row.Cells[1].Text;