我刚开始使用 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/