Essayez d'éviter d'utiliser des lecteurs comme celui-ci:
SqlConnection connection = new SqlConnection("connection string");
SqlCommand cmd = new SqlCommand("SELECT * FROM SomeTable", connection);
SqlDataReader reader = cmd.ExecuteReader();
connection.Open();
if (reader != null)
{
while (reader.Read())
{
//do something
}
}
reader.Close(); // <- too easy to forget
reader.Dispose(); // <- too easy to forget
connection.Close(); // <- too easy to forget
Au lieu de cela, enveloppez-les dans des instructions d'utilisation:
using(SqlConnection connection = new SqlConnection("connection string"))
{
connection.Open();
using(SqlCommand cmd = new SqlCommand("SELECT * FROM SomeTable", connection))
{
using (SqlDataReader reader = cmd.ExecuteReader())
{
if (reader != null)
{
while (reader.Read())
{
//do something
}
}
} // reader closed and disposed up here
} // command disposed here
} //connection closed and disposed here
La déclaration using assurera l'élimination correcte de l'objet et la libération des ressources.
Si vous oubliez, vous laissez le nettoyage au ramasse-miettes, ce qui peut prendre un certain temps.
Notez que la suppression d'un SqlDataReader instancié à l'aide de SqlCommand.ExecuteReader () ne fermera / supprimera pas la connexion sous-jacente.
Il existe deux modèles communs. Dans le premier, le lecteur est ouvert et fermé dans le cadre de la connexion:
Parfois, il est pratique qu'une méthode d'accès aux données ouvre une connexion et renvoie un lecteur. Dans ce cas, il est important que le lecteur renvoyé soit ouvert à l'aide de CommandBehavior.CloseConnection, afin que la fermeture / suppression du lecteur ferme la connexion sous-jacente. Le motif ressemble à ceci:
et le code appelant a juste besoin de disposer le lecteur ainsi:
la source
using
s, alors appelez dispose dans lefinally {}
bloc après catch. De la manière dont cela est écrit, les commandes réussies ne seront jamais fermées ou supprimées.Pour être sûr, enveloppez chaque objet SqlDataReader dans une instruction using .
la source
Enveloppez simplement votre SQLDataReader avec l'instruction "using". Cela devrait régler la plupart de vos problèmes.
la source