2014-02-24 3 views
0

Я хочу получить имена, связанные с состояниями, которые я выбираю в своей программе. Ниже приведен код, который у меня есть. Моя база данных имеет несколько местоположений в состоянии, которое имеет разные контакты. Я просто хочу выбрать государство и приобрести всех в этом состоянии. Спасибо за помощь!Получить имена ForEach Проверенный элемент в Контрольном списке

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