Avatar billede tinaw25 Nybegynder
19. oktober 2013 - 21:45 Der er 10 kommentarer og
1 løsning

Object reference not set to an instance of an object. ???

Jeg har sat op så man kan bestille tilvalg eller man kan lade værd, men det kommer også fint op idatabasen men den kommer med denne fejl når den har kørt koden:

Object reference not set to an instance of an object.

Line 140: List<ValgtFrugt> valgteFrugter = (List<ValgtFrugt>)Session["ValgteFrugter"];
Line 141:
Line 142: DataTable dataTable = new DataTable(Session["ValgteFrugter"].ToString());
Line 143:

Jeg har siddet med det i lang tid, og jeg kan bare ikke se hvad det er jeg gør galt, er der nogle som kan hjælpe mig?? Jeg smider resten af min kode.

protected void Button_putikurv_Click(object sender, EventArgs e)
    {

        int totalvaerdi = 0;

        List<ValgtDeli> valgteDeli = new List<ValgtDeli>(); //Her laver jeg en liste over valgte frugter. Det er et nyt objekt, som kan indeholde påde ID, Navn, Antal og Værdi

        foreach (DataListItem itm in VisDeli.Items)
        {
            if (itm.ItemType == ListItemType.Item || itm.ItemType == ListItemType.AlternatingItem)
            {
                    TextBox TextBox_deli = itm.FindControl("TextBox_deli") as TextBox;

                string DeliNavn = TextBox_deli.Attributes["DeliNavn"];

                int deliID = Convert.ToInt32(TextBox_deli.Attributes["ID"]);

                if (TextBox_deli.Text != null)
                {

                    if (string.IsNullOrEmpty(TextBox_deli.Text))
                    {
                        TextBox_deli.Text = "0";

                    }
                }

                int enkeltDeliAntal = int.Parse(TextBox_deli.Text);

                totalvaerdi += (enkeltDeliAntal);

                if (enkeltDeliAntal > 0)
                {
                    ValgtDeli frugtenDerskalTilfoejes = new ValgtDeli();
                    frugtenDerskalTilfoejes.ID = deliID;
                    frugtenDerskalTilfoejes.Navn = DeliNavn;
                    frugtenDerskalTilfoejes.Antal = enkeltDeliAntal;
                    valgteDeli.Add(frugtenDerskalTilfoejes);

                }
             
            }
            if (totalvaerdi > 0)
            {
                Session["ValgteDeli"] = valgteDeli;
                opretOrdre();
            }
            else
            {
                opretOrdre();
            }
         

        }
     
               
    }
    private void opretOrdre()
    {
       
        if (Session["ValgteDeli"] == null )
        {

            SqlConnection conn = new SqlConnection();
            conn.ConnectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ToString();

            SqlCommand cmd = new SqlCommand();
            cmd.Connection = conn;
            cmd.CommandText = "INSERT INTO ordre (dato, navn, efternavn, mobil, adresse, mail, postnr, bynavn) VALUES(GETDATE(), @navn, @efternavn, @mobil, @adresse, @mail, @postnr, @bynavn); SELECT SCOPE_IDENTITY()";

            cmd.Parameters.Add("@navn", SqlDbType.VarChar).Value = TextBox_navn.Text;
            cmd.Parameters.Add("@efternavn", SqlDbType.VarChar).Value = TextBox_efternavn.Text;
            cmd.Parameters.Add("@mobil", SqlDbType.VarChar).Value = TextBox_mobil.Text;
            cmd.Parameters.Add("@adresse", SqlDbType.VarChar).Value = TextBox_adresse.Text;
            cmd.Parameters.Add("@mail", SqlDbType.VarChar).Value = TextBox_mail.Text;
            cmd.Parameters.Add("@postnr", SqlDbType.VarChar).Value = TextBox_postnr.Text;
            cmd.Parameters.Add("@bynavn", SqlDbType.VarChar).Value = TextBox_by.Text;


            conn.Open();
            object orderId = cmd.ExecuteScalar();
            conn.Close();

            //SÅ skal vi bruge de parametre der skal til for at kunne skrive til vore OrdrerLinier Tabel
            //Og evt. opdatere vores produkts lagerbeholdning
            //########################//
            //SÅ til vores ordrerlinier
            //fk_ordre - den fra object'et
            cmd.Parameters.Add("@fk_ordre", SqlDbType.Int).Value = orderId;
            //fk_produktId - fra session _kurv. Sættes nu til 0, den den skal ind i foreach løkken og få sin værdi.
            //cmd.Parameters.Add("@prod", SqlDbType.Int).Value = 0;

            //Produkt antal - sammen som Id'et. Sættes til 0 og får værdi i løkken
            cmd.Parameters.Add("@Antal", SqlDbType.Int).Value = 0;
 

        List<ValgtFrugt> valgteFrugter = (List<ValgtFrugt>)Session["ValgteFrugter"];
       
            var dataTable = new DataTable(Session["ValgteFrugter"].ToString());



            dataTable.Columns.Add("ID", typeof(int));
            dataTable.Columns.Add("Navn", typeof(string));
            dataTable.Columns.Add("Antal", typeof(int));
            dataTable.Columns.Add("Vaerdi", typeof(int));

            foreach (ValgtFrugt frugt in valgteFrugter)
            {
                dataTable.Rows.Add(frugt.ID, frugt.Navn, frugt.Antal, frugt.Vaerdi);
            }

            List<ValgtGroent> valgteGroent = (List<ValgtGroent>)Session["ValgteGroent"];
            var dataTable1 = new DataTable(Session["ValgteGroent"].ToString());

            dataTable1.Columns.Add("ID", typeof(int));
            dataTable1.Columns.Add("Navn", typeof(string));
            dataTable1.Columns.Add("Antal", typeof(int));
            dataTable1.Columns.Add("Vaerdi", typeof(int));

            foreach (ValgtGroent groent in valgteGroent)
            {
                dataTable1.Rows.Add(groent.ID, groent.Navn, groent.Antal, groent.Vaerdi);
            }

         

            DataTable dtAll = new DataTable();
            dtAll = dataTable.Copy();
            dtAll.Merge(dataTable1, true);
           


            conn.Open();

            foreach (DataRow row in dtAll.Rows)
            {
                cmd.CommandText = @"INSERT INTO ordre_linie
                                (fk_ordre_id, antal, navn)
                                VALUES (@fk_ordre, @Antal, @navn)";



                cmd.Parameters["@Antal"].Value = row["Antal"];
                cmd.Parameters["@navn"].Value = row["Navn"];


                cmd.ExecuteNonQuery();
            }

            conn.Close();
            Session.Abandon();

            Session.Contents.RemoveAll();
            Label_tak.Text = "Tak for henvendelsen, ordren bliver behandlet hurtigst muligt";

        }
        else
        {


            SqlConnection conn = new SqlConnection();
            conn.ConnectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ToString();

            SqlCommand cmd = new SqlCommand();
            cmd.Connection = conn;
            cmd.CommandText = "INSERT INTO ordre (dato, navn, efternavn, mobil, adresse, mail, postnr, bynavn) VALUES(GETDATE(), @navn, @efternavn, @mobil, @adresse, @mail, @postnr, @bynavn); SELECT SCOPE_IDENTITY()";

            cmd.Parameters.Add("@navn", SqlDbType.VarChar).Value = TextBox_navn.Text;
            cmd.Parameters.Add("@efternavn", SqlDbType.VarChar).Value = TextBox_efternavn.Text;
            cmd.Parameters.Add("@mobil", SqlDbType.VarChar).Value = TextBox_mobil.Text;
            cmd.Parameters.Add("@adresse", SqlDbType.VarChar).Value = TextBox_adresse.Text;
            cmd.Parameters.Add("@mail", SqlDbType.VarChar).Value = TextBox_mail.Text;
            cmd.Parameters.Add("@postnr", SqlDbType.VarChar).Value = TextBox_postnr.Text;
            cmd.Parameters.Add("@bynavn", SqlDbType.VarChar).Value = TextBox_by.Text;


            conn.Open();
            object orderId = cmd.ExecuteScalar();
            conn.Close();

            //SÅ skal vi bruge de parametre der skal til for at kunne skrive til vore OrdrerLinier Tabel
            //Og evt. opdatere vores produkts lagerbeholdning
            //########################//
            //SÅ til vores ordrerlinier
            //fk_ordre - den fra object'et
            cmd.Parameters.Add("@fk_ordre", SqlDbType.Int).Value = orderId;
            //fk_produktId - fra session _kurv. Sættes nu til 0, den den skal ind i foreach løkken og få sin værdi.
            //cmd.Parameters.Add("@prod", SqlDbType.Int).Value = 0;

            //Produkt antal - sammen som Id'et. Sættes til 0 og får værdi i løkken
            cmd.Parameters.Add("@Antal", SqlDbType.Int).Value = 0;



            List<ValgtFrugt> valgteFrugter = (List<ValgtFrugt>)Session["ValgteFrugter"];

            var dataTable = new DataTable(Session["ValgteFrugter"].ToString());



            dataTable.Columns.Add("ID", typeof(int));
            dataTable.Columns.Add("Navn", typeof(string));
            dataTable.Columns.Add("Antal", typeof(int));
            dataTable.Columns.Add("Vaerdi", typeof(int));

            foreach (ValgtFrugt frugt in valgteFrugter)
            {
                dataTable.Rows.Add(frugt.ID, frugt.Navn, frugt.Antal, frugt.Vaerdi);
            }

            List<ValgtGroent> valgteGroent = (List<ValgtGroent>)Session["ValgteGroent"];
            var dataTable1 = new DataTable(Session["ValgteGroent"].ToString());

            dataTable1.Columns.Add("ID", typeof(int));
            dataTable1.Columns.Add("Navn", typeof(string));
            dataTable1.Columns.Add("Antal", typeof(int));
            dataTable1.Columns.Add("Vaerdi", typeof(int));

            foreach (ValgtGroent groent in valgteGroent)
            {
                dataTable1.Rows.Add(groent.ID, groent.Navn, groent.Antal, groent.Vaerdi);
            }

            List<ValgtDeli> valgteDeli = (List<ValgtDeli>)Session["ValgteDeli"];


            var dataTable2 = new DataTable(Session["ValgteDeli"].ToString());

            dataTable2.Columns.Add("ID", typeof(int));
            dataTable2.Columns.Add("Navn", typeof(string));
            dataTable2.Columns.Add("Antal", typeof(int));

            foreach (ValgtDeli delikatesse in valgteDeli)
            {
                dataTable2.Rows.Add(delikatesse.ID, delikatesse.Navn, delikatesse.Antal);
            }

            DataTable dtAll = new DataTable();
            dtAll = dataTable.Copy();
            dtAll.Merge(dataTable1, true);
            dtAll.Merge(dataTable2, true);

            conn.Open();

            foreach (DataRow row in dtAll.Rows)
            {
                cmd.CommandText = @"INSERT INTO ordre_linie
                                (fk_ordre_id, antal, navn)
                                VALUES (@fk_ordre, @Antal, @navn)";



                cmd.Parameters["@Antal"].Value = row["Antal"];
                cmd.Parameters["@navn"].Value = row["Navn"];


                cmd.ExecuteNonQuery();
            }

            conn.Close();
            Session.Abandon();

            Session.Contents.RemoveAll();
            Label_tak.Text = "Tak for henvendelsen, ordren bliver behandlet hurtigst muligt uden deli"; 
        }

     
           
     
    }

