2017-05-02 48 views
0

我嘗試編寫代碼寫入到一個SQL表的形式。我使用其他表格的數據來完成表格(以及用戶輸入)。我有選擇的組合框(ddDefect)的源極的複選框 - 它是基於一個兩個SQL之類的查詢 - 如此,COMBOX將顯示之一的結果LIKE查詢,如果該複選框=真與其它類似的查詢,如果它=假。這部分工作很好。問題是;我似乎無法弄清楚如何將組合框中的選定項目和顯示文本形式在我的文本框中的另一列(txtNcm)數據庫中的值,如果選擇組合框

我嘗試了各種方法,這似乎對我最有意義(雖然我只有初學者和無知),但我沒有在我的文本框中得到什麼。

這裏是我一直在努力代碼:

private void ddDefect_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    string constring = "Data Source=TS-ERP01;Initial Catalog=Touchstn02;Integrated Security=True"; 
    string Query = "select * from Defect_Codes Where DESCP_91= ' " + ddDefect.Text + " ';"; 
    SqlConnection conDataBase = new SqlConnection(constring); 
    SqlCommand cmdDataBase = new SqlCommand(Query, conDataBase); 
    SqlDataReader myReader; 
    try 
    { 
     conDataBase.Open(); 
     myReader = cmdDataBase.ExecuteReader(); 

     while (myReader.Read()) 
     { 
      string sDEF = myReader["DEFECT_91"] as String; 
      txtNcm.Text = sDEF; 
     } 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 
+2

如果您調試代碼,什麼是包含在「sDEF」?正確的價值? –

+0

*「我似乎無法弄清楚如何採取在組合框中選擇的項目」 * - 使用:'(發件人爲組合框).SelectedItem'。 –

回答

1

你的SQL命令文本包含空格前後ddDefect的值之後。和

....DESCP_91= ' " + ddDefect.Text + " ';"; 
       ^     ^

這些空間將被原樣傳遞到數據庫引擎,除非你在數據庫列(CHAR/NCHAR)與列周圍的值時,這些確切的空間非常具體的數據類型,該命令將從未找到任何數據。

但是,這不是你的問題的結束。以這種方式連接字符串是衆所周知的問題來源。如果ddDefect.Text包含單引號會怎麼樣?另一個語法錯誤。那麼存在Sql Injection vulnerability這個非常嚴重的安全問題。

所以,你應該使用參數化查詢這樣

string constring = "Data Source=TS-ERP01;Initial Catalog=Touchstn02;Integrated Security=True"; 
string Query = "select * from Defect_Codes Where DESCP_91= @ds91"; 
using(SqlConnection conDataBase = new SqlConnection(constring)) 
using(SqlCommand cmdDataBase = new SqlCommand(Query, conDataBase)) 
{ 
    try 
    { 
     conDataBase.Open(); 
     cmdDataBase.Parameters.Add("@ds91", SqlDbType.NVarChar).Value = ddDefect.Text; 
     using(SqlDataReader myReader = cmdDataBase.ExecuteReader()) 
     { 
      while (myReader.Read()) 
      { 
       string sDEF = myReader["DEFECT_91"].ToString(); 
       txtNcm.Text = sDEF; 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 
} 

還要注意的SqlConnection,SqlCommand的和SqlDataReader的都是一次性的對象,因此,你應該儘量使用語句可以肯定,這些對象始終使用免費獲得的非託管資源在他們的工作(特別是SqlConnection對象)

+1

工作就像一個魅力 - 你們是驚人的。也感謝您爲安全性添加的提示和代碼 - 非常感謝! –

相關問題