我正在构建一个WF应用程序" Newsletter"向选定的电子邮件组发送电子邮件,这些电子邮件组是从此应用程序创建的,并存储在Visual Studio 2012中内置的.sdf
数据库(SQL Server Compact Edition)中。
截至目前,我在Main主机上运行了这个应用程序,但这不是应该与数据库一起使用的方法,我想异步地对数据库进行所有操作。我读过很少的方法,但我从未使用它们而且感到困惑。
对于那些对数据库和关系如何感兴趣的人来说,请阅读下方的方括号:
截至目前,共有2个表格:
Emails
(int UniqueID,string Email)Groups
(int ID,string Grupa)第一个表格中的PK是UniqueID+Email
,第二个ID+string
中的PK,第二个表格FK到表格1 ID
,它连接到UniqueID
。
我将添加带有ExistingGroups
的第3个表格和1列ExstGroup
,它将与表格2相关联,其中Grupa
将是FK到ExistingGroups
这个第3个表将存储我们数据库中所有组的名称,并将用于动态创建复选框(存储在checkedListBox?),当应用程序启动时,它将在FormLoad事件中触发,我猜想,如果我错了,请纠正我
我想使用ADO.net连接层方法,所以这里有几个问题:
在Form_Load事件期间,我应该在哪里建立与数据库的连接(conn.Open())?我应该检查这个conn是否打开b4试图在DB上执行任何操作?
以下是从DB获取电子邮件并将其插入hashset以将这些电子邮件传递给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)让我们假设这个DB上的操作成本高昂并且需要一些时间,我将如何阻止用户执行此操作,多次在DB上执行此操作,或者在此操作处于此操作时对DB上的其他操作(如添加新电子邮件)进度?
3.我可以使用一些东西让用户知道DB上的操作当前正在运行,就像一些进度条或将鼠标光标更改为Loading?怎么样?
提前感谢大家的帮助,我尽可能地准确,但如果有任何不可理解的地方请问。
答案 0 :(得分:0)
2)你可以使用async和await功能;)