程序或功能' sp_getchech'期望参数' @ ID',未提供

时间:2017-08-09 15:29:11

标签: c# asp.net stored-procedures

我有一个非常简单的存储过程,它根据用户提供的ID选择记录。

ALTER PROCEDURE [dbo].[sp_getcheck]
@ID int
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.

SET NOCOUNT ON;
If NOT EXISTS(select * from mytable where ID=@ID)
  BEGIN
    RAISERROR (
    'The ID you entered %d is invalid',
    11,
    1,
    @ID);
  END
END

我们想要做的是让用户输入一个ID并检查它是否存在于我们的数据库中。

如果是,用户将被重定向到他/她选择的页面。

如果不是,我们希望用户在同一屏幕上显示输入的ID号码Q1254无效的消息。

在存储过程中引发了该错误,我们希望C#代码在屏幕上为用户显示该消息。

以下是代码:

protected void chk_Click(object sender, EventArgs e)
{
    if (!string.IsNullOrEmpty(accountnumber.Text))
    {
        SqlConnection Conn = default(SqlConnection);

        //Read in connection String
        Conn = new SqlConnection(ConfigurationManager.ConnectionStrings["Constr"].ConnectionString);
        Conn.Open();

        SqlCommand cmd = new SqlCommand("sp_getcheck", Conn);
        //Retrieve the value of the output parameter

        //Add the output parameter to the command object
        cmd.Parameters.AddWithValue("@ID", checknumber.Text);
        SqlParameter outPutParameter = new SqlParameter();
        SqlDataReader dr = cmd.ExecuteReader();

        //Retrieve the value of the output parameter

        if (dr.Read())
        {
            try
            {
                //we add a hidden field called IsValid to the markup and set the IsValid value in the event handler here.
                imgstatus.ImageUrl = "images/Icon_Available.gif";
                lblStatus.ForeColor = Color.Green;

                //redirect based on value of hidden form field called evalue
                var evalue = hequipID.Value;
                if (evalue == "1")
                {
                    Response.Redirect("Air.aspx?pageId=1");
                }
                if (evalue == "2")
                {
                    Response.Redirect("Land.aspx?pageId=2");
                }

                //ID exists, get form fields and store db values in them:
                //txtfname.Text = (dr["FullName"].ToString());

            }
            catch (SqlException ex)
            {
                //Something is wrong with this taxpayer's account.
                imgstatus.ImageUrl = "images/NotAvailable.jpg";
                lblStatus.ForeColor = Color.Red;
                lblStatus.Text = ex.Message;
                chk.BackColor = Color.Silver;
                System.Threading.Thread.Sleep(2000);
            }
        }
    }
  }

当我尝试运行代码时,收到以下错误消息:

Procedure or function 'sp_getchech' expects parameter '@ID', which was not supplied

当然我做错了。

有任何想法如何解决这个问题?

引用的线程与我的不同。该线程缺少一些参数。

我没有遗漏任何参数,因此,不是引用线程的副本。

2 个答案:

答案 0 :(得分:1)

看起来您可能会向存储过程发送空白,空或空ID。

您的代码会检查accountnumber.Text是否为空或空,但您使用checknumber.Text的值。

当然,如果您附加调试器并查看要发送到存储过程的值,则可以很容易地发现这一切。

答案 1 :(得分:1)

您永远不会告诉您的SqlCommand这是关于调用存储过程 - 请执行以下操作:

SqlCommand cmd = new SqlCommand("sp_getcheck", Conn);
cmd.CommandType = CommandType.StoredProcedure;