C# Else语句在while循环中无法工作

C# Else语句在while循环中无法工作,c#,asp.net,mysqldatareader,C#,Asp.net,Mysqldatareader,下面是我使用MySqlDataReader连接数据库的代码。现在if语句工作正常,而else语句工作不正常。当我在VS中使用debug函数时,它一直跳过else语句并跳转到reader.Close;。 任何想法。谢谢 private void db() { string constr = ConfigurationManager.ConnectionStrings["constr"].ConnectionString; MySqlConnection connection =

下面是我使用MySqlDataReader连接数据库的代码。现在if语句工作正常,而else语句工作不正常。当我在VS中使用debug函数时,它一直跳过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行,所以您不需要循环,只需检查即可

if (reader.Read()) {
    //...
} 
将SELECT*与列索引一起使用可能有危险,因为您可能不知道返回的第一列是什么。我建议您在查询中指定所需的列

SELECT user_id, user_name ... FROM ... 
返回的第一列的值是多少?我假设它是user_id。因此,这永远不能满足条件IsDBNull0,因为user_id是WHERE子句中的匹配条件。如果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";
    }
}

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

至于您的问题:我假设这个查询只返回1行或0行,所以您不需要循环,只需检查即可

if (reader.Read()) {
    //...
} 
将SELECT*与列索引一起使用可能有危险,因为您可能不知道返回的第一列是什么。我建议您在查询中指定所需的列

SELECT user_id, user_name ... FROM ... 
返回的第一列的值是多少?我假设它是user_id。因此,这永远不能满足条件IsDBNull0,因为user_id是WHERE子句中的匹配条件。如果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";
    }
}

你打算把reader.Close放在循环中吗?如果是这样,为什么会有循环?你不需要循环,只需要使用If reader.ReadMove reader。关闭循环外部,将其更改为If reader。阅读、清理、重建,如果仍然看到问题,请告诉我们。这段代码没有太多意义。您不会关闭一个读卡器,然后尝试从中读取!而且你的代码有一个巨大的安全缺陷;请仔细阅读SQL注入。另外,为了避免将来的大量麻烦和容易发现的安全漏洞,请切换到使用。目前我可以使用用户名'or=1;删除表格用户;-我会删除你的整个用户表。你打算把reader.Close放在循环中吗?如果是这样,为什么会有循环?你不需要循环,只需要使用If reader.ReadMove reader。关闭循环外部,将其更改为If reader。阅读、清理、重建,如果仍然看到问题,请告诉我们。这段代码没有太多意义。您不会关闭一个读卡器,然后尝试从中读取!而且你的代码有一个巨大的安全缺陷;请仔细阅读SQL注入。另外,为了避免将来的大量麻烦和容易发现的安全漏洞,请切换到使用。目前我可以使用用户名'or=1;删除表格用户;-我会删除你的整个用户表。