Avatar billede limes_planum Praktikant
23. august 2012 - 15:05 Der er 6 kommentarer og
1 løsning

Falder igennem på switch grundet DB-kald?

I den følgende switch har jeg et stort problem med scope't:

// Bruger/ekspedient scanner varer eller returnere ved 'H'
            switch (myCSK)
            {
               
                case "H":                   
                    Program HvMn = new Program();
                    HvMn.StartAlt();
                    break;
                case "S":
                    StartSalg();
                    break;
                case "V":
                    bool visBoolForfra = true;
                    StartSalgVisning(visBoolForfra);
                    break;
                case "K":
                    Console.WriteLine("\nKvittering...\n");
                    SammenRegner nySR = new SammenRegner();
                    nySR.SammenRG(mylist, myCSK, counter, sendRFV);
                break;
                case "CK":
                StartSalgMedKvitt stSalg2 = new StartSalgMedKvitt();
                stSalg2.StartSalg();
                break;
                case "VN":
                Console.WriteLine("\n1.2.V Du er nu i varenavns-zonen \n(Ønsker du at returnere til 3-ciferkode-zonen, skal du nu taste '121' og enter)");
                    myCSK = Console.ReadLine();
                    if (myCSK == "CK")
                    {
                        StartSalg();
                    }
                    else
                    {
                        Console.WriteLine("Varenavnsloop");
                        vareNavnsLoop();
                    }
                break;
                default:

                try
                {
                    string SQLCreateCore = "";
                    SqlDataReader myWriter = null;

                    SqlConnection cnn = new SqlConnection("xxx");

                    SQLCreateCore = "INSERT INTO GerstedtTmpVar (tmpVar) VALUES ('" + myCSK + " ')";
                    SqlCommand myCommand1 = new SqlCommand(SQLCreateCore, cnn);
                    myWriter = myCommand1.ExecuteReader();
                    cnn.Close(); 

                    if (Convert.ToInt32(myCSK) > 101 && Convert.ToInt32(myCSK) < 1000)
                    {
                        // afvikl hent varenavn og pris til kvitteringsopbygning (før disse med over til sammenregner.cs)
             
                        while (mylist.Count > counter)
                        {
                            sendRFV = returnValueFaVa;
                            SammenRegner nySRW = new SammenRegner();
                            nySRW.SammenRG(mylist, myCSK, counter, sendRFV);                           

                            returnValueFaVa = nySRW.SammenRG(mylist, myCSK, counter, sendRFV);                                             
                                counter += 1;

                                if (returnValueFaVa == 0 && counter == mylist.Count)
                                {
                                    returnValueFaVa = -1;                           
                                }
                                else if (returnValueFaVa != 0 && counter == mylist.Count)
                                {                                   
                                    returnValueFaVa = 0;
                                }

                        }                       

                        if (returnValueFaVa == -1)
                        {
                            Console.WriteLine("Varenummeret genkendes ikke - Prøv igen.");
                            returnValueFaVa = 0;
                            counter = 0;
                            StartSalg();
                        }
                     
                        counter = 0;
                        if (myCSK != "K")
                        {
                            StartSalg();
                        }
                    }
                    else
                    {

                        // Her udskrives at valget ikke er rigtigt indtastet
                        Console.WriteLine("Indtastning genkendes ikke (dine bogstaver skal skrives med stort, og/eller varenummeret skal have 3 cifre) - Prøv igen.");
                        if (myCSK != "K")
                        {
                            StartSalg();
                        }
                    }
                }
                catch {
                    if (myCSK != "K")
                    {

                        Console.WriteLine("Varenummeret genkendes ikke, da du har tastet 'ingen-tegn'/specialtegn eller bogstaver.\n Såfremt du ønsker at søge på et varenavn nu, skal du taste 'VN'");
                        StartSalg();
                    }
 
                }       
                break;
            }


- - -

