【问题标题】:Gettitng error as Procedure or function expects parameter which was not suppliedGettitng 错误,因为过程或函数需要未提供的参数
【发布时间】:2015-05-24 10:51:16
【问题描述】:

我创建了一个存储过程来将我的数据插入到表中, 但我收到错误

过程或函数“AddUserDetails”需要参数“@UserId”,但未提供。

这是我的 SP

CREATE PROCEDURE AddUserDetails 
@UserId nvarchar(55),
@UserPassword nvarchar(100),
@ConfirmPass nvarchar(100),
@Mobile int,
@Email nvarchar(100),
@BirthDate nvarchar(100)
AS  
BEGIN
    SET NOCOUNT ON;


     Insert into RegisterUser(UserId,UserPassword,ConfirmPass, Mobile, Email,BirthDate)Values (@UserId, @UserPassword, @ConfirmPass, @Mobile, @Email,@BirthDate)
END
GO

这也是我的 C# 代码。

protected void btnSubmit_Click(object sender, EventArgs e)
    {
        try
        {
            SqlCommand cmd = new SqlCommand();
            cmd.Parameters.Add("@UserId", SqlDbType.NVarChar).Value = txtUserId.Text;
            cmd.Parameters.Add("@UserPassword", SqlDbType.NVarChar).Value = txtPassword.Text;
            cmd.Parameters.Add("@ConfirmPassword", SqlDbType.NVarChar).Value = txtConfirmPassword.Text;
            cmd.Parameters.Add("@Mobile", SqlDbType.Int).Value = txtMobile.Text;
            cmd.Parameters.Add("@Email", SqlDbType.NVarChar).Value = txtEmail.Text;
            cmd.Parameters.Add("@BirthDate", SqlDbType.NVarChar).Value = txtBirth.Text;
            cmd = new SqlCommand("AddUserDetails", con);
            cmd.CommandType = CommandType.StoredProcedure;
            con.Open();
            cmd.ExecuteNonQuery();
            Response.Redirect("http://www.google.com");
            con.Close();
        }
        catch (Exception ex)
        {

            throw ex;
        }
    }

请指出这里的错误是什么

【问题讨论】:

    标签: c# asp.net sql-server stored-procedures


    【解决方案1】:

    因为你正在重新创建你的命令

    cmd = new SqlCommand("AddUserDetails", con);
    

    line 而你从不向该 cmd 添加任何参数。您尝试使用已创建的 SqlCommand cmd = new SqlCommand(); 行添加旧的。

    删除此SqlCommand cmd = new SqlCommand(); 行并移动您的;

    SqlCommand cmd = new SqlCommand("AddUserDetails", con);
    cmd.CommandType = CommandType.StoredProcedure;
    

    代码的顶部。就是这样。而且你从来没有在你的捕捉部分做过任何事情。刚刚用throw ex;this resets the stack trace 抛出了新异常。并考虑使用using statement 自动处理您的连接和命令,而不是手动调用Close()Dispose() 方法。

        try
        {
            SqlCommand cmd = new SqlCommand("AddUserDetails", con);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add("@UserId", SqlDbType.NVarChar).Value = txtUserId.Text;
            cmd.Parameters.Add("@UserPassword", SqlDbType.NVarChar).Value = txtPassword.Text;
            cmd.Parameters.Add("@ConfirmPassword", SqlDbType.NVarChar).Value = txtConfirmPassword.Text;
            cmd.Parameters.Add("@Mobile", SqlDbType.Int).Value = Convert.ToInt32(txtMobile.Text);
            cmd.Parameters.Add("@Email", SqlDbType.NVarChar).Value = txtEmail.Text;
            cmd.Parameters.Add("@BirthDate", SqlDbType.NVarChar).Value = txtBirth.Text;
            con.Open();
            cmd.ExecuteNonQuery();
            Response.Redirect("http://www.google.com");
            con.Close();
        }
        catch (Exception ex)
        {
            // 
        }
    

    【讨论】:

    • @nadeem 声明为SqlCommand cmd = new SqlCommand("AddUserDetails", con)
    • 现在出现错误为Failed to convert parameter value from a String to a Int32.
    • @nadeem 由于您的Mobile 列是int,您可以直接将它传递给txtMobile.Text。尝试先将其解析为int,例如Convert.ToInt32(txtMobile.Text) 或其他内容。
    • 已更改但出现错误为Value was either too large or too small for an Int32.
    • @nadeem 然后您需要更改适合您的值的列类型。阅读:sqlblog.com/blogs/aaron_bertrand/archive/2009/10/12/…
    猜你喜欢
    • 2016-04-01
    • 2011-02-05
    • 2013-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多