SqlException: «Процедура или функция usp_UserValidation имеет слишком много аргументов». - PullRequest
0 голосов
/ 09 марта 2020
CREATE PROCEDURE usp_UserValidation
    (@UserName varchar(50),
     @Password varchar(30))
AS
BEGIN
    DECLARE @UserID int, @RoleID int;

    SELECT @UserID = UserId, @RoleID = RoleId 
    FROM Users
    WHERE UserName = @UserName AND Password = @Password

    IF @UserID IS NOT NULL
    BEGIN
        IF EXISTS (SELECT UserId FROM Users WHERE UserId = @UserID AND IsActive = 1)
        BEGIN
            SELECT 
                @UserID [UserID],
                (SELECT RoleType FROM Role WHERE RoleId = @RoleID) [RoleType] -- User Valid
        END
        ELSE
        BEGIN
            SELECT -2 [@UserID], '' [RoleType] -- User not activated.
        END
    END
    ELSE
    BEGIN
        SELECT -1[@UserID] , '' [RoleType] -- User invalid.
    END
END

Dapper

public (int UserId,string Roletype) UserAuthentication(UsersViewModel users)
{
    DynamicParameters parameters = new DynamicParameters();
    parameters.Add("@UserName", users.UserName);
    parameters.Add("@Password", users.Password);
    parameters.Add("@UserID", dbType: DbType.Int32, direction: ParameterDirection.Output);

    connection();

    sqlConn.Open();           
    var res = SqlMapper.Query(sqlConn, "usp_UserValidation", parameters, commandType: CommandType.StoredProcedure).SingleOrDefault();
    int userid = parameters.Get<dynamic>("@UserID");
    string roletype = parameters.Get<dynamic>("@RoleType");            
    sqlConn.Close();            
    return (userid, roletype);
}

Я пытаюсь реализовать аутентификацию для заданных учетных данных пользователя. Хранимая процедура отлично работает в SQL. Получение ошибки в строке SqlMapper.Query при запуске приложения.

Что мне здесь не хватает?

Ответы [ 2 ]

3 голосов
/ 09 марта 2020
(var userid, var roletype) = sqlConn.QuerySingle<(int, string)>("usp_UserValidation", 
    new { users.UserName, users.Password }, commandType: CommandType.StoredProcedure);

ключевое изменение здесь в том, что результаты находятся в select, а не через параметры; другие изменения просто упрощают код.

1 голос
/ 09 марта 2020

Вы должны определить @UserID в качестве выхода.

CREATE PROCEDURE usp_UserValidation
    (@UserName varchar(50),
     @Password varchar(30),
     @UserID int OUTPUT)

AS
BEGIN

Затем выбрать в переменную, чтобы вернуть UserID

SELECT @UserID = xxx.
...