LinqToSql и HashBytes - PullRequest
       1

LinqToSql и HashBytes

2 голосов
/ 16 декабря 2010

Мне нужно выполнить эту команду Sql (которая прекрасно работает в Management Studio):

select * from Users where Login = 'test' and PasswordHash = HashBytes('SHA1', 'test')

Я написал это c # linqtosql:

var user = db.ExecuteQuery<User>("select * from Users where Login = {0} and PasswordHash = HashBytes('SHA1', {1})", loginTextBox.Text.Trim(), passwordPasswordBox.Password).SingleOrDefault();

, но она никогда не работает !!

кто-нибудь может мне помочь?

спасибо!

Это журнал DataContext:

select * from Users where Login = @p0 and PasswordHash = HashBytes('SHA1', @p1)
-- @p0: Input NVarChar (Size = 4000; Prec = 0; Scale = 0) [test]
-- @p1: Input NVarChar (Size = 4000; Prec = 0; Scale = 0) [test]
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.0.30319.1

Ответы [ 3 ]

4 голосов
/ 16 декабря 2010

Я профилировал это через db.Log = Console.Out, с результатом:

-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.0.30319.1

select * from Users where Login = @p0 and PasswordHash = HashBytes('SHA1', @p1)
-- @p0: Input NVarChar (Size = 4000; Prec = 0; Scale = 0) [Admiral Trask]
-- @p1: Input NVarChar (Size = 4000; Prec = 0; Scale = 0) [Arutha]
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.0.30319.1

Глядя на это, я представляю проблема в том, что параметр равен NVarChar, а не varchar - поэтому взятие хэша (двоичная операция) отличается Если вы хэшировали как varchar, вам, вероятно, следует привести строку к varchar перед HASHBYTES.

Следующие работы, например:

var user = db.ExecuteQuery<User>(@"select * from Users where Login = {0}
        and PasswordHash = HashBytes('SHA1', CAST({1} as varchar(40)))", cn, pw)
        .SingleOrDefault();

Более простая иллюстрация этого:

SELECT HASHBYTES('SHA1','12345'), HASHBYTES('SHA1',N'12345')
2 голосов
/ 16 декабря 2010

Что вы действительно хотите сделать, так это сопоставить метод C # с функцией db HashBytes, которая выполняется примерно так

[Function(Name = "HashBytes")]
[return: Parameter(DbType = "VarChar(100)")]
string HashBytes(string hashtype, string text)
{  .... }

Подробности приведены здесь: http://msdn.microsoft.com/en-us/library/bb386973.aspx

Это позволит вам написать запрос в правильном LINQ:

var q = from u in db.Users
        where u.Login == cn && u.PasswordHash == HashBytes("SHA1", pw)
        select u;
0 голосов
/ 16 декабря 2010

Кажется, вы пропустили кавычки в строке шаблона для логина и пароля.

var user = db.ExecuteQuery<User>("select * from Users where Login = '{0}' and PasswordHash = HashBytes('SHA1', '{1}')", loginTextBox.Text.Trim(), passwordPasswordBox.Password).SingleOrDefault();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...