La réutilisation de SqlConnection et SqlDataReader
Si je veux exécuter plusieurs requêtes SELECT sur les tables différentes, puis-je utiliser le même SqlDataReader et SqlConnection pour chacun d'eux?? Suite sages?? (J'ai tapé ce rapidement, de sorte qu'il manque try/catch):
MySqlCommand myCommand = new MySqlCommand("SELECT * FROM table1", myConnection);
myConnection.Open();
SqlDataReader myDataReader = myCommand.ExecuteReader();
while(myReader.Read())
{
//Perform work.
}
myCommand.commandText = "SELECT * FROM table2";
myReader = myCommand.ExecuteReader();
while(myReader.Read())
{
//Perform more work
}
myReader.Close();
myConnection.Close();
Merci beaucoup.
Vous devriez regarder dans l'aide de Entity Framework.
Peut-être utile: stackoverflow.com/questions/9705637/...
Est-ce que votre code ci-dessus donne toute erreur? Si non, alors c'est sûrement d'accord.
Vous ne les réutilisez pas le lecteur, le
Peut-être utile: stackoverflow.com/questions/9705637/...
Est-ce que votre code ci-dessus donne toute erreur? Si non, alors c'est sûrement d'accord.
Vous ne les réutilisez pas le lecteur, le
ExecuteReader
crée un nouveau lecteur.OriginalL'auteur PaulG | 2012-04-13
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser la même connexion pour chacun d'eux, tant que vous n'essayez pas d'exécuter plusieurs requêtes simultanément sur la même connexion de différents threads.
Comme pour le lecteur de données, vous ne sont pas réellement de ré-utiliser le lecteur, chaque appel à
ExecuteReader
retourne une nouvelle instance d'un nouveau lecteur, tout ce que vous ré-utilisez est la variable qui maintient la référence pour le lecteur. Ici réside un problème, vous ne sont explicitement la fermeture de la dernière lecteur et en laissant le premier à être GC avais quelque temps plus tard.Vous pouvez réutiliser la Commande en tant que bien, mais n'oubliez pas que si vous les fournissez les paramètres etc. vous aurez besoin de les effacer pour la prochaine requête, sauf si elles s'appliquent à la requête suivante.
Vous devez utiliser
try/finally
blocs pour s'assurer que vous nettoyez les ressources, ou ici est un changement rapide de votre code pour utiliserusing
états à assurer des ressources propres, même si il y a une exception qui empêche le reste du code de l'exécution.Remarque:
GetTheConnection
est juste un endroit titulaire de la fonction de ce mécanisme que vous utilisez pour obtenir votre connexion instance.En fait, je suis un fournisseur de paramètres pour le SqlCommand, suppose que je devrais utiliser myCommand.Les paramètres.Clear(). Merci beaucoup.
en règle générale, chaque fois qu'une classe implémente IDisposable vous devriez être en disposer le plus tôt possible. Dans le cas de lecteurs, ils tie-up de serveur de base de données de ressources jusqu'à ce qu'ils sont fermés ou éliminés si vous souhaitez vous débarrasser ensuite dès que vous avez terminé avec eux. Maintenant, je vois que vous utilisez MySQL donc je ne sais pas ce que l'utilisation de la ressource est là, mais pour le serveur de base de SGBD systèmes comme Oracle ou SQL Server, c'est le cas, et vous devriez toujours supposer que c'est le cas.
OriginalL'auteur Chris Taylor
J'en général d'utiliser les Adaptateurs si je suis rouillé sur les détails du lecteur, mais je pense que vous êtes sur la bonne voie.
Un élément de note dans votre code, c'est que chaque appel à
ExecuteReader
devrait être de générer un nouveau lecteur de données. Vous avez peut-être réutiliser le nom de la variable, mais la référence à l'actuel lecteur est mis au rebut et remplacé par un nouveau à chaque appel. Point étant, à proximité de la précédente lecteur avant de l'utiliser ExecuteReader pour en obtenir un nouveau.OriginalL'auteur Rozwel