2009-03-30 6 views
9

Dire que j'ai ces deux objets:Comment puis-je fermer une OracleConnection dans .NET

OracleConnection connection = new OracleConnection(connectionString); 
OracleCommand command = new OracleCommand(sql, connection); 

Pour fermer la connexion ou Oracle, dois-je appeler command.Dispose(), connection.Dispose(), ou les deux?

Est-ce assez bon:

using(connection) 
{ 
    OracleDataReader reader = cmd.ExecuteReader(); 
    // whatever... 
} 

Répondre

3

Ceci est assez bon. L'utilisation de l'instruction encapsulera l'instruction de disposition, donc même si l'exception est levée, vous êtes en sécurité, c'est ma façon préférée de disposer de la ressource.

using(OracleConnection connection = new OracleConnection(connectionString); ) 
{ 
    //Create a command object 
    using(OracleCommand command = new OracleCommand(sql, connection)) 
    { 
     using(OracleDataReader reader = cmd.ExecuteReader()) 
     { 
     } 

    } 
    // whatever... 
} 

Je pense par l'utilisation « à l'aide », vous demandez au compilateur d'injecter un essai ... enfin bloquer, et enfin bloc, il fermera l'objet jetable pour vous.

16
using (OracleConnection connection = new OracleConnection(connectionString)) 
{ 
    using (OracleCommand command = new OracleCommand(sql, connection)) 
    { 
     using (OracleDataReader reader = cmd.ExecuteReader()) 
     { 
     } 
    } 
} 

S'il implémente IDisposable, et si vous le créez, placez-le dans un bloc using.

+0

-ce que les usings internes effectivement nécessaires, ou est celui de « connexion » assez bon? –

+0

Vous devez disposer de tous vos objets IDisposables, donc chaque utilisation est nécessaire. Si vous ne le faites pas, vous ne disposerez que de la connexion, et les enfants seront laissés. – Russ

+0

Accordé pour les connexions de base de données (et pour IDiposable en général), mais cela ne se fera pas avec les flux d'entrée/sortie en cascade où disposer un parent dispose l'enfant. – Mac

3

using assurera que votre connexion est fermée. Vous pouvez également passer CommandBehavior.CloseConnection à la méthode ExecuteReader de votre commande pour le fermer avant d'appeler Dispose.

5

Les deux réponses sont en bonne voie. Vous voulez toujours appeler .Dispose() sur n'importe quel objet IDisposeable. En l'enveloppant dans un "using" vous élancez le compilateur pour toujours implémenter un bloc try/finialy pour vous.

1 point de note, si vous voulez éviter l'imbrication, vous pouvez écrire le même code comme ceci:

using (OracleConnection connection = new OracleConnection(connectionString)) 
using (OracleCommand command = new OracleCommand(sql, connection)) 
using (OracleDataReader reader = cmd.ExecuteReader()) 
    { 
     // do something here 
    } 
+3

vous * pouvez * écrire le code comme ça, mais à mon humble avis vous ne devriez jamais l'écrire comme ça. –

+1

Pouvez-vous donner des précisions pourquoi? Je travaille beaucoup par moi-même, (pas par choix), donc je suis toujours à la recherche de commentaires extérieurs. – Russ

+1

D'accord. À première vue, quelqu'un comprendrait quel objet est encapsulé dans un autre. Utilisez plus de parenthèses et indentation. – wonea