aide sur SQLDataReader
Je sais, j'ai posé une question relative à la précédente. J'ai juste eu une autre pensée.
using (SqlConnection conn = new SqlConnection('blah blah'))
{
using(SqlCommand cmd = new SqlCommand(sqlStatement, conn))
{
conn.open();
//*** do I need to put this in using as well? ***
SqlDataReader dr = cmd.ExecuteReader()
{
While(dr.Read())
{
//read here
}
}
}
}
L'argument est que: Depuis le SqlDataReader
dr
objet n'est PAS UN OBJET similaire à celui de LA connexion ou des objets de commande, il s'agit tout simplement d'une référence vers le cmd.ExecuteReader()
méthode, dois-je mettre le lecteur à l'intérieur d'un using
. (Maintenant basé sur mon post précédent, c'est ma compréhension que tout objet qui utilise IDisposable
doit être mis dans un using
, et SQLDataReader
hérite de IDisposable
, donc j'ai besoin de le mettre. Ai-je raison de mon jugement?) Je suis juste confus puisque ce n'est pas un nouvel objet, serait-il la cause des problèmes à l'aliénation d'un objet qui est tout simplement un pointeur de référence pour la commande?
Merci beaucoup
OriginalL'auteur xeshu | 2010-08-02
Vous devez vous connecter pour publier un commentaire.
Je pense que vous vous trompez. Le
dr
est une référence à l'objet renvoyé parcmd.ExecuteReader
, qui va être un nouvel objet. Dans votre exemple, rien ne va disposerdr
, donc oui, il doit être dans unusing
, ou manuellement éliminer.Votre jugement sur
IDisposable
réalisateurs besoin d'être dans unusing
n'est pas correct. Ils seront fonction de beaux dehors. Unusing
déclaration est tout sucre syntaxique pour untry ... finally
. Les choses de la mise en œuvre deIDisposable
devrait avoirDispose
appelé, parce qu'ils signalent qu'ils ont besoin de disposer de certains états de manière déterministe.Noter que si vous n'appelez pas
Dispose
, ce n'est pas toujours un problème. Certains objets sont également de mettre en œuvre l'outil de finalisation, qui sera déclenchée par le garbage collector. Si ils ne mettent pas en œuvre l'outil de finalisation, il peut partir de la mémoire non gérée non récupérés. Cela restera non récupérés jusqu'à ce que votre application se ferme. Tous gérés de la mémoire est finalement remis en état, à moins qu'il n'est pas admissible pour la collecte des ordures.Ré-écrit:
C'est OK 🙂 je vais le mentionner ainsi que le SqlDataReader est un nouvel objet, ou au moins une référence à un objet retourné par l'appel de méthode, il n'est pas une référence à la méthode. Le simple fait de mentionner parce que vous avez fait ce point, en lettres majuscules et sa pas correct. La seule différence entre le lecteur et la connexion/commande est que vous avez initialisé la connexion/commande, mais vous n'avez pas initialiser le lecteur. À la fin vous avez encore des références à tous les objets - si vous avez initialisé ou non.
Ah oui. Mon mauvais! 🙂
Peut-être cela va sans dire, mais
conn.Close();
est nécessaire après lausing(SqlDataReader dr=cmd.ExecuteReader()) { ... }
section, correct?La fermeture est appelée à jeter, mais vous pouvez l'appeler explicitement trop si vous le souhaitez.
OriginalL'auteur Adam Houldsworth
Vous devez envelopper le lecteur de données à l'aide d'instruction que la méthode ExecuteReader est la création d'un nouveau lecteur de données instance qui doit également être éliminés.
OriginalL'auteur Michael Arnell