.sdf
このアプリケーションから作成され、Visual Studio 2012 に組み込まれている SQL Server Compact Edition であるデータベースに格納されている、選択した電子メール グループに電子メールを送信する WF アプリケーション「ニュースレター」を構築しています。
今のところ、このアプリケーションをメインスレッドで実行しましたが、これはデータベースで使用する必要があるアプローチではありません。データベースですべての操作を非同期で実行したいと考えています。私はいくつかのアプローチについて読んだことがありますが、それらを使用したことはなく、困惑しています。
DB とリレーションがどのように見えるかに興味がある人は、下の角括弧を読んでください:
現在、2 つのテーブルがあります。
Emails
(int UniqueID、文字列 Email)Groups
(int ID、文字列 Grupa)
1 番目のテーブルの PK はUniqueID+Email
で、2ID+string
番目のテーブルは 2 番目のテーブルの FK で、テーブル 1ID
に接続されUniqueID
ます。
ExistingGroups
1 列の3 番目のテーブルを追加しExstGroup
ます。これはテーブル 2 に関連し、Grupa
FK にExistingGroups
なります。この 3 番目のテーブルは、データベース内のすべてのグループの名前を保存し、チェックボックスを動的に作成するために使用されます (checkedListBox に保存されます)。 ?) アプリケーションが起動すると、FormLoad イベントでトリガーされると思います。間違っている場合は修正してください
ADO.net 接続層アプローチを使用したいので、いくつか質問があります。
Form_Load イベント中に、どこでデータベース (conn.Open()) への接続を確立する必要がありますか? そして、この conn が DB で操作を実行しようとして b4 が開いているかどうかを確認する必要がありますか?
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 での操作が現在実行中であることをユーザーに知らせるために何かを使用できますか? そしてどうやって?
事前にご協力いただきありがとうございます。できる限り正確に説明するよう努めましたが、わからないことがあればお尋ねください。