ASP中准备好的语句.Net c#在使用SQL Server时

本文关键字:SQL Server 准备好 语句 Net ASP | 更新日期: 2023-09-27 18:16:14

我刚开始使用ASP。. NET c#和我的数据库是SQL Server。我正试图写一个查询,我想用准备好的语句使用。

这是一个允许用户登录的查询:

    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查询,它工作正常。

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

'?'附近语法错误。无法准备语句。

请帮帮我,谢谢!

ASP中准备好的语句.Net c#在使用SQL Server时

您正在寻找字量 '@user''@pass',而不是参数的值;用途:

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

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

顺便说一句,在这里调用Prepare()没有帮助。我还将插入dapper-dot-net (free/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();