2013-07-09 18 views
16

これは有名な話題の1つですが、あなたの知識、意見、現在の習慣に基づいて、次のシナリオを設定する最善の方法は何ですか?C#データ接続のベストプラクティス?

私は広範なデータ入力アプリケーションを構築しています。広範囲に渡って、私はプログラム全体の約15〜25%を組み込んでいる基本設定しか持っていないということです。 (彼らはまだ仕事が必要です)私はバックエンドデータベースとして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); 
      } 
     } 

それから私は単に私がへのアクセスを必要とするデータベースに対応オープン接続メソッドを呼び出した後、最終的には声明の中で、それを閉じます。このようにして、接続が必要なときに、非常に長く開いてしまうことはありません。もちろんこれは、オープンな接続方法の呼び出しがたくさんあることを意味します。これは、この種のシナリオを実装する最善の方法ですか、より良い方法がありますか?

フォームがロードされるとすぐに接続を開いて、フォームが閉じたときに接続を閉じるほうがよいでしょうか?私は一度に複数のフォームが開いているインスタンスを持っており、それぞれがデータベースとのオープンな接続を必要としている可能性があるので、もしそれを閉じると他のフォームは正しくねじ込まれるでしょうか?または、アプリケーションの起動時に両方のデータベースへの接続を開く必要がありますか?どんな入力も感謝します。ありがとう。

+1

Using the Statement http://stackoverflow.com/q/212198/1193596 – Amicable

答えて

51

接続は.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.  
     { 
      ... 
     { 
    } 
} 

こうすることで、リソースが閉鎖され、例外がスローされた場合でも、処分されます。

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

+0

ありがとうございました。私は、usingステートメントを追加し、接続を作成するよりクリーンで効率的な方法として、開いている接続メソッドを削除することを検討してきました。ちょうど私のコードのいくつかの掃除をすることに慣れていない。テストのためにtry/catchメソッドを使用するだけです。 –

-10

あなたはアプリケーションの起動時にそれらを開く方が良いと思いますが、あなたのデータベースのものが必要なのでしょうか?私はこれについて専門家ではなく、私の意見です。メインフォームの先頭に接続します。別の接続を作成した唯一のフォームはログインフォームでした。

+7

投機的な回答を投稿しないでください。実際にMicrosoftが推奨するベストプラクティスがあります。 – Mgetz

+0

@Mgetzあなたはこのことが正しかったと思っています。私はそれに従うべきだと確信しています。それらを取り除く重要なことは、それが標準であるという理由だけで、あなたのソフトウェアシステムに合ったものにならないということです。これがあなたのシステムをより良くするなら、それはどうでしたか?それははるかに良い議論を引き起こすだろう。私は実行が完了するまで、開いているデータベース接続で書いたいくつかのアプリケーションがありますが、正当な理由があります。 –