无法从存储过程中获取返回值

时间:2016-10-03 12:23:49

标签: c# sql-server stored-procedures

我知道这个问题被问过很多次,我已经完成了大部分问题,但没有解决我的问题

我有一个名为LoginValidation的存储过程,它接受2个参数,用户名和密码,并返回相应用户的user_id

以下是程序代码:

    @username nvarchar(50),
    @password nvarchar(50),
    @userID int output
AS
    SELECT @userID = user_id
    FROM Users_Master 
    WHERE user_name = @username and password = @password;

    RETURN

但是,当我在C#中尝试使用此过程时,会发生以下错误:

  

过程或函数'LoginValidation'需要参数'@userID',这是未提供的

这是我的C#代码:

protected void btnLogin_Click(object sender, EventArgs e)
{
    cmd.Connection = con;

    con.Open();

    cmd.CommandType = CommandType.StoredProcedure;
    cmd.CommandText = "LoginValidation";

    cmd.Parameters.Add("@username", SqlDbType.VarChar).Value = txtmobile.Text;
    cmd.Parameters.Add("@password", SqlDbType.VarChar).Value = txtpwd.Text;

    SqlParameter returnParm = cmd.Parameters.AddWithValue("@userID", SqlDbType.VarChar);
    returnParm.Direction = ParameterDirection.ReturnValue;

    string id = returnParm.Value.ToString();

    try
    {
        dr = cmd.ExecuteReader();
    }
    catch (SqlException EX)
    {
        string ff = EX.Message;
    }

    if (dr.HasRows)
    {
        while (dr.Read())
        {
            Session["name"] = dr["user_name"].ToString();

            lblmsg.Text = "Login successful: " + id;
        }
    }
    else
    {
        lblmsg.Text = "Invalid username/password";
    }

    dr.Close();
    con.Close();
}

有什么建议吗?

4 个答案:

答案 0 :(得分:2)

尝试使用returnParm.Direction = ParameterDirection.Output;

答案 1 :(得分:2)

请注意,在传递数据类型时,您使用的方法AddWithValue不正确。您需要将其更改为:

SqlParameter returnParm = cmd.Parameters.Add("@userID", SqlDbType.VarChar);
returnParm.Direction = ParameterDirection.Output;

您还需要将方向设置为Output

然后你需要在执行查询后读取值:

dr = cmd.ExecuteReader();
string id = returnParm.Value.ToString();

Docs

  

输入:参数是输入参数。

     

InputOutput :该参数既可以输入也可以输出。

     

输出:参数是输出参数。

     

ReturnValue :该参数表示返回值   来自诸如存储过程,内置函数或的操作   用户定义的函数。

答案 2 :(得分:1)

首先,您决定要获取输出参数或返回值参数。

  1. 获取返回值参数。您不必将任何额外参数传递给存储过程。只需添加以下行

    SqlParameter returnParameter = cmd.Parameters.Add("RetVal", SqlDbType.Int);
    returnParameter.Direction = ParameterDirection.ReturnValue;
    cmd.ExecuteNonQuery();
    
     int id = (int) returnParameter.Value;
    
  2. 获取输出参数。你做的所有步骤都很好。只需替换

    returnParm.Direction = ParameterDirection.ReturnValue;
    
  3.   returnParm.Direction = ParameterDirection.Output;
    

答案 3 :(得分:1)

你犯了错误。呼叫

string id = returnParm.Value.ToString();

之后

dr = cmd.ExecuteReader();