Non valide tentative de Lecture lorsque le lecteur est fermé
J'ai une base de données commune de la classe de ma demande et dans la classe que j'ai une fonction
public MySqlDataReader getRecord(string query)
{
MySqlDataReader reader;
using (var connection = new MySqlConnection(connectionString))
{
connection.Open();
using (var cmd = new MySqlCommand(query, connection))
{
reader = cmd.ExecuteReader();
return reader;
}
}
return null;
}
et sur mon code qui se cache derrière les pages j'utilise
String sql = "SELECT * FROM `table`";
MySqlDataReader dr = objDB.getRecord(sql);
if (dr.Read())
{
//some code goes hear
}
et je vais avoir d'erreur comme Invalide tentative de Lecture lorsque le lecteur est fermé.
Je sais que l'accès au lecteur après la connexion de base de données est fermée n'est pas possible
bot je suis à la recherche d'un travail autour de dans lequel je n'a pas besoin de changer dans le code-behind
EDIT: je VAIS COMME LA SOLUTION DANS LAQUELLE LE LECTEUR EST ATTRIBUÉ À un AUTRE OBJET (de manière SIMILAIRE AU LECTEUR ), PUIS de RENVOYER cet OBJET donc je n'ai pas besoin de changer dans toutes les pages de l'application
Je suis nouvelle dans .net ce n'MySqlDataReader scellé signifie?
OriginalL'auteur Champ | 2012-10-02
Vous devez vous connecter pour publier un commentaire.
Vous pouvez charger les résultats de votre requête à la mémoire, puis fermer la connexion et encore retour une
IDataReader
qui fonctionne comme prévu. Notez que cela coûte à la mémoire.Dans les appelants:
C'est une solution viable pour le demandeur de problème (il a demandé une solution qui ne nécessite pas de changements significatifs dans les appelants). J'ai explicitement a déclaré qu'elle augmente les besoins en mémoire. En conclusion, je n'ai pas à vous dire ce que je pense de vous.
Remarque: si vous pour l'ensemble de l'univers dans votre base de données, et vous avez une requête qui peut y accéder, j' vraiment envie de vous parler. SQL est déclarative, qui devrait faire comprendre certains sujets difficiles facile. Avez-vous essayé
select location from person where name = 'Amelia Earhart'
ou quelque chose de semblable?OriginalL'auteur Alex
Lorsque la portée de votre appel à
using (var connection = new MySqlConnection(connectionString))
se termine, la connexion sera fermée.Cependant, vous êtes toujours le retour d'un lecteur basé sur cette connexion. Une fois que vous essayez de l'utiliser dans votre appelant la méthode, vous obtiendrez l'erreur que la fermeture de la connexion ne peut pas être utilisé.
En outre, votre méthode est appelée
GetRecord
mais il renvoie d'un lecteur.L'une des options est de faire ceci:
Votre idée de création d'un objet similaire à celui de lecteur, de sorte que vous n'avez pas à changer l'appelant, ne fonctionnerait pas: l'objet retourné devra contenir à la fois lecteur et une connexion ouverte, de sorte que vous pouvez utiliser le lecteur. Cela signifie que vous devez fermer la connexion en l'appelant. Dans le meilleur des cas, l'appelant doit être modifié comme suit:
Vous permettra d'économiser pas que beaucoup de travail, mais il manque un
using
déclaration de l'appelant, votre application ne fonctionne pas après un certain temps en raison d'une fuite dans le joint.Vous ne pouvez pas retourner le datareader ET l'envelopper dans une instruction d'utilisation. Une fois qu'il est sorti de l'instruction d'utilisation,
Dispose
est appelée sur l'objet datareader qui va fermer la connexion. Vous devez repenser votre conception.Vous devez garder une connexion ouverte.
Oui, je sais. Avez-vous formulé des commentaires sur la saisie incorrecte ou ai-je raté quelque chose?
les gars veuillez voir la note ... il va être difficile pour moi de faire des changements dans la demande complète, donc nous ne pouvons pas avoir une solution comme assining le lecteur à quelque chose d'autre objet similaire de lecteur, puis renvoyer cet objet ?
OriginalL'auteur Zdeslav Vojkovic
Ce que vous voulez, c'est possible, mais ce n'est pas une solution sympa, parce que vous devez placer toutes les fonctions de la
MySqlDataReader
de la classe et de la transmettre au réelMySqlDataReader
.Voir la
ConnectedMySqlDataReader
classe (indice: il ne met pas en œuvre toutes les fonctions de MySqlDataReader, si vous voulez vraiment utiliser, vous devez le faire vous-même) et la façon dont il serait bon de votre solution:je n'ai pas testé cette classe, c'est juste pour la démonstration!
PS: c'est ce que scellé en c# contexte moyens, et oui,
MySqlDataReader
estsealed
.OriginalL'auteur esskar