C#reader.HasRows一直返回false,即使表中仍有行

时间:2018-04-17 07:42:32

标签: c#

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;

1 个答案:

答案 0 :(得分:4)

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

但要修复你的错误,你要连续两次调用MySqlDataReader.Read。这将使读者进入下一个记录。而只做一次:

if(reader.Read())
{
    u = new User(reader["username"].ToString(), reader["password"].ToString(), reader["name"].ToString(), reader["role"].ToString());
}
else
{
   u = null;
}
if(reader.Read())
{
    // bug detected, two user with same name and password, log this/throw an exception
}

同样使用using statemennt(或try-catch-finally)进行连接,以确保每次都处理/关闭它,即使出现错误。