1

我在 C# 中遇到了一个存储过程的问题,我收到了这个错误:

过程或函数 myQSProcedure_Delete 指定的参数过多。

我无法解决这个问题。请帮助我。

代码如下。

ALTER PROCEDURE [dbo].[myQSProcedure_Delete] 
@Id int
AS
BEGIN
Delete From tblfb where Id = @Id
End

我的 C# 代码是:

DataTable dt = (DataTable)ViewState["dt"];
DataTable dtDelete = (DataTable)ViewState["dtDelete"];
dtDelete.Rows.Add(dt.Rows[e.RowIndex]["Id"].ToString(),
dt.Rows[e.RowIndex]["name"].ToString(), dt.Rows[e.RowIndex]["session"].ToString(),
dt.Rows[e.RowIndex]["gender"].ToString(), dt.Rows[e.RowIndex]["email"].ToString(),
dt.Rows[e.RowIndex]["address"].ToString(), dt.Rows[e.RowIndex]["priority"].ToString(),       
dt.Rows[e.RowIndex]["comments"].ToString());
ViewState["dtDelete"] = dtDelete;
dt.Rows[e.RowIndex].Delete();
dt.AcceptChanges();
if (dt.Rows.Count < 1)
dt.Rows.Add(null, "", "", "", "", "", "", "");
GridView1.DataSource = dt;
GridView1.DataBind();
ViewState["dt"] = dt;
if (dt.Rows[0][0].ToString().Equals(""))
    {
        GridView1.Rows[0].Visible = false;
    }
SqlConnection conn = new SqlConnection("data source=Burhan\\SQLEXPRESS;database=mydb;integrated security=true");
    conn.Open();
    SqlCommand cmd = new SqlCommand("myQSProcedure_Delete", conn);
    cmd.CommandType = CommandType.StoredProcedure;
  foreach (DataRow row in dtDelete.Rows)
    {
        cmd.Parameters.Add(new SqlParameter("@Id",row[0]));
        cmd.ExecuteNonQuery();
    }
   conn.Close();
   GridView1.DataSource = dt;
    GridView1.DataBind();
    ViewState["dt"] = dt;
4

4 回答 4

4

当您遍历行时,该命令似乎保留了它的参数。您应该在每次迭代期间创建一个新命令:

foreach (DataRow row in dtDelete.Rows)
{
  using (var cmd = new SqlCommand("myQSProcedure_Delete", conn)
  {
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.Add(new SqlParameter("@Id",row[0]));
    cmd.ExecuteNonQuery();
  }
}
于 2012-12-04T06:33:27.310 回答
3

您的问题在于每次循环时都添加一个新参数。请尝试以下代码。

using (SqlCommand cmd = new SqlCommand("myQSProcedure_Delete", conn))
{
    cmd.CommandType = CommandType.StoredProcedure;
    foreach (DataRow row in dtDelete.Rows)
    {
        cmd.Parameters.Clear();
        cmd.Parameters.Add(new SqlParameter("@Id",row[0]));
        cmd.ExecuteNonQuery();
    }
}
于 2012-12-04T06:33:27.170 回答
1

您也可以添加一次参数并为其赋值 n 次,如下所示:

  using (var cmd = new SqlCommand("myQSProcedure_Delete", conn))
  {
      cmd.CommandType = CommandType.StoredProcedure;
      cmd.Parameters.Add("@Id",SqlDbType.Int);
      foreach (DataRow row in dtDelete.Rows)
      {
          cmd.Parameters["@Id"].Value = row[0];
          cmd.ExecuteNonQuery();
      }
  }
于 2012-12-04T07:11:35.553 回答
0

您的存储过程只需要一个 int 作为参数,您可能会发送一大堆。

您需要为要删除的每一行单独调用该过程并清除参数。

于 2012-12-04T06:33:17.923 回答