我在这里有代码,它会检查输入的用户名和密码是否正确,我的问题是在我的数据库中我有一个用户名:“ADMIN”和密码:“ADMIN”但每当我尝试输入“admin”时对于用户名和密码,它仍然允许我进入主窗口,这意味着我的布尔是真的。
这是我的代码:
update
答案 0 :(得分:3)
您可以在SqlCommand上使用ExecuteReader来读取值 - 您可以将这些值与用户提供的值进行比较。用户名不应该区分大小写。
我的回复假设您的用户表中的用户名是唯一的 - 我认为这是非常有效的假设。
由于您只需要用户名和密码,您可能需要将选择查询修改为:
SELECT UserName, Password
FROM Users
WHERE Username = @Username AND Password = @Password
在这种情况下,您修改后的代码段可能类似于:
public bool IsAccountValid(string userLogin, string userPassword)
{
bool flag = false;
try
{
accessToDatabase.OpeningDatabase();
String query = "SELECT * FROM Users where Username=@Username AND Password=@Password";
SqlCommand sqlCmd = accessToDatabase.Command(query);
sqlCmd.CommandType = CommandType.Text;
sqlCmd.Parameters.AddWithValue("@Username", userLogin);
sqlCmd.Parameters.AddWithValue("@Password", userPassword);
var reader = sqlCmd.ExecuteReader();
if (reader.HasRows)
{
while (reader.Read())
{
if(userPassword == reader[0].ToString())
{
flag = true;
}
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
accessToDatabase.ClosingDataBase();
}
return flag; //returns false if query does not exists...
}
其他替代方法是修改你的sql查询本身以确保它在where here
之类的子句中处理区分大小写的匹配在这种情况下,您无需对ADO.NET代码进行任何更改。
答案 1 :(得分:1)
更好的方法是更改区分大小写搜索的查询:
String query = "SELECT * FROM Users where
Username=@Username COLLATE SQL_Latin1_General_CP1_CS_AS
AND Password=@Password COLLATE SQL_Latin1_General_CP1_CS_AS";
另一种方法是进行二元投射:
String query = "SELECT * FROM Users
where CAST(Username as varbinary(100))=CAST(@Username as varbinary(100))
AND CAST(Password as varbinary(100))=CAST(@Password as varbinary(100))";