跳过MySqlDataReader.ExecuteReader后的所有代码

时间:2015-05-18 18:25:04

标签: c# mysql

我正在将我的C#Windows窗体应用程序与MySql数据库连接。在使用MySqlDataReader执行数据检索期间会出现此问题。

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

在我的代码中,MySqlDataReader.ExecuteReader之后的代码段在执行期间总是被跳过。我在以下链接中遇到了一个可能的解决方案,但它也没有解决我的问题。 All code after SqlDataReader.ExecuteReader skipped

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

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#数据库相关的应用程序。

1 个答案:

答案 0 :(得分:0)

问题源于两件事:

  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)。这意味着您正在尝试从尚未开始阅读的任何内容的读者访问数据。

  3. 至于第一个声明,解决此问题的正确方法是参数化查询。参数化查询实际上非常简单,自动处理数据类型,以及防止多种类型的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语句的人。他们中的大多数人都会同意这一点。有些人不会,但是那些很少,而且很少。)