创建了一个网站登录系统,但是当我运行它时,它不断向下面的特定编码位提出此错误。有人可以帮我解决这个特定代码上的错误消息吗:
System.Data.SqlClient.SqlException: Incorrect syntax near the keyword 'user'.
代码:
public static User LoginUser(string login, string password)
{
//Check if user exists
string query = string.Format("SELECT COUNT(*) FROM TeesDB.dbo.user WHERE name = '{0}'",
login);
command.CommandText = query;
try
{
conn.Open();
int amountOfUsers = (int) command.ExecuteScalar();
if(amountOfUsers == 1)
{
//User exists, check if the password match
query = string.Format("SELECT password FROM users WHERE name = '{0}", login);
command.CommandText = query;
string dbPassword = command.ExecuteScalar().ToString();
if (dbPassword == password)
{
//password match. Login and password data are known to us.
//retrieve further user data from the database
query = string.Format("SELECT email, user_type FROM users WHERE name =
'{0}'", login);
command.CommandText = query;
SqlDataReader reader = command.ExecuteReader();
User user = null;
while (reader.Read())
{
string email = reader.GetString(0);
string type = reader.GetString(1);
user = new User(login, password, email, type);
}
return user;
}
else
{
//passwords do not match
return null;
}
}
else
{
//user exists
return null;
}
}
finally
{
conn.Close();
}
}
}
}
最佳答案
发生这种情况是因为 USER 是保留关键字。要在查询中引用它,您需要将单词封装在方括号之间
string query = string.Format("SELECT COUNT(*) FROM [user] WHERE name = .....
但是此时,为什么在后续查询中使用名称
users
?这只是第一个查询或下一个查询中的错字?但是,您还应该记住,以这种方式格式化查询的字符串非常糟糕。
您面临 Sql 注入(inject)的风险,如果您的文本值中出现单引号,则整个查询将导致无效语法
作为替换查询的参数化查询示例
string query = "SELECT COUNT(*) FROM [user] WHERE name = @name",
command.CommandText = query;
command.Parameters.AddWithValue("@name",login);
int amountOfUsers = (Convert.ToInt32(command.ExecuteScalar());
if(amountOfUsers > 0)
{
.....
}
然后下一个问题是从数据库中检索密码并与用户输入进行比较。拥有这种代码意味着密码以明文形式存储在数据库中。明显的安全风险。您应该以加密形式存储密码。当您需要检查用户凭据时,您将相同的加密算法应用于用户输入并检查数据库中的密码。
您可以在一次操作中完成此操作
string cryptPwd = EncryptPassword(password);
string query = "SELECT COUNT(*) FROM [user] WHERE name = @name and password = @cryptpwd",
....
关于asp.net - 数据库登录系统的语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22735869/