2015-09-28 40 views
0

我正在處理我的Windows窗體應用程序。在這個winform中,我有一個checkListBox,它綁定了我的sql數據庫中的數據。我試圖將checkListBox的checkedItem匹配到我的sql表列的文本,該文本以nvarchar數據類型存儲。我運行了調試模式,發現程序執行時它跳過了整個while循環。我不知道爲什麼,因爲有價值的名稱items也確實顯示該複選框在checkListBox檢查如何讀取列SqlDataReader

這是我的代碼。

foreach(var items in checkListBox1.CheckedItems){ 

    string query = "select * from my_table WHERE employeeName = '"+items+"'" 

    SqlCommand myCommand = new SqlCommand(query, myConn); 
    SqlDataReader dr = myCommand.ExecuteReader(); 

    while(dr.Read()){ 
     //read the column  
    } 
} 

下面是截圖。我試圖在列,以獲取中國人名(不用擔心它是什麼笑)

enter image description here

+1

你可能想做一些關於SQL注入的閱讀。 – Paddy

+0

您可能需要從添加'checkedItems'到'string'的'用逗號分隔,你可以使用'SQL query'了'foreach'這樣的事情外foreach':'選擇MY_TABLE *其中employeename在(」 「+ string_used_to_add_checkedItems +」');' – Wanderer

+0

您的*查詢*生成正確嗎?查詢變量的價值是什麼,你能證明這一點嗎?我懷疑*項目*是造成問題。 – niksofteng

回答

1

您的代碼中有多個問題。您無需在ForEach循環中編寫查詢。如果您希望從checklistbox獲取多個值,那麼equalto = operator不是您的朋友,您需要使用IN運算符。現在檢查下面的例子。

private void button1_Click(object sender, EventArgs e) 
{ 
    string items = string.Empty; 

    foreach (var item in checkedListBox1.CheckedItems) 
    { 
     if (items.Length == 0) 
      items = item.ToString(); 
     else 
      items = items + "," + item;    
    } 

    //make myCommand object and open connection on your own 
    myCommand = new SqlCommand(query, myConn); 

    string query = @'select distinct firstName, lastName, chineseName, teacherEmail, entryYear, leaveYear, userLoginId, ad.applicationId 
    from [teacher_detail] as td 
    LEFT JOIN[class_detail] as cd ON td.teacherId = cd.teacherId 
    LEFT JOIN[application_teacher] as at ON at.teacherId = td.teacherId 
    LEFT JOIN[application_detail] as ad ON at.applicationId = ad.applicationId 
    Where ad.applicationId = 2 
    and chineseName in (@name)' 

    myCommand.Parameters.Add("@name", SqlDbType.nvarchar); 
    myCommand.Parameters["@name"].Value = items; 

    //now execute query 

} 
+0

這段代碼不會通過這個測試:假設我有一個叫做vardhan的男人,我立即就有一個叫做harsh的男人!兩行都被選中!現在假設DB中有第三個人,名字叫harshvardhan!即使他的名字沒有被選中/檢查,數據讀取器也會在結果中錯誤地存儲這一行 –

0

如在數據庫中的數據類型爲nvarchar是在你的代碼修改下面的語句嘗試

string query = "select * from my_table WHERE employeeName = '"+items+"'" 

string query = "select * from my_table WHERE employeeName = N'"+items.ToString()+"'" 

前綴 'N' 用於將值從檢查項目

比較
+0

在拉梅什,它說不正確的語法附近「someName」 – RedRocket

+0

@DragonBorn我測試了它,對我工作的罰款。我花了表類型爲nvarchar的列,使用checkedlistbox,也做了同樣的查詢,你和'而(dr.read())'對我來說工作很好 –

+0

@DragonBorn是你的列表框,顯示中文名字或英文名字? –