2012-08-20 5 views

risposta

2

Per quello che so, quando Dispose() metodo viene chiamato, Close() viene eseguita automaticamente.
Quindi db.Close(); non è necessario qui.

1

Alla staffa di chiusura viene chiamato Dispose().

Penso che nel metodo DbConnection il metodo Dispose verificherà anche se la connessione è chiusa. Quindi no, probabilmente non è necessario, ma personalmente penso che sia una buona pratica e migliora la leggibilità e non influisce sulle prestazioni perché il Close sarà chiamato in un modo o nell'altro.

9

È necessario chiudere un collegamento Db se viene utilizzata una clausola using?

No, non è necessario chiudere un DbConnection se si utilizza una clausola using?

e

Sì, è inutile qui perché quando si utilizza una connessione estremità disporrà nel senso di chiusura e rilasciando tutta la memoria.

Poiché l'interfaccia DBConnection implementa l'interfaccia IDisposable, la funzione di chiusura è presente nel metodo Dispose di DBConnection.

Ma se alcune linee sono dopo la chiusura linea, allora è utile

using (DbConnection db = GetDbConnection()) 
{ 
    // do data-access stuff 
    // ... 

    db.Close(); //Useless 
} 

Ma qui è utile

using (DbConnection db = GetDbConnection()) 
{ 
    // do data-access stuff 
    // ... 

    db.Close(); //Useful 

// Some more code 
} 

In questo caso si può fare

using (DbConnection db = GetDbConnection()) 
{ 
    // do data-access stuff 
    // ... 

} 

// Some more code which was previously inside using section. 
+3

+1 per un bel progetto di chiudere manualmente nel caso esista un maggior numero di codice che non utilizza la connessione. Tuttavia in tal caso è meglio non includere quel codice nel blocco using. – Aphelion

+0

@Anfelione: sì, sicuramente il codice sotto il Close() non dovrebbe essere nel blocco – CJ7

+0

Perché qualche altro codice sotto db.CLose() è utile? –

1

codice Estratto dall'implementazione di disposi dello SqlConnection (derivato da DbConnection) cl ass:

public void Dispose() 
{ 
    Dispose(true); 
} 

protected override void Dispose(bool disposing) 
{ 
    if (disposing) 
    { 
    this.Close(); 
    } 
    base.Dispose(disposing); 
} 

Il using parola chiave utilizza l'interfaccia IDisposable. Il metodo sopra è l'implementazione del metodo. Chiuderà la connessione.

4

solo per essere sicuri ho controllato il codice :)

protected override void Dispose(bool disposing) 
    { 
     if (disposing) 
     { 
     this._userConnectionOptions = (DbConnectionOptions) null; 
     this._poolGroup = (DbConnectionPoolGroup) null; 
     this.Close(); 
     } 
     this.DisposeMe(disposing); 
     base.Dispose(disposing); 
    } 

Questa è l'implementazione di SqlConnection che si eredita da DbConnection.Come potete vedere c'è questo metodo.() :)

+0

Mi stavo chiedendo qui, l'istruzione 'using' chiama' Dispose() 'o' Dispose (bool disposing) ' –

+0

@Aphelion: pls potresti rispondere anche a questo? –

+0

@CuongLe Chiamerà 'Dispose()' che è pubblico. La sua implementazione chiamerà 'Dispose (true)'. – Aphelion