2014-02-24 54 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

相关问题