Saturday, August 9, 2014

3 tier architecture in asp.net using c#

ഡേറ്റാബേസ് ഉപയോഗിച്ചുള്ള ആപ്ലിക്കേഷനുകളിൽ ഉപയോഗിക്കുന്ന architecture ആണ് 3 tier architecture. പേരിൽ തന്നെ മനസിലാക്കാൻ സാധിക്കുന്നതുപോലെ മൂന്ന് ഭാഗമായിട്ടാണ് ഈarchitecture ന്റെ നില്പ്.

1.Application or Presentation tier
2.Business Access or Business Logic or Business tier
3.Data or Data Access tier.


1.Application or Presentation tier.
യൂസർ ഇന്റ്ര്‍_ഫേസാണ് Application or Presentation tier ല് വരുന്നത്. ഇത് ഒന്നുകിൽ വെബ് പേജോ വിൻഡോസ് ഫോമോ അതുപോലെയുള്ള മറ്റേതെങ്കിലും യൂസർ ഇന്റ്ര്‍_ഫേസാകാം. യൂസര്‍ നേരിട്ട് ഉപയോഗിക്കുന്നതാണ് Application or Presentation tier. Business tier മായി ബന്ധപ്പെട്ടാണ് Presentation tier ന്റെ നിൽപ്പ്. 

2. Business tier.
Presentation tier നും Data tier നും ഇടയിൽ മധ്യവർത്തിയായി നിൽക്കുകയാണ് Business tier ചെയ്യുന്നത്. Presentation tier ല് നിന്ന് കിട്ടൂന്ന നിർദ്ദേശങ്ങൾ സ്വീകരിച്ച്  Data tierനു നൽകുകയും Data tier ല് നിന്ന് ലഭിക്കുന്ന വിവരങ്ങൾ ആവശ്യമായ രൂപത്തിലേക്ക് മാറ്റം വരുത്തി തിരിച്ച് Presentation tier ന് നൽകുന്നത് Business tier ആണ്.

3.Data tier.
ഡേറ്റാബേസ് സെർവറൂമായിമായി ഉള്ള ബന്ധവും ക്വറികളും സ്റ്റോർഡ് പ്രൊസീജിയറുകളുമാണ് Data tier ല് ഉൾപ്പെടുന്നത്. ഡേറ്റാബേസിൽ നിന്നുള്ള വിവരങ്ങൾ(റിക്കോർഡുകൾ) Business tier ലേക്ക് കൈമാറുക എന്നുള്ളതാണ് Data tier ന്റെ ചുമതല. 

{3 tier architecture എന്നു കേൾക്കുമ്പോൾ എന്തോ വലിയ സംഭവം ആണന്ന് കരുതേണ്ട. class (.cs) വഴിയാണ് 3 tier architecture നിർമ്മാണം. മറ്റൊരു രീതിയിൽ പറഞ്ഞാൽ ഡേറ്റാബേസ് കണക്ഷനും മറ്റും(ഇൻസേർട്ട്, അപ്ഡേറ്റ്,ഡിലീറ്റ്,സെലക്റ്റ് ... ക്വറികൾ) ക്ലാസിൽ എഴുതിയിട്ട് .aspx.cs ല്(വെബ് ആപ്ലിക്കേഷനിൽ) ഒബ്ജക്റ്റ് വഴി ക്ലാസിനെ വിളീച്ച് ഡേറ്റാകളെ ഡെറ്റാബേസിലേക്ക് വിടുകയും എടുക്കുകയും ചെയ്യുന്നു.}

3 tier architecture example

::ആപ്ലിക്കേഷൻ::
ഒരു കസ്റ്റ്മർ ഫോംമിൽ കൂടി അയാളുടെ വിവരങ്ങൾ ഡേറ്റാബേസിൽ ഇൻസേർട്ട് ചെയ്തിട്ട് ആ ഡേറ്റാകളെ ഒരു ഗ്രിഡിൽ കൂടി ഡിസ്പ്ലേ ചെയ്യുക എന്നുള്ളതാണ് നമ്മുടെ ലക്ഷ്യം.  ഈ ആപ്ലിക്കേഷൻ 3 tier architecture വഴി എങ്ങനെ ചെയ്യാം എന്ന് നോക്കാം.

