2009-09-21 9 views

Répondre

0

Vous pouvez exécuter une requête après l'autre en utilisant la même connexion. Toutefois, le DataReader utilise la connexion pour lire le résultat, vous devez donc lire le résultat et fermer le lecteur avant de pouvoir exécuter la requête suivante.

Si vous deviez exécuter une autre requête pour chaque ligne du résultat, vous devez d'abord lire le résultat dans une collection, afin de pouvoir fermer le lecteur avant de parcourir le résultat. Alternativement, vous pouvez ouvrir une autre connexion, mais il est préférable de s'en tenir à une seule connexion si possible.

Considérez également si vous pouvez obtenir le résultat dans une requête simple en utilisant une jointure. Il est préférable d'exécuter une seule requête que des centaines.

+0

Bonne réponse. Je n'ai pas mentionné la fermeture du lecteur. –

+0

Je dois dire que c'est exactement ce que je pensais que le DataReader ne peut être utilisé qu'une seule fois pour cette connexion. En conséquence, parce que vous devez avoir le DataReader pour afficher le résultat, vous devez ouvrir et fermer la connexion. Est-ce la même chose si vous avez un DataReader et ExecuteNonQuery? – aHunter

+0

@Stuart: Vous ne pouvez utiliser un DataReader qu'une seule fois, mais vous n'avez pas besoin d'ouvrir une nouvelle connexion pour chaque DataReader.Si vous avez un DataReader ouvert, sa connexion est nécessaire pour lire son résultat, donc vous ne pouvez pas utiliser la connexion, même pour ExecuteNonQuery. – Guffa

1

Vous pouvez réutiliser la connexion. Vous devrez peut-être modifier le CommandType, mais vous n'avez pas besoin de fermer et de rouvrir la connexion. Cela ajoute des frais généraux inutiles.

+0

Est-ce que le CommandType est pas toujours pour les requêtes texte? MySqlCommand qry = nouvelle MySqlCommand ("SELECT somthing FROM table1"); qry.CommandType = System.Data.CommandType.Text; qry.Connection = conn; MySqlDataReader res = qry.ExecuteReader(); – aHunter

+0

Si vous exécutez des requêtes de cette façon, oui, il resterait Text. –

0

Vous pouvez le faire avec une seule connexion.

Vous n'avez pas besoin d'ouvrir puis de fermer, et la méthode préférée dans ce cas est de garder la connexion ouverte.

1

Vous n'avez pas à le fermer.

using(connection...) 
{ 
query1; 
query2; 
} 
+0

Merci, vous voulez dire comme ça? en utilisant (MySqlConnection conn = new MySqlConnection (global.connectionString)) { MySqlCommand qry1 = nouveau MySqlCommand ("SELECT quelque chose FROM table1"); MySqlDataReader res_qry1 = qry1.ExecuteReader(); while (res_qry1.Read()) {MySqlCommand qry2 = nouveau MySqlCommand ("SELECT quelque chose FROM table2"); MySqlDataReader res_qry2 = qry2.ExecuteReader(); } – aHunter

+0

Tant que vous fermez le lecteur lorsque vous avez terminé, avant d'exécuter la requête suivante, comme l'a souligné Guffa. –

+0

oui, quelque chose comme ça. –

0

Vous pouvez également utiliser DataTableReader, qui est un lecteur déconnecté, vous pouvez parcourir ses résultats sans avoir à stocker une autre collection en mémoire nécessitant deux fois l'itération.

MSDN reference for DataTableReader

Questions connexes