2015-05-18 38 views
-1

我在我的連接C#Windows窗體與MySQL數據庫應用程序的過程。在使用MySqlDataReader執行數據檢索期間發生該問題。MySqlDataReader.ExecuteReader越來越之後的所有代碼跳過

在關注的方法,我試圖如果對應於該大學的名稱和課程名稱以前的條目存在檢索大學課程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

的ExecuteScalar代替的ExecuteReader? –

+0

讀者究竟是否有行?*沿着這些路線,'catch'會被擊中嗎?你還應該在'if(dataReader.HasRows)'中寫'dataReader.Read()'。否則它會**拋出異常。 –

+4

不要吞食異常。 – SLaks

回答

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. 您不會在if (dataReader.HasRows)區塊內執行dataReader.Read()區塊。這意味着您正嘗試訪問來自尚未開始讀取任何內容的讀取器的數據。

至於第一條語句,來解決這個問題的正確方法是參數化查詢。參數化查詢實際上很容易,自動句柄數據類型,還有防止許多類型的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 [email protected] AND [email protected]"; 
MySqlCommand command = new MySqlCommand(query, this.connection); 
command.Parameters.AddWithValue("@CourseName", selectCourse.CourseName); 
command.Parameters.AddWithValue("@UniversityName", selectCourse.UniversityName); 

此,手柄數據類型爲你自動,並且還可以防止SQL注入攻擊。這也是更可讀更容易維護一般。 (問任何人誰管理大型,複雜的SQL語句。他們大多會同意這一點。有些人不會,爲了泄憤,但這些並不多見。)