我已经编写了一个简单用户登录功能的存储过程。
USE [project]
GO
/****** Object: StoredProcedure [dbo].[authenticateLogin] Script Date: 10/18/2013 9:24:57 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[authenticateLogin] @userName varchar, @password varchar
AS
BEGIN
Declare @userRole int;
Declare @uPassword varchar;
Declare @uRole int;
SET @uPassword = (SELECT uPassword FROM [user] WHERE uName=@userName);
IF(@uPassword = @password)
SET @userRole = (SELECT uRole FROM [user] WHERE uName=@userName);
ELSE
SET @userRole = 0;
--RETURN @userRole
SELECT @userRole
END
我从我的程序中这样称呼:
internal int Authenticate(string userName, string password)
{
int userRole = 0;
Shared shrObj=new Shared();
string encPassword = shrObj.EncryptToString(password);
SqlConnection sqlCon = Shared.GetSqlCon();
var sqlCom = new SqlCommand("authenticateLogin", sqlCon);
sqlCom.CommandType = CommandType.StoredProcedure;
sqlCom.Parameters.AddWithValue("@userName", userName);
sqlCom.Parameters.AddWithValue("@password", encPassword);
try
{
userRole = Shared.ExecuteNonQueryOnProcedure(sqlCon, sqlCom);
if (userRole > 0) return userRole;
}
catch (SqlException sqlEx)
{
//catch
}
finally
{
Shared.COC(sqlCon);
}
return userRole;
}
在Shared.cs
public static int ExecuteNonQueryOnProcedure(SqlConnection sqlCon, SqlCommand sqlCom) {
int rowCount = 0;
SqlParameter returnParameter = sqlCom.Parameters.Add("userRole", SqlDbType.Int);
returnParameter.Direction = ParameterDirection.ReturnValue;
try
{
sqlCon.Open();
//rowCount = sqlCom.ExecuteNonQuery();
var inu = sqlCom.ExecuteScalar().ToString();
}
catch (Exception ex)
{
//catch
return rowCount;
}
return (int)returnParameter.Value;
}
但问题是,即使提供的参数匹配,它总是返回0。请帮助我,我在哪里做错了。
答案 0 :(得分:2)
您不应该使用SqlCommand传递EXEC procedure
。使用CommandType.StoredProcedure
var sqlCom = new SqlCommand("authenticateLogin",sqlCon);
sqlComm.CommandType = CommandType.StoredProcedure; //here
sqlCom.Parameters.AddWithValue("@userName", userName);
sqlCom.Parameters.AddWithValue("@password", encPassword);
try
{
userRole = (short)sqlComm.ExecuteScalar();
if (userRole > 0) return userRole;
}
要获得返回值,您可以添加如下参数:
SqlParameter returnParameter = sqlCom.Parameters.Add("userRole", SqlDbType.Int);
returnParameter.Direction = ParameterDirection.ReturnValue;
sqlCom.ExecuteScalar();
int returnValue = (int) returnParameter.Value;
答案 1 :(得分:1)
答案 2 :(得分:1)
你不会像这样从SP返回一个值,实际上返回值并没有多大用处。
如果您想使用SP进行身份验证,那么以下内容将起作用:
CREATE PROCEDURE [dbo].[authenticateLogin] @userName varchar, @password varchar
AS
BEGIN
SELECT uRole FROM [User]
WHERE uName=@userName AND uPassword = @password
这将为具有匹配用户名和密码的所有用户返回uRole字段,该用户名和密码有望为1行或0行。
答案 3 :(得分:0)
我没有在varchar(?)
中指定字符值,因此它只取每个变量的第一个字符,因此if-Else
块失败了。修好了,现在一切都很好。
感谢大家的帮助。 :)