我正在构建一个 WF 应用程序“Newsletter”,以向选定的电子邮件组发送电子邮件,这些电子邮件组是从该应用程序创建并存储在.sdf
Visual Studio 2012 中内置的 SQL Server Compact Edition 数据库中。
到目前为止,我在主线程上运行了这个应用程序,但这不是应该与数据库一起使用的方法,我想对数据库进行异步操作。我读过一些方法,但我从未使用过它们并且很困惑。
对于对 DB 和关系的外观感兴趣的人,请阅读下面的方括号:
截至目前有2个表:
Emails
(int UniqueID,字符串电子邮件)Groups
(整数 ID,字符串 Grupa)
第一个表中的 PK 在UniqueID+Email
第二ID+string
个表中,第二个表中的 FK 到表 1 中ID
,它连接到UniqueID
。
我将添加ExistingGroups
带有 1 列的第 3 个表,ExstGroup
它将与表 2 相关,Grupa
FK 将在哪里ExistingGroups
,第 3 个表将存储我们数据库中所有组的名称,并将用于动态创建复选框(存储在 checkedListBox ?)当应用程序启动时,我想它会在 FormLoad 事件中触发,如果我错了,请纠正我
我想使用 ADO.net 连接层的方法,所以这里有几个问题:
在 Form_Load 事件期间,我应该在哪里建立与数据库 (conn.Open()) 的连接?我应该检查这个 conn 是否打开 b4 试图在 DB 上执行任何操作?
这是从数据库中获取电子邮件并将其插入哈希集以将这些电子邮件传递给
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.我可以使用一些东西让用户知道数据库上的操作当前正在运行,比如一些进度条或将鼠标光标更改为正在加载?如何?
提前感谢大家的帮助,我尽量做到准确,但如果有任何不明白的地方,请询问。