Att jobba mot en DAL-class, del 1

Relevanta dokument
Stored procedure i ASP.NET

public DataSet GenerateDataSet(SqlCommand dbcommand, String tablename, out String errormsg) { errormsg = "";

Objektorienterad programmering i Java Undantag Sven-Olof Nyström Uppsala Universitet Skansholm: Kapitel 11

ASP.NET Thomas Mejtoft

Objektorienterad programmering i Java Undantag Sven-Olof Nyström Uppsala Universitet Skansholm: Kapitel 11

Lab 6: ASP.NET 2.0 Providermodellen

Stored procedure i ASP.NET

Innehåll MySQL Intro. Allmänt om Lagrade Procedurer Enkel utformning Skapa en lagrad procedur Använda parameter som indata

Exceptions (undantag) Murach s: kap 7

Objektorienterad Programmering (OOP) Murach s: kap 12-16

Command line argumenter. Objektorienterad Programmering (TDDC77) Vad blir resultatet? Nu då? Ahmed Rezine. Hösttermin 2016

Objektorienterad Programmering (TDDC77)

Idag. Exempel, version 2. Exempel, version 3. Ett lite större exempel

ADO.NET Murach Kapitel 17-20

Language Integrated Query, LINQ, och databaser

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Programmering A C# VT Ett kompendie över Programmering A (50p) i c# Stefan Fredriksson

F4. programmeringsteknik och Matlab

ASP.NET Web Forms. Copyright Mahmud Al Hakim Vad är Web Forms?

Föreläsnings 9 - Exceptions, I/O

INTRODUKTION TILL JDBC

Klientprogrammering mot databaser

Föreläsning 8. Arv. Arv (forts) Arv och abstrakta klasser

Metoder (funktioner) Murach s: kap Winstrand Development

DUGGA: Objektorienterade applikationer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

Tentamen, EDAA20/EDA501 Programmering

DB, DATA, LOGIC, EXPOSURE (WEB)

Översikt. Installation av EasyPHP 1. Ladda ner från Jag använder Release Installera EasyPHP.

Övning. Introduktion och förberedelser

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

TDDC77 Objektorienterad Programmering

Webbsidor och databaser i ASP.NET

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Erik Nilsson, Institutionen för Datavetenskap, LiU

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

Undantag. Engelska: exceptions. Skansholm: exceptionella händelser

Outline. I Vi kan lätt göra samma sak för fyra variabler... I Hur gör vi för 400 inlästa värden? I Ofta behöver man flera likadana variabler

Generiska konstruktioner. Kursbokens kapitel 13

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2

Högskolan Dalarna sid 1 av 5 DI-institutionen Hans-Edy Mårtensson Sten Sundin

DIAGNOSTISKT PROV. Tid. Hjälpmedel. Antaganden. Rättning. Övrigt. Diagnostiskt Prov. Klockan Inga

Detta dokument är ett exempel, cirka hälften av en tentamen för TDA545 Objektorienterad programvaruutveckling

Laboration 1 Introduktion till Visual Basic 6.0

Lösningsförslag till omtentamen för TDA540 Objektorienterad Programmering

Projekt Foreläsning VI

Övning MS SQL och MVC del 2

Objektorienterad Programkonstruktion. Föreläsning 4 8 nov 2016

Kopiering av objekt i Java

Genomgång av tentamen. Databasteknik ITHS 4/3 2016

Allmänna anvisningar: Skriv dina svar på svarsblanketten (se nästa sida) Markera och ange alla svar tydligt och entydigt efter instruktionerna.

Arv: Fordonsexempel. Arv. Arv: fordonsexempel (forts) Arv: Ett exempel. En klassdefinition class A extends B {... }

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Objektorientering. Objekt och metoder. Objektorientering. Viktiga begrepp. Klass. Objekt. Deklarativ programmering

Objektorienterad Programmering (TDDC77)

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

Bankkonto - övning. Övning 2 Skriv en metod, geträntan, som returnerar räntan.

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Webbtjänster med API er

Uppgiften är att beskriva en kvadrat i ett Java program. En första version av programmet skulle kunna se ut så här:

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Lektion 5 HTML, CSS, PHP och MySQL

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

OOP Objekt-orienterad programmering

Objektorienterad programmering D2

KARLSTADS UNIVERSITET 12/8/09 informatik & datavetenskap Johan Öfverberg, Kerstin Andersson Laboration 4, ISG A04 och DVG A08 HT-09

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

Lösningar för tenta 3 DAT043,

Föreläsning 3 Innehåll. Generiska klasser. Icke-generisk lista ArrayList, skiss av implementering. Icke-generisk lista Risk för fel

FactoryCast HMI. Premium & Quantum PLC. MySQL Server och FactoryCast HMI databastjänst

Det här dokumentet är till för att ge en översikt över ASP.NET MVC samt hur WCF Services används från.net applikationer.

Att skriva till och läsa från terminalfönstret

Översikt MERA JAVA OCH ECLIPSE. Uttryck och tilldelning. Uttryck och tilldelning. Uttryck och tilldelning. Uttryck och tilldelning

Backcode. Jonathan Crusoe TDP019 Projekt: Datorspråk Linköpings universitet

Objektorienterad programmering med Java, Generics

Tentamen, EDAA10 Programmering i Java

Högskolan Dalarna sid 1 av 7 DI-institutionen Hans-Edy Mårtensson Sten Sundin Micael Karlsson

Du skall naturligtvis visa körexempel med output där det behövs i din rapport!

Mål med lektionen! Repetera och befästa kunskaperna.

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-17, TDA540. Dag: , Tid:

PROGRAMMERING A VC# 2008 EXPRESS UTVECKLINGSVERKTYGET VISUAL C#

trafiksimulering Intro OU5 trafiksimulering

Lösningsförslag, tentamen FYTA11 Javaprogrammering

Tentamen i Webbproduktion (7.5 hp)

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

Föreläsning 3: Booleans, if, switch

if (n==null) { return null; } else { return new Node(n.data, copy(n.next));

Asp.net mvc intro PER KVARNBRINK,

List.java. List.java. Printed by Tom Smedsaas

Objektorienterad Programmering (TDDC77)

Laboration 24 Databasen MySQL och java

Parsing med Recursive Descent, Avbildningsklasser. Syntaxdiagram. Syntaxdiagram och kodning expression. Betrakta följande uttryck

Föreläsning 6: Metoder och fält (arrays)

Inledande programmering med C# (1DV402) Tärningarna ska kastas

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Exempelduggan. Luffarschack. Koda spel

Föreläsning 3. Stack

Arbeta med databas. Översikt. Lektion 1: Arbeta med Entity Data Models. Arbeta med Entity Data Models. LINQ (Language Integrated Query).

Föreläsning 5 (6) Metoder. Metoder Deklarera. Metoder. Parametrar Returvärden Överlagring Konstruktorer Statiska metoder tostring() metoden javadoc

Nya Aquila använder senaste versionen av våra verktyg: UniPaaS 1.9 (tidigare Magic), samt Crystal Reports version 12 (idag kör ni på version 8).

Tentamen FYTA11 Javaprogrammering

2203$( Föreläsning ii - Mer om Java bla this och konstruktorer. Exempel: lampa

TENTAMEN I PROGRAMMERING. På tentamen ges graderade betyg:. 3:a 24 poäng, 4:a 36 poäng och 5:a 48 poäng

Transkript:

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.