MySqlDataReader后面的所有代码.ExecuteReader被跳过了

本文关键字:ExecuteReader 过了 代码 MySqlDataReader | 更新日期: 2023-09-27 17:49:47

我正在连接我的c# Windows窗体应用程序与MySql数据库。这个问题发生在使用MySqlDataReader执行数据检索时。

在此方法中,如果存在与大学名称和课程名称相对应的前一个条目,则尝试检索大学课程的courseId,否则返回-1。

在我的代码中,MySqlDataReader之后的代码段。ExecuteReader在执行过程中总是被跳过。我在以下链接中遇到了一个可能的解决方案,但它也不能解决我的问题。SqlDataReader之后的所有代码。ExecuteReader跳过

下面的代码示例为您提供了所关注的方法。

public int SelectCourseId(Course selectCourse)
{
    int courseId = -1;
    MySqlDataReader dataReader = null;
    try
    {
        using (connection)
        {
            String query = "SELECT * FROM course WHERE courseName=" + selectCourse.CourseName + " AND courseUniversityName=" + selectCourse.UniversityName;
            MySqlCommand command = new MySqlCommand(query, this.connection);
            connection.Open();
            dataReader = command.ExecuteReader();
            if (dataReader.HasRows)
            {
                courseId = Convert.ToInt32(dataReader["courseId"] + "");
            }
        }
    }
    catch (MySqlException)
    {
        return courseId;
    }
    finally
    {
        if (dataReader != null)
        {
            dataReader.Close();
        }
        this.CloseConnection();
    }
    return courseId;
}

如果有人能给我提供一个很好的解决方案来解决这个问题,请原谅我的任何错误,因为这是我第一次创建一个c#数据库相关的应用程序。

MySqlDataReader后面的所有代码.ExecuteReader被跳过了

问题源于两个方面:

  1. 你的语句没有把字符串用引号括起来。修改String query = "SELECT * FROM course WHERE courseName=" + selectCourse.CourseName + " AND courseUniversityName=" + selectCourse.UniversityName;String query = "SELECT * FROM course WHERE courseName='" + selectCourse.CourseName + "' AND courseUniversityName='" + selectCourse.UniversityName + "'";

  2. 你不做dataReader.Read()在你的if (dataReader.HasRows)块。这意味着您正在尝试从尚未开始读取任何内容的读取器访问数据。

对于第一个语句,解决这个问题的正确方法是参数化查询。参数化查询实际上非常简单,自动处理数据类型,并且还可以防止多种类型的SQL注入攻击。

要将查询修改为参数化,只需要以下命令:

取这一段:

String query = "SELECT * FROM course WHERE courseName=" + selectCourse.CourseName + " AND courseUniversityName=" + selectCourse.UniversityName;
MySqlCommand command = new MySqlCommand(query, this.connection);

并更改它:

String query = "SELECT * FROM course WHERE courseName=@CourseName AND courseUniversityName=@UniversityName";
MySqlCommand command = new MySqlCommand(query, this.connection);
command.Parameters.AddWithValue("@CourseName", selectCourse.CourseName);
command.Parameters.AddWithValue("@UniversityName", selectCourse.UniversityName);

同样,自动处理数据类型,还可以防止SQL注入攻击。总的来说,的可读性比强得多,的维护性比强得多。(问问任何管理过大型复杂SQL语句的人。他们中的大多数人都会同意这一点。)