Avatar billede lasserasch Juniormester
20. juni 2007 - 11:54 Der er 2 kommentarer og
1 løsning

SqlConnections/SqlDataReader låsnings problem.

Hejsa.

Har følgende problem, som er lidt langhåret at forklare...


Har denne void i en klasse jeg kalder for "functions".

  public SqlDataReader SSDR(String sqltext, SqlConnection Conn)
        {
            SqlCommand cmd;
                cmd = new SqlCommand(sqltext, Conn);
                SqlDataReader RSDR = cmd.ExecuteReader();
                return RSDR;
        }


Conn er en SqlConnection som jeg statisk har oprettet på den første form mit program loader. På denne form har jeg pt. 20 statiske SqlConnections.

Dvs. når jeg skal udføre en SQL forespørgelse, så foregår det normalt sådan her :

--------------
SqlDataReader Reader1 = functions.SSDR("select * from tabel", frmmain.SqlConn1);

    While (Reader1.read())
    {
    loop igennem resultat
    }

Reader1.Close();
------------

Problemet med dette er at "frmmain.SqlConn1" er låst til den SqlDataReader lige indtil jeg kører "Reader1.Close()";

Det er irriterende, da jeg nogle gange kører sqlforespørgelser inde i et loop, eller kalder en funktion inde i et loop. I den funktion jeg så kalder, er der nogle gange også et Sql loop der skal køres igennem, og i dette loop kaldes så andre funktioner som igen laver forespørgelser.

Og da dette foregår på kryds og tværs i hele programmet, bliver det hurtigt forvirrende og uoverskueligt, og med risiko for programfejl.

Jeg har forsøgt at oprette en SqlConnection direkte inde i SSDR void'en men hvis jeg gør det, så kan jeg kun få denne sqlconnection lukket igen inde fra samme funktion. Og hvis jeg lukker den igen, så kan jeg ikke retunere og læse den SqlDataReader, som jeg forsøger.

Hvad pokker gør man?

Jeg kan selvfølgelig helt droppe min SSDR funktion og oprette og køre SQL forespørgelserne direkte, men det ville jeg nødt gøre.

Kan det på nogen måde lade sig gøre at retunere både SqlConnection'en og SqlDataReaderen fra functions.SSDR() void'en.

Problemet er nemlig at hvis jeg ikke får lukket en SqlConnection igen, så løber jeg meget hurtigt ind i max antal af åbne SQL forbindelser.

Og det kan vel heller ikke passer at man skal have 20 åbne samtidige forbindelser til en SQL server eller?

Og hvis det ikke kan lade sig gøre at retunere SqlConnection sammen med SqlDataReaderen, kan må så på en måde undgå at en SqlConnection bliver låst til en SqlDataReader? Hvis man kan det, så er mit problem også løst.

Håber en kan hjælpe mig ud af denne klemme.

/Lasse
Avatar billede neoman Novice
20. juni 2007 - 13:37 #1
Se afsnittet "Returning DataReader form components" i
http://www.dotnetbips.com/articles/432e4904-754c-4425-ae93-c6142c2b943f.aspx

hvor løsningen på dit problem er beskrevet:


public SqlDataReader GetEmployees()
{
SqlConnection cnn=
new SqlConnection
(@"data source=.\vsdotnet;initial catalog=northwind;user id=sa");
SqlCommand cmd=
new SqlCommand("select * from employees",cnn);
cnn.Open();
SqlDataReader dr=
cmd.ExecuteReader(CommandBehavior.CloseConnection);
return dr;
}
Avatar billede dr_chaos Nybegynder
20. juni 2007 - 13:39 #2
Du skal ikke bruge statiske connections på den måde.
Det er no-no.
Avatar billede lasserasch Juniormester
20. juni 2007 - 14:12 #3
Yes.... Var jo lige det jeg manglede. Virker perfekt. Hvis i vidste hvor mange timer det problem har givet mig hovedpine, og min tålmodighed var virkelig blev sat på en prøve...

Og ja, var godt klar over at det var noget fy fy at have statiske SQL connections.

Takker for hjælpen!

/Lasse
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester