2014-02-24 94 views
0

我想獲取與我在我的程序中選擇的狀態相關的名稱。以下是我目前擁有的代碼。我的數據庫在一個狀態中有多個位置,具有不同的聯繫人。我只想選擇一個州,並在該州獲得所有人。謝謝您的幫助!在Checkedlistbox中獲取每個檢查的項目

con = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=F:\\Database\\LocNo.accdb"); 
con.Open(); 

foreach (Object c in checkedListBox2.CheckedItems) 
{ 
    if (checkedListBox2.GetItemCheckState(checkedListBox2.Items.IndexOf(c)) == CheckState.Checked) 
    { 
     str1 += c.ToString() + ","; 
     flag = 1; 
    } 
} 

i = 0; 
allSelectedtypestring = ""; 
allSelected = str1.Split(','); 


while (allSelected.Length - 1 > i) 
{ 
    str = "select c1 from table where state ='" + allSelected[i++] + "'"; 
    cmd = new OleDbCommand(str, con); 
    dr = cmd.ExecuteReader(); 

    dr.Read(); 
    allSelectedtypestring += dr.GetString(11); 
} 

label30.Text = Convert.ToString(allSelectedtypestring); 
con.Close(); 
+0

如果用戶在「CheckedListBox」中選擇了多個項目,您希望做什麼?您是否想要返回分配給這些州的所有聯繫人的彙總列表,或者是否想要檢索另一個州的聯繫人? – Markus

+0

好問題,我只想要一個聚合。每個人都在那個州。無論哪一個最簡單。 –

回答

2

您可以使用下面的代碼來檢索聯繫人:

var states = new List<string>(); 
foreach (Object c in checkedListBox2.CheckedItems) 
{ 
    states.Add(c.ToString()); 
    flag = 1; // Can also be substituted by states.Count > 0 
} 

using(var con = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=F:\\Database\\LocNo.accdb")) 
{ 
    con.Open(); 
    using(var cmd = con.CreateCommand()) 
    { 
     var paramIndex = 0; 
     var paramClause = new System.Text.StringBuilder(100); 
     foreach(var state in states) 
     { 
      if (paramClause.Length > 0) 
       paramClause.Append(", "); 
      paramClause.Append("?"); 
      var paramName = "State" + (paramIndex++).ToString(); 
      cmd.Parameters.AddWithValue(paramName, state); 
     } 
     var paramsClause = string.Join(", ", cmd.Parameters. 
     cmd.CommandText = "select distinct c1 from table where state IN (" + paramsClause.ToString() + ")"; 
     using(var rdr = cmd.ExecuteReader()) 
     { 
      var contacts = new List<string>(); 
      while(rdr.Read()) 
      { 
       contacts.Add(rdr.GetString(0); 
      } 
      label30.Text = string.Join(", ", contacts); 
     } 
    }   
} 

請注意,我已經做了以下修改:

  • 新增using陳述可靠地處理連接,命令和讀者。
  • 使用List<string>作爲收集選定狀態的更方便的方法。
  • 將DISTINCT添加到SELECT以過濾重複條目。
  • 在命令文本中使用了一個參數以避免SQL注入攻擊。儘管這種在IN子句中使用參數的方法適用於SQL Server,但我還沒有檢查它是否也適用於Access數據庫。如果它不起作用,請在評論中告訴我。
+0

無視,這是我的錯誤。這完美的作品!我要測試更多的東西。謝謝!! –

+0

最後一個問題,當我選擇多於1個狀態時,結果爲空。有什麼建議麼? –

+0

@hexc:可能是Access不喜歡我爲IN提供參數的方式。我更新了我的帖子。 – Markus

相關問題