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

C#中ExecuteScalar返回结果与纯SQL执行结果不一致问题

问题原因及修复方案
  • 核心错误出在SQL语句的写法上:你给@password参数额外加了单引号,这会导致SQL引擎将其识别为固定字符串常量'@password',而非你通过参数传入的密码值,相当于每次计算的都是字符串@password的SHA1哈希,自然和数据库中存储的对应用户密码哈希匹配不上,所以始终返回0。

修复步骤

  1. 修改SQL语句,去掉@password外层的单引号,修改后语句如下:
SELECT Count(*) FROM Users WHERE UserName = @username AND Password = HASHBYTES('SHA1', @password)
  1. 其他可选优化/注意事项:
  • 不要使用全局静态的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 01:45:00