25

わかりました、これはそのような独断的なトピックの 1 つですが、あなたの知識、意見、および現在の慣行に基づいて、次のシナリオを設定するための最良の方法は何ですか?

私は大規模なデータ入力アプリケーションを構築しています。大規模とは、プログラム全体の約 15 ~ 25% を組み込んだ基本的なセットアップしかなく、部分的にセットアップされたフォームが約 15 あることを意味します。(彼らはまだ作業が必要です) 私はバックエンド データベースとして SQL Compact 4.0 を使用しています。MMO に相当するデータを格納していないため、これ以上拡張性の高いデータベースは実際には必要ありません。現時点では、これはローカル アプリケーションのみです。 .

メニューシステムに基づいてさまざまなページに変更される単一のウィンドウとして表示されるように設定できるようにしたいと思っていますが、それがどのように達成されるかについての良いチュートリアルが見つからないようです。どなたかご存知の方、教えてください。

ただし、問題のシナリオは、データベースへの接続方法です。私は 2 つの SQLCE データベースを使用しています。1 つはサービスとスタッフに基づく定数データを格納するデータベースで、もう 1 つは常に変化するデータまたは最初のデータベースに基づいて入力された新しいデータを格納するデータベースです。これを設定する方法についてさまざまな方法を見てきましたが、現在、他のすべてのフォームが継承する BaseForm がある方法を使用しています。BaseForm 内には、多くのフォームに共通のメソッドと変数があるため、繰り返されるコードの量が最小限に抑えられます。

これには、両方のデータベースへの接続文字列と、いずれかへの接続を開く 2 つのメソッドが含まれます。そのようです:

internal SqlCeConnection dataConn = new SqlCeConnection(@"Data Source = |DataDirectory|\opi_data.sdf");
internal SqlCeConnection logConn = new SqlCeConnection(@"Data Source = |DataDirectory|\opi_logs.sdf");
internal SqlCeCommand command;

internal void openDataConnection() // Opens a connection to the data tables 
        {
            try
            {
                if(dataConn.State == ConnectionState.Closed)
                    dataConn.Open();
            }
            catch(SqlCeException ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        internal void openLogConnection() // Opens a connection to the log tables
        {
            try
            {
                if(logConn.State == ConnectionState.Closed)
                    logConn.Open();
            }
            catch (SqlCeException ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

次に、接続を開く必要があるときはいつでも、アクセスする必要があるデータベースに対応する open connection メソッドを呼び出してから、finally ステートメントでそれを閉じます。このようにして、必要なときに接続が長時間開かれることはありません。もちろん、これはオープン接続メソッドへの呼び出しが多いことを意味します。これは、この種のシナリオを実装するための最良の方法ですか、それともより良い方法はありますか?

フォームが読み込まれたらすぐに接続を開き、フォームが閉じたら閉じた方がよいでしょうか? 一度に複数のフォームが開いているインスタンスがあり、それぞれがおそらくデータベースへの開いた接続を必要とするため、1 つを閉じると他のフォームはうまくいかないでしょうか? または、アプリケーションの起動時に両方のデータベースへの接続を開く必要がありますか? 任意の入力をいただければ幸いです。ありがとう。

4

1 に答える 1

77

接続は .NET によってプールされるため、通常、それらを再作成することは高価な操作ではありません。ただし、接続を長時間開いたままにしておくと、問題が発生する可能性があります。

ほとんどの「ベスト プラクティス」では、できるだけ遅く (SQL を実行する直前に) 接続を開き、できるだけ早く (データの最後のビットが抽出された直後に) 接続を閉じるように指示しています。

これを自動的に行う効果的な方法は、usingステートメントを使用することです。

using (SqlConnection conn = new SqlConnection(...))
{
    using(SqlCommand cmd = new SqlCommand(..., conn))
    {
        conn.Open();
        using(DataReader dr = cmd.ExecuteReader())  // or load a DataTable, ExecuteScalar, etc.    
        {
             ...
        {
    }
}

そうすれば、例外がスローされた場合でも、リソースは閉じられ、破棄されます。

要するに、アプリが開いたとき、または各フォームが開いたときに接続を開くことは、おそらく最善の方法ではありません。

于 2013-07-09T16:22:11.533 に答える