【问题标题】:SqlException: 'Procedure or function usp_UserValidation has too many arguments specified.'SqlException:“程序或函数 usp_UserValidation 指定了太多参数。”
【发布时间】:2020-03-09 15:39:19
【问题描述】:
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

小巧玲珑

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 行出现错误。

我在这里错过了什么?

【问题讨论】:

  • @UserName@Password 是存储过程的参数。 UserIDRoleType 是返回结果集中的列。
  • 您的存储过程 DOES NOT@UserID OUTPUT 参数 - 您在C# 代码... @UserId 和 @RoleId 值作为 结果数据集 - NOT 作为参数返回!
  • 顺便说一句;您应该将密码存储为varchar(30) - 它应该是原始密码的加盐哈希
  • @MarcGravell Point 指出。
  • @marc_s 添加到同一问题中,查询返回 UserId 和 RoleType 的值,但 roletype 变量显示为 null。为什么?

标签: sql-server dapper


【解决方案1】:
(var userid, var roletype) = sqlConn.QuerySingle<(int, string)>("usp_UserValidation", 
    new { users.UserName, users.Password }, commandType: CommandType.StoredProcedure);

这里的关键变化是结果在select中,而不是通过参数;其他更改只是简化了代码。

【讨论】:

    【解决方案2】:

    您应该将@UserID 定义为输出。

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

    然后选择变量返回UserID

    SELECT @UserID = xxx.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-28
      • 2019-10-07
      相关资源
      最近更新 更多