首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LinqToSql和HashBytes

LinqToSql和HashBytes
EN

Stack Overflow用户
提问于 2010-12-17 03:33:52
回答 3查看 2.7K关注 0票数 2

我需要执行这个Sql命令(它在management studio中运行良好):

代码语言:javascript
复制
select * from Users where Login = 'test' and PasswordHash = HashBytes('SHA1', 'test')

我写了这个c# linqtosql:

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

但它永远不会起作用!!

有人能帮我吗?

谢谢!

这是DataContext的日志:

代码语言:javascript
复制
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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-12-17 04:14:59

我通过db.Log = Console.Out对其进行了分析,结果如下:

代码语言:javascript
复制
-- 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,那么您可能应该在HASHBYTES之前将字符串强制转换为varchar

例如,以下内容可以工作:

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

一个更简单的例子是:

代码语言:javascript
复制
SELECT HASHBYTES('SHA1','12345'), HASHBYTES('SHA1',N'12345')
票数 4
EN

Stack Overflow用户

发布于 2010-12-17 04:29:11

您真正想要做的是将一个C#方法映射到db函数HashBytes,这是这样完成的

代码语言:javascript
复制
[Function(Name = "HashBytes")]
[return: Parameter(DbType = "VarChar(100)")]
string HashBytes(string hashtype, string text)
{  .... }

详情请参阅:http://msdn.microsoft.com/en-us/library/bb386973.aspx

这将允许您在适当的LINQ中编写查询:

代码语言:javascript
复制
var q = from u in db.Users
        where u.Login == cn && u.PasswordHash == HashBytes("SHA1", pw)
        select u;
票数 2
EN

Stack Overflow用户

发布于 2010-12-17 03:43:51

您似乎缺少登录和密码模板字符串中的引号。

代码语言:javascript
复制
var user = db.ExecuteQuery<User>("select * from Users where Login = '{0}' and PasswordHash = HashBytes('SHA1', '{1}')", loginTextBox.Text.Trim(), passwordPasswordBox.Password).SingleOrDefault();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4464643

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档