我知道这个问题被问过很多次,我已经完成了大部分问题,但没有解决我的问题
我有一个名为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();
}
有什么建议吗?
答案 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)
首先,您决定要获取输出参数或返回值参数。
获取返回值参数。您不必将任何额外参数传递给存储过程。只需添加以下行
SqlParameter returnParameter = cmd.Parameters.Add("RetVal", SqlDbType.Int);
returnParameter.Direction = ParameterDirection.ReturnValue;
cmd.ExecuteNonQuery();
int id = (int) returnParameter.Value;
获取输出参数。你做的所有步骤都很好。只需替换
returnParm.Direction = ParameterDirection.ReturnValue;
与
returnParm.Direction = ParameterDirection.Output;
答案 3 :(得分:1)
string id = returnParm.Value.ToString();
之后
dr = cmd.ExecuteReader();