2017-08-31 15 views
1

私は患者にリンクされたアレルギー(下記画像参照)と薬をリンクしたアレルギーをチェックする警告システムを作りようとしています。 ERDSQLDataReaderが読んでいません

私はコードを実行するとSQLDataReaderを完全にスキップするように見えますが、私はif(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は.NETエラーとしてSQLエラーを検出しません。作成している文字列を取得してSSMSで実行できますか? また、あなたのコードがインジェクション攻撃に対して脆弱であることを指摘していない場合は、私は残念です。 – Xedni

答えて

0

まずSQLインジェクション攻撃に対して脆弱である - それはあなたがSQLインジェクションを防ぐことができますよう、あなたは常にSqlParameterを使用する必要があります。 だからあなたの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); 

詳細は何ですか、あなたがINNERを持っているので、あなたのクエリに文を以下を

WHERE A.allergyID = PA.allergyID 

冗長でありますこのフィールドに参加する

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) 

から冗長な文を削除することができます。クエリで行が返されたかどうかを確認してください。たとえば、クエリをコピーして、@medIDをコンボボックスの値で置き換えることができます。

+0

あなたは実際に私の人生を救いました。あなたのすべての協力に感謝します –

関連する問題