Avatar billede mikkel251 Seniormester
04. juli 2016 - 16:10 Der er 17 kommentarer og
3 løsninger

Objektet kan ikke ændres fra DBNull til andre typer.

Hej eksperter jeg ved ikke lige hvordan jeg løser den her og jeg tænkte nogen af jer kunne hjælpe mig med det :D

Serverfejl i programmet '/'.

Objektet kan ikke ændres fra DBNull til andre typer.
Beskrivelse: Der opstod en undtagelse, der ikke blev behandlet, under udførelse af den aktuelle webanmodning. Se staksporingen for at få flere oplysninger om fejlen, og hvor den kom fra i koden.

Detaljer om undtagelse: System.InvalidCastException: Objektet kan ikke ændres fra DBNull til andre typer.

Kildefejl:

Linje 38:                //De skal bruges til at regene priser og rabat ud med
Linje 39:                _pris = Convert.ToDecimal(dr["fldPris"]);
Linje 40:                _discount = Convert.ToInt32(dr["fldRabat"]);
Linje 41:
Linje 42:                //Nu skal total-discount regnes ud

Kildefil: c:\Users\Mikkel\Dropbox\Hovedforløbet webintegrator\Webshop-cms\vis-indhold.aspx.cs    Linje: 40

Staksporing:

[InvalidCastException: Objektet kan ikke ændres fra DBNull til andre typer.]
  System.DBNull.System.IConvertible.ToInt32(IFormatProvider provider) +52
  System.Convert.ToInt32(Object value) +30
  vis_indhold.Page_Load(Object sender, EventArgs e) in c:\Users\Mikkel\Dropbox\Hovedforløbet webintegrator\Webshop-cms\vis-indhold.aspx.cs:40
  System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +51
  System.Web.UI.Control.OnLoad(EventArgs e) +95
  System.Web.UI.Control.LoadRecursive() +59
  System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +2952


Versionsoplysninger: Microsoft .NET Framework version:4.0.30319; ASP.NET version:4.6.1073.0

Og her er min codebehind.
  vareFac objVare = new vareFac();
    DataTable dt = new DataTable();
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            //tjek om der er noget i querystring først før jeg går videre
            if (string.IsNullOrEmpty(Request.QueryString["indholdID"]))
            {
                Response.Redirect("Default.aspx");
            }
            else
            {
                int _produktId = Convert.ToInt32(Request.QueryString["indholdID"]);

                //her laver jeg et par variabler til at regene pris og før pris ud med
                int _discount;
                decimal _pris;
                decimal _total;
                decimal _totalDiscount;


                dt = objVare.hentVareUdFraId(_produktId);
                //opretter datarow med rows[0] - således jeg kun skal skrive dr istedetfor dr.rows[0] - det spare tid.
                DataRow dr = dt.Rows[0];

                //Prisen på produktet
                //De skal bruges til at regene priser og rabat ud med
                _pris = Convert.ToDecimal(dr["fldPris"]);
                _discount = Convert.ToInt32(dr["fldRabat"]);

                //Nu skal total-discount regnes ud
                _totalDiscount = _pris * _discount / 100;

                //her skal total pris regnes ud
                _total = _pris - _totalDiscount;

                //så skal jeg have tjekket på om rabat er 0
                if (Convert.ToInt32(dr["fldRabat"]) == 0)
                {
                    //hvis det er sandt, så skal prisen være
                    _total = _pris;
                }
                //ny pris
                string nyPris = "";
                if (Convert.ToInt32(dr["fldRabat"]) == 0)
                {
                    nyPris = "<h5>Pris: " + String.Format("{0:#.00}", _pris) + "</h5>";
                }
                else
                {
                    nyPris = "<h5 class='error'>Før pris :<del> " + String.Format("{0:#.00}", _pris) + "</del> kr.</h5>";
                    nyPris += "<h5>Nu kun : " + String.Format("{0:#.00}", _total) + " kr.</h5>";
                    nyPris += "<h5>Spar : " + String.Format("{0:#.00}", _totalDiscount) + " kr.</h5>";
                }

                litVare.Text += "<div class='col-md-4'>";
                litVare.Text += "<img src='img/produkt-img/produkter/" + dr["fldBillede"].ToString() + "' style='width: 250px;'/><br />";
                litVare.Text += "</div>";
                litVare.Text += "<div class='col-md-6'>";
                litVare.Text += "<h2 calss='title'>" + dr["fldTitel"] + "</h2><br />";
                litVare.Text += dr["fldBeskrivelse"].ToString() + "<br />";
                //litVare.Text += "<a href='#' class='btn btn-default'>Køb</a>";
                litVare.Text += "</div>";
                litVare.Text += "<div class='col-md-2'>";
                litVare.Text += "<img src='/img/rabat-img/" + dr["fldRabatBillede"].ToString() + "' style='width: 83px;'/><br />";
                litVare.Text += nyPris;
                litVare.Text += "</div>";

                ////tjek om der er over 10 på lager.
                if (Convert.ToInt32(dr["fldAntalPaaLager"]) > 10)
                {
                    hliKurv.Visible = true;
                    litRest.Visible = false;
                    hliKurv.NavigateUrl = "Kurv.aspx?vareID=" + dr["fldVareId"] + "&pris=" + _total;
                }
                else
                {
                    hliKurv.Visible = false;
                    litRest.Visible = true;
                    litRest.Text = "<p>";
                    litRest.Text = "<i>";
                    litRest.Text = "<del>";
                    litRest.Text = "<span>";
                    litRest.Text = "Læg i krurv";
                    litRest.Text = "</span>";
                    litRest.Text = "</del>";
                    litRest.Text = "</i>";
                    litRest.Text = "</p>";
                    litRest.Text = "<div>";
                    litRest.Text = "<p>Varen er i rest ordre</p>";
                    litRest.Text = "</div>";
                }
                ////Sætter billede ind hvis der ikke er nogen i forevejen
                //if (litVare.Text.Length <= 0)
                //{
                //    //her skal der så være et defalut billede hvis ikke der er et billede i forevejen
                //}
            }
        }
    }




