15. juli 2016 - 18:08Der er
60 kommentarer og 1 løsning
Et objekt af typen 'System.String' kan ikke konverteres til typen 'System.Data.DataTable'.
hvad betyder Et objekt af typen 'System.String' kan ikke konverteres til typen 'System.Data.DataTable'.
og hvordan finder jeg en løsning på det. fejlen ser sådan her ud Serverfejl i programmet '/'.
Et objekt af typen 'System.String' kan ikke konverteres til typen 'System.Data.DataTable'.
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: Et objekt af typen 'System.String' kan ikke konverteres til typen 'System.Data.DataTable'.
Kildefejl:
Linje 31: //det her er en fiktiv tabel ligesom i DataBasen - Den lever kun i hukkommelsen så længe Session["kurv"] findes Linje 32: //her opretter jeg de felter der kræves for at vise indholdet i indkøbskurven Linje 33: dtKurv = (DataTable)Session["kurv"]; Linje 34: Linje 35: //Hvis der ikke er noget i kurven, så skal datatabellen have noget indhold..
[InvalidCastException: Et objekt af typen 'System.String' kan ikke konverteres til typen 'System.Data.DataTable'.] kurv.Page_Load(Object sender, EventArgs e) in c:\Users\Mikkel\Dropbox\Hovedforløbet webintegrator\webshoppen-boger\kurv.aspx.cs:33 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
det er på flere sider med samme navn, men det ved jeg ikke om gør noget? den side den fejler på, som den først fejler på når man har lagt varen i kurven og har trykke bestil, hvis man så vil tilbage til forsiden så sker fejlen.. jeg kommer til at tænke på man skal da have en mulighed for at vende tilbage til shoppen før man betaler hvis nu man vil købe mere, vil du ikke også sige det??
codebehind på kurv.aspx det er her den siger fejlen er på linie 33 using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls;
public partial class kurv : System.Web.UI.Page { menuFac objMenu = new menuFac(); vareFac objVare = new vareFac(); DataTable dt = new DataTable();
//Der oprettes forbindelse til DataTable dtKurv private DataTable dtKurv = new DataTable();
protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { //SIDENS STANDARD INDHOLD (overskrift + tekst) dt = objMenu.HentSideUdfraID(3); DataRow dr = dt.Rows[0];
//her skriver jeg side overskriften ud litOverskrift.Text = dr["fldSideoverskrift"].ToString(); }
//KURV //det her er en fiktiv tabel ligesom i DataBasen - Den lever kun i hukkommelsen så længe Session["kurv"] findes //her opretter jeg de felter der kræves for at vise indholdet i indkøbskurven dtKurv = (DataTable)Session["kurv"];
//Hvis der ikke er noget i kurven, så skal datatabellen have noget indhold.. if (dtKurv == null) { //Her erklæres den - her fortæller jeg dtkurv at den er en DataTable dtKurv = new DataTable();
//Her fortæller jeg den DataTable jeg lige har oprettet at den slkal hedde tblKurv dtKurv.TableName = "tblKurv";
//her laver jeg kollonnerne som ellers normalt ligger i databasen... dtKurv.Columns.Add("fldID", typeof(int)); dtKurv.Columns.Add("fldVareID_dt", typeof(int)); dtKurv.Columns.Add("fldAntal_dt", typeof(int)); dtKurv.Columns.Add("fldPris_dt", typeof(float));
//ID feltet skal selv styre tallene. Derfor sættes autoincrement til true.. dtKurv.Columns["fldID"].AutoIncrement = true;
//Her fortæller jeg at Session["kurv"] er den DataTable jeg lige har lavet - dtKurv Session["Kurv"] = dtKurv; }
//Nu skal der lægges data i datatabellen. //den data henter jeg fra querystringen - vareID if (!string.IsNullOrEmpty(Request.QueryString["vareID"])) { //hvis querystring ikke er tom så skal den hente vare efter vare ID... DataRow dr = objVare.hentVareUdFraId(Convert.ToInt32(Request.QueryString["vareID"])).Rows[0];
//Variablen intVareId oprettes og tildeles værdien fra querystringen - vareID int intVareID = Int32.Parse(Request.QueryString["vareID"]);
//variabel _pris oprettes med værdien fra - dr["fldPris"] som hentes fra databasen i tblVare decimal _pris = Convert.ToDecimal(dr["fldPris"]);
//variabel _Rabat oprettes med værdien fra - dr["fldPris"] som hentes fra databasen i tblVare decimal _rabat = Convert.ToInt32(dr["fldRabat"]);
//så ganges _pris med _rabat og divideres med 100 for at få procenten af det produkt der er i kurven - hvis den har en rabat decimal _totalRabat = _pris * _rabat / 100;
//den totale pris regnes ud ved at trække - _pris - _totalRabat - fra hinanden. decimal _total = _pris - _totalRabat;
//Hvis ikke der er nogen rabat på produktet så skal _total være _pris if (Convert.ToInt32(dr["fldRabat"]) == 0) { _total = _pris; }
//DataRow[] drVareRow = et array //DataRowen får værdien fra den vareID, der er med i querystringen og som ligges i den fiktive database - fldVareID_dt DataRow[] drVareRow = dtKurv.Select("fldVareID_dt=" + intVareID);
//Hvis man ikke kan finde en fldVareID, som er lig med den medbragte, så skal der oprettes en ny række //hvor fldVareID er lig med det medbragte vareID og antal sættes lig 1. DataRowen tilføjes til datatabellen dtKurv //HER KØRER ARRYET if (drVareRow.Length == 0) { //her laver jeg en ny række hvis det er første gang man køber har man købt flere er det ikke denne her kode.. //Det her er de fiktive database felter der er oprettet kun for at indeholde den vare der nu er i kurven - Session["kurv"] DataRow drVare = dtKurv.NewRow(); drVare["fldVareID_dt"] = intVareID; drVare["fldAntal_dt"] = 1; drVare["fldPris_dt"] = _total; dtKurv.Rows.Add(drVare); } //Men findes der en vareID allerrede i datatabellen så skal der lægges 1 til den som allerrede findes else { drVareRow[0]["fldAntal_dt"] = Int32.Parse(drVareRow[0]["fldAntal_dt"].ToString()) + 1; //+1 betyder der lægges plus en til den række som der findes allerrede } //HER SLUTTER ARRYET
//Hele datatabellen lægges over i Session["Kurv"] //det vil sige at alt vises fordi Session["kurv"] lever, når browser lukkes slettes indholdet i denne kurv Session["Kurv"] = dtKurv;
//her opdateres siden efter køb... Response.Redirect("kurv.aspx"); } //Hvis der er noget i kurven, så skal det vises. Her vises det i en tabel if (dtKurv.Rows.Count > 0) { //Der laves en variabel floatTotal af typen float. //Den tildeles værdien 0 som udgangspunkt. //float kan indeholde flere decimaler.. man kunne også godt bruge decimal float floatTotal = 0;
//her udskrives indholdet af kurven ligesom jeg plejer at gøre når indholdet kommer fra databasen litIndhold.Text += "<th>Vare nr</th>"; litIndhold.Text += "<th>Varenavn</th>"; litIndhold.Text += "<th>Antal vare</th>"; litIndhold.Text += "<th>Pris</th>"; foreach (DataRow Row in dtKurv.Rows) { //parse tager værdien og aver den om til en interger kan samlignes med convert dog sætter de tallene ind på hver deres måde //string.format = betyder at den formatere teskt med også tal her er det tallene der formateres i denne streng {0:#.00}... int intID = Int32.Parse(Row["fldVareID_dt"].ToString());
//her laver jeg min datarow med indholdet fra Databasen tblVare DataRow dr = objVare.hentVareUdFraId(intID).Rows[0];
//her regnes prisen ialt ud float intPrisIAlt = float.Parse(Row["fldAntal_dt"].ToString()) * float.Parse(Row["fldPris_dt"].ToString()); floatTotal += intPrisIAlt;
} //Har man endnu ikke lagt vare i kurven, så skal man som kunde have det at vide. else { litIndhold.Text = "<br /><span class='Overskrift'>Kurven er tom</span>"; }
jeg har fundet ud af at hun tømmer kurven på Defaultsiden når man trykker bestil vare så sletter knappen kurven Session["kurv"] = ""; og man bliver sendt til siden test-tak.aspx og der har man så mulighed for at printe en kvitering ud, men når man så vil gå tilbage til siden med ens oplysninger så er kurven tom og derfor kommer fejlen - Et objekt af typen 'System.String' kan ikke konverteres til typen 'System.Data.DataTable' - i den her - dtKurv = (DataTable)Session["kurv"]; for der er jo ingen vare i kurven mere, hvad gør jeg der for at undgå den fejl??
koden på i knappen send på admin/Default.aspx //i kurven ligger vores oplysninger om kundens køb. //De ligger i - Session["kurv"] - dtKurv = (DataTable)Session["kurv"];
//Vi opretter en generisk liste, som skal indeholde vores kundes produkter og det antal, //som kunden har bestilt. //list<vareFac> - er en generisk liste som skal bruges til at samle de vare der er bestilt og loope dem igennem en foreach løkke. //I vareFac der skal være de rigtige probertyes ellers virker det ikke... //proberty fra - vareFac - bruges i - list<vareFac> - List<vareFac> samletOrdre = new List<vareFac>();
//listen løbes igennem. //Disse oplysninger indsættes sammen med kundens generelle oplysninger //i de relevante tabeller ved hjælp af metoden SaveOrder() objordre.Ordre = samletOrdre; objordre._brugernavn = txtNavn.Text; objordre._Adresse = txtAdresse.Text; objordre._Postnr = txtPostNr.Text; objordre._By = txtBy.Text; objordre._Tlf = txtTlf.Text; objordre._Email = txtEmail.Text; objordre.GemOrder(Convert.ToInt32(Session["id"].ToString())); //Man ken eventuel sende en mail til kunden om hans bestilling.
//Kurven tømmes for indhold når data er laget i databasen Session["kurv"] = "";
//man bliver sendt til siden tak når man har trykket på bestil Response.Redirect("test-tak.aspx");
Mener du i stil med den her //Her tjekker jeg om Session["kurv"] er tom og hvis den er det skal der oprettes en ny kurv som viser at den er tom, hvis man vender tilbage til siden kurv = (DataTable)Session["kurv"]; if (kurv == null) { kurv = new List<odreFac>; Session["kurv"] = dtKurv; }
og så er Session["kurv"] = "" ændret til Session.Remove("kurv");
jeg tror jeg fandt ud af den den skal ikke være en list>vareFac> men en DataTable() nu ser den ud til at virke, med den her kode, var det ikke sådan du mente ??
kurv = (DataTable)Session["kurv"]; if (kurv == null) { kurv = new DataTable(); Session["kurv"] = dtKurv; }
er det ikke mere avanceret at bruge List<OrderLine>??
nu har jeg så fået en anden fejl, den opgave er jo fyldt med fejl :( løses det skal den :D
Fejlen Serverfejl i programmet '/'.
Kolonnen [fldVareID_dt] blev ikke fundet.
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.Data.EvaluateException: Kolonnen [fldVareID_dt] blev ikke fundet.
Kildefejl:
Linje 85: //DataRow[] drVareRow = et array Linje 86: //DataRowen får værdien fra den vareID, der er med i querystringen og som ligges i den fiktive database - fldVareID_dt Linje 87: DataRow[] drVareRow = dtKurv.Select("fldVareID_dt=" + intVareID); Linje 88: //Hvis man ikke kan finde en fldVareID, som er lig med den medbragte, så skal der oprettes en ny række Linje 89: //hvor fldVareID er lig med det medbragte vareID og antal sættes lig 1. DataRowen tilføjes til datatabellen dtKurv
Versionsoplysninger: Microsoft .NET Framework version:4.0.30319; ASP.NET version:4.6.1073.0
når det felt den ikke kan findes er i codebehind og ikke i Databasen hvordan løser jeg den, for den er i koden så jeg forstår ikke at den ikke kan se feltet.
Min kode hvor felterne oprettes DataRow[] drVareRow = dtKurv.Select("fldVareID_dt=" + intVareID); //Hvis man ikke kan finde en fldVareID, som er lig med den medbragte, så skal der oprettes en ny række //hvor fldVareID er lig med det medbragte vareID og antal sættes lig 1. DataRowen tilføjes til datatabellen dtKurv //HER KØRER ARRYET if (drVareRow.Length == 0) {
//her laver jeg en ny række hvis det er første gang man køber har man købt flere er det ikke denne her kode.. //Det her er de fiktive database felter der er oprettet kun for at indeholde den vare der nu er i kurven - Session["kurv"] DataRow drVare = dtKurv.NewRow(); drVare["fldVareID_dt"] = intVareID; drVare["fldAntal_dt"] = 1; drVare["fldPris_dt"] = _total; dtKurv.Rows.Add(drVare); } //Men findes der en vareID allerrede i datatabellen så skal der lægges 1 til den som allerrede findes else { drVareRow[0]["fldAntal_dt"] = Int32.Parse(drVareRow[0]["fldAntal_dt"].ToString()) + 1; //+1 betyder der lægges plus en til den række som der findes allerrede }
List<OdrerLine> var en generisk liste ?? og der skal man i sin factory fil have en private List<vareFac> _Ordre; public List<vareFac> Ordre { get { return _Ordre; } set { _Ordre = value; } }
får at få den til at virke, det er ret nyt for mig med den måde at lave kode på :D
jeg fik det til at virke med den her og nu kan jeg hoppe rundt lige så tosset jeg vil på siden :D tak for hjælpen med det :D
#region KurvenEfterKøbAfVare //Her tjekker jeg om Session["kurv"] er tom og hvis den er det skal der oprettes en ny kurv som viser at den er tom, hvis man vender tilbage til siden kurv = (DataTable)Session["kurv"]; if (kurv == null) { kurv = new DataTable(); Session["kurv"] = Kurv;
kurv.TableName = "tblKurven";
//her laver jeg kollonnerne som ellers normalt ligger i databasen... kurv.Columns.Add("fldID", typeof(int)); kurv.Columns.Add("fldVareID_dt", typeof(int)); kurv.Columns.Add("fldAntal_dt", typeof(int)); kurv.Columns.Add("fldPris_dt", typeof(float));
//ID feltet skal selv styre tallene. Derfor sættes autoincrement til true.. kurv.Columns["fldID"].AutoIncrement = true;
//Her fortæller jeg at Session["kurv"] er den DataTable jeg lige har lavet - kurv Session["Kurv"] = kurv;
//Nu skal der lægges data i datatabellen. //den data henter jeg fra querystringen - vareID if (!string.IsNullOrEmpty(Request.QueryString["vareID"])) { //hvis querystring ikke er tom så skal den hente vare efter vare ID... DataRow dr = objVare.hentVareUdFraId(Convert.ToInt32(Request.QueryString["vareID"])).Rows[0];
//Variablen intVareId oprettes og tildeles værdien fra querystringen - vareID int intVareID = Convert.ToInt32(Request.QueryString["vareID"]);
//variabel _pris oprettes med værdien fra - dr["fldPris"] som hentes fra databasen i tblVare decimal _pris = Convert.ToDecimal(dr["fldPris"]);
//variabel _Rabat oprettes med værdien fra - dr["fldPris"] som hentes fra databasen i tblVare decimal _rabat = Convert.ToInt32(dr["fldRabat"]);
//så ganges _pris med _rabat og divideres med 100 for at få procenten af det produkt der er i kurven - hvis den har en rabat decimal _totalRabat = _pris * _rabat / 100;
//den totale pris regnes ud ved at trække - _pris - _totalRabat - fra hinanden. decimal _total = _pris - _totalRabat;
//Hvis ikke der er nogen rabat på produktet så skal _total være _pris if (Convert.ToInt32(dr["fldRabat"]) == 0) { _total = _pris; }
//DataRow[] drVareRow = et array //DataRowen får værdien fra den vareID, der er med i querystringen og som ligges i den fiktive database - fldVareID_dt DataRow[] drVareRow = kurv.Select("fldVareID_dt=" + intVareID); //Hvis man ikke kan finde en fldVareID, som er lig med den medbragte, så skal der oprettes en ny række //hvor fldVareID er lig med det medbragte vareID og antal sættes lig 1. DataRowen tilføjes til datatabellen kurv //HER KØRER ARRYET if (drVareRow.Length == 0) { //her laver jeg en ny række hvis det er første gang man køber har man købt flere er det ikke denne her kode.. //Det her er de fiktive database felter der er oprettet kun for at indeholde den vare der nu er i kurven - Session["kurv"] DataRow drVare = kurv.NewRow(); drVare["fldVareID_dt"] = intVareID; drVare["fldAntal_dt"] = 1; drVare["fldPris_dt"] = _total; kurv.Rows.Add(drVare); } Session["Kurv"] = kurv;
//her opdateres siden efter køb... Response.Redirect("kurv.aspx"); } } #endregion
Vi har ikke lært så meget endnu med de list<> men det er da helt sikkert noget jeg vil når jeg bliver færdig på skolen, det lyder til at når jeg får styr på dem vil det være nemmere end DataTable's :D
jeg har et nyt problem med min side når jeg trykker på Send i indkøbskurven bliver jeg sendt til en side der hedder lige nu test-tak.aspx og der skal jeg kunne se min egen data om mig selv samt mit køb, men jeg kan kun se mit eget navn, adress osv, den data om mit køb vil ikke vise sig??
Det er meningen at ordre skal gemmes i databasen med ordre id osv men der sker ingen ting??
min Codebehind knap funktionen protected void btnBestilOrdre_Click(object sender, EventArgs e) { //i kurven ligger vores oplysninger om kundens køb. //De ligger i - Session["kurv"] - dtKurv = (DataTable)Session["kurv"];
//Vi opretter en generisk liste, som skal indeholde vores kundes produkter og det antal, //som kunden har bestilt. //list<vareFac> - er en generisk liste som skal bruges til at samle de vare der er bestilt og loope dem igennem en foreach løkke. //I vareFac der skal være de rigtige probertyes ellers virker det ikke... //proberty fra - vareFac - bruges i - list<vareFac> - List<vareFac> samletOrdre = new List<vareFac>();
//Listen løbes igennem. //For hver vare i kurven lægges varens ID over i //propertien _intVareID og antallet lægges i propertien _intVareAntal foreach (DataRow row in dtKurv.Rows) { //her henter jeg probertys fra VareFac objVare._intVareID = Int32.Parse(row["fldVareID_dt"].ToString()); objVare._intVareAntal = Int32.Parse(row["fldAntal_dt"].ToString()); objVare._Pris = decimal.Parse(row["fldPris_dt"].ToString()); samletOrdre.Add(objVare); }
//listen løbes igennem. //Disse oplysninger indsættes sammen med kundens generelle oplysninger //i de relevante tabeller ved hjælp af metoden SaveOrder() objordre.Ordre = samletOrdre; objordre._brugernavn = txtNavn.Text; objordre._Adresse = txtAdresse.Text; objordre._Postnr = txtPostNr.Text; objordre._By = txtBy.Text; objordre._Tlf = txtTlf.Text; objordre._Email = txtEmail.Text; objordre.SaveOrder(Convert.ToInt32(Session["id"].ToString())); //Man ken eventuel sende en mail til kunden om hans bestilling.
//Kurven tømmes for indhold når data er laget i databasen Session.Remove("kurv");
//man bliver sendt til siden tak når man har trykket på bestil Response.Redirect("test-tak.aspx"); }
Metoden SaveOrder: public void SaveOrder(int ID) { cmd = new SqlCommand(@"UPDATE tblBruger SET fldBrugernavn=@brugernavn, fldAdresse=@Adresse, fldPostnr=@Postnr, fldBy=@By, fldTlf=@Tlf, fldEmail=@Email WHERE fldId=@ID"); cmd.Parameters.AddWithValue("@brugernavn", _brugernavn); cmd.Parameters.AddWithValue("@Adresse", _Adresse); cmd.Parameters.AddWithValue("@Postnr", _Postnr); cmd.Parameters.AddWithValue("@By", _By); cmd.Parameters.AddWithValue("@Email", _Email); cmd.Parameters.AddWithValue("@Tlf", _Tlf); cmd.Parameters.AddWithValue("@ID", ID); DA.ModifyData(cmd);
//Henter id'et på den nye bruger/kunde cmd = new SqlCommand(@"SELECT fldId FROM tblBruger WHERE fldBrugernavn=@brugernavn AND fldAdresse=@Adresse AND fldPostnr=@PostNr AND fldBy=@By AND fldTlf=@Tlf AND fldemail=@Email AND fldId=@ID"); //Parameters cmd.Parameters.AddWithValue("@brugernavn", _brugernavn); cmd.Parameters.AddWithValue("@Adresse", _Adresse); cmd.Parameters.AddWithValue("@PostNr", _Postnr); cmd.Parameters.AddWithValue("@By", _By); cmd.Parameters.AddWithValue("@Email", _Email); cmd.Parameters.AddWithValue("@Tlf", _Tlf); cmd.Parameters.AddWithValue("@ID", ID);
//int32.parse er skiftet ud med convert.Into32() int intKundeID = Convert.ToInt32(DA.GetData(cmd).Rows[0]["fldId"].ToString());
//Indsætter ordren i ORDRETABELLEN... cmd = new SqlCommand(@"INSERT INTO tblOrdrer(fldBrugerId_fk, fldDato, fldStatus) VALUES(@KundeID, @Dato, @Status)");
//her udskriver jeg til kunden at ordren pakkes... cmd.Parameters.AddWithValue("@Status", "Pakkes"); DA.ModifyData(cmd);
//Henter ID'et fra ordretabellen ud fra kunde ID'et.... //MAX er også et reseverede ord... cmd = new SqlCommand(@"SELECT MAX(fldOrdreID) as MaxID FROM tblOrdrer WHERE fldBrugerId_fk=@KundeID"); cmd.Parameters.AddWithValue("@KundeID", intKundeID);
//Lægger ID'et i variablen intOrderID int intOrderID = Int32.Parse(DA.GetData(cmd).Rows[0]["MaxID"].ToString());
//Her indsætter jeg ordre detaljerne i tabellen.. foreach (vareFac Vare in Ordre) { cmd = new SqlCommand(@"INSERT INTO tblOrdreDetaljer(fldOrdreID, fldVareID, fldAntalKoebt, fldStatus, fldTilbudspris) VALUES(@OrderID, @VareID, @VareAntal, 'Pakkes', @pris)");//'pakkes' er udskrivning til kunden om at ordren pakkes
jeg har fået det til at virke, men jeg forstå ikke måden hun har lavet metoderne på, hvis der er en der kan hjælpe mig med at forstå hvad der foregår i de her 2 metoder :D
metode 1 public DataTable getUdvOrdre() { cmd = new SqlCommand("SELECT MAX(fldOrdreID) AS MAXID FROM tblOrdrer");
int intOrdreID = Int32.Parse(DA.GetData(cmd).Rows[0]["MAXID"].ToString());
cmd = new SqlCommand(@"SELECT DISTINCT tblBruger.fldBrugernavn, tblOrdreDetaljer.fldOrdreID, tblOrdreDetaljer.fldVareID, tblOrdreDetaljer.fldAntalKoebt, tblOrdreDetaljer.fldTilbudspris, tblVare.fldTitel, tblVare.fldPris FROM tblBruger LEFT JOIN tblOrdrer ON tblBruger.fldId = tblOrdrer.fldBrugerId_fk LEFT JOIN tblOrdreDetaljer ON tblOrdrer.fldOrdreID = tblOrdreDetaljer.fldOrdreID LEFT JOIN tblVare ON tblOrdreDetaljer.fldVareID = tblVare.fldId WHERE tblOrdrer.fldOrdreID=@intOrdreID"); cmd.Parameters.AddWithValue("@intOrdreID", intOrdreID); return DA.GetData(cmd); }
Metode 2 public void SaveOrder(int ID) { cmd = new SqlCommand(@"UPDATE tblBruger SET fldBrugernavn=@brugernavn, fldAdresse=@Adresse, fldPostnr=@Postnr, fldBy=@By, fldTlf=@Tlf, fldEmail=@Email WHERE fldId=@ID"); cmd.Parameters.AddWithValue("@brugernavn", _brugernavn); cmd.Parameters.AddWithValue("@Adresse", _Adresse); cmd.Parameters.AddWithValue("@Postnr", _Postnr); cmd.Parameters.AddWithValue("@By", _By); cmd.Parameters.AddWithValue("@Email", _Email); cmd.Parameters.AddWithValue("@Tlf", _Tlf); cmd.Parameters.AddWithValue("@ID", ID); DA.ModifyData(cmd);
//Henter id'et på den nye bruger/kunde cmd = new SqlCommand(@"SELECT fldId FROM tblBruger WHERE fldBrugernavn=@brugernavn AND fldAdresse=@Adresse AND fldPostnr=@PostNr AND fldBy=@By AND fldTlf=@Tlf AND fldemail=@Email AND fldId=@ID"); //Parameters cmd.Parameters.AddWithValue("@brugernavn", _brugernavn); cmd.Parameters.AddWithValue("@Adresse", _Adresse); cmd.Parameters.AddWithValue("@PostNr", _Postnr); cmd.Parameters.AddWithValue("@By", _By); cmd.Parameters.AddWithValue("@Email", _Email); cmd.Parameters.AddWithValue("@Tlf", _Tlf); cmd.Parameters.AddWithValue("@ID", ID);
//int32.parse er skiftet ud med convert.Into32() int intKundeID = Convert.ToInt32(DA.GetData(cmd).Rows[0]["fldId"].ToString());
//Indsætter ordren i ORDRETABELLEN... cmd = new SqlCommand(@"INSERT INTO tblOrdrer(fldBrugerId_fk, fldDato, fldStatus) VALUES(@KundeID, @Dato, @Status)");
//her udskriver jeg til kunden at ordren pakkes... cmd.Parameters.AddWithValue("@Status", "Pakkes"); DA.ModifyData(cmd);
//Henter ID'et fra ordretabellen ud fra kunde ID'et.... //MAX er også et reseverede ord... cmd = new SqlCommand(@"SELECT MAX(fldOrdreID) as MaxID FROM tblOrdrer WHERE fldBrugerId_fk=@KundeID"); cmd.Parameters.AddWithValue("@KundeID", intKundeID);
//Lægger ID'et i variablen intOrderID int intOrderID = Int32.Parse(DA.GetData(cmd).Rows[0]["MaxID"].ToString());
//Her indsætter jeg ordre detaljerne i tabellen.. foreach (vareFac Vare in Ordre) { cmd = new SqlCommand(@"INSERT INTO tblOrdreDetaljer(fldOrdreID, fldVareID, fldAntalKoebt, fldStatus, fldTilbudspris) VALUES(@OrderID, @VareID, @VareAntal, 'Pakkes', @pris)");//'pakkes' er udskrivning til kunden om at ordren pakkes
hjælp, det lyder ikke godt :D det er som sagt min læres kode, hun er en ældre dame og vi er flere der har brokket os over hendes kodning for den er meget svær at forstå.
Du siger at der hvor der står int.parse skal jeg erstatte det med Convert.ToInt32 måske ??
Det med data adabter der har vi ikke lært at bruge andet lige nu, men det kunne da være et forsøg værd at prøve det andet.
SELECT MAX jeg aner ikke hvad den gør og hvorfor hun bruger den men jeg må google mig lidt frem ang SCOPE_IDENTITY() :D
Så vil jeg ikke bruge convert.ToInt32 eller parse :D jo DA er en data adabter, jeg tror vores lære har ville gøre det så simpel som muligt da vi stadig er på begynder niveau og jeg tror de mener at når vi kommer ud og arbejder med det så lære vi mere, ( det er bare en tanke ) :D
//Henter id'et på den nye bruger/kunde cmd = new SqlCommand(@"SELECT fldId FROM tblBruger WHERE fldBrugernavn=@brugernavn AND fldAdresse=@Adresse AND fldPostnr=@PostNr AND fldBy=@By AND fldTlf=@Tlf AND fldemail=@Email AND fldId=@ID"); //Parameters cmd.Parameters.AddWithValue("@brugernavn", _brugernavn); cmd.Parameters.AddWithValue("@Adresse", _Adresse); cmd.Parameters.AddWithValue("@PostNr", _Postnr); cmd.Parameters.AddWithValue("@By", _By); cmd.Parameters.AddWithValue("@Email", _Email); cmd.Parameters.AddWithValue("@Tlf", _Tlf); cmd.Parameters.AddWithValue("@ID", ID);
//int32.parse er skiftet ud med convert.Into32() int intKundeID = Convert.ToInt32(DA.GetData(cmd).Rows[0]["fldId"].ToString());
Det er rimlig godt set af dig :), det virkede fint og mindre kode når man skriver den på den måde det må vel næsten være det samme med den her: //Lægger ID'et i variablen intOrderID int intOrderID = Int32.Parse(DA.GetData(cmd).Rows[0]["MaxID"].ToString());
cmd = new SqlCommand(@"SELECT MAX(fldOrdreID) as MaxID FROM tblOrdrer WHERE fldBrugerId_fk=@KundeID"); cmd.Parameters.AddWithValue("@KundeID", intKundeID);
//Lægger ID'et i variablen intOrderID int intOrderID = Int32.Parse(DA.GetData(cmd).Rows[0]["MaxID"].ToString());
skal nok laves som:
cmd = new SqlCommand(@"SELECT SCOPE_IDENTITY() as NewID"); int intOrderID = (int)(decimal)DA.GetData(cmd).Rows[0]["NewID"];
Jeg læser til webintegrator, jeg har et par andre uddannelser men det blev en hoppy at lave hjemmesider men det var mest wordpress og det program der hedder artisteer og det var ikke altid så optimal at arbejde i, så faldt jeg over den her uddannelse som er ren programmering af hjemmesider, men der er åbentbart forskel på hvad man bliver undervist alt efter hvor i landet man går :D og vi bliver undervist i asp.net webforms og så har vi haft en lille smule jQuery det er på hovedforløbet på grundforløbet der har vi kun html og css
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: Den angivne ændring er ugyldig.
Kildefejl:
Linje 171: // cmd = new SqlCommand("SELECT SCOPE_IDENTITY() AS MAXID FROM tblOrdrer"); Linje 172: cmd = new SqlCommand(@"SELECT SCOPE_IDENTITY() as NewID FROM tblOrdrer"); Linje 173: int intOrderID = (int)(decimal)DA.GetData(cmd).Rows[0]["NewID"]; Linje 174: Linje 175:
jeg sad lige og så en video med det her idag og er det ikke forstået rigtig at den henter den sidste række der lige er oprettet ud fra dens id og det gør den kun den ene gang?
men man kan også bruge Select @@IDENTITY as NewID, men er det ikke det samme bare skrevet på en anden måde ?
Forskellen er hvis du laver en INSERT og den resulterer i at databasen koerer en TRIGGER som laver en ny INSERT, saa vil SCOPE_IDENTITY() returnere det id har lavet, mens @@IDENTITY vil returnere det sidste genererede id aka det fra triggeren.
Det var også det jeg frygtede men hvis bare jeg kan få grund tingene så må jeg give en den gas med selv at komme videre, men jeg synes det er meget svært at finde gode og forståelige guides på nettet til asp.net webforms så jeg håber at når jeg kommer ud i job at jeg så kan lære mere ?
Jeg synes nu nok at der er en del omkring ASP.NET web forms.
Men jeg tror at du vil finde det nemmere at finde hjaelpen hvis du strukturerer din applikation bedre.
F.eks. den helt traditionelle:
Presentation Layer Business Logic Layer Data Access Layer
Fordi det er jo kun PL som er ASP.NET web forms specifik. For BLL og DAL kan du bruge al slags C# kode inkl. ASP.NET MVC, win forms, WPF, console etc..
hvis jeg gerne vil hente min navigation fra databasen så skal jeg lave en tabel til min navigation men jeg forstå ikke helt hvad jeg gør,
jeg har lavet et felt til
-navn på linket -url på linket -sideorden til linket så man kan order dem senere, hvis det bliver nødvendigt -sideId så man kan hente den ene side der høre til linket
og tabellen med siden der har jeg -sidens overskrift -sidens indhold
burde det ikke være nok og så skal indholdet på siderne jo bare ligges ind i tabellen sider??
Det kan jeg godt forstå du ikke gør, jeg fik lavet det om så nu virker det, og undskyld mit sene svar ferien er slut og jeg er igang igen på skolen så jeg blev lidt hængt op :)
selvfølgelig den havde jeg lige glemt i farten, det skulle være blevet gjort nu :D
Synes godt om
Ny brugerNybegynder
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.