/Tina
Avatar billede erikjacobsen Ekspert
19. oktober 2013 - 21:48 #1
Kunne det tænkes at Session["ValgteFrugter"] bare er null - jeg kan ikke se den får en værdi i din kode.
Avatar billede tinaw25 Nybegynder
19. oktober 2013 - 21:57 #2
Mener du i denne her?

List<ValgtFrugt> valgteFrugter = (List<ValgtFrugt>)Session["ValgteFrugter"];
Avatar billede tinaw25 Nybegynder
19. oktober 2013 - 22:02 #3
Session bliver oprettet på en anden side

Der er noget i Session og i listen, men behøver vel bare kun at tage info fra session og smide i datatable eller hvad?
Avatar billede erikjacobsen Ekspert
19. oktober 2013 - 22:07 #4
I linie 140 aflæser du værdien. Den kan godt være null på det sted - det giver ikke fejl. Men i linie 142 bruger du .ToString() - som vil give fejl på en null-værdi.

Som sagt kan jeg ikke se noget det ligner

  Session["ValgteFrugter"] = ....noget....
Avatar billede tinaw25 Nybegynder
19. oktober 2013 - 22:15 #5
På en anden side:

if (totalvaerdi == 14 && totalvaerdiGroent == 7) //Det her skal vel være "Mindre end" eller lig 7, for ellers kan du bestille over 7 frugter
        {
            Session["ValgteFrugter"] = valgteFrugter;
            Session["ValgteGroent"] = valgteGroent;//Her lægger jeg dem bare i en session-variabel, så kan jeg lægge dem ind i databasen når det er bekræftet.
            Response.Redirect("bekraeft.aspx");

        }

