为什么SqlCommand不在HASHBYTES函数内传递参数?

Jak*_*kša 2 c# sql-server

我有一个简单的SqlConnection代码,它有一个HASHBYTES函数来从我的服务器检索数据.

using (var connection = new SqlConnection(connectionString))
{
    connection.Open();

    using (var command = new SqlCommand(commandString, connection))
    {
        command.Parameters.Add(new SqlParameter("mail", email));
        command.Parameters.Add(new SqlParameter("password", password));
        using (var reader = command.ExecuteReader())
        {
            while (reader.Read())
            {
                return true;
            }
            throw new InvalidDataException();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

CommandString中的属性如下:

DECLARE @pass varchar(50);
SET @pass = @password;

DECLARE @pwdHash varbinary(max);
SET @pwdHash = HASHBYTES('SHA2_256', @pass);

SELECT * FROM Users
WHERE email=@mail AND pwd=@pwdHash;
Run Code Online (Sandbox Code Playgroud)

此代码有效,但为什么下面的较短代码不起作用?

在下面的情况中,该函数不会进入while循环,而是抛出异常.

DECLARE @pwdHash varbinary(max);
SET @pwdHash = HASHBYTES('SHA2_256', @password);

SELECT * FROM Users
WHERE email=@mail AND pwd=@pwdHash;
Run Code Online (Sandbox Code Playgroud)

在这两个代码中,@ password值设置为a SqlParameter,因此它应该可以工作,对吧?或者我错过了什么?

Dai*_*Dai 7

字符串参数nvarchar默认传递; 但是你的较长命令会转换@passwordvarchar具有不同二进制表示的命令,因此如果它们的哈希值生成方式不同,则会生成与现有记录不匹配的不同哈希摘要.

顺便说一句,你也应该给哈希加盐.