Att jobba mot en DAL-class, del 1 Många har säkert hört talas om DAL, men få har använt det på riktigt. DAL står för Data Access Layer och används för hämta och ta hand om all datahantering mot databasen. Genom att skapa en DALclass gör att vi har ett ställe som öppnar upp kommunikationen mot databasen. Vi bygger in några enkla funktioner och vi har ett enkelt verktyg för att hämta och ändra informationen i databasen. Det finns en hel del varianter på detta, men nu visar jag en liten del som jag tycker är lätt greppbart. I klassiska ASP:n så inkluderade man oftast en liten fil på varje sida som innehöll koden för att skapa ett connection-object mot databasen. Den inkluderade man på sidan för att slippa skriva om den varje gång när man skulle göra ett nytt db-anrop. Vår första del i den här artikelserien kommer att vara koden för att skapa vårat connection-object, fast i en liten modernare tappning. Det här kommer vara en artikelserie i flera delar. Jag har valt att lägga mina anslutningsuppgifter mot databasen i web.config-filen, eftersom jag tycker att det är där den ska ligga. Vi lägger till några rader i <configuration>-delen: <connectionstrings> <add name="databaseconnectionstring" connectionstring="server=*server adress*;port=3305;uid=*loginnamn*;pwd=*lösen*;database=*databasens namn*;allow Zero Datetime=True;"/> </connectionstrings> Ändra på alla ställen där orden börkar och slutar med en stjärna. Varför jag går mot MySQL är för att jag har färdig kod och kan skriva artikeln utan att pröva mig fram och skapa nya databaser m.m. Jag kommer troligtvis även kompletera med en DAL-class i en senare artikel där jag väljer att gå mot MsSQL istället, men det innebär att jag måste skriva om den koden jag har. För att kunna köra mot en MySQL-databas så behöver vi även ladda hem en DLL-fil som heter MySQL.Data.dll och lägga den i en mapp som heter Bin. När vi lagt till uppgifterna i databasen och hittat DLL-filen så börjar vi nu att skapa en ny class. Eftersom DAL är en känd benämning så kan vi lika bra döpa den till DAL.cs och placera den i mappen App_Code. Jag gillar inte när det dräller av using-direktiv som inte används och därför så väljer jag att städa upp lite grann och har enabrt dessa 4:a rader. using MySql.Data.MySqlClient; using System; using System.Configuration; using System.Data; Vi skapar våran connection som hämtar infon ifrån web.config med några rader kod. public class DAL public static MySqlConnection GetConnection() MySqlConnection conn = new
MySqlConnection(ConfigurationManager.ConnectionStrings["DatabaseConnectionS tring"].connectionstring); conn.open(); return conn; Nu har vi grunden klar för att bygga en enkel DAL-class. Vidare i denna artikelserie så kommer jag gå in och visa några enkla funktioner för att enkelt hämta/skriva data ifrån våran databas.
Att jobba mot en DAL-class, del 2 Om du nu har följt del1 av denna artikleserie så ska vi nu skapa en funktion som man kan använda för att fylla en repeater med information. Våran funktion kommer att returnera en DataTable, men det är inget som vi kommer att se när våran DAL-class väl snurrar. Öppbna upp filen DAL.cs och lägg till följande funktion: public static DataTable GetData(MySqlCommand command) try using (MySqlConnection conn = GetConnection()) using (DataSet ds = new DataSet()) using (MySqlDataAdapter da = new MySqlDataAdapter()) da.selectcommand = command; da.selectcommand.connection = conn; da.fill(ds); return ds.tables[0]; catch (Exception err) throw new ApplicationException(string.Format("Felmeddelande: 0", err.message)); Det som händer är är att vi skapar våran variabel conn som är av typen MySqlConnection och hämtar information ifrån GetConnection() som skapades i del 1. Eftersom GetConnection() är samma som för övriga funktioner så har vi skapat en plats där den informationen finns som vi anropar ifrån alla ställen. Vi talar om att den ska jobba med en MySqlDataAdapter och att den senare ska returneras tillbaka till anropsstället. Nu är vi klara med det som behvöer göras i våran DAL-class och fortsätter och skapar en ny class som vi döper till BLL.cs. BLL står för Buisness Layout Layer. I BLL.cs så lagrar vi alla databasanropsfunktioner för att enkelt kunna fylla en repeater med information. Nu gör vi en enkel funktion som hämtar alla artiklar baserat på en person, här väljer jag enbart att visa hur man kör med paramterar för att slippa tänka på ev. SQL-injection. public static DataTable getarticles(string userid) MySqlCommand getarticles = new MySqlCommand("SELECT id, headline, text, date FROM articles WHERE userid =?userid");
getarticles.parameters.add("?userid", MySqlDbType.VarChar, 25).Value = userid; return DAL.GetData(getArticles); Vi har nu en funktion som heter getarticles som är av type DataTable där vi skickar in userid. Vi har våran SQL-sats som en MySqlCommand och en paramter som vi får med i SQL-satsen som ett userid. Vi anropar våran DALclass och funktionen GetData. Nu kommer vi till det roliga att börja använda repeatern. Skapa en ny sida som ni kan kalla repeater.aspx. I Toolboxen och under Data så hittar ni repeater-controllen. Dra ut en repeater-controll på sidan. Om ni nu separerer på de två raderna som repeatern och skriver < så kommer ni få fram en lista på olika alternativ. AlternatingItemTemplate, FooterTemplate, HeaderTemplate, ItemTemplate och sist SeparatorTemplate. Vi kommer bara att använda FooterTemplate, HeaderTemplate och ItemTemplate. Ni kan börja lägga till <HeaderTemplate> inutti repetern. <HeaderTemplate><div>Våran första repeater.</div></headertemplate> En <FooterTemplate> <FooterTemplate><div>Här slutar våran första repeater.</div></footertemplate> Och till sist <ItemTemplate> <ItemTemplate> <div> <div> <%# Eval("id") %></div> <div> <%# Eval("headline") %></div> </div> </ItemTemplate> id och headline är två av fälten vi valt att hämta ut i våran funktion getarticles. För att fylla våran repeater med innehållet ifrån databasen så ska vi nu öppna upp repeater.aspx.cs och lägga till två rader i Page_Load. protected void Page_Load(object sender, EventArgs e) Repeater1.DataSource = bll.getarticles( MacTommy ); Repeater1.DataBind(); Kör sidan och om du gjort rätt så har du en 3-skiktslösning med en <asp:repeater> där ni har full kontroll på all HTML som genereras.
Att jobba mot en DAL-class, del 3. Tidigare artiklar så har jag visat hur man enkelt kan fylla en repeater med information, när man väl har skapat sin DAL-class så kan man lätt återanvända den om och om igen. Det är inte alltid som man vill fylla en repeater med information, utan bara hämta t.ex. antalet artiklar som finns. Vi börjar lägga till en funktion i våran DAL-class. public static object ExecuteScalar(MySqlCommand command) using (MySqlConnection conn = GetConnection()) command.connection = conn; object result = command.executescalar(); return result; Denna funktion returnerar ett valfritt object. Vi kan inte nyttja det för att hämta id och namn, utan det är antingen id eller namn. Här har vi åter GetConnection() för att hämta själva db-anslutningen. Vi går till våran BLL.cs och lägger till SQL-satsen för att hämta antalet artiklar baserat på en viss person. public static Int16 countarticlesbyuser(string userid) MySqlCommand countarticlesbyuser = new MySqlCommand("SELECT COUNT(id) FROM articles WHERE userid =?userid "); countarticlesbyuser.parameters.add("?userid", MySqlDbType.VarChar, 25).Value = userid; return Convert.ToInt16(DAL.ExecuteScalar(countArticlesByUser)); Tillbaka i repeater.aspx.cs så kan vi nu enkelt skapa oss en integer och hämta antalet artiklar med en rad kod: int articlesbyuser = bll.countarticlesbyuser( MacTommy ); Nu kan man fritt använda variabeln articlesbyuser för att skriva ut hur många artiklar en viss person skrivit. Vill man få ut alla artiklar oavsett skribent så lägger vi till ytterligare några rader i BLL.cs. public static Int16 countarticles() MySqlCommand countarticlesbyuser = new MySqlCommand("SELECT COUNT(id) FROM articles"); return Convert.ToInt16(DAL.ExecuteScalar(countArticlesByUser)); Samma sak här, tillbaka till repeater.aspx.cs och hämta antalet med: int articlesbyuser = bll.countarticles();
Som ni märker så kan ni bygga upp ett bibliotek med SQL-satser som ni hittar på ett ställe och med en rad så hämtar ni det ni önskar till en variabel. Eftersom vi lagt till ExecuteScalar i DAL-classen tidigare så behöver vi bara komplettera våran BLL.cs-fil med ytterligare SQL-satser.
Att jobba mot en DAL-class, del 4. Tidigare så har jag visat hur man enkelt kan hämta data ifrån en DAL-class, nu kommer vi till där vi vill skicka in data till databasen via en DAL-class. Vi går till DAL.cs och lägger till ytterligare en funktion. public static void ExecuteNonQuery(MySqlCommand command) using (MySqlConnection conn = GetConnection()) command.connection = conn; command.executenonquery(); ExecuteNonQuery använder vi när vi skickar in data, utan att få något tillbaka. Vi går till våran BLL.cs och lägger till att vi ska spara en ny artikel. public static void savearticle(string title, string text) MySqlCommand savearticle = new MySqlCommand("INSERT INTO articles (headline,text,date) VALUES (?headline,?text,?date)"); savearticle.parameters.add("?headline", MySqlDbType.String, 255).Value = headline; savearticle.parameters.add("?text", MySqlDbType.String).Value = text; savearticle.parameters.add("?date", MySqlDbType.Datetime).Value = DateTime.Now; DAL.ExecuteNonQuery(saveArticle); Åter igen så kan vi gå tillbaka till våran repeater.aspx för att spara en ny artikel: bll.savearticle( Min rubrik, Min text som även kan hämtas in ifrån en textbox istället. ); Vill vi ta bort en artikel så skapar vi en funktion i BLL.cs: public static void deltearticle(int id) MySqlCommand deltearticle = new MySqlCommand("DELETE FROM articles WHERE id =?id"); deltearticle.parameters.add("?id", MySqlDbType.Int, 11).Value = id; DAL.ExecuteNonQuery(delteArticle); Radering sker nu ifrån våran repeater.aspx med en rad kod. Denna tar bort artikeln med ID:et 10: bll.deletearticle(10); Nu har ni fått en liten inblick hur man enkelt kan jobba med en enkel DALclass.
Det finns flera andra varianter och somliga föredrar vissa framför andra. Jag har fastnat för den här varianten, även om det säkert finns andra som är mycket lättare att jobba med.