其他语句无法在while循环中工作

时间:2018-07-07 12:57:09

标签: c# asp.net mysqldatareader

下面是我的代码,使用MySqlDataReader连接到数据库。现在,if语句可以正常工作,而else语句则不能。当我在VS中使用调试功能时,它会不断跳过else语句,并跳转到reader.Close();。 任何想法。谢谢

private void db()
{
    string constr = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;

    MySqlConnection connection = new MySqlConnection(constr);
    connection.Open();
    MySqlCommand command = connection.CreateCommand();

    command.CommandText = "SELECT * FROM user Where user_id ='" + Userid.Text + "'" + "And password='" + Password.Text + "'";

    MySqlDataReader reader = command.ExecuteReader();

    while (reader.Read())
    {
        if (!reader.IsDBNull(0))
        {
            Label1.Text = reader["user_id"].ToString();
        }
        else
        {
            Label1.Text = "nodata";
        }
        reader.Close();
    }
}

1 个答案:

答案 0 :(得分:2)

首先:不要在构建查询时使用字符串连接,而要使用参数化查询!

关于您的问题:我假设此查询将仅返回1或0行,因此您不需要循环,只需检查

if (reader.Read()) {
    //...
} 

SELECT *与列索引一起使用可能会很危险,因为您可能不知道返回的“第一”列是什么。我建议在查询中为您想要的列命名

SELECT user_id, user_name ... FROM ... 

返回的第一列的值是多少?我认为是user_id。因此,这永远不会满足条件IsDBNull(0),因为user_idWHERE子句中的匹配条件。如果您的WHERE子句与表中的任何记录都不匹配,则reader.Read()将已经失败,因此您将永远无法进入else分支。

此外,我建议使用using子句,该子句将自动处理阅读器,因此您不必担心关闭它。

command.CommandText = "SELECT user_id, foo, bar from user where user_id = @userid and password = @password";
command.Parameters.AddWithValue("@user_id", UserId.Text);
command.Parameters.AddWithValue("@password", Passowrd.Text);

using (MySqlDataReader reader = command.ExecuteReader()) {
    if (reader.Read()) {
        Label1.Text = reader["user_id"].ToString();
    } else {
        Label1.Text  ="nodata";
    }
}