我正在将我的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#数据库相关的应用程序。
答案 0 :(得分:0)
问题源于两件事:
您的语句不会将字符串包装在引号中。将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 + "'";
。
您在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语句的人。他们中的大多数人都会同意这一点。有些人不会,但是那些很少,而且很少。)