C#中ExecuteScalar返回结果与纯SQL执行结果不一致问题
问题原因及修复方案
- 核心错误出在SQL语句的写法上:你给
@password参数额外加了单引号,这会导致SQL引擎将其识别为固定字符串常量'@password',而非你通过参数传入的密码值,相当于每次计算的都是字符串@password的SHA1哈希,自然和数据库中存储的对应用户密码哈希匹配不上,所以始终返回0。
修复步骤
- 修改SQL语句,去掉
@password外层的单引号,修改后语句如下:
SELECT Count(*) FROM Users WHERE UserName = @username AND Password = HASHBYTES('SHA1', @password)
- 其他可选优化/注意事项:
- 不要使用全局静态的
SqlConnection对象,建议将数据库连接也放在using块中托管生命周期,避免连接泄露和状态异常,ADO.NET内置的连接池会自动处理连接复用,不需要手动复用连接对象。 - 检查
Users表的Password字段类型,HASHBYTES返回值为varbinary类型,确保该字段存储类型和返回值类型匹配,如果你的密码是存储为十六进制字符串格式,需要额外做类型转换后再匹配。 - 目前SHA1算法已被认定为不安全,不适合用于密码存储,后续迭代建议更换为bcrypt、PBKDF2等带盐值的慢哈希算法提升安全性。
修复后完整代码参考
public static bool CheckUser(string UserName, string Password) { try { // 这里替换为你的实际数据库连接字符串 string connectionString = "你的数据库连接字符串"; string sql = "SELECT Count(*) FROM Users WHERE UserName = @username AND Password = HASHBYTES('SHA1', @password)"; using (SqlConnection con = new SqlConnection(connectionString)) using (SqlCommand command = new SqlCommand(sql, con)) { con.Open(); command.Parameters.AddWithValue("@username", UserName); command.Parameters.AddWithValue("@password", Password); return (int)command.ExecuteScalar() > 0; } } catch (Exception ex) { string message = ex.Message; return false; } }
内容的提问来源于stack exchange,提问作者Ashik Dangol
相关产品推荐
相关产品推荐

