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

标签 c# asp.net sql-server

我刚开始使用 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 查询并且它工作正常。

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

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

请帮帮我, 谢谢!

最佳答案

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

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

相反。然后研究“加盐哈希”,以及为什么您永远不应该实际存储密码。

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

关于c# - 使用 SQL Server 时在 ASP.Net C# 中准备语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8339107/

相关文章:

sql - sql server 上的按位非示例

C# 此时无法启动异步操作。

c# - 如何在 ASP.NET Core 中设置默认区域?

c# - 根据上下文注入(inject)构造函数参数

asp.net - jQuery UI "$("#datepicker").datepicker 不是函数"

c# - TinyMCE 包

c# - 放大图片框时图像变得模糊

asp.net - IIS 上的远程调试 - 拒绝访问的噩梦!

sql-server - 有效的 SQL Server 触发器 - 仅触发一次

sql-server - 停止聚集索引脚本