質問

アプリケーションの1つで使用されているデータベース接続が常に閉じているとは限らないという疑いがありました。コードを見に行きましたが、 SqlConnection オブジェクトを持つクラス DataProvider を見つけました。接続は、このクラスのコンストラクターで開かれ、その Dispose メソッドで閉じられます(開いている接続を維持するのは悪いことだと判断しないでください、それは単に私のコードではなく、とにかく質問)。 Dispose メソッドは次のように実装されます。

protected virtual void Dispose(bool disposing)
{
    if (!_disposed)
    {
        if (disposing)
        {
            if (_conn != null)
                _conn.Close();
        }

        _disposed = true;
    }
}

質問:
接続が閉じられることを常に保証しますか?
このコードは正しいですか?

_conn.Dispose()が呼び出されるべきだと思います-私は正しいでしょうか、接続を閉じないことに影響を与える可能性があります(おそらくそうではありません)

役に立ちましたか?

解決

Disposeが自動的に呼び出されることはありません。

オブジェクトのDisposeメソッドが明示的に呼び出されるか、クラスがusing()ブロックで使用されるまで、接続は閉じられません

より安全な方法は、ファイナライザでdisposeメソッドを呼び出し、Disposeメソッドが呼び出されたときにファイナライザが抑制されるようにすることです。

この記事は、パターンを実装する正しい方法を示しています

お役に立てばと思います!

Cé dric

他のヒント

conn.Dispose(); も接続を閉じますので、disposeパターンに従うように変更しても害はありません。

ただし、機能的には同等であるため、どこにも問題があるはずです。

http://msdn.microsoft .com / en-us / library / system.data.sqlclient.sqlconnection.close.aspx

  

SqlConnectionが切れた場合   スコープ、閉じられません。したがって、   明示的に閉じる必要があります   Closeを呼び出すことによる接続   廃棄する。閉じると破棄は   機能的に同等。もし   接続プーリング値   trueまたはyesに設定され、基礎となる   接続は   接続プール。一方、   プーリングはfalseまたはnoに設定されます。   サーバーへの基本的な接続は   閉じた。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top