-2

次のコードでドキュメントを承認しようとしています

if (e.CommandName == "_Approve")
        {
            //using (SqlConnection con = DataAccess.GetConnected())
            using (SqlConnection con = new 
          SqlConnection(ConfigurationManager.ConnectionStrings["mydms"]
           .ConnectionString))
            {
                try
                {
                    con.Open();
                    int rowindex = Convert.ToInt32(e.CommandArgument);
                    GridViewRow row = (GridViewRow)
                   ((Control)e.CommandSource).NamingContainer;
                    Button Prove_Button = (Button)row.FindControl("BtnApprove");
                    SqlCommand cmd = new SqlCommand("approve", con);
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.Add(new SqlParameter("@UserID", UserID));
                    cmd.Parameters.Add(new SqlParameter("@DocID", DocID));
                    cmd.Parameters.Add(new SqlParameter("@ApproveID", ApproveID));
                    int result = cmd.ExecuteNonQuery();
                    if (result != 0)
                    {
                        GrdFileApprove.DataBind();
                    }
                }

                catch
                {
                    apfi.Text = "Not Approve";



                }
                finally
                {
                    con.Close();
                }
            }
        }


        else if (e.CommandName == "_Reject")
        {
            using (SqlConnection con = new 
          SqlConnection(ConfigurationManager.ConnectionStrings
        ["mydms"].ConnectionString))
            {
                try
                {
                    con.Open();
                    int rowindex = Convert.ToInt32(e.CommandArgument);
                    GridViewRow row = (GridViewRow)
                    ((Control)e.CommandSource).NamingContainer;
                    LinkButton Prove_Button = (LinkButton)row.FindControl("Button1");
                    SqlCommand cmd = new SqlCommand("sprejectapprove", con);

                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.Add(new SqlParameter("@UserID",UserID));
                    cmd.Parameters.Add(new SqlParameter("@DocID", DocID));
                    cmd.Parameters.Add(new SqlParameter("@ApproveID", ApproveID));
                    int result = cmd.ExecuteNonQuery();
                    if (result != 0)
                    {
                        GrdFileApprove.DataBind();
                    }
                }

                catch 
                {
                    apfi.Text = "Rejct";
                }
                finally
                {
                    con.Close();
                }
            }
        }

と承認ストア手順は

 @UserID int,
  @DocID int,
 @ApproveID int
as
insert into Approval(UserID,DocID,ApproveID)
VALUES(@UserID,@DocID,@ApproveID)

SQLには承認タイプテーブルがあり、そこには承認IDと承認タイプの列があり、承認タイプには3つのタイプがあります.1は承認、2は拒否、3は保留中です

そして承認テーブルにはuserid、docid、approveidがあります

そのため、コードをデバッグすると、承認部分のキャッチでエラーが発生します

プロシージャまたは関数 'approve' には、指定されていないパラメーター '@ApproveID' が必要です。助けてくださいありがとう

4

1 に答える 1

4

ApproveIDの値があると思いますnull。ADO.NET の異常により、nullパラメーターは送信されません。必要なもの:

cmd.Parameters.Add(new SqlParameter("@ApproveID", (object)ApproveID ?? DBNull.Value));

またはより簡単:

cmd.Parameters.Add("ApproveID", (object)ApproveID ?? DBNull.Value);

または、さらに簡単に、「dapper」を使用すると、正しく行うのがはるかに簡単になります。

con.Execute("approve", new {
    UserID, DocID, ApproveID
}, commandType: CommandType.StoredProcedure);
于 2013-10-01T13:20:30.977 に答える