09. november 2004 - 13:01Der er
10 kommentarer og 1 løsning
Forbindelse lukkes ikke til MS SQL
Jeg har lavet en lille, simpel SqlHandler-klasse, hvorigennem jeg kører alle SQL-kommandoer. Mit problem er, at forbindelserne ikke lukkes efter brug, og til sidst løber MS SQL tør for poolede forbindelser. Nogen der kan se/ved hvad der går galt?? Min klasse ser ud som følger:
using System; using System.Data; using System.Data.SqlClient;
namespace Shockwaved.Data { public class SqlHandler { private static string _conStr;
public static void Init(string conStr) { _conStr = conStr; }
private static SqlConnection GetConnection() { return new SqlConnection(_conStr); }
public static IDataReader ExecuteReader(SqlCommand cmd) { SqlConnection con = GetConnection(); con.Open(); cmd.Connection = con; return cmd.ExecuteReader(CommandBehavior.CloseConnection); }
public static DataSet ExecuteDataSet(SqlCommand cmd) { SqlConnection con = null; try { con = GetConnection(); con.Open(); cmd.Connection = con; SqlDataAdapter da = new SqlDataAdapter(cmd); DataSet ds = new DataSet(); da.Fill(ds); return ds; } finally { if (con != null) con.Close(); } }
public static int ExecuteNonQuery(SqlCommand cmd) { SqlConnection con = null; try { con = GetConnection(); con.Open(); cmd.Connection = con; return cmd.ExecuteNonQuery(); } finally { if (con != null) con.Close(); } } } }
Jeg sørger for at lukke alle forbindelser explicit, og metoden ExecuteDataReader anvendes kun, hvor IDataReader'en sættes som source til et GUI-element, og dermed altid itereres helt igennem og automatisk skulle blive lukket af .NET.
Den moderne arbejdsplads er i stigende grad afhængig af mødelokaler til at fremme samarbejde, men dette skift medfører også stigende sikkerhedsudfordringer.
Ja du kan godt hente SQL strengen ud af en Command, men hvis du har en command så skal du naturligvis bare sende den over. Jeg synes måske bare at det var pænere også at holde Command's nede i denne her klasse og nøjes med SQL strenge og DataReader/DataSet udenfor. Ikke noget funktionelt. Kun smag og behag.
Jeg mener også at finally udføres selvom der er en return.
[STAThread] static void Main(string[] args){ MinTest(); Console.ReadLine(); } } } ************************ Finally bliver afviklet... men det var også kun et gæt fra min side...
Grunden er, at jeg ikke vil opbygge SQL'en som streng, men som en SqlCommand, hvor det er muligt at tilføje attributter - jeg synes koden bliver pænere...
Synes godt om
Slettet bruger
09. november 2004 - 13:47#9
Du skal explicit kalde close på din reader - det er mig bekendt - ikke nok at itererer til enden af reader. CommandBehavior.CloseConnection sørger blot for at lukke connection når close kaldes på reader.
Nu kan jeg ikke lige finde et eksempel, men i flere artikler jeg tidligere har læst antydes det, at DataReader'en automatisk lukke sig selv (og dermed db-forbindelsen, hvis CommandBehavior.CloseConnection er sat), når alle elementer er itereret igennem, men det kan jeg så forstå er en generelt misforståelse.
Synes godt om
Slettet bruger
09. november 2004 - 17:24#11
svar
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.