J'ai une méthode générique pour appeler une procédure stockée dans ASP.NET:Connexion à SQL ne se ferme pas après appel à DB dans ASP.NET
public SqlDataReader ExecuteStoredProc(string sprocName, SqlParameter[] SqlP)
{
SqlDataReader iReader;
SqlCommand sql = new SqlCommand();
sql.CommandText = sprocName;
sql.CommandType = CommandType.StoredProcedure;
sql.Connection = ConnStr;
if (SqlP != null)
{
foreach (SqlParameter p in SqlP)
{
sql.Parameters.Add(p);
}
}
sql.Connection.Open();
iReader = sql.ExecuteReader(CommandBehavior.CloseConnection);
sql.Dispose();
return iReader;
}
Même si je fais appel CommandBehavior.CloseConnection la connexion est ne pas fermer. Je peux obtenir les données correctement la première fois que je demande une page. Sur le rechargement, j'obtiens l'erreur suivante:
The connection was not closed. The connection's current state is open. Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.InvalidOperationException: The connection was not closed. The connection's current state is open.
Source Error:
Line 35: Line 36: } Line 37: sql.Connection.Open(); Line 38: iReader = sql.ExecuteReader(CommandBehavior.CloseConnection); Line 39: sql.Dispose();
Enfin, si je mets sql.Connection.Close(); avant sql.Dispose(); Je reçois une erreur indiquant qu'iReader n'est pas lisible car il a déjà été fermé.
De toute évidence, je ferme mal ma connexion, quelqu'un peut-il me diriger dans la bonne direction?
Je suis d'accord avec votre approche "la responsabilité du consommateur de nettoyer correctement les ressources.", Mais ce n'est généralement pas à compter sur cela, le consommateur est trop paresseux pour le faire. –
Merci cela a aidé. J'ai ajouté un iReader.Close() à mon consumermethod après ma boucle while. – RedWolves
Vous n'avez pas besoin de fermer et de disposer de la connexion que vous créez dans ExecuteStoredProc? –