Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用SQL Server时在ASP.Net C中准备的语句_C#_Asp.net_Sql Server - Fatal编程技术网

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

C# 使用SQL Server时在ASP.Net C中准备的语句,c#,asp.net,sql-server,C#,Asp.net,Sql Server,我刚刚开始使用ASP.NETC,我的数据库是SQLServer。我正在尝试编写一个查询,我想在其中使用prepared语句 这是一个允许用户登录的查询: SqlParameter UserName = new SqlParameter("@user", SqlDbType.NVarChar, 30); SqlParameter Password = new SqlParameter("@pass", SqlDbType.NVarChar, 20); UserName.V

我刚刚开始使用ASP.NETC,我的数据库是SQLServer。我正在尝试编写一个查询,我想在其中使用prepared语句

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

    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,即使我使用正确的密码输入exist user

如果我只是删除参数并以这种方式编写查询:

command.CommandText = "SELECT * FROM table_users WHERE user_name = '"+user+"' AND password = '"+ pass+"';";
tmp变量get value TRUE适用于现有用户

我尝试将此语法用于INSERT INTO查询,它工作正常

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

“?”附近的语法不正确。无法编写声明

请帮帮我, 谢谢

您要查找的是文本'@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();

非常感谢你,现在它的工作。我会检查盐哈希。@markgravel-BTW,在这里调用Prepare没有帮助。你能详细解释一下为什么使用预先准备好的语句对这种用法没有帮助吗?@Jesse,因为现在大多数数据库都不在乎:它们在即席查询上有自动查询计划缓存,这基本上是有区别的unmeasurable@MarcGravell我是否可以像select*那样从user\U name=user12和password=123,带值。我需要使用字符串形式的参数值进行查询