Der bliver session oprettet

I breakpoint til linie 142: står der dataTable null. Så det vil sige at den er tom??

Men hvad gør jeg så forkert?
Avatar billede tinaw25 Nybegynder
19. oktober 2013 - 22:54 #6
Hvis jeg fjerner min if og else sætning er køre koden som alt er udfyldt, så bliver det udført korrekt.

Men ligeså snart jeg sættet min if og else op med at man behøver ikke at udfylde tilvalg så køre den hele koden korrekt og efter at det er lagt i databasen så køre koden forfra, også kan jeg godt forstå at den session er tom for den bliver clear ligeså snart tingende er kommet i databasen.

Så må min if og else være forkert, hvor jeg går ind og tjekker om der er noget i min session
Avatar billede erikjacobsen Ekspert
19. oktober 2013 - 23:04 #7
Hmm, det er mere end jeg lige har tid til at sætte mig ind i. Men er der noget i Session["ValgteFrugter"] hvis den ikke lige kommer ind i den if?

Og den anden ting jeg ser: hvad er det for en værdi, som din new DataTable har med som parameter? Jeg plejer at se den uden parametre.
Avatar billede tinaw25 Nybegynder
20. oktober 2013 - 22:45 #8
Jeg har fundet ud af min fejl, jeg skal slette min textbox_deli når jeg har info ind i databasen for den har værdi derfor køre den koden og jeg får fejlen fordi mine lister jo er tomme.

Hvis man skal have fat i textbox i en datalist skal det så være en foreach??

foreach (DataListItem itm in VisDeli.Items)
            {
             
                    if (itm.ItemType == ListItemType.Item || itm.ItemType == ListItemType.AlternatingItem)
                    {
                        TextBox TextBox_deli = itm.FindControl("TextBox_deli") as TextBox;
                    }

}

Kan jeg ikke få adgang uden en foreach??
Avatar billede tinaw25 Nybegynder
21. oktober 2013 - 00:46 #9
Jeg fik set selv løst men tak for din tid.

Smid et svar fordi du har brugt tid på mig
Avatar billede kalp Novice
23. oktober 2013 - 09:33 #10
prøv lige at se hvad hans hjemmeside hedder lol
Avatar billede tinaw25 Nybegynder
23. oktober 2013 - 10:14 #11
Den havde jeg slet ikke set *GG*
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
Kurser inden for grundlæggende programmering

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