我需要创建一个包含逻辑的类,用于通过Login控件检查用户的SQL Server表。当我运行我的代码并在Login控件中输入数据时,它无法识别用户并写入错误消息。有人可以查看我的代码是否有错误?
这是类代码:
public int checkUser (string Username, string Password)
{
using (SqlConnection sqlCnn = new SqlConnection(cnn))
{
Int32 count = 0;
string sqlQuery = "SELECT COUNT(*) AS LoginInfo FROM users" +
"WHERE Username = @Name AND Password = @Password";
//sqlCnn.Open();
using (SqlCommand comm = new SqlCommand(sqlQuery, sqlCnn))
{
//comm.Parameters.AddWithValue("@Name", Username);
//comm.Parameters.AddWithValue("@Password", Password);
comm.Parameters.Add("@Name", SqlDbType.NChar).Value = Username;
comm.Parameters.Add("@Password", SqlDbType.NChar).Value = Password;
try
{
sqlCnn.Open();
count = (Int32)comm.ExecuteScalar();
}
catch (Exception ex)
{
Console.WriteLine("Error");
}
finally
{
sqlCnn.Close();
}
return (Int32)count;
}
}
}
这是实施代码:
protected void Login1_Authenticate(object sender, AuthenticateEventArgs e)
{
User1 user = new User1();
string name = Login1.UserName;
string pass = Login1.Password;
if (user.checkUser(name, pass) > 0)
{
Response.Redirect("mainPage.aspx");
}
else
{
Label1.Text = "Error";
}
}
答案 0 :(得分:1)
您的查询字符串应该出错:
SELECT COUNT(*)AS LoginInfo FROM usersWHERE Username = @Name AND Password = @Password
这可能是引起异常的原因。
我总是使用verbatim string literal,以便复制查询更容易,而且您不必考虑以空格结束或启动每个字符串:
string sqlQuery = @"SELECT COUNT(*) AS LoginInfo FROM users
WHERE Username = @Name AND Password = @Password";
而不仅仅是Console.WriteLine("错误");你应该写下例外:
catch (Exception ex)
{
Console.WriteLine(ex.Message);
Console.WriteLine(ex.StackTrace); //probably a good idea
}
如果它不是null,你也可以查看InnerException。
我看到您的变量用户名和密码中有大字母。您应该将第一个字符更改为小写。 我也总是使用AddWithValue
comm.Parameters.AddWithValue("@Name", username);
答案 1 :(得分:0)
好的,我找到了问题的解决方案。第一个错误是在sql查询中。 我不应该将类接受的数据转发为值(Username = @Name ==> name = @Name)。 其次,在实施代码中,必须为重定向添加另一行才能将批准的用户转移到另一个页面:
FormsAuthentication.RedirectFromLoginPage(name, true);