->> Vælger jeg at udkommentere dette stykke:

      string SQLCreateCore = "";
                    SqlDataReader myWriter = null;

                    SqlConnection cnn = new SqlConnection("xxx");

                    SQLCreateCore = "INSERT INTO GerstedtTmpVar (tmpVar) VALUES ('" + myCSK + " ')";
                    SqlCommand myCommand1 = new SqlCommand(SQLCreateCore, cnn);
                    myWriter = myCommand1.ExecuteReader();
                    cnn.Close(); 

->> .. fungerer scriptet igen, på en sådan måde at :

  if (Convert.ToInt32(myCSK) > 101 && Convert.ToInt32(myCSK) < 1000)
                    { ... etc.

->>  .. bliver kørt rigtigt og min vare bliver indskrevet.

Hvad gør jeg for at scope't afvikles ordentligt MED db-kaldet aktivt (ikke-udkommenteret)?
Avatar billede Syska Mester
23. august 2012 - 15:14 #1
Du skal flytte det ud af din "default" i din switch hvis det altid skal køres.

default køres kun hvis ingen af oversteånde "case" matches.

Jeg håber jeg har forstået dit problem eller må du gerne beskrive det lidt bedre.

Måske også flytte noget af din kode ud i methods så det er nemmere at læse her på eksperten :-)
Avatar billede softspot Forsker
23. august 2012 - 15:46 #2
Jeg gætter på, at der sker en fejl ifm. dit SQL-kald og du dermed ryger i catch-sektionen. Men da du kun gør/viser noget, hvis betingelsen myCSK != "K" er opfyldt, får du ikke nogen indikation af denne fejl.

Skriv et eller andet ud i Console (indtil det fungerer i et mindste) i den catch-blok, så du kan følge din kodes eksekveringssti. Du kan f.eks. udskrive teksten fra den undtagelse der rejses... :-)

Når nu du alligevel har gang i et Command-objekt til databasekaldet, så kan du jo ligeså godt benytte dig at parametre, i stedet for at plastre din SQL-sætning sammen af SQL og parameterværdien.
Avatar billede limes_planum Praktikant
23. august 2012 - 15:50 #3
Ja, kan umiddelbart se hvad du mener med 'default', problemet er jo bare at såfremt brugeren (i denne vareindtastnings-programdel i et butikssystem) indtaster en 3-cifret varekode (eks-vis '115'), så ramler switchen normalt (uden kommentering) ned til default, da ingen af de ovenfor karakter-baserede valg bliver opfyldt.

Således er jeg sikker på at switchen fungerer upåklageligt så langt, at 'default' afvikles hvis et tal indskrives.

- - -

Kodestumpen med DB-kaldet, har allerede ligget ud i en metode, hvor det desv. heller ikke virkede..

>> det virker bare som om at DB-kaldet i sig selv skaber scope-problemer og ignorerer pointer-kronologien?
Avatar billede softspot Forsker
23. august 2012 - 15:51 #4
I øvrigt giver dine tjek på om myCSK != "K", i default-sektionen af din switch, vel ikke ret meget mening, når du allerede har en case "K" tidligere. Dvs. i default-sektionen vil myCSK ALTID være forskellig fra "K" og dermed vil dine betingelser altid være sande (og dermed overflødige)... eller har jeg overset noget?

Det gør så også min påstand fra før ugyldig, da du jo burde få udskrevet en meddelelse om at "Varenummeret genkendes ikke..." - og det har du jo ikke nævnt noget om (hvad sker der egentlig?)...
Avatar billede limes_planum Praktikant
23. august 2012 - 15:52 #5
Foregående svar var kun @buzz - skal lige vende din komm. @softspot før jeg kommenterer derpå..
Avatar billede limes_planum Praktikant
24. august 2012 - 12:48 #6
Tak fir hjælpen til Jer begge - Det var selvfølgelig mig selv der ikke udnyttede at consol-writeline; 'Exception e', så jeg ku se at conn ikke var åben..
Derfra ku jeg smide cnn.Open(); ind det rette sted for at få det til at virke (havde copy-pasted db-conn fra et andet sted, og åbenbart fået slettet cnn.Open(); i den forb.)

@Softspot >> spot on.. smid et svar :)
Avatar billede softspot Forsker
24. august 2012 - 14:33 #7
Velbekomme :-)
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