1

.sdfこのアプリケーションから作成され、Visual Studio 2012 に組み込まれている SQL Server Compact Edition であるデータベースに格納されている、選択した電子メール グループに電子メールを送信する WF アプリケーション「ニュースレター」を構築しています。

今のところ、このアプリケーションをメインスレッドで実行しましたが、これはデータベースで使用する必要があるアプローチではありません。データベースですべての操作を非同期で実行したいと考えています。私はいくつかのアプローチについて読んだことがありますが、それらを使用したことはなく、困惑しています。

DB とリレーションがどのように見えるかに興味がある人は、下の角括弧を読んでください:

現在、2 つのテーブルがあります。

  1. Emails(int UniqueID、文字列 Email)
  2. Groups(int ID、文字列 Grupa)

1 番目のテーブルの PK はUniqueID+Emailで、2ID+string番目のテーブルは 2 番目のテーブルの FK で、テーブル 1IDに接続されUniqueIDます。

ExistingGroups1 列の3 番目のテーブルを追加しExstGroupます。これはテーブル 2 に関連し、GrupaFK にExistingGroupsなります。この 3 番目のテーブルは、データベース内のすべてのグループの名前を保存し、チェックボックスを動的に作成するために使用されます (checkedListBox に保存されます)。 ?) アプリケーションが起動すると、FormLoad イベントでトリガーされると思います。間違っている場合は修正してください

ADO.net 接続層アプローチを使用したいので、いくつか質問があります。

  1. Form_Load イベント中に、どこでデータベース (conn.Open()) への接続を確立する必要がありますか? そして、この conn が DB で操作を実行しようとして b4 が開いているかどうかを確認する必要がありますか?

  2. SendingEmail以下は、DB からメールを取得し、それをハッシュセットに挿入して、それらのメールを関数に渡すコード スニペットです。どのように非同期に変更しますか?

     // 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 での操作が現在実行中であることをユーザーに知らせるために何かを使用できますか? そしてどうやって?

事前にご協力いただきありがとうございます。できる限り正確に説明するよう努めましたが、わからないことがあればお尋ねください。

4

1 に答える 1

0

2) async および await 機能を使用できます;)

于 2013-11-12T09:46:52.397 に答える