C# Else语句在while循环中无法工作
下面是我使用MySqlDataReader连接数据库的代码。现在if语句工作正常,而else语句工作不正常。当我在VS中使用debug函数时,它一直跳过else语句并跳转到reader.Close;。 任何想法。谢谢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 =
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;删除表格用户;-我会删除你的整个用户表。