在C#中向存储过程传递参数

15

我有一个存储过程,它返回一个变量@result设置为1或0(数据类型为bit)。我正在使用以下代码在我的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

2
你的存储过程中,它是一个实际的输出参数还是返回值?请同时发布你的存储过程的简略定义。 - J. Steen
1
请发布您的 Sp Signature。 - Romil Kumar Jain
1
@Rowland Shaw... 这个问题是在链接中的帖子回答之后提出的... 那些回答是我问的! - who-aditya-nawandar
@Aditya Nawandar,只需复制、粘贴并测试答案。 - Arshad
你做了什么...什么都没有发生! - who-aditya-nawandar
显示剩余3条评论
2个回答

26
你可以尝试这段代码:
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); 
}

我刚刚调用了您的存储过程并传递了参数,请检查您的数据库和存储过程。 - Arshad
顺便问一下,“means”是什么意思?另外,我还没有收到任何消息。希望你已经查看了我的SP代码,它会返回1或0。 - who-aditya-nawandar
你测试过 SQL 中的存储过程了吗?就像我说的,我只是从代码中调用它。 - Arshad
是的,我已经测试过了,CountryCode 是 varchar 50 而不是 int 类型... 为什么你的代码没有起作用呢? - who-aditya-nawandar
我的存储过程代码已经在帖子中写好了,我该如何检查它呢? - who-aditya-nawandar
让我们在聊天中继续这个讨论 - Arshad

4

为什么要设置:

Cmd.CommandText = "Registration";

这将替换你存储过程的名称,所以它不会调用你指定的存储过程:

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

使用SQL分析器调试可以很有用,以确保经过网络传输的SQL语句是符合预期的。


我移除了Cmd.CommandText = "Registration";,现在它抛出了"将nvarchar转换为int时出错"的错误。 - who-aditya-nawandar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接