2009-08-10 11 views
2

私はEnterprise Library 4.1を使用しています。EntLib IDisposable変換

私が使用してコードを実行していますが:

using ( _db = DatabaseFactory.CreateDatabase("NLayerDB")) 
{ 
    DbCommand dbCommand = _db.GetStoredProcCommand("someSPName"); 
    _db.AddInParameter(dbCommand, "Id", DbType.Int32, id); 
    result= _db.ExecuteNonQuery(dbCommand); 
} 

を私は次のエラーが発生します:usingステートメントで使用

Microsoft.Practices.EnterpriseLibrary.Data.DatabaseタイプはSystem.IDisposable

に暗黙的に変換可能でなければなりませんUSINGの正確な問題は何ですか?

答えて

2

実際に使用していることで何も得られていません(あなたが指摘したように、実際にはコンパイルされません)。

オブジェクト作成コードの "using"ステートメントをラップすると、 "using"ブロックが終了したときに作成したオブジェクトが破棄されます。他の型を明示的に処理することはできないため、IDisposableを実装するオブジェクトに対してのみ意味があります。

あなたが安全に使用してブロックを削除し、これで終わることができます。

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

たDbCommandは(私はEntLibのDAABを使用したことがない持つ、よく分からない)IDisposableインターを実装している場合、あなたはちょうどその部分をラップすることもできます

_db = DatabaseFactory.CreateDatabase("NLayerDB"); 
using (DbCommand dbCommand = _db.GetStoredProcCommand("someSPName")) 
{ 
    _db.AddInParameter(dbCommand, "Id", DbType.Int32, id); 
    result = _db.ExecuteNonQuery(dbCommand); 
} 
+0

DbCommandはIDisposableを実装しています – Coops

1

Microsoft.Practices.EnterpriseLibrary.Data.DatabaseはIDisposableを実装していない、using statementための要件である:使用してブロック内のコード。

オブジェクトはIDisposableを実装しているので、代わりにusingステートメントでそれを使用する方が適切かもしれません。

+0

oh!私は疑問に思っています...次に、EntLib データベースのガベージコレクションはどのように動作しますか? – user146584

+0

ガベージコレクションは他の管理対象オブジェクトと同様にデータベース上で動作します。それがもはや使用されなくなると、通常のGC処理の間に収集されます。 _dbが宣言されているスニペットからはわかりません。変数名では、私はクラスレベルで想定します。もしそうなら、_dbは、宣言されたクラスがもはや参照されなくなった後にいつでも収集されるべきです。 DbCommandは、不要になったときにできるだけ早く解放することに焦点を合わせたいオブジェクトです。したがって、「使用する」ステートメントが間違いなく適切です。 –

関連する問題