Avatar billede lasserasch Juniormester
02. maj 2007 - 12:39 Der 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);
           
            conn.Open();

            SqlDataReader RSDR = cmd.ExecuteReader();
           
            return RSDR;
            conn.Close();   
        }

        public static String sql_conn()
        {
            String Conn = "Data Source=SERVERNAVN"; UID=USERNAME; PWD=PASSWORD; Database=DATABASE;
            return Conn;
        }


Nogen der kan fortælle mig hvordan jeg undgår den fejl?

/Lasse
Avatar billede jokkejensen Novice
02. maj 2007 - 12:48 #1
Du laver "return RSDR;"

Før du lukker forbindelsen..

Så tror jeg ikke du får den lukket.

/JJ
Avatar billede lasserasch Juniormester
02. maj 2007 - 12:50 #2
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å?
Avatar billede thesurfer Nybegynder
02. maj 2007 - 13:00 #3
Den burde tillade:

            conn.Close();
            return RSDR;
Avatar billede thesurfer Nybegynder
02. maj 2007 - 13:01 #4
Men denne ser ikke helt rigtigt ud:

        public static String sql_conn()
        {
            String Conn = "Data Source=SERVERNAVN"; UID=USERNAME; PWD=PASSWORD; Database=DATABASE;
            return Conn;
        }

Mon ikke at det skulle have været:

            String Conn = "Data Source=SERVERNAVN; UID=USERNAME; PWD=PASSWORD; Database=DATABASE;";
Avatar billede lasserasch Juniormester
02. maj 2007 - 13:04 #5
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?
Avatar billede Spotgun Seniormester
02. maj 2007 - 13:15 #6
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.
Avatar billede thesurfer Nybegynder
02. maj 2007 - 13:16 #7
Prøv evt med:

        public SqlDataReader SSDR(String sqltext)
        {
            SqlDataReader RSDR = null; // måske bare "SqlDataReader RSDR;"
            try
            {

        SqlConnection conn = new SqlConnection(sql_conn());
        SqlCommand cmd = new SqlCommand(sqltext, conn);
           
        conn.Open();

        SqlDataReader RSDR = cmd.ExecuteReader();
            } catch (Exception ex) {

        // fejlhåndtering

            } finally {
        conn.Close();   
            }

            return RSDR;
        }
Avatar billede jokkejensen Novice
02. maj 2007 - 14:05 #8
Nej..

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;
}
}
Avatar billede jokkejensen Novice
02. maj 2007 - 14:06 #9
how... ja det skal selvfølgeligt være

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;
}
}
Avatar billede jokkejensen Novice
02. maj 2007 - 14:08 #10
Problemet med en DataReader er at den kræver en åben forbindelse.

Det gør et Dataset/Datatable ikke.

/JJ
Avatar billede jokkejensen Novice
02. maj 2007 - 14:11 #11
Public DataTable (string sqlText)
{
DataTable dt= new DataTable("Results");
using (SqlConnection cn = new SqlConnection(sql_conn()))
{
    SqlCommand cmd = new SqlCommand(sqlText, cn);
    SqlDataAdapter adpt = new SqlDataAdapter(cmd);   
    adpt.Fill(dtCustomers);
}
return dt;
}

Burde gøre tricket..

Den sørger selv for connection pooling osv.

/JJ
Avatar billede jokkejensen Novice
02. maj 2007 - 14:15 #12
ja.. det skal så igen lige være

Public DataTable GetDataTable(string sqlText)
{
..
}

Så skriver du bare

DataTable test = GetDataTable("Select * from ...");


  foreach ( DataRow row in test.Rows ) {
      foreach ( DataColumn col in table.Columns ) {
        Response.Write ( row [ col ].ToString ( ) );
      }
  }
Avatar billede lasserasch Juniormester
02. maj 2007 - 15:25 #13
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....
Avatar billede lasserasch Juniormester
02. maj 2007 - 16:13 #14
Nå, jeg fandt ud af det.

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!


Smid svar!

/Lasse
Avatar billede jokkejensen Novice
02. maj 2007 - 17:18 #15
Skal der kun være én bruge på den hjemmeside, er det en fin løsning.

svar :)

/JJ
Avatar billede lasserasch Juniormester
02. maj 2007 - 17:28 #16
Det er ikke en hjemmeside jeg udvikler. Det er et windows program, men never mind.... Takker for indsatsen til alle!

/Lasse
Avatar billede arne_v Ekspert
03. maj 2007 - 02:00 #17
må jeg hav elov til at foreslå:

cmd.ExecuteReader(CommandBehavior.CloseConnection)

?

(den gør at når DataReader lukkes så lukkes Connection også)
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