2017-08-31 51 views
1

我正在嘗試製作一個警報系統,用於檢查與患者相關的過敏症的藥物鏈接過敏(請參閱下圖)。 ERDSQLDataReader未讀取

當我運行它似乎只是完全跳過SqlDataReader的代碼,我已經當(reader.HasRows)進行檢查,它只是顯示有在讀者沒有行。我想要做的就是在閱讀器的最後顯示一個帶有選定過敏名稱的消息框。我正在使用SQL Server 2014.任何幫助將不勝感激。所有的SqlCommand的

private void button_addItem_Click(object sender, RoutedEventArgs e) 
{ 
    if (!string.IsNullOrEmpty(comboBox_select_Item.Text.ToString())) 
    { 
     using (SqlConnection conn = new SqlConnection(connection)) 
     { 
      try 
      { 
       SqlCommand sqlCmd2 = new SqlCommand("SELECT allergyName, allergyDescription FROM Allergies A INNER JOIN PatientAllergies PA ON A.allergyID = PA.allergyID WHERE A.allergyID = PA.allergyID AND PA.allergyID = (SELECT allergyID FROM Medication_Allergies MA WHERE MA.medID = " + comboBox_select_Item.SelectedValue.ToString() + ")", conn); 
       conn.Open(); 
       SqlDataReader sqlReader = sqlCmd2.ExecuteReader(); 
       Allergies allergies = new Allergies(); 

       while (sqlReader.Read()) 
       { 
        allergies.allergyName = Convert.ToString(sqlReader["allergyName"]); 
        allergies.allergyDescription = Convert.ToString(sqlReader["allergyDescription"]); 
       } 

       MessageBox.Show(allergies.allergyName); 
       sqlReader.Close(); 
       FillSalesItemGrid(); 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.ToString(), ex.ToString()); 
      } 
     } 
    } 
} 
+1

可能查詢返回零行。 –

+0

我只是看不到,我已經通過我的聲明來追蹤,它應該返回一個值。 –

+2

您可能也會從SQL中收到錯誤。 ExecuteReader不會將SQL錯誤視爲.NET異常。你能抓住你創建的字符串並在SSMS中運行它嗎? 另外,如果我沒有指出你的代碼容易受到注入攻擊,我會不服。 – Xedni

回答

0

首先是容易受到SQL注入攻擊 - 你應該總是使用SqlParameter的,因爲它可以幫助您防止SQL注入。 所以你的SqlCommand應該是這樣的:

SqlCommand sqlCmd2 = new SqlCommand("SELECT allergyName, allergyDescription FROM Allergies A INNER JOIN PatientAllergies PA ON A.allergyID = PA.allergyID WHERE A.allergyID = PA.allergyID AND PA.allergyID = (SELECT allergyID FROM Medication_Allergies MA WHERE MA.medID = @medID)", conn); 

,你可以傳遞參數:

sqlCmd2.Parameters.AddWithValue("@medID",comboBox_select_Item.SelectedValue); 

更重要的是,在您的查詢下面的語句是多餘的

WHERE A.allergyID = PA.allergyID 

,因爲你有INNER加入此域

FROM Allergies A INNER JOIN PatientAllergies PA ON A.allergyID = PA.allergyID 

,因此您可以從您的查詢

SELECT allergyName, allergyDescription FROM Allergies A INNER JOIN PatientAllergies PA ON A.allergyID = PA.allergyID WHERE PA.allergyID = (SELECT allergyID FROM Medication_Allergies MA WHERE MA.medID = @medID) 

刪除冗餘的發言中,我敢肯定,你的代碼的其餘部分是或多或少的罰款。請看看你的查詢是否返回任何行。例如,你可以複製你的查詢,並用comboBox中的值替換@medID。

+0

你實際上拯救了我的生命,現在一切正常。感謝你的幫助 –