11
votes

Est-ce que exécuterreader (commandbehavior.closonnection) a toujours fermé la connexion?

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? XXX


1 commentaires

Faites les réponses ci-dessous l'aide, si cela résolvait votre question, veuillez marquer la réponse comme acceptée.


5 Réponses :


0
votes

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.


4 commentaires

-1 Il fermera la connexion mais non parce que l'op l'a intérieure en utilisant . Je viens d'écrire un test simple et cela dépend de si le CommandBeHavor.Closeconnection est transmis en tant que paramètre ou non. Lorsqu'elle n'est pas transmise, la connexion reste ouverte même après avoir lancé une exception. N'oubliez pas que Dispose ne sera pas appelé sur la connexion elle-même, car dans ce cas particulier, dBCommand est joint dans un en utilisant , pas 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é . Dans ce cas, l'utilisation de l'utilisation ferme le lecteur et que vous avez explicitement indiqué commandbehavior.closeconnection .


@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 :(



9
votes

Oui même s'il jette une exception, il fermera la connexion. Si vous ne spécifiez pas CommandBehavior.Closeconnection et que vous fermez la connexion, votre code d'appel ne peut pas accéder au contenu du lecteur.

Aussi de MSDN:

Lorsque la commande est exécutée, l'objet de connexion associé est fermé lorsque l'objet DataReader associé est fermé.

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 Essayez / enfin dans ce cas, le lecteur sera fermé, qui fera ensuite fermer la base de données connexion.


6 commentaires

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 (); et ensuite conn.ConnectionsTring = connexionsRing;


@Eugeneryabtsev vous ne devriez pas vous inquiéter de recréer les connexions. Les connexions sont généralement 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 , vous utilisez toujours de nouveaux objets de connexion (peut-être groupés), l'autre, vous pouvez rouvrir les connexions existantes, ce que pourrait ne fonctionne pas Avec une connexion disposée pouvant être renvoyée plusieurs fois à partir d'une méthode d'usine.



0
votes

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 à l'aide du bloc également: xxx

update Je pensais que c'était une question intéressante J'ai donc écrit le test suivant: xxx

si la ligne à l'aide de (Idatreader Reader = cmd.executereader ()) est modifié en: Utilisation (dbdatreader Reader = cmd.executereader (CommandBehavior.closeconnection)) Puis il imprime fermé . Quelque chose à garder à l'esprit.


6 commentaires

Donc, même si une exception est lancée avant vous ouvrez la connexion avec conn.Open () , son état 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 () provoquera une exception sauf pour conn.Createcommand à quel point la connexion n'a pas été même ouvert (bien qu'il ait été instancié). Seulement jusqu'à ce que vous appelle Ouvrir , 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 ne lancera pas une exception, mais l'exécution de cela. Je me suis confus sur le commentaire à cette ligne.


@Patrick Exactement. Le CommandText peut être gibberish; Seulement lorsque vous appelez exécutereader 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 . 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 . C'était trompeur, merci.



2
votes

Personnellement, je préfère un à l'aide de la clause de la clause de fermeture / élimination 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 n'est pas équilibré et donc imprévisible.

Je dis constamment à mes développeurs d'aller simple et cohérent.
Comme s'ils oublient de définir le CommandBehavior ...

Je ne le verrai pas ...
Mais s'ils n'utilisent pas un en utilisant déclaration ...
i le voir car il est très important.


0 commentaires

0
votes

Si vous fermez le lecteur et / ou enveloppez le lecteur avec à l'aide de (varecteur var ...) {} bloquer oui Vous vous assurez que votre connexion est fermée. < / p>

ne pas envelopper et ne ferme pas le lecteur avec lecteur.frose () gardé ma connexion ouverte.


0 commentaires