2009-02-27 5 views
1

De MSDN:Pourquoi ne puis-je pas utiliser une instance SqlConnection tant que SqlDataReader n'est pas fermé?

Alors que le SqlDataReader est utilisé, le SqlConnection associé est occupé à servir SqlDataReader, et peut être aucune autre opération sur le SqlConnection autre que fermer. C'est le cas jusqu'à ce que la méthode Close de SqlDataReader soit appelée. Par exemple, vous ne pouvez pas récupérer les paramètres de sortie avant d'avoir appelé Fermer.

a) Pourquoi n'avez-vous pas utilisé SqlConnection pour autre chose? Après tout, lorsque ExecuteQuery() renvoie l'objet SqlDataReader, les données de la base de données ont déjà été récupérées et l'objet SqlDatareader est rempli. Donc je ne vois pas comment ou pourquoi SqlConnection devrait toujours servir l'objet SqlDataReader ?!

b) Plus important encore, pour quelle raison serait-il une mauvaise idée de récupérer les paramètres de sortie avant d'appeler Close() sur SqlDataReader?

c) Lorsque la citation ci-dessus mentionne qu'aucune autre opération ne peut être effectuée sur SqlConnection, quelles opérations a-t-elle en tête? Juste ceux qui auraient besoin de se connecter au serveur SQL distant, ou nous ne pouvons pas utiliser les membres de l'instance SqlConnection?

Merci.

+0

Embarrassant - J'ai placé le mauvais script. – Graham

Répondre

10

a) Lorsque le ExecuteReader est de retour, les données n'ont pas toutes été extraites et remplies dans le lecteur, elles peuvent encore être retransmises à partir de la base de données. C'est tout le point de la SqlDataReader parce qu'il est plus efficace de le faire que de tout charger à l'avant.

b) Vous ne pouvez pas récupérer les paramètres de sortie tant que le lecteur n'a pas terminé en raison de la structure du protocole TDS (Tabular Data Stream). Les paramètres de sortie ne sont pas physiquement envoyés dans le flux avant les données du jeu de résultats.

c) Cela signifie qu'aucune des opérations à l'exception de Close n'est documentée comme garantie de fonctionnement. Qu'elles fonctionnent réellement ou non, ce n'est pas pertinent, car il s'agit d'un détail de mise en œuvre plutôt que d'un contrat, et la programmation par rapport aux détails de mise en œuvre est une recette pour un désastre. Pourquoi voulez-vous réutiliser la connexion de toute façon?

Les connexions utilisées par SqlConnection sont regroupées dans les coulisses, donc lorsque vous en disposez une, elle ne se débarrasse pas vraiment de toutes les ressources, elle renvoie simplement la connexion au pool. Cela signifie que vous pouvez utiliser la connexion le plus rapidement possible, idéalement dans un bloc using, et ne pas avoir à vous soucier de ce genre de chose. Créez simplement une nouvelle connexion chaque fois que vous en avez besoin, et ne vous embêtez pas à essayer de les réutiliser, car cela se passe déjà dans les coulisses.

1

SqlDataReader ne retourne pas la table entière dans un Fetch, un peu comme un StreamReader ne retournerait pas la fichier entier. Évidemment, en réalité, ce sera pour les petites tables, mais une seule connexion est en cours de service. Cela utilise le blocage pour l'accès au réseau - il suffit d'ouvrir une seconde connexion si vous avez besoin de faire autre chose de manière asynchrone.

0

Le code que vous avez posté est en fait conçu pour être exécuté avec la bibliothèque jQuery. Vous pouvez trouver plus d'informations sur jQuery au http://jquery.com/.Mootools, tout en étant une bibliothèque javascript, est une chose différente et le code que vous avez posté ne fonctionnerait pas (vous pouvez en apprendre plus sur mootools au http://mootools.net/). Que voulez-vous exactement accomplir en incluant ce code sur votre page/site?

+0

Désolé - c'était une chose très stupide à faire. Le bon script a maintenant été ajouté. – Graham

Questions connexes