02. maj 2007 - 12:39Der er
16 kommentarer og 1 løsning
SQL Connection fejl.
Hejsa drenge...
Jeg er stødt på et problem! Mit C# program bruger en SQL server. Den forbinder jeg til når programmet startes, når der navigeres rundt i de forskellige skærmbilleder med data og andre steder.
Det har indtil nu virket perfekt, men nu er jeg åbenbart stødt på en mur.
Jeg skal loade et usercontrol, som laver ret mange SQL forespørgelser! Det spørger på priser på en masse produkter, sammenligner dem med andre informationer osv osv osv....
Idag har jeg for første gang langt over 70 produkter ind, som den skal tjekke igennem.
Jeg støder nu på denne fejl :
"Timeout er udløbet. Timeoutperioden udløb, før der blev hentet en forbindelse fra gruppen. Det kan skyldes, at alle grupperede forbindelser var i brug, og at den maksimale gruppestørrelse var nået."
Min SQL forbindelse opretter jeg således : Fra mit usercontrol siger jeg :
SqlDataReader Reader = SSDR("select * from tabel 1 ect.");
public SqlDataReader SSDR(String sqltext) { SqlConnection conn = new SqlConnection(sql_conn()); SqlCommand cmd = new SqlCommand(sqltext, conn);
Hvis jeg laver en conn.close() før "return RSDR;" så siger min SQLDatareader at den ikke kan læse når state er = closed! Men du har nok ret i at jeg har sindsygt mange åbne forbindelser! Men hvordan får jeg den lukket korrekt så?
Men ja, du har ret i at mine forbindelser ikke bliver lukket. Har lige fundet ud af, at når den når 232 åbne forbindelser, så lukker den af! Men som sagt får jeg følgende fejl hvis jeg laver en conn.close(); lige før return RSDR;
"Forsøget på at Read er ugyldigt, når læsefunktionen er lukket."
Den kommer når jeg forsøger at køre min "while (ÅSQDR2.Read())" Ala sådan her :
SqlDataReader SQDR2 = SSDR("Select * from TABEL1 ); while (SQDR2.Read()) { kode kode kode
}
Hvordan pokker får jeg så mine forbindelser lukket igen?
Så vidt jeg husker, så er SqlDataReader afhængig af en åben forbindelse til databasen, da den kun læser en række af gangen.
Du skal i stedet for bruge et DataSet eller en DataTable som fyldes med data fra en SqlDataAdapter. Så kan du returnere et dataset som du frit kan bladre rundt i, uden en åben forbindelse til databasen.
Der skulle være rigeligt med eksempler på nettet, med den fremgangsmåde.
Jeg ville hellere lave et datalag der returnerede et Data ark af en eller anden type..
ala psuedo
Public DataSet/DataTable (string sqlText) { using (SqlConnection cn = new SqlConnection(sqlText)) { DataTable/DataSet/DataReader Results; using (SqlCommand cm = new SqlCommand(commandString, cn)) { cn.Open(); ..... } return Results; } }
Public DataSet/DataTable (string sqlText) { using (SqlConnection cn = new SqlConnection(sql_conn())) { DataTable/DataSet/DataReader Results; using (SqlCommand cm = new SqlCommand(sqlText, cn)) { cn.Open(); ..... } return Results; } }
Eneste problem er bare at jeg gerne ville undgå at bruge datatables så vidt muligt. Jeg bruger det nogle steder i mit program, men hvis jeg skal til at ændre mine SqlDataReaders til datatables or arbejde med dem i stedet for, så skal jeg rette program kode i mange dage....
Jeg har nu oprettet 10 stk. static SQLConnection's på min hovedform, og hver gang jeg kalder min SSDR funtion, så kalder jeg den bare med en af disse SqlConnections.
Grunden til at jeg har lavet 10 stk, er at jeg har nogle gange brug for at lave følgende :
SqlDataReader SQDR1 = SSDR("select bla bla bla", frm_main.SqlConn1)
while (SQDR1.read())
{ SqlDataReader SQDR2 = SSDR("select bla bla bla", frm_main.SqlConn2)
While (SQDR2.read()) { do something
} }
Og derfor har jeg brug for flere SqlConnections. Men det virker nu, så jeg er lettet igen!
(den gør at når DataReader lukkes så lukkes Connection også)
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.