1. ഡേറ്റാബേസ് നിർമ്മാണം.
ആദ്യം നമുക്ക് ആവശ്യമായ ഡേറ്റാബേസ് ടെബിളുകൾ ഉണ്ടാക്കാം. കസ്റ്റ്മറുടെ വിവരങ്ങൾ ശേഖരിക്കാൻ ആവശ്യമായി ഒരൊറ്റ ടേബിൾ മാത്രം മതി. tbl_Customer എന്ന പേരിൽ ഒരു ടേബിൾ ഉണ്ടാക്കൂക.(താഴത്തെ ചിത്രം നോക്കുക). അതിൽ ഡിസ്ട്രിക്റ്റിന്റെ ഫോറിൻ കീ ആണ് സേവ് ചെയ്യുന്നത്. (tbl_Customer_District എന്ന ടേബിളിൽ നിന്നാണ് ഡിസ്ട്രികിറ്റിനെ ഫോമിൽ ഡിസ്പ്ലേ ചെയ്യിക്കുന്നത്)


2. Application Layer or Presentation Layer/tier
File -> New -> Web Site... ല് ക്ലിക്ക് ചെയ്ത് അടൂത്ത വിൻഡോയിൽ എത്തി TYPE :: Visual C# സെലക്റ്റ് ചെയ്ത് ASP.Net Web Site സെലക്റ്റ് ചെയ്ത് വെബ് ലോക്കെഷൻ ബ്രൗസ്ചെയ്ത് നൽകി ആപ്ലിക്കേഷനു പേരു നൽകി 'OK' കൊടുക്കുക.


Default.aspx പേജിൽ നമുക്ക് ആവശ്യമുള്ള 'ഡിസൈനും' ഫീൽഡുകളും/കണ്ട്രോളുകളും നൽകുക.


3. Stored Procedure എഴുതിയിട്ട് വരാം.
നമ്മുടെ ഫോമിലേക്ക് എന്തെല്ലാം/ഏതെല്ലാം രീതിയിലാണ് ഡേറ്റാബേസിലേക്കും ഡെറ്റബേസിൽ നിന്നും ഡെറ്റാ വരേണ്ടത് എന്ന് മനസിലാക്കി Stored Procedure എഴുതണം. നമുക്ക് ഈ ഫോമിൽ മൂന്ന് Stored Procedure ന്റെ ആവശ്യമുണ്ട്. 
1. tbl_Customer_District ല് നിന്ന് ഡിസ്റ്റ്രിക് നമ്മുടെ ഡ്രോപ്പ് ഡൗൺ കണ്ട്രോളിലേക്ക് വരണം.
2. സേവ് ബട്ടൺ ക്ലിക്ക്ചെയ്യുമ്പോൾ ഡേറ്റാ tbl_Customer ലേക്ക് ഇൻസേർട്ട്(സേവ്) ആകണം.
3.ഇൻസേർട്ട് ആയ ഡേറ്റാ  ഗ്രിഡിലേക്ക്  ഡീസ്പ്ലേ ആകണം. 
ഈ മുന്ന് 'ഓപ്പറെഷനു'കൾക്കുള്ള Stored Procedure ആണ് എഴുതേണ്ടത്.

SP_Customer_District_Retrieve , SP_Customer_Insert , SP_Customer_Retrieve_All എന്നിങ്ങനെ മൂന്ന് Stored Procedure എഴുതി.

3.1. SP_Customer_District_Retrieve

CREATE PROCEDURE SP_Customer_District_Retrieve

AS
select * from tbl_Customer_District
order by tbl_Customer_District.PK_DistrictID

3.2 SP_Customer_Insert

CREATE PROCEDURE SP_Customer_Insert

@FK_DistructID int=0,
@CustomerName nvarchar(500),
@Customer_H_Name nvarchar(500),
@CustomerPlace nvarchar(500),
@CustomerPincode nvarchar(10),
@CustomerPhoneNumber nvarchar(20),
@CustomerEmailId nvarchar(100)

AS

BEGIN
insert into tbl_Customer(FK_DistructID,CustomerName,Customer_H_Name,CustomerPlace,CustomerPincode,CustomerPhoneNumber,CustomerEmailId)
values(@FK_DistructID,@CustomerName,@Customer_H_Name,@CustomerPlace,@CustomerPincode,@CustomerPhoneNumber,@CustomerEmailId)
END

3.3. SP_Customer_Retrieve_All 

CREATE PROCEDURE  SP_Customer_Retrieve_All

AS
BEGIN
Select tbl_Customer.PK_CustomerId,tbl_Customer.FK_DistructID,tbl_Customer.CustomerName,tbl_Customer.Customer_H_Name,
      tbl_Customer.CustomerPlace,tbl_Customer.CustomerPincode,tbl_Customer.CustomerPhoneNumber,tbl_Customer.CustomerEmailId,
      tbl_Customer_District.DistrictName
