重複の可能性:
Close and Dispose - どちらを呼び出すか?
私のデータ層の関数の多くはtry-catch
orusing
句で保護されていません。
私の GUI レイヤーにはtry-catch
節があります。これで十分でしょうか?
dbConnection
例外が発生した場合、 およびその他のオブジェクトが破棄されて閉じられることに依存できますか? GUI レイヤーが例外を処理します。
重複の可能性:
Close and Dispose - どちらを呼び出すか?
私のデータ層の関数の多くはtry-catch
orusing
句で保護されていません。
私の GUI レイヤーにはtry-catch
節があります。これで十分でしょうか?
dbConnection
例外が発生した場合、 およびその他のオブジェクトが破棄されて閉じられることに依存できますか? GUI レイヤーが例外を処理します。
これで十分でしょうか?
いいえ。経由を除いて、何も自動的に破棄されることはありませんusing
。オブジェクトがスコープ外に出た場合、オブジェクトは収集されません。ガベージ コレクションは後で断続的に発生し、非決定論的です。
接続を作成している場合は、using
それが不可能でない限り (非同期コールバックなど) を使用します。そうしないと、多くの開いている接続オブジェクトがぶら下がったままになり、サーバーが飽和状態になる可能性があります。
おそらくそれができるかもしれませんが、それが良い考えであるとは限りません。
一般に、DB 接続を処理するためのロジックの前後にtry-catch-finally
句 (または) を使用することは間違いありません。using
これは、あなたが尋ねている理由でより安全になるだけでなく、物事がうまく処理されていることがより明確になり、後で GUI レイヤーで何かを変更することを決定した場合に、誤って何かを台無しにすることが難しくなります。 .
このタイプのロジック (およびインスタンスの作成と破棄) は、できるだけ必要な場所で処理する必要があります。
注:Finally
句を使用すると、接続が閉じられていることを確認できますが、必要な場合は、例外を「バブルアップ」させます。
既に述べたように、ガベージ コレクションはスコープ外に出る変数とは無関係です。DbConnection の close と dispose に関する限り、SqlConnection の場合は Dispose を呼び出すと、接続を閉じてから破棄します。ただし、明示的に閉じてから破棄する必要があるプロバイダーは他にもあります。たとえば、ODP.Net の OracleConnection では、Dispose は接続を閉じません。
DbConnection は抽象クラスであり、実際の動作に関しては具象クラスに完全に依存していることを理解する必要があります。