对数据库的异步操作

时间:2013-11-10 21:30:42

标签: c# .net winforms asynchronous sql-server-ce

我正在构建一个WF应用程序" Newsletter"向选定的电子邮件组发送电子邮件,这些电子邮件组是从此应用程序创建的,并存储在Visual Studio 2012中内置的.sdf数据库(SQL Server Compact Edition)中。

截至目前,我在Main主机上运行了这个应用程序,但这不是应该与数据库一起使用的方法,我想异步地对数据库进行所有操作。我读过很少的方法,但我从未使用它们而且感到困惑。

对于那些对数据库和关系如何感兴趣的人来说,请阅读下方的方括号:

截至目前,共有2个表格:

  1. Emails(int UniqueID,string Email)
  2. Groups(int ID,string Grupa)
  3. 第一个表格中的PK是UniqueID+Email,第二个ID+string中的PK,第二个表格FK到表格1 ID,它连接到UniqueID

    我将添加带有ExistingGroups的第3个表格和1列ExstGroup,它将与表格2相关联,其中Grupa将是FK到ExistingGroups这个第3个表将存储我们数据库中所有组的名称,并将用于动态创建复选框(存储在checkedListBox?),当应用程序启动时,它将在FormLoad事件中触发,我猜想,如果我错了,请纠正我

    我想使用ADO.net连接层方法,所以这里有几个问题:

    1. 在Form_Load事件期间,我应该在哪里建立与数据库的连接(conn.Open())?我应该检查这个conn是否打开b4试图在DB上执行任何操作?

    2. 以下是从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;
       }
      
    3. 2A)让我们假设这个DB上的操作成本高昂并且需要一些时间,我将如何阻止用户执行此操作,多次在DB上执行此操作,或者在此操作处于此操作时对DB上的其他操作(如添加新电子邮件)进度?

      3.我可以使用一些东西让用户知道DB上的操作当前正在运行,就像一些进度条或将鼠标光标更改为Loading?怎么样?

      提前感谢大家的帮助,我尽可能地准确,但如果有任何不可理解的地方请问。

1 个答案:

答案 0 :(得分:0)

2)你可以使用async和await功能;)