存储过程始终返回默认值

时间:2013-10-18 16:40:05

标签: c# sql sql-server asp.net-mvc-4

我已经编写了一个简单用户登录功能的存储过程。

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。请帮助我,我在哪里做错了。

4 个答案:

答案 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)

在你的SQL中你应该有

SELECT @userRole 

而不是

RETURN @userRole

ExecuteScalar()将执行命令并返回SQL命令生成的第一行中第一列的值,而不是返回值。

答案 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块失败了。修好了,现在一切都很好。

感谢大家的帮助。 :)