Avatar billede dennism Nybegynder
16. februar 2009 - 15:43 Der er 13 kommentarer og
1 løsning

C#: MySQL connection

Jeg har et C# program som bruger MySql.Data.MySqlClient til at forbinde til en lokal MySQL database.

I toppen af min kode laver jeg en connection til min database og laver en command og en reader som bliver itereret igennem med en While. Inden i whilen har jeg for hvert objekt i readeren brug for at lave en ny command. Her fik jeg en fejl som sagde, at jeg ikke kunne bruge min connection igen mens den bliver brugt til readeren. Derfor var jeg nødt til at lave en ny connection hver gang while-løkken kører. Da den bliver kørt mange gange, ender det med at jeg åbenbart får en timeout til sidst får derfor en exception.

Hvordan kan jeg få lov til at bruge min connection til flere jobs på en gang?
Avatar billede j3ppah Novice
16. februar 2009 - 15:45 #1
Prøv lige at smide din kode, så vi kan se hvordan du har lavet det
Avatar billede arne_v Ekspert
16. februar 2009 - 15:54 #2
Du kan kunne bruge en connection til en enkelt reader.

Åben en ny connection når du skal bruge en *OG* kald Close eller
Dispose når du er færdig med den !

Så skal det nok virke.
Avatar billede dennism Nybegynder
16. februar 2009 - 15:55 #3
Koden er lidt komplex, så tror det vil forvirre ved at indsætte den her. Det kan desværre ikke laves med en subquery - er nødt til at lave en command igen. Her er et lille uddrag:


        static void Main(string[] args) {
            MySqlConnection connection = new MySqlConnection(connStr);
            connection.Open();

            MySqlCommand command = connection.CreateCommand();
            command.CommandText = "SELECT * FROM table";
            MySqlDataReader Reader = command.ExecuteReader();

            while (Reader.Read()) {

                //...

                MySqlCommand command2 = connection.CreateCommand();
                command2.CommandText = "SELECT * FROM table2";
                MySqlDataReader reader2 = command2.ExecuteReader();

                while (reader2.Read()) {
                    //...
                }

                //...

            }

            connection.Close();
        }
Avatar billede arne_v Ekspert
16. februar 2009 - 15:54 #4
Overvej iøvrigt om du kan hente al data med en enkelt SELECT og en JOIN.
Avatar billede arne_v Ekspert
16. februar 2009 - 15:56 #5
Overvej at bruge C# konstruktionen:

            using(MySqlConnection con = new MySqlConnection("Data Source=localhost;Database=Test;User Id=root;Password="))
            {
                con.Open();
                MySqlCommand ....
            }

da connection så bliver lukket automatisk ved slut parentesen.
Avatar billede dennism Nybegynder
16. februar 2009 - 15:58 #6
Ok, så jeg er nødt til at lave en connection for hver reader? Tror jeg havde glemt at Close den ene af dem før - nok derfor jeg fik timeout.
Avatar billede arne_v Ekspert
16. februar 2009 - 15:59 #7
MySqlConnection connection = new MySqlConnection(connStr);
            connection.Open();

            MySqlCommand command = connection.CreateCommand();
            command.CommandText = "SELECT * FROM table";
            MySqlDataReader Reader = command.ExecuteReader();

            while (Reader.Read()) {

                //...

            MySqlConnection connection2 = new MySqlConnection(connStr); // <--------------
            connection2.Open(); // <--------------

                MySqlCommand command2 = connection2.CreateCommand();
                command2.CommandText = "SELECT * FROM table2";
                MySqlDataReader reader2 = command2.ExecuteReader();

                while (reader2.Read()) {
                    //...
                }

                reader2.Close(); // <--------------
                connection2.Close(); // <--------------

                //...

            }

            reader.Close(); // <--------------
            connection.Close();
Avatar billede arne_v Ekspert
16. februar 2009 - 15:59 #8
Du kan også bruge using på din reader.
Avatar billede erikjacobsen Ekspert
16. februar 2009 - 16:39 #9
Alternativet er at samle dine data fra den første SELECT i en liste, og bruge dem efterfølgende. Så har du kun en connection i gang. Ikke at det gør den store forskel.

Og hvem ved om det kan laves med en subquery ... ?
Avatar billede jokkejensen Novice
16. februar 2009 - 17:25 #10
jeg-samler-slet-ikke-paa-point-tak.erikjacobsen.com/  lol
Avatar billede dennism Nybegynder
07. marts 2009 - 12:37 #11
.lukker
Avatar billede arne_v Ekspert
07. marts 2009 - 14:57 #12
øh ?
Avatar billede dennism Nybegynder
09. marts 2009 - 17:02 #13
Jeg beklager meget - der er sket en fejl.
Da jeg gennemgik mine åbne spørgsmål, så jeg at der i denne stod "eg-samler-slet-ikke-paa-point...". Derfor troede jeg, at jeg havde bedt jer smide et svar.

Jeg laver lige en tråd med point til dig, Arne!

Endnu engang undskyld fejlen!
Avatar billede dennism Nybegynder
09. marts 2009 - 17:03 #14
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