C#reader.HasRows始终返回false,即使表中还有行

C#reader.HasRows始终返回false,即使表中还有行,c#,C#,永远不要使用字符串连接来构建sql查询。而是使用参数化查询来防止sql注入和其他问题。这才是真正的问题 但是为了修复您的bug,您需要连续调用MySqlDataReader.Read两次。这将使读者进入下一条记录。相反,只做一次: password = md5Crypt(password); User u = null; String sql = "SELECT * FROM user WHERE username='" + username + "' AND password='" + pas

永远不要使用字符串连接来构建sql查询。而是使用参数化查询来防止sql注入和其他问题。这才是真正的问题

但是为了修复您的bug,您需要连续调用
MySqlDataReader.Read
两次。这将使读者进入下一条记录。相反,只做一次:

password = md5Crypt(password);
User u = null;
String sql = "SELECT * FROM user WHERE username='" + username + "' AND password='" + password + "'";
try
{
    conn.Open();
    MySqlCommand cmd = new MySqlCommand(sql, conn);
    MySqlDataReader reader = cmd.ExecuteReader();

    reader.Read();
    Console.WriteLine(reader.Read());


   if (reader.HasRows)
   {
        u = new User(reader["username"].ToString(), reader["password"].ToString(), reader["name"].ToString(), reader["role"].ToString());

   }
   else
   {
        u = null;
   }
   conn.Close();

}
catch (MySqlException e)
{
    Console.WriteLine(e.Message);
    conn.Close();
    return null;
}
return u;

还可以对连接使用
using
状态项(或try catch finally),以确保每次都会释放/关闭连接,即使发生错误也是如此。

永远不要使用字符串连接来构建sql查询。而是使用参数化查询来防止sql注入和其他问题。这才是真正的问题

但是为了修复您的bug,您需要连续调用
MySqlDataReader.Read
两次。这将使读者进入下一条记录。相反,只做一次:

password = md5Crypt(password);
User u = null;
String sql = "SELECT * FROM user WHERE username='" + username + "' AND password='" + password + "'";
try
{
    conn.Open();
    MySqlCommand cmd = new MySqlCommand(sql, conn);
    MySqlDataReader reader = cmd.ExecuteReader();

    reader.Read();
    Console.WriteLine(reader.Read());


   if (reader.HasRows)
   {
        u = new User(reader["username"].ToString(), reader["password"].ToString(), reader["name"].ToString(), reader["role"].ToString());

   }
   else
   {
        u = null;
   }
   conn.Close();

}
catch (MySqlException e)
{
    Console.WriteLine(e.Message);
    conn.Close();
    return null;
}
return u;

还可以对连接使用
using
statemennt(或try catch finally),以确保每次都能释放/关闭连接,即使是在发生错误的情况下。

@Tim但这会让乐趣消失。至少目前我可以尝试以用户名
”或1=1;--
并可能获得一个管理员帐户。@John:删除了注释,因为添加为答案。你说得对,其他人现在都玩得很开心:)@Tim,但这就失去了乐趣。至少目前我可以尝试以用户名
”或1=1;--
并可能获得一个管理员帐户。@John:删除了注释,因为添加为答案。你说得对,其他人现在玩得很开心:)