2009-08-10 5 views
2

J'utilise Enterprise Library 4.1.EntLib IDisposable conversion

Alors que je suis en cours d'exécution du code en utilisant:

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

Je reçois l'erreur suivante:

Type Microsoft.Practices.EnterpriseLibrary.Data.Database utilisé dans une instruction à l'aide doit être convertible implicitement System.IDisposable

Quel est le problème exact d'avoir en utilisant déclaration ici?

Répondre

2

Vous ne gagnez rien en ayant réellement l'utilisation (et comme vous l'avez noté, il ne compilera pas réellement). En recouvrant vos instructions «using» de code de création d'objet, vous vous assurez que l'objet que vous avez créé est éliminé lorsque le bloc «using» est fermé. Cela n'a de sens que pour un objet implémentant IDisposable, car les autres types ne peuvent pas être explicitement éliminés.

Vous pouvez supprimer en toute sécurité votre utilisation de bloc et finir avec ceci:

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

Si DbCommand implémente IDisposable (je ne suis pas sûr, avoir jamais utilisé DAAB de EntLib), vous pouvez envelopper simplement cette partie du code dans un bloc en utilisant:

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

DbCommand DOES implémenter IDisposable – Coops

1

Microsoft.Practices.EnterpriseLibrary.Data.Database ne met pas en œuvre IDisposable, ce qui est une exigence pour la using statement.

L'objet DbCommand implémente IDisposable, il est donc préférable de l'utiliser dans l'instruction using à la place.

+0

oh! Je me demande ... Alors, comment fonctionne la collection Garbage pour EntLib Base de données? – user146584

+0

La récupération de place fonctionne sur Base de données comme tout autre objet géré. Quand il n'est plus utilisé, il sera collecté pendant le traitement GC normal. Je ne peux pas dire à partir de votre extrait où _db est déclaré. Par le nom de la variable, je suppose au niveau de la classe. Si c'est le cas, alors _db devrait être collecté après que la classe dans laquelle elle a été déclarée ne soit plus référencée. DbCommand est l'objet que vous voulez concentrer dès que possible lorsque vous n'en avez plus besoin. L'instruction "using" est donc parfaitement appropriée. –

Questions connexes