2009-08-10 3 views
2

Ich verwende Enterprise Library 4.1.EntLib IDisposable Konvertierung

Während ich den Code bin Ausführung unter Verwendung von:

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

ich folgende Fehlermeldung erhalte:

Microsoft.Practices.EnterpriseLibrary.Data.Database Typ in einer using-Anweisung verwendet wird, muss System.IDisposable

implizit konvertierbar sein Was ist das genaue Problem von USING Aussage hier?

Antwort

2

Sie erhalten nichts, indem Sie tatsächlich die Verwendung (und wie Sie bemerkt haben, wird es nicht tatsächlich kompilieren).

Wenn Sie Ihren Objekt-Erstellungscode "using" -Anweisungen einpacken, stellen Sie sicher, dass das von Ihnen erstellte Objekt gelöscht wird, wenn der Block "using" beendet wird. Es ist nur für Objekte sinnvoll, die IDisposable implementieren, da andere Typen nicht explizit disponiert werden können.

Sie können mit Block sicher entfernen und damit am Ende:

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

Wenn DbCommand implementiert IDisposable (Ich bin nicht sicher, nachdem DAAB nie benutzt EntLib der), dann mögen Sie vielleicht nur diesen Teil wickeln des Codes in einem mit Block:

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

DbCommand Implementiert IDisposable – Coops

1

Microsoft.Practices.EnterpriseLibrary.Data.Database nicht implementiert IDisposable, die eine Voraussetzung für die using statement ist.

Das Objekt DbCommand implementiert IDisposable, daher ist es möglicherweise sinnvoller, stattdessen das in der using-Anweisung zu verwenden.

+0

oh! Ich frage mich ... Dann, wie die Garbage Collection für EntLib Datenbank funktioniert? – user146584

+0

Die Speicherbereinigung funktioniert genauso wie jedes andere verwaltete Objekt in der Datenbank. Wenn es nicht mehr verwendet wird, wird es während der normalen GC-Verarbeitung gesammelt. Ich kann nicht aus Ihrem Schnipsel sagen, wo _db deklariert ist. Durch den Variablennamen würde ich auf Klassenebene annehmen. Wenn das so ist, dann sollte _db irgendwann nach der Klasse, auf die es deklariert wurde, nicht mehr referenziert werden. DbCommand ist das Objekt, auf das Sie sich so schnell wie möglich konzentrieren möchten, wenn Sie es nicht mehr brauchen, also ist die Anweisung "using" definitiv dafür geeignet. –

Verwandte Themen