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

次のように、パラメータを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 に答える