Est-il prudent d'écrire cette méthode d'assistance comme celle-ci? Fermera-t-il toujours la connexion? Je vous ai compilé si tout se passe bien, cela va, mais exécuteraReader fermera la connexion même si elle jette?
5 Réponses :
Oui, il va (à l'intérieur d'un bloc d'utilisation comme vous le faites). Mais pour accéder aux données que vous souhaitez probablement utiliser pendant que dbdatreader.read au lieu de itération de son contenu. P>
-1 Il fermera la connexion mais non parce que l'op l'a intérieure en utilisant code>. Je viens d'écrire un test simple et cela dépend de si le
CommandBeHavor.Closeconnection code> est transmis en tant que paramètre ou non. Lorsqu'elle n'est pas transmise, la connexion reste
ouverte code> même après avoir lancé une exception. N'oubliez pas que
Dispose code> ne sera pas appelé sur la connexion elle-même, car dans ce cas particulier,
dBCommand code> est joint dans un
en utilisant code>, pas b> dbconnection
C'est ce que je voulais dire. Pour fermer la connexion, même avec CommandBehavior.Closeconnection spécifiée dans le constructeur, vous devez fermer le lecteur. La résiliation de l'utilisation du bloc fermera le lecteur, dans le cas d'une exception, ou achèvement du code dans le bloc, non? Vous pouvez également explicitement appeler lecteur.flose, mais vous devez inclure un try / catch / enfin bloquer
@Icarus - Je ne pense pas que cela vaut la peine de voter cette réponse, je ne pense pas que vous interprétiriez correctement la réponse. Le point ici est, lorsqu'une déclaration utilisée a rempli sa tâche, il va nettoyer les ressources - dans ce cas, le lecteur est fermé. Cela suit la règle MSDN qui indique lorsque la commande est exécutée, l'objet de connexion associé est fermé lorsque l'objet DataReader associé est fermé code>. Dans ce cas, l'utilisation de l'utilisation ferme le lecteur et que vous avez explicitement indiqué
commandbehavior.closeconnection code>.
@Jonh je vais restaurer mon vote une fois que je peux. En ce moment, cela dit que mon vote est verrouillé jusqu'à ce que la réponse soit éditée :(
Oui même s'il jette une exception, il fermera la connexion.
Si vous ne spécifiez pas Aussi de MSDN: P>
Lorsque la commande est exécutée, l'objet de connexion associé est
fermé lorsque l'objet DataReader associé est fermé. p>
blockQuote>
Vous devez vous assurer que le lecteur est fermé lorsque vous en avez terminé.
La bonne chose à propos de tout cela est que vous l'avez enveloppée autour d'une déclaration à l'aide de la déclaration et que vous n'utilisez pas CommandBehavior.Closeconnection code> et que vous fermez la connexion, votre code d'appel ne peut pas accéder au contenu du lecteur. P>
Essayez / enfin CODE> dans ce cas, le lecteur sera fermé, qui fera ensuite fermer la base de données connexion. p>
Quel serait l'avantage sur l'utilisation (dbconnection) {à l'aide de dbdatareader {}} sans l'option de closConnection? J'aime le concept d'utilisation car il ajoute un bon niveau de documentation automatique autour du code et précise (dans ce cas dans le code d'appel) que la connexion n'est plus ouverte / disponible par la suite ...
Je ne veux pas que la dbconnection disposée, car cette façon je n'ai pas à le recréer, que je fais actuellement comme dbconnection Conn = dbproviderFactories.getFactory (DataProvider) .Createconnio n (); code> et ensuite
conn.ConnectionsTring = connexionsRing; code>
@Eugeneryabtsev vous ne devriez pas vous inquiéter de recréer les connexions. Les connexions sont généralement i> groupées.
@efloh - aucun avantage mais cela dépend de l'utilisation. Plusieurs fois dans une seule routine, vous pouvez ouvrir une connexion DB, exécuter un lecteur, utiliser les données de lecteur, puis fermer la connexion en fermant efficacement votre lecteur (ne permettant aucun accès d'indexation de votre lecteur par nom de colonne). Ceci est correct si vous programmez une application de console ou une programmation de haut en bas. Mais dans la plupart des cas, nous ne faisons pas une approche descendante de la programmation. Dans les coulisses, nous avons des objets interagissant les uns avec les autres nécessité d'adopter des objets de données (retour). Avec CommandBehavior.Close, nous nous assurons qu'une fois le lecteur.
... est fermé la connexion à la base de données est également fermée. Sans ce type de comportement, votre connexion peut rester plus longue que nécessaire. Ce sont tous des détails mineurs, mais cela aide à comprendre ce produit lorsque vous tirez sur beaucoup de données, etc.
@Jonh: Merci pour la réponse élaborée, ces bons aspects que vous mentionnez. Néanmoins, dans le cas de l'utilisation des blocs ou de l'affaire ci-dessus, je ne vois pas un avantage. La principale différence est le fait que l'utilisation d'un en utilisant code>, vous utilisez toujours de nouveaux objets de connexion (peut-être groupés), l'autre, vous pouvez rouvrir les connexions existantes, ce que pourrait i> ne fonctionne pas Avec une connexion disposée pouvant être renvoyée plusieurs fois à partir d'une méthode d'usine.
Je sais que la question est liée à la fermeture de la connexion qui sera le cas; Cependant, la connexion ne sera pas disposée. Pour éliminer la connexion elle-même, vous devez la joindre à un update strong> Je pensais que c'était une question intéressante J'ai donc écrit le test suivant: p> si la ligne à l'aide du bloc code> également:
à l'aide de (Idatreader Reader = cmd.executereader ()) code> est modifié en:
Utilisation (dbdatreader Reader = cmd.executereader (CommandBehavior.closeconnection)) Code> Puis il imprime
Donc, même si une exception est lancée avant i> vous ouvrez la connexion avec conn.Open () code>, son état code> est ouvert? Est-ce vraiment le cas?
@Patrick Il est impossible, du moins du code ci-dessus, pour une exception à projeter avant que la connexion ne soit ouverte. Aucune des lignes ci-dessus conn.Open () code> provoquera une exception code> code> sauf pour
conn.Createcommand code> à quel point la connexion n'a pas été même ouvert (bien qu'il ait été instancié). Seulement jusqu'à ce que vous appelle
Ouvrir code>, la connexion est évaluée pour établir réellement la connexion à la DB.
Oh maintenant je comprends. Bien entendu, définir la propriété CommandText CODE> ne lancera pas une exception, mais l'exécution de cela. Je me suis confus sur le commentaire à cette ligne.
@Patrick Exactement. Le CommandText code> peut être gibberish; Seulement lorsque vous appelez
exécutereader code> lancera l'exception.
Veuillez noter qu'aucune exception n'est lancée pour définir le commandement. Ce code est trompeur. Au fait, il ira fermera fermé, c'est parce que vous avez passé la valeur Enum CommandBehavior.Closeconnection code>. L'utilisation de l'utilisation fermera le lecteur dès que vous avez fini de l'utiliser.
@John j'ai déplacé le commentaire sur exécutereader code>. C'était trompeur, merci.
Personnellement, je préfère un Je dis constamment à mes développeurs d'aller simple et cohérent. Je ne le verrai pas ... à l'aide de la clause code> de la clause de fermeture / élimination em> la connexion, simplement pour des raisons de construction parallèles - identité à la bonne grammaire anglaise. De
De mon point de vue en utilisant le CommandBehavior code> n'est pas équilibré et donc imprévisible. P>
Comme s'ils oublient de définir le CommandBehavior Code> ... P>
Mais s'ils n'utilisent pas un en utilisant code> strong> déclaration ...
i strong> le voir car il est très important. P>
blockQuote>
Si vous fermez le lecteur et / ou enveloppez le lecteur avec ne pas envelopper et ne ferme pas le lecteur avec à l'aide de (varecteur var ...) {} code> bloquer oui strong> Vous vous assurez que votre connexion est fermée. < / p>
lecteur.frose () code> gardé ma connexion ouverte. P>
Faites les réponses ci-dessous l'aide, si cela résolvait votre question, veuillez marquer la réponse comme acceptée.