Her er mine metoder:
    public DataTable hentVareUdFraId(int ID)
    {
        cmd = new SqlCommand(@"SELECT tblVare.fldId,
                                tblVare.fldTitel,
                                tblVare.fldPris,
                                tblVare.fldBeskrivelse,
                                tblVare.fldBillede,
                                tblVare.fldRabatId,
                                tblRabat.fldId,
                                tblRabat.fldRabat,
                                tblRabat.fldRabatBillede,
                                                                                                                                                                                                                                        tblAntalPaaLager.fldId,
                                                                                                                                                                                                                                        tblAntalPaaLager.fldAntalPaaLager,
                                tblAntalPaaLager.fldVareId
                                FROM
                                tblVare
                                LEFT JOIN tblRabat on tblVare.fldRabatId = tblRabat.fldId
                                                                                                                                                                                                                                        LEFT JOIN tblAntalPaaLager on tblVare.fldId = tblAntalPaaLager.fldVareId
                                                                                                                                                                                                                                        WHERE tblVare.fldId=@id");
        cmd.Parameters.AddWithValue("@id", ID);
        return DA.GetData(cmd);
    }

Tak fordi i gider kikke på det :D
Avatar billede arne_v Ekspert
04. juli 2016 - 16:26 #1
_pris = Convert.ToDecimal(dr["fldPris"]);
_discount = Convert.ToInt32(dr["fldRabat"]);

Et af disse felter har en NULL vaerdi.

Test for den inden du henter vaerdi og konverterer.
Avatar billede arne_v Ekspert
04. juli 2016 - 16:29 #2
Utestet:

if(!dr.IsDBNull("fldPris"))
{
    _pris = Convert.ToDecimal(dr["fldPris"]);
}
else
{
    _pris = 0;
}
Avatar billede mikkel251 Seniormester
04. juli 2016 - 16:44 #3
hej arne_v
den prøver jeg lige
Avatar billede mikkel251 Seniormester
04. juli 2016 - 17:01 #4
Det ser ud til at virke jeg måtte ændre et par linjer mere, men jeg får så samme fejl - Objektet kan ikke ændres fra DBNull til andre typer. -
jeg har lige prøvet at gøre det samme med den men det virkede ikke
og hvad betyder det  ( Objektet kan ikke ændres fra DBNull til andre typer. )

her er koden med fejlen
  ////tjek om der er over 10 på lager.
                if (Convert.ToInt32(dr["fldAntalPaaLager"]) > 10)
                {
                    hliKurv.Visible = true;
                    litRest.Visible = false;
                    hliKurv.NavigateUrl = "Kurv.aspx?vareID=" + dr["fldVareId"] + "&pris=" + _total;
                }
                else
                {
                    hliKurv.Visible = false;
                    litRest.Visible = true;
                    litRest.Text = "<p>";
                    litRest.Text = "<i>";
                    litRest.Text = "<del>";
                    litRest.Text = "<span>";
                    litRest.Text = "Læg i krurv";
                    litRest.Text = "</span>";
                    litRest.Text = "</del>";
                    litRest.Text = "</i>";
                    litRest.Text = "</p>";
                    litRest.Text = "<div>";
                    litRest.Text = "<p>Varen er i rest ordre</p>";
                    litRest.Text = "</div>";
                }
Avatar billede arne_v Ekspert
04. juli 2016 - 18:03 #5
if (!dr.IsDBNull("fldAntalPaaLager") && Convert.ToInt32(dr["fldAntalPaaLager"]) > 10)
Avatar billede arne_v Ekspert
04. juli 2016 - 19:03 #6
Og check eventuelt ogsaa om det faktisk er meningen at de felter kan indeholde NULL.
Avatar billede mikkel251 Seniormester
05. juli 2016 - 13:47 #7
der var ikke tilladt null i databsen  og så var der et par id,er der ikke passede til det de skulle, dem fik jeg ændret så nu virker det og den kode der var problemet er ændret til det her, Tak for hjælpen arne :D

          if (dr["fldPris"] == null && dr["fldRabat"] == null)
                {
                    _pris = 0;
                    _discount = 0;
                }
                else
                {
                    _pris = Convert.ToDecimal(dr["fldPris"]);
                    _discount = Convert.ToInt32(dr["fldRabat"]);
                }

                ////Nu skal total-discount regnes ud
                _totalDiscount = _pris * _discount / 100;

                //her skal total pris regnes ud
                _total = _pris - _totalDiscount;

                //så skal jeg have tjekket på om rabat er 0
                if (dr["fldRabat"] == null)
                {
                    //hvis det er sandt, så skal prisen være
                    _total = _pris;
                }
                //ny pris
                string nyPris = "";
                if (dr["fldRabat"] == null)
                {
                    nyPris = "<h5>Pris: " + String.Format("{0:#.00}", _pris) + "</h5>";
                }
                else
                {
                    nyPris = "<h5 class='error'>Før pris :<del> " + String.Format("{0:#.00}", _pris) + "</del> kr.</h5>";
                    nyPris += "<h5>Nu kun : " + String.Format("{0:#.00}", _total) + " kr.</h5>";
                    nyPris += "<h5>Spar : " + String.Format("{0:#.00}", _totalDiscount) + " kr.</h5>";
                }

                litVare.Text += "<div class='col-md-4'>";
                litVare.Text += "<img src='img/produkt-img/produkter/" + dr["fldBillede"].ToString() + "' style='width: 250px;'/><br />";
                litVare.Text += "</div>";
                litVare.Text += "<div class='col-md-6'>";
                litVare.Text += "<h2 calss='title'>" + dr["fldTitel"] + "</h2><br />";
                litVare.Text += dr["fldBeskrivelse"].ToString() + "<br />";
                //litVare.Text += "<a href='#' class='btn btn-default'>Køb</a>";
                litVare.Text += "</div>";
                litVare.Text += "<div class='col-md-2'>";
                litVare.Text += "<img src='/img/rabat-img/" + dr["fldRabatBillede"].ToString() + "' style='width: 83px;'/><br />";
                litVare.Text += nyPris;
                litVare.Text += "</div>";





                // her er en fejl der er ved at blive undersøgt //               
                ////tjek om der er over 10 på lager.
                if (dr["fldAntalPaaLager"] == null && Convert.ToInt32(dr["fldAntalPaaLager"]) > 10)
                {
                    hliKurv.Visible = true;
                    litRest.Visible = false;
                    hliKurv.NavigateUrl = "Kurv.aspx?vareID=" + dr["fldVareId"] + "&pris=" + _total;
                }
                else
                {
                    hliKurv.Visible = false;
                    litRest.Visible = true;
                    litRest.Text = "<p>";
                    litRest.Text = "<i>";
                    litRest.Text = "<del>";
                    litRest.Text = "<span>";
                    litRest.Text = "Læg i krurv";
                    litRest.Text = "</span>";
                    litRest.Text = "</del>";
                    litRest.Text = "</i>";
                    litRest.Text = "</p>";
                    litRest.Text = "<div>";
                    litRest.Text = "<p>Varen er i rest ordre</p>";
                    litRest.Text = "</div>";
                }
Avatar billede arne_v Ekspert
06. juli 2016 - 03:57 #8
// her er en fejl der er ved at blive undersøgt //             
                ////tjek om der er over 10 på lager.
                if (dr["fldAntalPaaLager"] == null && Convert.ToInt32(dr["fldAntalPaaLager"]) > 10)
                {

skal nok vaere:

// her er en fejl der er ved at blive undersøgt //             
                ////tjek om der er over 10 på lager.
                if (dr["fldAntalPaaLager"] != null && Convert.ToInt32(dr["fldAntalPaaLager"]) > 10)
                {

!= i.s.f. ==
Avatar billede mikkel251 Seniormester
06. juli 2016 - 11:02 #9
Den har jeg prøvet og jeg har også prøvet den her, men den vil ikke tælle ordentlig i databasen, når der er under 10 produkter skal knappen forsvinde og der skal være en besked til bruger om at varen er i rest ordre og når der er over 10 produkter så skal knappen Læg i kurv vises, men den viser kun at vare er i rest ordre, jeg har prøvet at rykke lidt rundt på koderne og når jeg så får knappen frem så er den der lige meget hvor mange vare der er på lager lige modsat af den anden :D

hvor dælen er min fejl henne? :D

    if (!string.IsNullOrEmpty(dr["fldAntalPaaLager"].ToString()) && Convert.ToInt32(dr["fldAntalPaaLager"]) > 10)
                    {
                            hliKurv.Visible = true;
                            litRest.Visible = false;
                            hliKurv.NavigateUrl = "kurv.aspx?vareID=" + dr["fldVareId"] + "&pris=" + _total;                     
                    }
                    else
                    {
                        hliKurv.Visible = false;
                        litRest.Visible = true;
                        litRest.Text = "<p><i><del><span style=\"color:red;\">Læg i kurv</span></del></i></p><div>Varen er i restordre</div>";
                    }
Avatar billede arne_v Ekspert
06. juli 2016 - 20:55 #10
Har du proevet med dr.IsDBNull?
Avatar billede arne_v Ekspert
06. juli 2016 - 21:05 #11
if (!dr.IsDBNull("fldAntalPaaLager") && (int)dr["fldAntalPaaLager"] > 10)
Avatar billede mikkel251 Seniormester
07. juli 2016 - 10:02 #12
når jeg bruger dr.IsDBNull? så får jeg en fejl men når jeg bruger != null så får jeg ingen fejl, men hvad er forskellen på de 2
Avatar billede arne_v Ekspert
07. juli 2016 - 15:49 #13
Hvilken fejl?
Avatar billede mikkel251 Seniormester
07. juli 2016 - 19:50 #14
den her

Serverfejl i programmet '/'.

Kompileringsfejl

Beskrivelse: Der opstod en fejl under kompilering af en ressource, der er påkrævet ved behandling af denne anmodning. Læs følgende detaljer om fejlen, og foretag de nødvendige ændringer af kildekoden.

Fejlmeddelelse om kompileringsfunktion: CS1525: Ugyldigt udtryk 'if'

Kildefejl:


Linje 92:                    // her er en fejl der er ved at blive undersøgt //               
Linje 93:                    ////tjek om der er over 10 på lager.
Linje 94:                    if (if (!dr.IsDBNull("fldAntalPaaLager") && (int)dr["fldAntalPaaLager"] > 10)
Linje 95:                    {
Linje 96:                            hliKurv.Visible = true;

Kildefil: c:\Users\mikkel pohjola\Dropbox\Hovedforløbet webintegrator\Webshop-cms\vis-indhold.aspx.cs    Linje: 94


Vis detaljeret output fra kompileringsfunktion:

Vis hele kompileringskilden:


Versionsoplysninger: Microsoft .NET Framework version:4.0.30319; ASP.NET version:4.6.1073.0
Avatar billede arne_v Ekspert
07. juli 2016 - 19:56 #15
if (if (

ser ikke rigtig ud.

:-)
Avatar billede mikkel251 Seniormester
07. juli 2016 - 19:57 #16
du siger noget, den havde jeg ikke set
Avatar billede mikkel251 Seniormester
07. juli 2016 - 21:04 #17
hvis det er så har jeg lagt siden online, det skal siges at det er et skole projekt jeg er ved at lave, jeg skal muligvis til eksamen i en webshop så derfor er jeg ved at lave den her, det er jo om at holde sig klar til det man skal op i :D

men det som er problemet kan du se på siden her...
http://www.mikkel-pohjola.dk/vis-indhold.aspx?indholdID=8

der er en streg og Læg i kurven og selvom der er de 10 produkter eller mere så ser den sådan ud og der burde stregen være væk og så skal der være mulighed for at ligge varen i kurven, jeg tænkte det gav mere mening at se selve siden end bare koderne, og så kan du se den måde jeg koder på :D
Avatar billede arne_v Ekspert
07. juli 2016 - 21:23 #18
Hvad indeholder fldAntalPaaLager?
Avatar billede mikkel251 Seniormester
08. juli 2016 - 11:26 #19
tænker du felter eller hvad den bruges til, det er nogen tabeller min lære har lavet og jeg har lidt tænkt på de godt kunne gøres bedre, men det er meningen at man skal bruge den tabel til at gemme det antal man har af vare på sit lager
Avatar billede mikkel251 Seniormester
08. juli 2016 - 20:46 #20
det  bliver ved med at drille jeg kan ikke lige finde ud af hvad fejlen er
du kan se på linket nedenunder at de første 2 produkter der er varen i rest ordre men de 3 produkt der kan jeg få lov til at tilføje til kurven og i feltet fldAntalPaaLager der er 12, 25 og 25 på lager og i koden der skal det kun være en rød streg over læg i kurven hvis der er under 2 vare på lager.
hmm jeg er på bar bund

http://www.mikkel-pohjola.dk/Default.aspx
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

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