C# 跳过MySqlDataReader.ExecuteReader之后的所有代码

C# 跳过MySqlDataReader.ExecuteReader之后的所有代码,c#,mysql,C#,Mysql,我正在将我的C Windows窗体应用程序与MySql数据库连接。该问题发生在使用MySqlDataReader执行数据检索时 在关注的方法中,我试图检索大学课程的courseId,如果与大学名称和课程名称对应的前一个条目存在,则返回-1 在我的代码中,MySqlDataReader.ExecuteReader之后的代码段在执行过程中总是被跳过。我在下面的链接中遇到了一个可能的解决方案,但它也不能解决我的问题。 下面的代码示例为您提供了所关注的方法 public int SelectCours

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

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

在我的代码中,MySqlDataReader.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数据库相关的应用程序。

这个问题源于两个方面:

您的语句没有将字符串括在引号中。修改字符串query=SELECT*,其中courseName=+selectCourse.courseName+和courseUniversityName=+selectCourse.UniversityName;要使用字符串query=SELECT*从courseName='+selectCourse.courseName+'和courseUniversityName='+selectCourse.UniversityName+'中选择课程

您没有执行dataReader。请在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语句的人。大多数人都会同意这一点。出于怨恨,其中一些不会,但它们很少。

executescalar而不是ExecuteReader?读者实际上有行吗?沿着这些路线,渔获量会被击中吗?您还应该在if dataReader.HasRows中执行dataReader.Read。否则它将抛出异常。不要吞咽异常。根据代码,任何错误都会导致忽略错误并返回值。因此,如果您的代码忽略了错误并返回了一个值,您为什么会对此感到惊讶呢?与我之前的评论一样,如果没有数据库ddl,您可能会遇到问题。我不能肯定地说,这是因为您没有在这些字符串周围加引号。尝试:从courseName='+selectCourse.courseName+'和courseUniversityName='+selectCourse.UniversityName+'的课程中选择*