Я строю приложение WF «Информационный бюллетень», чтобы отправить электронную почту для выбранных групп рассылки, которые создаются из этого приложения и хранятся в базе данных .sdf
, который SQL Server Compact Edition, встроенные в Visual Studio 2012.асинхронные операции на базе
На данный момент я выполнял это приложение, запущенное в основном потоке, но это не тот подход, который следует использовать с базами данных, я хотел бы делать все операции с базой данных асинхронно. Я прочитал несколько подходов, но я никогда их не использовал и озадачен.
Для госзакупок, кто интересуется, как DB и отношения похожи на считанные квадратные скобки под:
В настоящее время есть 2 таблицы:
Emails
(INT UniqueID, строка E-mail)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-подключенный уровень, поэтому несколько вопросов:
Где shoul d Я устанавливаю соединение с базой данных (conn.Open()) во время события Form_Load? И должен ли я проверить, открыто ли это соединение? B4 пытается выполнить любую операцию в БД?
Вот фрагмент кода для получения писем из БД и вставки его в хэшсет для передачи этих сообщений
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 Я использую что-то, чтобы сообщить пользователю, что в настоящее время выполняется работа над БД, например, индикатор выполнения или изменение курсора мыши на Загрузка? И как?
Спасибо всем за вашу помощь заранее, я старался быть как можно точнее, но если что-то непонятно, спросите.
Я написал что-то против правил SO? Если да, то скажите мне – MeIsNoob
для номера 3: попробуйте добавить контрольный элемент progressbar с вашим проектом, значения которого увеличиваются по мере продвижения вашего цикла while. –
Просто используйте компонент Backgroundworker – ErikEJ