You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET MVC存储过程实现登录表单返回结果异常求助

问题根源

你错误地使用了ExecuteScalar()来获取存储过程的RETURN返回值。ExecuteScalar()的作用是返回查询结果集中第一行第一列的值,而存储过程通过RETURN @Result输出的是存储过程的返回值,不属于查询结果集,因此你实际拿到的不是预期的1,强制转换为bool后自然得到false。

解决方法

方法1:修改存储过程,通过SELECT输出结果

调整存储过程,将RETURN @Result改为SELECT @Result,让结果进入查询结果集,这样ExecuteScalar()就能正确获取值:

ALTER PROCEDURE [dbo].[ValidateLogin]
    @Username VARCHAR(50),
    @Password VARCHAR(50),
    @Role VARCHAR(50)
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @Result bit;

    SELECT 
        @Result = CASE 
                      WHEN COUNT(*) > 0 
                          THEN 1 
                          ELSE 0 
                  END
    FROM 
        tblLogin
    WHERE 
        Username = @Username 
        AND Password = @Password 
        AND Role = @Role;

    SELECT @Result; -- 替换RETURN,输出结果到结果集
END

控制器代码可保留原逻辑,建议增加空值判断避免异常:

using (var connection = new SqlConnection(_configuration.GetConnectionString("EDMSConnectionString")))
{
    connection.Open();

    var command = new SqlCommand("dbo.ValidateLogin", connection);
    command.CommandType = CommandType.StoredProcedure;

    command.Parameters.AddWithValue("@Username", model.Username);
    command.Parameters.AddWithValue("@Password", model.Password);
    command.Parameters.AddWithValue("@Role", model.Role);

    var resultValue = command.ExecuteScalar();
    var result = resultValue != null && Convert.ToBoolean(resultValue);

    if (result)
    {
        return RedirectToAction("Index", "Home");
    }
    else
    {
        ModelState.AddModelError(string.Empty, "Invalid login attempt.");
    }
}

方法2:保留存储过程,添加返回值参数获取RETURN值

不修改存储过程,在控制器中添加一个Direction为ReturnValue的参数,专门获取存储过程的返回值:

using (var connection = new SqlConnection(_configuration.GetConnectionString("EDMSConnectionString")))
{
    connection.Open();

    var command = new SqlCommand("dbo.ValidateLogin", connection);
    command.CommandType = CommandType.StoredProcedure;

    command.Parameters.AddWithValue("@Username", model.Username);
    command.Parameters.AddWithValue("@Password", model.Password);
    command.Parameters.AddWithValue("@Role", model.Role);

    // 定义存储过程返回值参数
    var returnParameter = new SqlParameter
    {
        ParameterName = "@ReturnVal",
        SqlDbType = SqlDbType.Bit,
        Direction = ParameterDirection.ReturnValue
    };
    command.Parameters.Add(returnParameter);

    // 执行存储过程(用ExecuteNonQuery,因为不需要结果集)
    command.ExecuteNonQuery();

    // 获取返回值并转换为bool
    var result = (bool)returnParameter.Value;

    if (result)
    {
        return RedirectToAction("Index", "Home");
    }
    else
    {
        ModelState.AddModelError(string.Empty, "Invalid login attempt.");
    }
}

额外提示

  • 永远不要明文存储密码,建议使用BCrypt或ASP.NET Identity的密码哈希功能加密后存储。
  • AddWithValue可能导致SQL注入或性能问题,建议明确指定参数的SqlDbType和长度。

内容的提问来源于stack exchange,提问作者anony

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 07:35:29