2011-12-01 52 views
5

我刚刚开始使用ASP.NET C#并且我的数据库是SQL Server。我正在尝试在准备好的语句中使用我想要使用的查询。在ASP.Net中编写语句使用SQL Server时的C#

这是允许登录到用户的查询:甚至当我进入

SqlParameter UserName = new SqlParameter("@user", SqlDbType.NVarChar, 30); 
    SqlParameter Password = new SqlParameter("@pass", SqlDbType.NVarChar, 20); 

    UserName.Value = user.ToLower(); 
    Password.Value = pass; 

    SqlCommand command = new SqlCommand(null, conn); 
    command.Parameters.Add(UserName); 
    command.Parameters.Add(Password); 
    command.CommandText = "SELECT * FROM table_users WHERE user_name = '@user' AND password = '@pass';"; 

    command.Prepare(); 
    SqlDataReader reader = command.ExecuteReader(); 

    bool tmp = reader.HasRows; 

tmp变量的值总是FALSE,存在用户使用正确的密码。

,如果我只是删除参数和编写查询这样:

command.CommandText = "SELECT * FROM table_users WHERE user_name = '"+user+"' AND password = '"+ pass+"';"; 

tmp变量获取值TRUE对存在的用户。

我试图用INSERT INTO查询来使用这个语法,它工作正常。

我已阅读所有关于将@更改为?的建议,但它不起作用。 我有一个错误:

Incorrect syntax near '?'. Statement(s) could not be prepared.

请帮助我, 谢谢!

回答

9

您正在查找的文字'@user''@pass',而不是来自参数的值;使用:

command.CommandText = 
     "SELECT * FROM table_users WHERE user_name = @user AND password = @pass;"; 

改为。然后看看“盐渍哈希”,以及为什么你永远不应该实际存储密码。

顺便说一句,拨打Prepare()这里没有帮助。我也要去插上短小精悍点网(免费/ OSS),这将使只是这整个事情:

bool authenticated = conn.Query(
    @"select 1 from table_users where user_name = @user and password = @pass", 
    new {user = user.ToLower(), pass}).Any(); 

,或者,如果你想记录:

var tableUser = conn.Query<TableUser>(
    @"select * from table_users where user_name = @user and password = @pass", 
    new {user = user.ToLower(), pass}).SingleOrDefault(); 
+0

非常感谢你很多,现在是它的工作。我会检查“盐渍嘶嘶声”。 –

+0

@MarkGravell - “顺便说一句,在这里调用Prepare()在这里没有帮助。”你能否详细说明_why_使用准备好的声明对这种用法没有帮助? –

+2

@Jesse因为大多数数据库这些天不关心:他们有自动查询计划缓存特设查询,使任何区别基本无法测量 –