Non valide “tentative d'appel de Lecture lorsque le lecteur est fermée à l'aide d'un SqlDataReader
1) j'ai les codes suivants:
private static sqlDataReader gCandidateList = null;
public SqlDataReader myCandidateList
{
set
{
gCandidateList = value;
}
get
{
return gCandidateList;
}
}
2) En FormA j'ai:
sqlConn.ConnectionString = mySettings.myConnString;
sqlConn.Open();
SqlCommand cmdAvailableCandidate = new SqlCommand(tempString, sqlConn);
SqlDataReader drAvailableCandidate = cmdAvailableCandidate.ExecuteReader();
mySettings.myCandidateList = drAvailableCandidate;
sqlConn.Close();
3) Dans FormB je veux réutiliser les données enregistrées dans myCandidatList donc j'utilise:
SqlDataReader drCandidate = mySettings.myCandidateList;
drCandidate.Read();
4) puis j'ai le message d'erreur "Invalid tentative d'appel de Lecture lorsque le lecteur est fermé."
5) j'ai essayé mySettings.myCandidateList.Read() à (3) ci-dessus et de nouveau reçu le même message d'erreur.
6) Comment puis-je ré-ouvrir SqlDataReader drCandidate de lire les données?
7) apprécieront beaucoup pour le conseiller et l'aider, s'il vous plaît.
Statique DataReader est jamais une bonne idée.
OriginalL'auteur user1033744 | 2012-01-24
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas lire lecteur une fois que la connexion est
closed
oudisposed
. Si vous souhaitez utiliser ces lignes (fetch) plus loin dans votre code, vous devez créer unList
ouDataTable
.Par exemple,
OriginalL'auteur adatapost
Si vous souhaitez utiliser le datareader au stade ultérieur, vous devez spécifier le même en tant que paramètre à la Méthode ExecuteReader. Votre code en FormA doit être modifié comme ci-dessous.
Assurez-vous de disposer de datareader une fois qu'il est utilisé, comme la connexion à la base de données aura lieu ouvert jusqu'à datareader est fermé. Mieux de changer votre code dans FormB comme ci-dessous.
OriginalL'auteur Yogesh P
Vous êtes à la fermeture de la connexion avant de tenter de lire dans le lecteur. Cela ne marchera pas.
OriginalL'auteur phoog
Lorsque vous appelez à Proximité sur le
SqlConnection
objet (sqlConn.Close();
) il ferme la connexion et de votre lecteur de données. C'est pourquoi vous obtenez le message d'erreur lorsque vous essayez de lire à partir de votreSqlDataReader
de FormB.Ce que vous devez faire est de modifier la définition de votre
myCandidateList
propriété plutôt que de retourner une représentation des données que vous avez extrait à partir de la votredrAvailableCandidate
lecteur.Essentiellement ce que vous devez faire est de parcourir les lignes de la
drAvailableCandidate
objet, d'en extraire les valeurs et les mettre en cache dans votre propriété pour une récupération ultérieure.OriginalL'auteur James Shuttler
Juste pour ajouter à la réponse déjà donnée, si vous utilisez async/await, alors il est facile de se faire attraper avec cette par pas en attente d'une opération à l'intérieur d'un bloc using d'une occurrence de SqlConnection. Par exemple, en faisant ce qui suit peut donner l'erreur rapportée
Le problème ici est que nous ne sommes pas en attente de l'opération à l'intérieur de la à l'aide, par conséquent, il est disposé avant nous avons fait exécuter le sous-fifre opération asynchrone. De façon assez évidente, mais m'a pris avant.
La bonne chose à faire étant d'attendre à l'intérieur de l'aide.
OriginalL'auteur Richard