3

DBに接続してDataTableを取得するSQLクラスがあります。終了時にSqlConnectionを破棄する必要があることを認識しています。usingこれはブロックを使用して実行できることは知っていますがDispose()、このクラスのデストラクタ内に呼び出しを配置することもできますか?

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が必要です。この音は練習ですか?

4

3 に答える 3

8

SqlConnectionあなたのデザインは、(おそらく開いている)ものに長時間ぶら下がることを奨励しています。ベストプラクティスは、必要になる直前に接続を開き、終了したらすぐに解放(閉じて破棄)することです。

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

于 2012-04-12T02:27:24.043 に答える
1

エンタープライズライブラリのソース(MS Patterns&Practicesチームから)を見ると、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();
}

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

于 2012-04-12T02:37:21.437 に答える
0

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

DbConnectionを適切に廃棄する

これが良い習慣であるかどうかについては、SQL接続を別のクラスでラップしているとしたら、何を達成しているのかわかりません。すべてのメソッドは引き続きこのクラスのインスタンスにアクセスする必要があります。その場合、メソッドはそれ自体で接続オブジェクトのインスタンスにアクセスできます。

于 2012-04-12T02:27:15.437 に答える