from tbl_Customer
left outer join 
tbl_Customer_District on tbl_Customer.FK_DistructID=tbl_Customer_District.PK_DistrictID
order by tbl_Customer.PK_CustomerId
END


4. Business and .Data tier / Layer
Business and Data ലെയറിനു വേണ്ടി രണ്ട് ക്ലാസ് ആഡ് ചെയ്യണം. പ്രോപ്പർട്ടി സെറ്റ് ചെയ്യാൻ വേണ്ടി Cls_PropertyLayer.cs എന്ന പേരിലൊരു ക്ലാസും , Data and Business Layer.cs എന്ന പേരിലൊരു ക്ലാസുമാണ് ആഡ് ചെയ്യുന്നത്. ക്ലാസ് ആഡ് ചെയ്യാൻ ശ്രമിക്കുമ്പോൾ App_Code ഫോൾഡറിലേക്കാണ് ലേക്കാണ് വിഷ്വൽ സ്റ്റുഡിയോ ക്ലാസ് ആഡ് ചെയ്യുന്നത് - ചിത്രം നോക്കുക. { മറ്റൊരു ഫോൾ ഉണ്ടാക്കി അതിലേക്കും ക്ലാസ് ആഡ് ചെയ്യാം). Cls_PropertyLayer.cs ല് നമുക്ക് വേണ്ട ഫീൽഡുകളുടെ(പാരാമീറ്റേഴ്സ്) പ്രോപ്പർട്ടി get,set വെച്ച് സെറ്റ് ചെയ്ത് എടുക്കുകയാണ് ചെയ്യുന്നത്. ഡേറ്റാ tier ല് ഡേറ്റാ ബേസിന്റെ കണക്ഷനും സ്റ്റോർഡ് പ്രൊസീജയറും മറ്റുമാണ് ഉൾപ്പെടൂന്നതെന്ന് നേരത്തെ പറഞ്ഞല്ലോ.നമ്മൾ Stored Procedure ഡേറ്റാബേസിൽ തന്നെ എഴുതിക്കഴിഞ്ഞതുകൊണ്ട് ഇൻസേർഡ്/അപ്ഡേറ്റ്/ഡിലീറ്റ്/സെലക്റ്റ് മെതേഡുകളിൽ ആ Stored Procedure കളെ വിളിച്ചാൽ മതിയാകും. (Business tier ല് നിന്ന് ഫംഗ്ഷനുകളിലെക്ക് ഡേറ്റായെ വിളിക്കുക എന്നുള്ളതാണ് ചെയ്യുക- നമ്മൾ Business,Data Layer ഒരൊറ്റ ക്ലാസിലാണ് ചെയ്യുന്നത്)

4.1 Cls_PropertyLayer.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

///

/// Summary description for Cls_PropertyLayer
///
public class Cls_PropertyLayer
{


    private int FK_DistructID_;
    private string CustomerName_;
    private string Customer_H_Name_;
    private string CustomerPlace_;
    private string CustomerPincode_;
    private string CustomerPhoneNumber_;
    private string CustomerEmailId_;

    public int FK_DistructID
    {
        get 
        {
            return FK_DistructID_;
        }
        set
        {
            FK_DistructID_=value;
        }
    }

    public string CustomerName
    {
        get
        {
            return CustomerName_;
        }
        set
        {
            CustomerName_ = value;
        }
    }

    public string Customer_H_Name
    {
        get
        {
            return Customer_H_Name_;
        }
        set
        {
            Customer_H_Name_ = value;
        }
    }

    public string CustomerPlace
    {
        get
        {
            return CustomerPlace_;
        }
        set
        {
            CustomerPlace_ = value;
        }
    }

    public string CustomerPincode
    {
        get
        {
            return CustomerPincode_;
        }
        set
        {
            CustomerPincode_ = value;
        }
    }

    public string CustomerPhoneNumber
    {
        get
        {
            return CustomerPhoneNumber_;
        }
        set
        {
            CustomerPhoneNumber_ = value;
        }
    }

    public string CustomerEmailId
    {
        get
        {
            return CustomerEmailId_;
        }
        set
        {
            CustomerEmailId_ = value;
        }
    }

}


