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
查询,它工作正常。
我已经阅读了所有关于将@
更改为?
的建议,但它不起作用。我有一个错误:
'?'附近语法错误。无法准备语句。
请帮帮我,谢谢!
您正在寻找字量 '@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();