2009-09-14 9 views
9

Ho il seguente codice ado.net, se utilizzo già utilizzando per avvolgere il mio DBCommand, devo chiudere esplicitamente la connessione sottostante?Will dbCommand.Close() chiuderà anche la connessione?

Grazie,

 public static void ExecuteSQL(int Id) 
     { 
      Database db; 
      const string sqlCommand = "Stored Procedure Name"; 
      try 
      { 
       db = DatabaseFactory.CreateDatabase(); 
       using (DbCommand dbCommand = db.GetStoredProcCommand(sqlCommand)) 
       { 
        db.AddInParameter(dbCommand, "p_Id", DbType.Int32, Id); 
        db.ExecuteNonQuery(dbCommand); 
**//do I have to close connection explicitely here??** 
        if (dbCommand.Connection.State != ConnectionState.Closed) 
        { 
         dbCommand.Connection.Close(); 
        } 
        dbCommand.Connection.Dispose(); 
       } 
      } 
      catch (Exception ex) 
      { 
       Logger.Log.Error(ex.StackTrace, ex); 
       throw; 
      } 
     } 

risposta

4

Sì, se tutto quello che hai avvolto nel blocco using è il DbCommand, allora si sarà necessario chiudere esplicitamente la DbConnection, come si fa attualmente nel codice. Tuttavia, è sufficiente chiamare semplicemente Dispose. Non è necessario chiamare sia Close e Dispose.

+0

Credo che @Satya sia corretto in questo caso e la tua risposta è in realtà sbagliata. – Coops

+0

@CodeBlend: nel caso in cui qualcuno stia utilizzando Enterprise Library, allora sì, la sua risposta è corretta. Tuttavia, mentre il codice fa riferimento a classi come 'Database', il contenuto della domanda e i tag non fanno riferimento a EntLib. Di conseguenza, se le persone sono alla ricerca di una risposta alla domanda come è stato chiesto, allora sarebbe ancora corretto. –

-1

No, non lo fanno.

Quando si colpisce la fine del blocco di utilizzo, viene richiesta la disposizione.

+2

Non ho idea del motivo per cui è stato svalutato, in quanto è semplicemente sbagliato. Devi assolutamente chiudere la connessione. Questa domanda riguarda la necessità di disporre della ** connessione **, non del ** comando **. "usare" solo il comando non lo fa. –

+0

In base al commento nel suo codice e al fatto che sta chiamando esplicitamente dbCommand.Connection.Close e dbCommand.Connection.Dispose(), anche se mi chiedeva se fosse necessario poiché stava già eseguendo il wrapping del comando in un blocco using. Se chiedeva se ha ancora bisogno di chiamare qualcosa come db.Close e db.Dispose allora sei corretto al 100%. Non pensavo che fosse la sua domanda. – cptScarlet

+0

"se utilizzo già per racchiudere il mio DBCommand, devo chiudere esplicitamente la * connessione * sotto" Sembra abbastanza chiaro. –

2

http://www.willydev.net/descargas/WillyDev_EntLib_TestGuide.pdf

Il blocco applicazione chiude le connessioni al database dopo che è finito con loro. Ad esempio, l'implementazione del metodo ExecuteNonQuery include un'istruzione using. L'istruzione using ottiene risorse, esegue un'istruzione e smaltisce le risorse. In questo caso, la risorsa è la connessione al database. Nel caso del metodo ExecuteReader, il blocco dell'applicazione utilizza il metodo Command-Behavior.CloseConnection per chiudere la connessione dopo la chiusura del lettore.

+0

Quindi la risposta indicata come 'la risposta' qui è completamente sbagliata? – Coops

1

Questo post è vecchio, ma sto rispondendo di dire che sono sicuro che la connessione è chiusa se stiamo usando questo blocco con EnterpriseLibrary (i nomi di classi e metodi nel blocco di codice mi fanno pensare a questo). Il tizio che ha fatto la domanda e che ha risposto dovrebbe considerare esplicitamente se stiamo parlando di EnterbriseLibrary o no. Ho eseguito il test con un blocco finally e YES, la connessione viene chiusa automaticamente dopo l'utilizzo del blocco con DbCommand.

+0

Puoi pubblicare il codice, vorrei un esempio per dimostrare che quello che stai dicendo è corretto anche se penso che sia – Coops

Problemi correlati