In dit hoofdstuk leer je hoe je verschillende onderdelen van een applicatie kan scheiden. Veelal wordt gesproken over lagen of layers van een applicatie. Deze termen geven aan hoe de verschillende aspecten fysiek van elkaar worden gescheiden. Voor een ASP.net applicatie kunnen we op die manier steeds een client, een server en dikwijls een database-layer onderscheiden.
Met het begrip tier wordt wordt ook een laag aangegeven, maar wordt meestal niet als een fysieke scheidingslijn aangenomen, maar een programmatorische afsplitsing in klassen en groepen van gerateerde klassen. Het is de bedoeling dat de verschillende tiers enkel communiceren met elkaar, maar in principe niks over elkaar hoeven te weten.
Op deze manier kan je je toepassing opbouwen op een gestructureerde manier en kan je later aanpassingen doen in een van de tiers van de applicatie zonder daarvoor andere tiers te moeten manipuleren.
Je kan een toepassing opsplitsen in 2, 3 of meer lagen, algemeen spreken we over een N-Tier structuur.
Een gangbare manier om jouw toepassingen in tiers op te delen is de 3-Tier architectuur:
In deze toepassing maken we gebruik van twee lagen: een presentatielaag en een datalaag. We koppelen de interactie met de database los van de presentatie van de gegevens.
De gebruikte Stored Procedures:
CREATE PROCEDURE Categorieen AS SELECT cat_id, categorie FROM categorie ORDER BY categorie CREATE PROCEDURE ArtikelUitCategorie @CatID smallint AS SELECT artikel, omschrijving, verkoopprijs FROM artikel WHERE cat_id = @CatID ORDER BY artikel
DataObj.cs
using System;
using System.Data;
using System.Data.SqlClient;
namespace lagen
{
/// <summary>
/// Klasse voor datatoegang
/// </summary>
public class DataObj
{
private String _connStr;
public DataObj()
{
_connStr = null;
}
public DataObj(String connStr)
{
_connStr = connStr;
}
public String ConnectionString
{
get
{
return _connStr;
}
set
{
_connStr = value;
}
}
public DataView GetCategorieen()
{
SqlConnection conn = new SqlConnection(_connStr);
SqlDataAdapter da = new SqlDataAdapter("Categorieen", conn);
da.SelectCommand.CommandType = CommandType.StoredProcedure;
DataSet ds = new DataSet();
da.Fill(ds, "Categorieen");
return ds.Tables["Categorieen"].DefaultView;
}
public DataView GetArtikelsVoorCategorie(short catid)
{
SqlConnection conn = new SqlConnection(_connStr);
SqlDataAdapter da = new SqlDataAdapter("ArtikelUitCategorie", conn);
da.SelectCommand.CommandType = CommandType.StoredProcedure;
da.SelectCommand.Parameters.Add(new SqlParameter("@CatID", SqlDbType.SmallInt, 15));
da.SelectCommand.Parameters["@CatID"].Value = catid;
DataSet ds = new DataSet();
da.Fill(ds, "Artikel");
return ds.Tables["Artikel"].DefaultView;
}
}
}
TweeTier.aspx.cs 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.Configuration; namespace lagen { /// <summary> /// Summary description for tweeTier. /// </summary> public class tweeTier : System.Web.UI.Page { protected System.Web.UI.WebControls.ListBox lstCategorie; protected System.Web.UI.WebControls.DataGrid dgArtikel; private void Page_Load(object sender, System.EventArgs e) { if (!IsPostBack) { DataObj data = new DataObj(ConfigurationSettings.AppSettings["SpionString"]); lstCategorie.DataSource = data.GetCategorieen(); lstCategorie.DataValueField = "cat_id"; lstCategorie.DataTextField = "categorie"; lstCategorie.DataBind(); if(lstCategorie.Items.Count > 0) { lstCategorie.SelectedIndex = 0; VulArtikels(); } } } ... private void lstCategorie_SelectedIndexChanged(object sender, System.EventArgs e) { VulArtikels(); } private void VulArtikels() { DataObj data = new DataObj(ConfigurationSettings.AppSettings["SpionString"]); dgArtikel.DataSource = data.GetArtikelsVoorCategorie(Int16.Parse(lstCategorie.SelectedValue)); dgArtikel.DataBind(); } } }
Een eerste manier om dit te doen is om er gewoon op te rekenen dat de eerste kolom uit de DataView de value en de tweede kolom de tekst:
DataView dv = data.GetCategorieen(); lstCategorie.DataSource = dv; lstCategorie.DataValueField = dv.Table.Columns[0].ColumnName; lstCategorie.DataTextField = dv.Table.Columns[1].ColumnName; lstCategorie.DataBind();
Je kan hier nog weigerachtig tegenoverstaan, en nog verder willen afsplitsen. Hiervoor kan je:
Wens je ook nog bedrijfslogica in deze toepassing te verwerken, bijvoorbeeld een korting afhankelijk van de klant, dan kan je werken met een 3-Tier logica.
In deze toepassing vullen we een ListBox met de namen van de klanten. De basis hiervoor is de Stored Procedure KlantenBasis:
Voor de eenvoud plaatsen we de eigenschap AutoPostBack van de ListBox lstCategorie op false, we voorzien een ListBox lstKlant voor de klantenlijst en een Button om de gegevens op te vragen.
CREATE PROCEDURE KlantenBasis
AS
SELECT klant_id,
(naam +' ' +voornaam +' (' +convert(varchar(10),klant_id,103) +')')
as VolledigeNaam
FROM klant
ORDER BY naam
BusObj.cs using System; using System.Data; using System.Data.SqlClient; using System.Configuration; public class BusObj { private DataObj data; public BusObj() { data = new DataObj(ConfigurationSettings.AppSettings["SpionString"]); } public DataView GetCategorieen() { return data.GetCategorieen(); } public DataView GetKlantenBasis() { return data.GetKlantenBasis(); } public DataView GetArtikelsVoorCategorie(short catid, short klantid) { DataView view = data.GetArtikelsVoorCategorie(catid); double korting = 0; if ((klantid >= 3)&&(klantid < 5)) { korting = .50; } else if (klantid >= 5) { korting = 1.00; } for (int i=0; i<view.Count; i++) { view[i]["Verkoopprijs"] = Double.Parse(view[i]["Verkoopprijs"].ToString()) - korting; } return view; } } DataObj.cs ... public DataView GetKlantenBasis() { SqlConnection conn = new SqlConnection(_connStr); SqlDataAdapter da = new SqlDataAdapter("KlantenBasis", conn); da.SelectCommand.CommandType = CommandType.StoredProcedure; DataSet ds = new DataSet(); da.Fill(ds, "KlantenBasis"); return ds.Tables["KlantenBasis"].DefaultView; } DrieTier.aspx ... public class DrieTier : System.Web.UI.Page { protected System.Web.UI.WebControls.ListBox lstCategorie; protected System.Web.UI.WebControls.ListBox lstKlant; protected System.Web.UI.WebControls.Button Button1; protected System.Web.UI.WebControls.DataGrid dgArtikel; private void Page_Load(object sender, System.EventArgs e) { if (!IsPostBack) { BusObj data = new BusObj(); DataView dv = data.GetCategorieen(); lstCategorie.DataSource = dv; lstCategorie.DataValueField = dv.Table.Columns[0].ColumnName; lstCategorie.DataTextField = dv.Table.Columns[1].ColumnName; lstCategorie.DataBind(); DataView dvK = data.GetKlantenBasis(); lstKlant.DataSource = dvK; lstKlant.DataValueField = dvK.Table.Columns[0].ColumnName; lstKlant.DataTextField = dvK.Table.Columns[1].ColumnName; lstKlant.DataBind(); } } ... private void VulArtikels() { BusObj data = new BusObj(); dgArtikel.DataSource = data.GetArtikelsVoorCategorie(Int16.Parse(lstCategorie.SelectedValue),Int16.Parse(lstKlant.SelectedValue)); dgArtikel.DataBind(); } private void Button1_Click(object sender, System.EventArgs e) { VulArtikels(); } } }
Download de gegevens voor de Spyshop:
Figuren (opgepast, deze figuren zijn beschermd door copyright, enkel voor leerdoeleinden thuis gebruiken)
Om deze figuren correct te gebruiken pas je in de tabel CMRC_Products de ProductImage aan zodanig dat deze gelijk is aan het ProductId gevolgd door '.gif'. Anders krijg je steeds een sample-image te zien.
| Meer tutorials: |
| leer ook: | html | | xhtml | | css | | asp | | asp.net | | c# | | ado.net | | linq | | ajax | | java | | javascript |