Avatar billede henrik_40 Juniormester
15. oktober 2012 - 12:13 Der er 17 kommentarer og
1 løsning

Gentage sql-forespørgsel efter Exception error

Hej
Jeg får exception error-fejlen:

Unhandled Exception: System.Exception: A transport-level error has occurred when receiving results from the server. (provider: TCP Provider, error: 0 - The specified network name is.....

Jeg vil derfor gerne forsøge 3-4 gange mere med 10 sekunders mellemrum. Dette er forsøgt med koden (så spørgsmålet er hvad jeg gør galt i koden?):
        public DataTable ReadData(string ClassID)
        {
            bool success = false;
            short attempt = 0;

            DataTable dt = new DataTable();
            SqlDataAdapter da = new SqlDataAdapter();
            SqlCommand cmd = new SqlCommand();

            do
            {
                try
                {
                    using (cmd.Connection = JobsCode.Shared.DB.GetConnection(JobsCode.Shared.DB.DbAlias.Data_Custom))
                    {
                        cmd.Parameters.Add("@ClassID", SqlDbType.Char, 12).Value = ClassID;
                        cmd.Parameters.Add("@TypeCodeClientID", SqlDbType.Char, 3).Value = "abc";
                        cmd.CommandType = CommandType.StoredProcedure;
                        cmd.CommandTimeout = 20 * 60;

                        cmd.CommandText = "[dbo].[DK_MultiLevel]";
                        cmd.CommandType = CommandType.StoredProcedure;
                        cmd.Connection.Open();

                        SqlDataReader r = cmd.ExecuteReader();
                        dt.Load(r);
                    }
                    success = true;
                }
                catch (Exception ex)
                {
                    success = false;
                    attempt++;
                    Console.WriteLine("sql-server-connection Error. Attempts={0}", attempt);
                    Thread.Sleep(10000); // sleep for 10 seconds
                    throw new Exception(ex.Message);
                }
            } while (!(!success || attempt < 4));
            return dt;
        }
Avatar billede bvli Praktikant
15. oktober 2012 - 12:19 #1
throw new Exception(ex.Message);

Du skal ikke smide hvis du vil have at flowet skal fortsætte. Hvis du vil fikse det på den måde, må du gemme den sidste exception du får, og så smide den til sidst hvis success == false
Avatar billede henrik_40 Juniormester
15. oktober 2012 - 12:27 #2
Aha. Nu kan jeg desværre ikke teste det (da det tager 7 lange og 7 brede at køre mit program) førend i aften. Er det sådan her du mener (de sidste 5 linjer er interessante)?

        public DataTable ReadData(string ClassID)
        {
            bool success = false;
            short attempt = 0;

            DataTable dt = new DataTable();
            SqlDataAdapter da = new SqlDataAdapter();
            SqlCommand cmd = new SqlCommand();

            do
            {
                try
                {
                    using (cmd.Connection = JobsCode.Shared.DB.GetConnection(JobsCode.Shared.DB.DbAlias.Data_Custom))
                    {
                        cmd.Parameters.Add("@ClassID", SqlDbType.Char, 12).Value = ClassID;
                        cmd.Parameters.Add("@TypeCodeClientID", SqlDbType.Char, 3).Value = "abc";
                        cmd.CommandType = CommandType.StoredProcedure;
                        cmd.CommandTimeout = 20 * 60;

                        cmd.CommandText = "[dbo].[DK_MultiLevel]";
                        cmd.CommandType = CommandType.StoredProcedure;
                        cmd.Connection.Open();

                        SqlDataReader r = cmd.ExecuteReader();
                        dt.Load(r);
                    }
                    success = true;
                }
                catch (Exception ex)
                {
                    success = false;
                    attempt++;
                    Console.WriteLine("sql-server-connection Error. Attempts={0}", attempt);
                    Thread.Sleep(10000); // sleep for 10 seconds
                }
            } while (!(!success || attempt < 4));
        if (!success)
                    throw new Exception(ex.Message);
            return dt;
        }
Avatar billede henrik_40 Juniormester
15. oktober 2012 - 12:28 #3
altså stadig fange fejlen i en catch.

Men først smide excepttion ud efter x-antal forsøg, i
        if (!success)
                    throw new Exception(ex.Message);
Avatar billede bvli Praktikant
15. oktober 2012 - 12:34 #4
Ja næsten:

if (!success) { throw ex; }
Avatar billede bvli Praktikant
15. oktober 2012 - 12:35 #5
Ja næsten:

if (!success) { throw ex; }
Avatar billede henrik_40 Juniormester
15. oktober 2012 - 13:07 #6
Mange tak. Jeg må som sagt vente til jeg kan afprøve programmet senere i aften, og så vil jeg vende tilbage.
Avatar billede arne_v Ekspert
15. oktober 2012 - 13:19 #7
if (!success) { throw ex; }

vil man ofte lave som:

if (!success) { throw; }
Avatar billede henrik_40 Juniormester
15. oktober 2012 - 13:26 #8
hmm, jeg får problemer med throw. Skal try være udenom do-while-sætningen (se min kode først i tråden)?
Avatar billede henrik_40 Juniormester
15. oktober 2012 - 13:41 #9
Sådan her har jeg lavet den. Vil gerne høre om det er ok eller om der findes en bedre måde:
        public DataTable ReadData(string ClassID)
        {
            bool success = false;
            short attempt = 0;

            Exception exeption = null;
            DataTable dt = new DataTable();
            SqlDataAdapter da = new SqlDataAdapter();
            SqlCommand cmd = new SqlCommand();

            do
            {
                try
                {
                    using (cmd.Connection = JobsCode.Shared.DB.GetConnection(Morningstar.DK.JobsCode.Shared.DB.DbAlias.LicensedData_CustomFeedsDK))
                    {
                        cmd.Parameters.Add("@ClassID", SqlDbType.Char, 12).Value = ClassID;
                        cmd.Parameters.Add("@TypeCodeClientID", SqlDbType.Char, 3).Value = "abc";
                        cmd.CommandType = CommandType.StoredProcedure;
                        cmd.CommandTimeout = 20 * 60;

                        cmd.CommandText = "[dbo].[MultiLevel]";
                        cmd.CommandType = CommandType.StoredProcedure;
                        cmd.Connection.Open();

                        SqlDataReader r = cmd.ExecuteReader();
                        dt.Load(r);
                    }
                    success = true;
                }
                catch (Exception ex)
                {
                    success = false;
                    attempt++;
                    Console.WriteLine("sql-server-connection Error. Attempts={0}", attempt);
                    Thread.Sleep(10000); // sleep for 10 seconds
                    exeption = ex;
                }
            } while (!(!success || attempt < 4));
            if (!success) { throw exeption; }
            return dt;
        }
Avatar billede arne_v Ekspert
15. oktober 2012 - 13:57 #10
ah - throw uden exception virker kun i catch
Avatar billede arne_v Ekspert
15. oktober 2012 - 14:05 #11
jeg taenkte noget a la:

              catch (Exception ex)
                {
                    attempt++;
                    if(attempt < MAX_ATTEMPTS)
                    {
                        Console.WriteLine("sql-server-connection Error. Attempts={0}", attempt);
                        Thread.Sleep(INTERVAL_BETWEEN_ATTEMPTS);
                    }
                    else
                    {
                        throw;
                    }
                }
Avatar billede henrik_40 Juniormester
15. oktober 2012 - 14:24 #12
arne ->
Er denneher så bedre?






        public DataTable Data(string ClassID)
        {
            bool success = false;
            short attempt = 0;

            DataTable dt = new DataTable();
            SqlDataAdapter da = new SqlDataAdapter();
            SqlCommand cmd = new SqlCommand();

            do
            {
                try
                {
                    using (cmd.Connection = Shared.DB.GetConnection(Shared.DB.DbAlias))
                    {
                        cmd.Parameters.Add("@ClassID", SqlDbType.Char, 12).Value = ClassID;
                        cmd.Parameters.Add("@TypeCodeClientID", SqlDbType.Char, 3).Value = "abc";
                        cmd.CommandType = CommandType.StoredProcedure;
                        cmd.CommandTimeout = 20 * 60;

                        cmd.CommandText = "[dbo].[MultiLevel]";
                        cmd.CommandType = CommandType.StoredProcedure;
                        cmd.Connection.Open();

                        SqlDataReader r = cmd.ExecuteReader();
                        dt.Load(r);
                    }
                    success = true;
                }
                catch (Exception ex)
                {
                    success = false;
                    attempt++;
                    if (attempt < MAX_ATTEMPTS)
                    {
                        Console.WriteLine("sql-server-connection Error. Attempts={0}", attempt);
                        Thread.Sleep(10000);
                    }
                    else
                        throw;
                }
            } while (!(!success || attempt < 4));
            return dt;
        }
Avatar billede arne_v Ekspert
15. oktober 2012 - 14:43 #13
ja

du kan nok droppe test paa attempt i while
Avatar billede henrik_40 Juniormester
15. oktober 2012 - 14:45 #14
nåh ja p.gr.a. while :-)
Avatar billede henrik_40 Juniormester
15. oktober 2012 - 14:51 #15
Jeg sludrer, men forstår hvad du mener.
Avatar billede henrik_40 Juniormester
15. oktober 2012 - 19:43 #16
Det lader til det virker. Både bvli og arne_v har været mig til stor hjælp, så I fortjener point. Hvis I begge ligger svar, kan jeg vel fordele pointene?

Hilsen Henrik
Avatar billede arne_v Ekspert
15. oktober 2012 - 20:58 #17
svar

jeg synes ioevrigt at bvlu har hjulpet dig mest
Avatar billede henrik_40 Juniormester
15. oktober 2012 - 22:41 #18
Man kan åbenbart ikke dele ud af sine point, så jeg har oprettet et spørgsmål til bvlu, så jeg kan give bvlu point der.


http://www.eksperten.dk/spm/970607

bvlu -> afgiv svar på ovenstående link.
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