2013-11-10 2 views
1

Я строю приложение WF «Информационный бюллетень», чтобы отправить электронную почту для выбранных групп рассылки, которые создаются из этого приложения и хранятся в базе данных .sdf, который SQL Server Compact Edition, встроенные в Visual Studio 2012.асинхронные операции на базе

На данный момент я выполнял это приложение, запущенное в основном потоке, но это не тот подход, который следует использовать с базами данных, я хотел бы делать все операции с базой данных асинхронно. Я прочитал несколько подходов, но я никогда их не использовал и озадачен.

Для госзакупок, кто интересуется, как DB и отношения похожи на считанные квадратные скобки под:

В настоящее время есть 2 таблицы:

  1. Emails (INT UniqueID, строка E-mail)
  2. Groups (int ID, строка Grupa)

PK в 1-й таблице UniqueID+Email и на втором ID+string, в 2-й таблице FK к таблице 1 - ID, и она соединяется с UniqueID.

Я собираюсь добавить 3-ю таблицу ExistingGroups с 1 колонкой ExstGroup и он будет связан с таблицей 2, где Grupa будет FK к ExistingGroups и это третья таблице будет хранить имена всех групп в нашей базе данных и будет использоваться для динамического создания флажков (хранится в checkedListBox?), когда приложение запускается, оно будет запущено в событии FormLoad. Предположим, исправьте меня, если я ошибаюсь

Я хотел бы использовать ADO.net-подключенный уровень, поэтому несколько вопросов:

  1. Где shoul d Я устанавливаю соединение с базой данных (conn.Open()) во время события Form_Load? И должен ли я проверить, открыто ли это соединение? B4 пытается выполнить любую операцию в БД?

  2. Вот фрагмент кода для получения писем из БД и вставки его в хэшсет для передачи этих сообщений SendingEmail. Как бы вы изменили его на асинхронный?

    // CheckedEmails is Form variable to store emails from groups which where checked on checkboxes. 
    HashSet<string> CheckedEmails = new HashSet<string>(); 
    
    private HashSet<string> ListOfEmails() 
    { 
         CheckedEmails.Clear(); 
    
         Queue<string> checkBoxes = new Queue<string>(); 
         if (IT_checkbox.Checked) //checking all checkboxes this way.. 
         { 
          checkBoxes.Enqueue(IT_checkbox.Text); 
         } 
    
         SqlCeCommand cmd = conn.CreateCommand(); 
    
         while (checkBoxes.Count() != 0) 
         { 
          cmd.CommandText = string.Format("Select Email FROM Emails INNER JOIN Groups ON Emails.UniqueID=Groups.ID WHERE Groups.Grupa='{0}' ", checkBoxes.Dequeue()); 
          SqlCeDataReader dr = cmd.ExecuteReader(); 
    
          while (dr.Read()) 
          { 
           CheckedEmails.Add((string)dr["Email"]);//adding emails fromcheckedgroups 
          } 
          dr.Close(); 
         } 
         return CheckedEmails; 
    } 
    

2A) Давайте предположим, что эта операция на БД является дорогостоящим и занимает некоторое время, как бы предотвратить пользователя от выполнения, эту операцию БД много раз, или другие операции над БД (например, добавление нового Электронной почты), пока эта операция выполняется?

3.Can Я использую что-то, чтобы сообщить пользователю, что в настоящее время выполняется работа над БД, например, индикатор выполнения или изменение курсора мыши на Загрузка? И как?

Спасибо всем за вашу помощь заранее, я старался быть как можно точнее, но если что-то непонятно, спросите.

+0

Я написал что-то против правил SO? Если да, то скажите мне – MeIsNoob

+0

для номера 3: попробуйте добавить контрольный элемент progressbar с вашим проектом, значения которого увеличиваются по мере продвижения вашего цикла while. –

+0

Просто используйте компонент Backgroundworker – ErikEJ

ответ

0

2) Вы можете использовать async и ждать функции;)

Смежные вопросы