Si vous ciblez ASP.NET, vous pouvez configurer votre méthode Connect() (si vous en avez une) pour configurer également un finaliseur à exécuter lorsque la page est déchargée. Cette astuce est également utile si vous rencontrez des problèmes avec les pools de connexions qui sont épuisés.
J'ai également inclus une méthode Exec pour simplifier l'écriture de commandes SQL avec des paramètres de typesafe - comme dans la méthode Test.
using System;
using System.Web;
using System.Data.SqlClient;
using Conf = System.Configuration.ConfigurationManager;
using System.Data;
public static class Sql {
public static SqlConnection Connect() {
// create & open connection
SqlConnection result = new SqlConnection(Conf.ConnectionStrings["connectionString"].ConnectionString);
result.Open();
// add delegate to trigger when page has finished, to close the connection if it still exists
System.Web.UI.Page page = HttpContext.Current.Handler as System.Web.UI.Page;
if (page != null) {
page.Unload += (EventHandler)delegate(object s, EventArgs e) {
try {
result.Close();
} catch (Exception) {
} finally {
result = null;
}
};
}
// return connection
return result;
}
public static SqlDataReader Exec(string name, params object[] parameters) {
using (SqlCommand cmd = Connect().CreateCommand()) {
cmd.CommandTimeout = int.Parse(Conf.AppSettings["commandTimeoutSec"]);
cmd.CommandType = CommandType.Text;
cmd.CommandText = name;
for (int x = 0; x + 1 < parameters.Length; x += 2) {
SqlParameter p = cmd.Parameters.AddWithValue((string)parameters[x], parameters[x + 1]);
if (parameters[x + 1] is string) {
p.DbType = DbType.AnsiString;
}
}
return cmd.ExecuteReader(CommandBehavior.CloseConnection);
}
}
public static void Test() {
using (SqlDataReader reader = Exec(
"SELECT * FROM member WHERE [email protected] AND age=YEAR(GETDATE())[email protected]",
"@firstname", "tom",
"@yearborn", 1978)) {
while (reader.Read()) {
// read
}
}
}
}
+1 J'aime l'analogie. –