23. juni 2004 - 11:31Der er
69 kommentarer og 1 løsning
ASP.NET C# Class
Hejsa, Jeg håber der er nogen der kan give mig et eksempel på hvordan jeg løser følgende problemstilling:
Jeg har en ASP.NET webapp. programmeret i c#, som jeg gerne vil forbedre. Jeg har en database og en class.cs fil.
Fra min webform.aspx vil jeg gerne kunne kalde en funktion i class filen, der laver opslag i en db, som så returnerer f.eks. et dataset med alle brugernavne i db. Det var en giv mit alle funktion. Ud over dette vil jeg også kunne sende en parameter med (så funktionen bliver overloaded), så jeg kan sende et brugernavn fra min webform, hvorefter jeg får returneret brugerdata for den pågældende bruger.
Er det noget der kan løses på en nem måde? Min mening med det, er at adskille præs. laget fra datalaget! Kom gerne med kommentarer til eksemplet. På forhånd tak!
Den brokker sig over DataSet: "Class, struct, or interface method must have a return type"
public DataSet(string Brugernavn) { //Her skriver du din kode som henter oplysninger ud fra din DB, og gemmer dem i et dataset. string DataSetNavnet = "Testnavn"; return(DataSetNavnet); }
Har inkluderet: using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Drawing; using System.Web; using System.Web.SessionState; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; using System.Data.SqlClient; using System.Data.OleDb;
Så nu er der kun fejl ved: The type or namespace name 'UserAdapter' could not be found (are you missing a using directive or an assembly reference?)
:) Jeg er tilbage på min plads... :) Har du mulighed for at bruge SQL adgang til din server, så ville det gøre mine hjælpe muligheder MEGET bedre... :)
Nu ser den sådan ud, og er builded: public DataSet GetUserInformation(string Brugernavn) { DataSet ReturnDataSet = new DataSet(); //Nu skal du lave en connection til din Database server, normalt bruger jeg en SQL server. OleDbConnection conn = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=Tipsdata.mdb"); OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM tblLogin WHERE Username="+Brugernavn+"",conn); //SqlConnection ConnectionDB = new SqlConnection("data source=SERVERNAVN;initial catalog=DATABASENAVN;password=PASSWORD;persist security info=True;user id=USERID;packet size=4096") //SqlDataAdapter UserAdapter = new SqlDataAdapter("SELECT * FROM "TABELNAVN" WHERE "KOLONNENAVN" = '"+ Brugernavn +"'", ConnectionDB); da.Fill(ReturnDataSet); return(ReturnDataSet); }
using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Drawing; using System.Web; using System.Web.SessionState; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; using System.Data.SqlClient; using System.Data.OleDb;
namespace WebApplication1 { /// <summary> /// Summary description for Class1. /// </summary> public class Class1 { public Class1() {}
public DataSet GetUserInformation(string Brugernavn) { DataSet ReturnDataSet = new DataSet(); OleDbConnection conn = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=Tipsdata.mdb"); OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM tblLogin WHERE Username="+Brugernavn+"",conn); da.Fill(ReturnDataSet); return(ReturnDataSet); } } }
Højre klik på din solution, add projekt from web, find dit nye projekt. Bagefter højre klik på din reference, og klik faneblad projekts, og find dit nye projekt...
Oprette en class fil i dit webprojekt, og skrive den sådan her:
using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Drawing; using System.Web; using System.Web.SessionState; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; using System.Data.SqlClient; using System.Data.OleDb;
namespace "NAVNPÅDITNAMESPACEIDITPROJEKT" { /// <summary> /// Summary description for Class1. /// </summary> public class Class1 : Page { public Class1() {}
public DataSet GetUserInformation(string Brugernavn) { DataSet ReturnDataSet = new DataSet(); OleDbConnection conn = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=Tipsdata.mdb"); OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM tblLogin WHERE Username="+Brugernavn+"",conn); da.Fill(ReturnDataSet); return(ReturnDataSet); } } }
Så på den hjemmeside du skal bruge den, skriver du sådan her:
using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Data.SqlClient; using System.Drawing; using System.Web; using System.Web.SessionState; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; using System.Configuration; using System.Data.SqlTypes; using System.Web.Mail;
namespace Lagerstyring { /// <summary> /// Summary description for Admin. /// </summary> public class Admin : NAVNETPÅDINCLASSFIL {
Du skal ikke bruge mine usings, dem skal du selvfølgelige erstatte med dem du bruger, de er kun med, så du kan se hvor du skal skrive henne....
Det er ikke det der er problemet, da det nye projekt vi lavede, er det jeg vil bruge (en skabelon). I projektet har jeg: Class1.cs (som vi lavede) WebForm1.aspx (so er der standard) Det er fra denne fil, jeg vil kalde GetUserInformation(bruger) fra Class1 men følgende besked kommer:
The name 'GetUserInformation' does not exist in the class or namespace 'WebApplication1.WebForm1'
using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Drawing; using System.Web; using System.Web.SessionState; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; using System.Data.SqlClient; using System.Data.OleDb;
namespace WebApplication1 { /// <summary> /// Summary description for WebForm1. /// </summary> public class WebForm1 : System.Web.UI.Page { private void Page_Load(object sender, System.EventArgs e) { string bruger = "malle"; DataSet ReceivedDataSet = new DataSet(); ReceivedDataSet = GetUserInformation(bruger);
}
#region Web Form Designer generated code override protected void OnInit(EventArgs e) { // // CODEGEN: This call is required by the ASP.NET Web Form Designer. // InitializeComponent(); base.OnInit(e); }
/// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.Load += new System.EventHandler(this.Page_Load); } #endregion } }
using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Drawing; using System.Web; using System.Web.SessionState; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; using System.Data.SqlClient; using System.Data.OleDb;
namespace WebApplication1 { /// <summary> /// Summary description for Class1. /// </summary> public class Class1 : Page { public Class1() {}
public DataSet GetUserInformation(string Brugernavn) { DataSet ReturnDataSet = new DataSet(); OleDbConnection conn = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=Tipsdata.mdb"); OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM tblLogin WHERE Username="+Brugernavn+"",conn); da.Fill(ReturnDataSet); return(ReturnDataSet); } } }
using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Drawing; using System.Web; using System.Web.SessionState; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; using System.Data.SqlClient; using System.Data.OleDb;
namespace WebApplication1 { /// <summary> /// Summary description for WebForm1. /// </summary> public class WebForm1 : Class1 { private void Page_Load(object sender, System.EventArgs e) { string bruger = "malle"; DataSet ReceivedDataSet = new DataSet(); ReceivedDataSet = GetUserInformation(bruger);
}
#region Web Form Designer generated code override protected void OnInit(EventArgs e) { // // CODEGEN: This call is required by the ASP.NET Web Form Designer. // InitializeComponent(); base.OnInit(e); }
/// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.Load += new System.EventHandler(this.Page_Load); } #endregion } }
Line 27: OleDbConnection conn = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=Http://localhost/webapplication1/Tipsdata.mdb"); Line 28: OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM tblLogin WHERE Username="+Brugernavn+"",conn); Line 29: da.Fill(ReturnDataSet); Line 30: return(ReturnDataSet); Line 31: }
using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Drawing; using System.Web; using System.Web.SessionState; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; using System.Data.SqlClient; using System.Data.OleDb;
namespace WebApplication1 { /// <summary> /// Summary description for Class1. /// </summary> public class Class1 : Page { public Class1() {}
public DataSet GetUserInformation(string Brugernavn) { DataSet ReturnDataSet = new DataSet(); OleDbConnection conn = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=Http://localhost/webapplication1/Tipsdata.mdb"); OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM tblLogin WHERE Username="+Brugernavn+"",conn); da.Fill(ReturnDataSet); return(ReturnDataSet); } } }
using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Drawing; using System.Web; using System.Web.SessionState; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; using System.Data.SqlClient; using System.Data.OleDb;
namespace WebApplication1 { /// <summary> /// Summary description for WebForm1. /// </summary> public class WebForm1 : Class1 { private void Page_Load(object sender, System.EventArgs e) { string bruger = "malle"; DataSet ReceivedDataSet = new DataSet(); ReceivedDataSet = GetUserInformation(bruger);
}
#region Web Form Designer generated code override protected void OnInit(EventArgs e) { // // CODEGEN: This call is required by the ASP.NET Web Form Designer. // InitializeComponent(); base.OnInit(e); }
/// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.Load += new System.EventHandler(this.Page_Load); } #endregion } }
Hehe... I get the picture... Er ked af det, men jeg må melde pas.. Jeg ved ikke hvordan OleDb hænger sammen, og håndtere tingene... Hvis du havde haft MSSQL, så var vi færdige nu, og du ville være en glad mand :)
Det var stien til db der var skidt: (nedenstående er den rigtige) OleDbConnection conn = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source="+Server.MapPath("Tipsdata.mdb")+"");
the_party_dog>> Lader til at du lige skal have styr på noget kode optimering... følgende er helt unødvendigt:
DataSet ReceivedDataSet = new DataSet(); ReceivedDataSet = GetUserInformation(bruger);
Du opretter en variabel og peger den på et nyt dataset. I næste linje tager du variablen fra før og peger den på det dataset GetUserInformation-funktionen returnerer. Hvad skete der nu med det dataset du lige oprettede?? Jo, det ligger bare i hukommelsen og fylder indtil GC'en fjerne den. Altså, lad vær med det !!
cyberfessor> Det ved jeg godt, men det er hvordan man ser på tingene... Jeg og andre har det bedst med at tingene bliver oprettet i starten af en funktion, og brugt senere... Det er hvordan man ser på hvad der er bedst...
Sådan som jeg har lært og forstået tingene, bruger jeg da det første dataset som jeg har oprettet, men giver det først data når jeg skriver den sidste sætning. I min første linjer beskriver jeg jo hvilken variabel type jeg vil have mit navn skal referere til, og så fylder jeg den variabel med sætning nr.2....
Men skal da slet ikke kunne sige noget omkring det, jeg er selvlært, samt jeg har fået vist en masse ting af andre mennesker. Men det er fredag morgen, og mine argumenter stinker :) Men for mig at se, når vi snakker om at kode, vil jeg helst se noget kode, hvor alle variabler er defineret og initaliseret i starten, og folk så giver dem data senere i koden, end at se folk opretter tingene hist og pist....
Men det er vel en smags sag? Men jeg vil gerne vide noget mere om din begrundelse, evt. noget beskrivelse på en eller anden side, som siger at når jeg gør sådan, at mit første oprettet dataset ikke bliver brugt til noget...
Jeg har selvfølgelige lavet en connection tidligere, henviser bare til den. Så "fejler" min web applikation, og siger "Use of unassigned local variable 'UserSet' "
Men hvis jeg skriver:
DataSet UserSet = new DataSet();
SqlDataAdapter GetUserDetails = new SqlDataAdapter("SELECT * FROM Data", DBConnection);
nu roder du tingene sammen... det foregår jo i to forskellige scopes...
det er rigtigt at INDE i din funktion, GetUserInformation, skal du oprette et dataset som du så fylder... det er så DETTE dataset du returnerer.
Udenfor funktionen skal man ikke oprette et dataset, for det sørger funktionen jo for at gøre.
DataSet UserSet; SqlDataAdapter GetUserDetails = new SqlDataAdapter("SELECT * FROM Data", DBConnection); GetUserDetails.Fill(UserSet, "Details");
Her kalder du jo netop Fill på en variabel (UserSet) som ikke peger på noget.
DataSet ReceivedDataSet = new DataSet(); ReceivedDataSet = GetUserInformation(bruger);
Her opretter du et nyt dataset og tildeler den til variablen ReceivedDataSet. Men hov, inde i funktionen GetUserInformation bliver der jo også oprettet et dataset som bliver fyldt og returneret. Det er DETTE dataset som ReceivedDataSet ender med at pege på, altså er det første unødvendigt.
Måske I kan hjælpe mig med et lille spm: Jeg har følgende web: Tipsklub Med en webconfig i roden. I mappen access kan jeg der oprette en nu webconfig med følgende: <authentication mode="Forms"> <forms loginUrl="WebForm1.aspx" name="FORMSAUTHCOOKIE" /> </authentication>
Dette for at styre at kun brugere der er logget ind, kan få adgang til denne mappe. Jeg får følgende fejl: Parser Error Message: It is an error to use a section registered as allowDefinition='MachineToApplication' beyond application level. This error can be caused by a virtual directory not being configured as an application in IIS.
Line 11: mode="RemoteOnly" Line 12: /> -->Line 13: <authentication mode="Forms"> Line 14: <forms loginUrl="WebForm1.aspx" name="FORMSAUTHCOOKIE" /> Line 15: </authentication>
<authentication> skal konfigureres på application-level... altså i den web.config-fil der ligger i roden af din applikation
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.