4.2. Cls_Data and Business Layer.cs
നെയിംസ്പേസുകളുടെ കൂട്ടത്തിൽ ഈ രണ്ട് നെയിംസ്പേസുകളൂടെ നൽകണം.
using System.Data;
using System.Data.SqlClient;

4.2.1 ConnectSQL()
ഡേറ്റാബേസിനെ കണക്റ്റ് ചെയ്യാനുള്ള ഫക്ഷാനാണിത്.  കണക്ഷൻ ഓപ്പണാണങ്കിൽ അതിനെ ക്ലോസ് ചെയ്തിട്ട് വീണ്ടും കണക്ഷൻ സ്ട്രിംങ് നൽകി കണക്ഷൺ ഓപ്പൺ ചെയ്യുന്നു. സെർവറിന്റെ പേര്, ഉപയോഗിക്കേണ്ട ഡേറ്റാബേസിന്റെ പേര് , ഡേറ്റാബേസ് യൂസർ നെയിം,പാസ്വേഡ് എന്നിവയാണ് കണക്ഷൻ സ്ട്രിമ്ങിൽ നൽകുന്നത്.

4.2.2 InsertUpdateDeleteSqlString (string StrSqlString)
ഇൻസേർട്ട്,അപ്ഡേറ്റ്,ഡിലീറ്റ് എന്നിവയ്ക്കുള്ള Stored Procedure കളെ SqlCommand ഉപയോഗിച്ച് ഡേറ്റാബേസിലേക്ക് എക്സിക്യൂട്ട് ചെയ്യിക്കാനുള്ളതാണ് ഈ ഫക്ഷൻ.   

4.2.3 Customer_Insert(Cls_PropertyLayer ObjPropLayer)
ഇൻസേർട്ട് Stored Procedure ലേക്ക് ഡേറ്റായെ അസൈൻ ചെയ്യുന്നു. ( പ്രോഗ്രാം റൺ ചെയ്യുമ്പോൾ ബ്രേക്ക് പോയിന്റ് F11 നൽകി അടിച്ച് നോക്കിയാൽ ഫ്ലോ മനസിലാക്കാൻ കഴിയും)

4.2.4 .......Retrival (Cls_PropertyLayer objPropLayer)
ഡേറ്റാബേസ് ടേബിളിൽ നിന്നുള്ള ഡേറ്റായെ(റോ കളെ) എടുത്ത് ഡേറ്റാസെറ്റിലേക്ക് എടൂത്തുവയ്ക്കാനാണ് ഈ ഫക്ഷൻ ഉപയോഗിക്കുന്നത്.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

using System.Data;
using System.Data.SqlClient;

///

/// Summary description for Cls_Data_and_Business_Layer
///
public class Cls_Data_and_Business_Layer
{
    Cls_PropertyLayer ObjPropLayer=new Cls_PropertyLayer();
    SqlConnection SqlCon = new SqlConnection();

    public string strQueryString;

    #region SQLCONNECTION

    // ::::::::::::: 1. SQL CONNECTION :::::::::

    public void ConnectSQL()
    {
        if (SqlCon.State == ConnectionState.Open)
        {
            SqlCon.Close();
        }
        SqlCon.ConnectionString = "Server=SHIBU;DataBase=DotnetBlog;uid=sa;pwd=123123";
        SqlCon.Open();
    }

    // ::::::::::::: 2. SQL INSERT, UPDATE, DELETE SQl Query - ExecuteNOnQuery:::::::::

    public void InsertUpdateDeleteSqlString(string StrSqlString)
    {       

        ConnectSQL();
        SqlCommand cmd = new SqlCommand(StrSqlString,SqlCon);
        cmd.ExecuteNonQuery();
    }

    #endregion SQLCONNECTION

    #region INSERT_UPDATE_DELETE

    //::::::::::: 1. INSERT CUSTOMER ::::::::::::
    public void Customer_Insert(Cls_PropertyLayer ObjPropLayer)
    {
        strQueryString= "SP_Customer_Insert " + ObjPropLayer.FK_DistructID + "," + "'" +ObjPropLayer.CustomerName +"'," + "'" +ObjPropLayer.Customer_H_Name+ "'," +
                        "'" + ObjPropLayer.CustomerPlace+ "'," + "'" + ObjPropLayer.CustomerPincode+"'," + "'" + ObjPropLayer.CustomerPincode + "'," +
                        "'" + ObjPropLayer.CustomerEmailId + "'" ;
        InsertUpdateDeleteSqlString(strQueryString);
    }

    #endregion INSERT_UPDATE_DELETE

