2009-08-09 6 views
0

私はEntLib 4.1を使用しています。タスクを実行した後明示的な閉鎖が必要ですか?

_db = DatabaseFactory.CreateDatabase("DbName"); 
DbCommand dbCommand = _db.GetStoredProcCommand("someProcedure"); 
_db.AddInParameter(dbCommand, "Id", DbType.Int32, id); 
result = _db.ExecuteNonQuery(dbCommand); 

私のような、_dbオブジェクトを配置する必要があります:

finally 
{ 
    _db = null; 
} 

...またはEntLib Frameworkは、自動的にそれを扱うのだろうか?

+0

変数を明示的にnullに設定する必要はほとんどありません。参照:http://blogs.msdn.com/b/csharpfaq/archive/2004/03/26/97229.aspx –

答えて

2

_db = nullを実行しても、オブジェクトは破棄されません。

_db.Dispose()を実行するか、usingブロックを使用する必要があります。

ガベージコレクションでは、オブジェクトは非決定的な時間に処分されますが、IDisposableを実装するオブジェクトを作成するとすぐに必ずDispose()を呼び出してください(もちろん、オブジェクトまたはそれを行うことを約束する別の機能)。

この場合、工場でオブジェクトの処理が完了したことを知る方法がないことが分かりやすいので、自分で処分する必要があります。

0

オブジェクトがスコープから外れると、ガベージコレクションによってオブジェクトが破棄されます。だからあなたのコードはうまくいくが、これは最善の解決策ではない。

データベースオブジェクトの作成をusingステートメントに配置する方がよいでしょう。

3

私はこれが古代の歴史だと知っていますが、私はこれらの答えを残すことはできません。

データベースインスタンスを削除する必要はありません。それはIDisposableを実装していません。

doは、作成した明示的なDbCommandオブジェクトを処分する必要があります。

関連する問題