2016-12-20 13 views
0

私の機能は以下のようになります。私の質問です:この関数でcmdを閉じる必要がありますか?私の理解は、エンタープライズライブラリは、使用後に自動的に接続を閉じます。エンタープライズライブラリ4.1でDbCommandを閉じる必要がありますか?

const String STORED_PROCEDURE_NAME = "LTR_GetLicenseDetails"; 
    const string DB_CONNECTION_NAME = "LTRDB"; 
    MSPData.Database db; 
    DbCommand cmd = null; 

    db = CreateDatabase(DB_CONNECTION_NAME); 
    DataSet ds; 

    try 
    { 
     //Need to close cmd in enterprise libra 
     cmd = db.GetStoredProcCommand(STORED_PROCEDURE_NAME); 

     ds = ExecuteDataSet(db, cmd); 
    } 
    catch (Exception ex) 
    { 
     thrown ex; 
    } 
+0

この理解はどこから得られますか?あなたはドキュメンテーションでそれを読んだことがありますか?データベース接続のような作業を終えると、明示的にデータベース接続を閉じることをお勧めします。 – Shadow

答えて

0

Database.GetStoredProcCommandIDisposableを実装IDbCommandを返します。一般に、オブジェクトがIDisposableを実装する場合は、オブジェクトが不要になったときにオブジェクトを削除する必要があります。

実際、コマンドを実行しないEnterprise Libraryメソッドを呼び出すと、コマンドを作成して破棄します。例えば

public virtual DataSet ExecuteDataSet(string storedProcedureName, 
             params object[] parameterValues) 
{ 
    using (DbCommand command = GetStoredProcCommand(storedProcedureName, parameterValues)) 
    { 
     return ExecuteDataSet(command); 
    } 
} 

エンタープライズライブラリのご理解は正しいです - Database.Execute *方法(例えばExecuteDataSet)のいずれかを呼び出すときに接続が閉じられます。したがって、コマンドオブジェクトを破棄しても、孤立したデータベース接続は発生しません。ただし、データベースプロバイダによっては、他の種類のリークが発生することがあります。

SqlCommandを最後に見たときに、オブジェクトが破棄されていない場合には明らかな害はありませんでした。パラメータキャッシュはガベージコレクションが解放されるまで待たなければならなかった。

関連する問題