    #region RETREIVAL
    // ::::::::::::: 1. District Retreival ::::::::::

    public DataSet District_Retrival(Cls_PropertyLayer objPropLayer)
    {
        DataSet dsPropLayer = new DataSet();
        strQueryString = "SP_Customer_District_Retrieve";
        ConnectSQL();
        SqlDataAdapter sqlDa = new SqlDataAdapter(strQueryString, SqlCon);
        sqlDa.Fill(dsPropLayer);
        return dsPropLayer;

    }

    // ::::::::::::: 2. Customer Retreival ::::::::::

    public DataSet Customer_Retrival(Cls_PropertyLayer objPropLayer)
    {
        DataSet dsPropLayer = new DataSet();
        strQueryString = "SP_Customer_Retrieve_All";
        ConnectSQL();
        SqlDataAdapter sqlDa = new SqlDataAdapter(strQueryString, SqlCon);
        sqlDa.Fill(dsPropLayer);
        return dsPropLayer;

    }

    #endregion RETREIVAL

}


5. Presentation Layer Coding

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using System.Data;
using System.Data.SqlClient;

public partial class _Default : System.Web.UI.Page
{
    Cls_PropertyLayer ObjPropLayers = new Cls_PropertyLayer();
    Cls_Data_and_Business_Layer objDBLayer = new Cls_Data_and_Business_Layer();

    protected void Page_Load(object sender, EventArgs e)
    {
        if (IsPostBack == false)
        {
            FillDistricts();
            Fill_GridView_CustomerDetails();
        }

    }

    #region Control_Events

    protected void btn_Save_Click(object sender, EventArgs e)
    {
        try
        {
            ObjPropLayers.CustomerName = txt_CustomerName.Text;
            ObjPropLayers.Customer_H_Name = txt_HouseName.Text;
            ObjPropLayers.CustomerPlace = txt_Place.Text;
            ObjPropLayers.FK_DistructID = Convert.ToInt16(DDL_District.SelectedValue.ToString());
            ObjPropLayers.CustomerPincode = txt_PinCode.Text;
            ObjPropLayers.CustomerPhoneNumber = txt_Phone_Number.Text;
            ObjPropLayers.CustomerEmailId = txt_Email_id.Text;

            objDBLayer.Customer_Insert(ObjPropLayers);
            ClearFields();

            Fill_GridView_CustomerDetails();

        }
        catch (Exception ex)
        {
            lbl_ErrorMessage.Text = ex.Message;
        }

    }

    protected void btn_Clear_Click(object sender, EventArgs e)
    {
        ClearFields();
    }

    #endregion Control_Events

    #region User_defined_Functions

    public void FillDistricts()
    {
        try
        {
            DataSet dsDistrict = objDBLayer.District_Retrival(ObjPropLayers);
            DDL_District.DataSource = dsDistrict;
            DDL_District.DataTextField = "DistrictName";
            DDL_District.DataValueField = "PK_DistrictID";
            DDL_District.DataBind();

            DDL_District.Items.Insert(0, new ListItem("--Select--", "0"));
            dsDistrict.Clear();
        }
        catch (Exception ex)
        {
            lbl_ErrorMessage.Text = ex.Message;
        }

    }

    public void Fill_GridView_CustomerDetails()
    {
        try
        {
            DataSet dsCustomerdetails = objDBLayer.Customer_Retrival(ObjPropLayers);
            GV_CustomerDetails.DataSource = dsCustomerdetails;
            GV_CustomerDetails.DataBind();

            GV_CustomerDetails.Columns[3].Visible = false;
            dsCustomerdetails.Clear();
        }
        catch(Exception ex)
        {
            lbl_ErrorMessage.Text = ex.Message;
        }
    }

    public void ClearFields()
    {
        try
        {
            txt_CustomerName.Text = "";
            txt_HouseName.Text = "";
            txt_Place.Text = "";
            txt_PinCode.Text = "";
            txt_Phone_Number.Text = "";
            txt_Email_id.Text = "";
            DDL_District.SelectedIndex = 0;
            lbl_ErrorMessage.Text = "";
        }
        catch(Exception ex)
        {
            lbl_ErrorMessage.Text = ex.Message;
        }
    }

    #endregion User_defined_Functions


}

***************   ***************   ***************
DataBase :: SQL Server 2008 R2
VS : Visual Studio 2010


2 comments:

Muthukulathe Mon said...
This comment has been removed by the author.
Muthukulathe Mon said...

Simply Superb ...:)
Expecting More n More ..