2012-04-12 14 views
3

DBに接続してDataTableを取得するSQLクラスがあります。終了したらSqlConnectionを破棄する必要があることを認識しています。私はこれがusingブロックを使って行うことができることを知っていますが、Dispose()コールをこのクラスのデストラクタ内に置くことも可能ですか?SQL接続の廃棄

Herreが私のコードです:

public class SQLEng 
{ 

    //Connection String Property 
    //Must be set to establish a connection to the database 
    public string ConnectionString{ get; set; } 
    SqlConnection _Conn; 

    //Overridden Constructor enforcing the Connection string to be set when created 
    public SQLEng(string connectionString) 
    { 
     ConnectionString = connectionString; 
     _Conn = new SqlConnection(connectionString); 
    } 

    //ensure the SqlConnection is disposed when destructing this object 
    public ~SQLEng() 
    { 
     _Conn.Dispose(); 
    } 

    //various other methods to get datatables etc... 
} 

は基本的に私は、DBにアクセスするすべてのメソッド内SqlConnectionオブジェクトをインスタンス化するのではなく、クラス変数SqlConnectionオブジェクトを持つことを望みます。これは健全な練習ですか?

+3

デストラクタの呼び出しが保証されていません。あなたはおそらく 'SQLEng'を使い捨てにする必要があります。また、処分を処理するために_it_のユーザに依存するべきです。 –

+0

ありがとう@ m.babcock、私はYuckのアドバイスを受け取り、必要なときに接続を開いて閉じてしまうと思います。私はむしろ、他のクラスでDBアクセスが必要になるたびにDispose()を呼び出す必要はありません。単にこのクラスでまとめようとしています。 – Simon

答えて

8

あなたのデザインは、長い間(おそらく開いている)SqlConnectionに掛かっていることをお勧めします。 ベストプラクティスは、必要な直前に接続を開いて、終了したらすぐに解放(閉じて処分)することです。

はい、新しい接続の作成に伴うオーバーヘッドがあります。 connection poolingはその処理時間の多くを軽減します。さらに悪いことに、サーバー上で多くの接続を維持しています。

+0

+1、アドバイスありがとうございます。 – Simon

0

SQL接続クラスをラップする場合は、IDisposableを実装し、独自のDispose()メソッド内から接続Dispose()を呼び出します。詳細情報はこちら:これは良い習慣であるか否かを

Properly disposing of a DbConnection

- すべてのあなたのやっが別のクラスでのSQL接続をラップされている場合だけでなく、私はあなたが達成しているのかわかりません。すべてのメソッドは、このクラスのインスタンスにアクセスする必要があります。この場合、接続オブジェクトのインスタンスにアクセスすることができます。

1

(MSパターン&プラクティスチームから)エンタープライズライブラリのソースを見ると、DAABは必要に応じて接続を作成し、できるだけ早くそれを廃棄します。

public virtual int ExecuteNonQuery(DbCommand command) 
{ 
    using (var wrapper = GetOpenConnection()) 
    { 
     PrepareCommand(command, wrapper.Connection); 
     return DoExecuteNonQuery(command); 
    } 
} 

protected DatabaseConnectionWrapper GetOpenConnection() 
{ 
    DatabaseConnectionWrapper connection = TransactionScopeConnections.GetConnection(this); 
    return connection ?? GetWrappedConnection(); 
} 

だから私はこれがベストプラクティスだと言います。ほとんどの場合、接続プールに接続を戻すだけで、接続自体は実際には閉じられません。

関連する問題