2016-12-20 2 views
0

Ma fonction ressemble à celle ci-dessous. Ma question est: avons-nous besoin de fermer cmd dans cette fonction. Ma compréhension est la bibliothèque d'entreprise ferme automatiquement la connexion après l'utilisation.Avons-nous besoin de fermer DbCommand dans la bibliothèque d'entreprise 4.1?

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

D'où vient cette compréhension? L'avez-vous lu dans la documentation? C'est une bonne idée de fermer des choses comme des connexions de base de données explicitement lorsque vous avez terminé avec eux. – Shadow

Répondre

0

Database.GetStoredProcCommand retourne un IDbCommand qui implémente IDisposable. En général, si un objet implémente IDisposable, il doit être supprimé lorsque l'objet n'est plus nécessaire. En fait, si vous appelez les méthodes de la bibliothèque d'entreprise qui ne prennent pas de commande, elles vont construire une commande et la mettre au rebut. par exemple.

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

Votre compréhension Enterprise Library est correcte - la connexion sera fermée lors de l'appel d'un des Database.Execute * méthodes (par exemple ExecuteDataSet). Ainsi, ne pas disposer de l'objet de commande n'entraînera pas de connexions de base de données orphelines. Cependant, cela peut entraîner un autre type de fuite en fonction du fournisseur de base de données. En termes de SQL Server, la dernière fois que j'ai regardé SqlCommand, il n'y avait aucun dommage évident si l'objet n'était pas éliminé et le seul problème que je me souviens avoir vu était le cache de paramètre devrait attendre jusqu'à ce que garbage collection soit libéré .