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

本文关键字:获取 返回值 存储过程 | 更新日期: 2023-09-27 18:11:28

我知道这个问题已经被问过很多次了,我已经经历了大多数,但没有一个解决我的问题

我有一个名为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();
}

有什么建议吗?

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

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

请注意,在传递数据类型时使用了不正确的方法AddWithValue。你需要把它改成:

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

你还需要设置方向为Output

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

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

文档:

Input:输入参数。

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

Output:参数为输出参数。

ReturnValue:参数表示返回值从诸如存储过程、内置函数或用户定义的函数。

首先决定要获取输出参数还是返回值参数。

  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;
    

  returnParm.Direction = ParameterDirection.Output;

你做错了。叫

string id = returnParm.Value.ToString();

dr = cmd.ExecuteReader();