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
相关产品推荐
相关产品推荐

