2009-04-21 6 views
3

Supposons que je fais ce qui suit:ADO.NET, Fermeture d'une connexion Oracle sans validation préalable ou annulation: Fuite?

using (OracleConnection conn = new OracleConnection(connStr)) 
{ 
    OracleTransaction trans = conn.BeginTransaction(); 
    OracleCommand command = new OracleCommand(cmdTxt, conn, trans); 
    // this statement is executed in a transaction context: 
    command.ExecuteNonQuery(); 
} 
// the using statement will dispose and thus close the connection. 
// a rollback is done implicitly 

Bien que je ne l'ai pas exécuté transaction.Rollback(), mes tests ont montré qu'un rollback est fait implicitement.

Ma question est: Ce code va-t-il fuir les connexions ou autre chose?

Édition1: Je suis l'espace de noms System.Data.OracleClient.

Édition2: Ceci est un exemple de code traité. Le scénario le plus réaliste est lorsque dans l'instruction using une exception se produit et que l'instruction Commit() n'est pas encore exécutée.

Edit3: De la réponse que je pense que ce qui est favorable:

using (OracleConnection conn = new OracleConnection(connStr)) 
using (OracleTransaction trans = conn.BeginTransaction()) 
using (OracleCommand command = new OracleCommand(cmdTxt, conn, trans)) 
{ 
    command.ExecuteNonQuery(); 
    trans.Commit(); 
} 

Si proprement jeter quoi que ce soit et clairement ce qui se passe.

Répondre

2

Il ne fuira pas. La clause using garantit que OracleConnection sera éliminé, que la commande aboutisse ou échoue avec une exception, et qu'elle prendra la transaction avec elle. Mais comme OracleTransaction est IDisposable, il serait probablement bon de mettre aussi une clause using autour de la transaction, par exemple, OracleTransaction est IDisposable. Cela permettra aux lecteurs du code de voir que la transaction est en train d'être nettoyée; cela rendra plus clair pour les lecteurs du code; en particulier, il peut devenir important si une amélioration ultérieure effectue plusieurs transactions sur la même connexion. De plus, selon le commentaire de John ci-dessous, vous devriez mettre une instruction using autour de OracleCommand, afin qu'elle puisse être nettoyée rapidement.

+1

Même avec OracleCommand, je suspecte. Tout ce qui est jetable doit être éliminé, probablement dans un bloc d'utilisation. –

+0

Merci John - mis à jour. – itowlson

Questions connexes