将参数传递给C#中的存储过程

Posted

技术标签:

【中文标题】将参数传递给C#中的存储过程【英文标题】:Passing parameter to stored procedure in C# 【发布时间】:2013-03-22 12:04:19 【问题描述】:

我有一个存储过程,它返回一个设置为 1 或 0(数据类型位)的变量 @result。我正在使用以下代码在我的 C# 中访问它。它抛出一个错误,说参数太多。

protected void btnRegister_Click(object sender, EventArgs e)

    SqlConnection con = new SqlConnection(System.Configuration.ConfigurationManager.AppSettings["ConnectionString"]);
    con.Open();

    SqlCommand Cmd = new SqlCommand("usp_CheckEmailMobile", con);
    Cmd.CommandType = CommandType.StoredProcedure;
    Cmd.CommandText = "Registration";
    Cmd.Parameters.AddWithValue("@Name", txtName.Text);
    Cmd.Parameters.AddWithValue("@Email", txtEmailAddress.Text);
    Cmd.Parameters.AddWithValue("@Password", txtPassword.Text);
    Cmd.Parameters.AddWithValue("@CountryCode", ddlCountryCode.Text);
    Cmd.Parameters.AddWithValue("@Mobile", txtMobileNumber.Text);
    //Cmd.Parameters.Add("@Result", DbType.Boolean);
    SqlParameter sqlParam = new SqlParameter("@Result", DbType.Boolean);
    //sqlParam.ParameterName = "@Result";
    //sqlParam.DbType = DbType.Boolean;
    sqlParam.Direction = ParameterDirection.Output;
    Cmd.Parameters.Add(sqlParam);
    Cmd.ExecuteNonQuery();
    con.Close();
    Response.Write(Cmd.Parameters["@Result"].Value); 

存储过程:(我认为这很好...)请更正我的 CS 代码...

ALTER PROCEDURE [dbo].[usp_CheckEmailMobile](
    @Name VARCHAR(50), 
    @Email NVARCHAR(50), 
    @Password NVARCHAR(50), 
    @CountryCode INT, 
    @Mobile VARCHAR(50), 
    @Result BIT OUTPUT)
    AS 
BEGIN 

IF EXISTS (SELECT COUNT (*) FROM AUser WHERE  [Email] = @Email AND [Mobile] = @Mobile) 
Begin 
    Set @Result=0; --Email &/or Mobile does not exist in database
End
ELSE
Begin
    --Insert the record & register the user 
    INSERT INTO [AUser] ([Name], [Email], [Password], [CountryCode], [Mobile]) VALUES (@Name, @Email, @Password, @CountryCode, @Mobile)  
    Set @Result=1;
End
END

【问题讨论】:

它是实际输出参数还是存储过程中的返回值?请同时发布您的存储过程的缩写定义。 也发布您的 Sp 签名。 那么哪个是 CommandText ? usp_CheckEmailMobileRegistration,当前正在查看 Registration 这不是你的意思 Returning boolean value from a stored procedure using bit的可能重复 @Rowland Shaw...这个问题出现在链接中帖子的答案之后...这些都是我问的! 【参考方案1】:

你可以试试这个代码:

bool result=false;
SqlCommand scCommand = new SqlCommand("usp_CheckEmailMobile", sqlCon);
scCommand.CommandType = CommandType.StoredProcedure;
scCommand.Parameters.Add("@Name", SqlDbType.VarChar, 50).Value = txtName.Text;
scCommand.Parameters.Add("@Email", SqlDbType.NVarChar, 50).Value = txtEmailAddress.Text;
scCommand.Parameters.Add("@Password ", SqlDbType.NVarChar, 50).Value = txtPassword.Text;
scCommand.Parameters.Add("@CountryCode", SqlDbType.VarChar.50).Value =ddlCountryCode.SelectedText;
scCommand.Parameters.Add("@Mobile", SqlDbType.NVarChar, 50).Value = txtMobileNumber.Text;
scCommand.Parameters.Add("@Result ", SqlDbType.Bit).Direction = ParameterDirection.Output;
try

    if (scCommand.Connection.State == ConnectionState.Closed)
    
        scCommand.Connection.Open();
    
    scCommand.ExecuteNonQuery();
    result = Convert.ToBoolean(scCommand.Parameters["@Result"].Value);



catch (Exception)



finally
                
    scCommand.Connection.Close();
    Response.Write(result); 

【讨论】:

我刚刚调用了你的 sp 和参数,检查你的数据库和存储过程 是什么意思??顺便说一句,还是什么都没有……我希望您阅读我的 sp 的代码……它返回 1 或 0…… 你在 sql 中测试过你的 sp,我说过我只是从代码中调用它 是的,我已经测试过了,并且 CoountryCode 是 varchar 50 而不是 int...而且(为什么)您的代码不起作用... 我的sp的代码写在我的帖子上面..我如何检查它...?【参考方案2】:

为什么要设置:

Cmd.CommandText = "Registration";

这将替换您的存储过程名称,因此它不会调用您在中指定的存储过程:

SqlCommand Cmd = new SqlCommand("usp_CheckEmailMobile", con);

使用 SQL 分析器来调试“通过网络”运行的 SQL 是否符合预期会很有用。

【讨论】:

我删除了 Cmd.CommandText = "Registration";现在它抛出“将 nvarchar 转换为 int 时出错”

以上是关于将参数传递给C#中的存储过程的主要内容,如果未能解决你的问题,请参考以下文章

将参数传递给c#中的sql存储过程

将 xml 作为参数传递给 SQL Server 中的存储过程

是否可以将可变数量的参数传递给redshift中的存储过程?

当参数之一是列表时,如何将参数传递给 NHibernate 中的存储过程?

将参数传递给 AS400 中的存储过程以匹配 IN 键

使用 Mybatis 将布尔参数传递给存储过程