Sunday, August 17, 2014

Generate and publish Scripts in SQL

ഡേറ്റാബേസിന്റെ ബാക്കപ്പ് വഴി എടൂത്ത ഡേറ്റാബേസ് എങ്ങനെയണ് റീസ്റ്റോർ ചെയ്യുന്നതെന്ന് നമ്മൾ കഴിഞ്ഞ പോസ്റ്റിൽ കണ്ടൂ. എപ്പോഴും ഡേറ്റാബേസിന്റെ മുഴുവൻ ബാക്കപ്പ് നമുക്ക് ആവശ്യമായി വരികയില്ല. ബാക്കപ്പ് വഴി ഡേറ്റാബേസ് എടുക്കുമ്പോൾ അതിന്റെ സൈസ് വളരെക്കൂടൂതലും ആയിരിക്കും. എന്നാൽ സ്ക്രിപിറ്റ് വഴി നമുക്ക് സൈസ് കുറച്ച് ഡേറ്റാബേസിന്റെ 'ബാക്കപ്പ്' എടുക്കാൻ നമുക്ക് കഴിയും. നമൂക്ക് ആവശ്യമായ ടേബിളിന്റെയോ പ്രൊസീജിയറിന്റെയോ മാത്രമായി ബാക്കപ്പ് എടുക്കാൻ 'സ്ക്രിപിറ്റ്' വഴി സാധിക്കൂം. ഈ സ്ക്രിപിറ്റ് ക്വറി വിൻഡോയിൽ ഓപ്പണാക്കി എക്സിക്യൂട്ട് ചെയ്യിച്ചാൽ നമുക്ക് ആവശ്യമായ ടേബിൾ/പ്രൊസീജിയർ ഡേറ്റാബേസിൽ 'ജനറേറ്റ്' ആവുകയും ചെയ്യും. എങ്ങനെയാണ് ഡേറ്റാബേസിന്റെ/ഡേറ്റാബേസിൽ നിന്ന് സ്ക്രിപിറ്റ് എടുക്കുന്നതെന്ന് നോക്കാം

DB : SQL Server 2008 R2

സ്റ്റെപ്പ് 1
ഏത് ഡേറ്റാബേസിന്റെ സ്ക്രിപിറ്റ് ആണോ എടുക്കേണ്ടത് ആ ഡേറ്റാബേസിൽ റൈറ്റ് ക്ലിക്ക് ചെയ്ത് ജനറേറ്റ് സ്ക്രിപിറ്റ് എന്ന മെനുവിൽ എത്തുക. (Database(right Click) - Tasks-Generate Scripts...)


സ്റ്റെപ്പ് 2
Generate and Publish Scripts എന്ന വിൻഡോ യിൽ  Script എടുക്കുന്നതിന്റെ സ്റ്റെപ്സ് നൽകിയിട്ടുണ്ട്. Introduction ഭാഗത്ത് നമുക്കൊന്നും ചെയ്യാനില്ലാത്തതുകൊണ്ട് Choose Objects ല് ക്ലിക്ക് ചെയ്തോ  Next ബട്ടൺ ഉപയോഗിച്ചോ അടൂത്ത സ്റ്റെപ് ആയ Choose Objects ല് എത്തുക.


സ്റ്റെപ് 3

Choose Objects ല് Script entire database and all databases objects , Select specific database objects എന്നിങ്ങനെ രണ്ട് റേഡിയോ ബട്ടൺ കാണാം. അതിൽ ആദ്യത്തേത് സെലക്റ്റ് ചെയ്താൽ ഡേറ്റാബേസ് മുഴുവനായി(ഡേറ്റാബേസിന്റെ ക്രിയേഷൻ മുതൽ ടേബിളും പ്രൊസീജയറും ഉൾപ്പെടെ) സ്ക്രിപിറ്റ് എടുക്കാം.Select specific database objects ആണ് സെലക്റ്റ് ചെയ്യുന്നതെങ്കിൽ നമുക്ക് ആവശ്യമുള്ള ടേബിളോ പ്രൊസീജയറോ മാത്രമായി സ്ക്രിപിറ്റ് എടുക്കാം. (നമ്മൾ ഇവിടെ ചെയ്യുന്നത് ആദ്യത്തെ റേഡിയോ ബട്ടൺ സെലക്റ്റ് ചെയ്ത് ഡേറ്റാബേസിന്റെ മുഴുവൻ സ്ക്രിപിറ്റ് എടുക്കുകയാണ്)


സ്റ്റെപ് 4.1
Next ബട്ടൺ ഉപയോഗിച്ചോ set Scripting OPtions ടാബിൽ ക്ലിക്ക് ചെയ്തോ set Scripting OPtions എന്ന സ്റ്റെപിലേക്ക് എത്തുക. ഇവിടെ സ്ക്രിപിറ്റ് ഏത് രീതിയിലാണ് സേവ് ചെയ്യേണ്ടത് , സേവ് ചെയ്യേണ്ട ലൊക്കെഷൻ എന്നിവ പറഞ്ഞ് കൊടുക്കണം. Output Type ല് Save scripts to a specific location എന്ന റേഡീയോ ബട്ടൺ സെലക്റ്റ് ചെയ്യുന്നു. Save to file ഭാഗത്ത് നിന്ന് 
Files to generate ല്‍ നിന്ന് Single file Option എന്ന ബട്ടൺ select ചെയ്യുന്നു. ഇത് സെലക്റ്റ് ചെയ്താൽ ഡേറ്റാബേസ് സ്ക്രിപിറ്റ് മുഴുവൻ ഒരൊറ്റ .sql ഫയലായി ലഭിക്കും. Single File per object ആണ് സെലക്റ്റ് ചെയ്യുന്നതെങ്കിൽ ഓരോ ടേബിളിനും പ്രൊസീജയറിനും പ്രത്യേകം പ്രത്യേകം .sql ഫയല് ഉണ്ടാവും. Save As ഭാഗത്ത് Unicode text സെലക്റ്റ് ചെയ്യുന്നതാണ് നല്ലത്.


സ്റ്റെപ് 4.2
Advanced എന്നൊരു ടാബ് ഇവിടെ കാണാം. ഈ ടാബിൽ ക്ലിക്ക് ചെയ്താൽ Advanced Scripting Options എന്ന ഒരു വിൻഡോയിലേക്കാണ് ചെല്ലുന്നത്. ഇവിടെ നമുക്ക് പ്രധാനമായി രണ്ട് കാര്യങ്ങളാണ് ചെയ്യേണ്ടത്. 

ഒന്നാമത് Script for Server version എന്ന ഓപ്ഷൻ ഭാഗത്തു നിന്ന് നമ്മൾ സ്ക്രിപ്റ്റ് റൺ ചെയ്യിക്കാൻ/എക്സിക്യൂട്ട് ചെയ്യിച്ച് ഡേറ്റാബേസ് നിർമ്മിക്കാൻ പോകുന്നത് ഏത് വേർഷനിലേക്കാണോ അത് സെലക്റ്റ് ചെയ്യുക. (ഹയർ വേർഷനിലേക്ക് പറ്റില്ല).ഇവിടെയുള്ള ഓപഷൻ 
SQL Server 2000 , SQL Server 2005, SQL Server 2008 , SQL Server 2008 R2 എന്നിവയാണ്.

രണ്ടാമത് സ്ക്രിപ്റ്റിന്റെ ഉള്ളടക്കം നിശ്ചയിക്കുക എന്നുള്ളതാണ്. TYpes of data to script എന്ന ഓപ്ഷൻ ഭാഗത്ത് നമുക്ക് കാണാൻ പറ്റുന്നത് Data only , Schema and Data ,Schema only എന്നിങ്ങനെയുള്ള മൂന്ന് ഓപ്ഷൻ ആണ്. ഇതിൽ Data only സെലക്റ്റ് ചെയ്താൽ സ്ക്രിപ്റ്റിൽ ഡേറ്റാ മാത്രമേ ഉണ്ടാകൂ. Schema and Data ആണ് സെലക്റ്റ് ചെയ്യുന്നതെങ്കിൽ ടേബിളിന്റെ സ്ട്രക്ച്ചറും ഡേറ്റായും ഉണ്ടവും, Schema only ആണ് സെലക്റ്റ് ചെയ്യുന്നതെങ്കിൽ ടേബിളിന്റെ സ്ട്രക്ച്ചര്‍ മാത്രമേ സ്ക്രിപിറ്റിൽ കാണൂ.

സ്റ്റെപ് 5
Next ബട്ടൺ ഉപയോഗിച്ച് Summary ടാബിൽ ചെല്ലുക. വീണ്ടൂം Next ബട്ടൺ ഉപയോഗിച്ച്  Save or Publish Scripts ടാബിൽ എത്തുക. സ്ക്രിപ്റ്റ് എടുത്ത സെലക്ഷനുകളുടെ ഒരു സ്മ്മറിയാണ് Summary ടാബിൽ കാണിക്കുന്നത്. ഇവിടെ നോക്കി സെലക്ഷനിൽ എതെങ്കിലും മാറ്റം വരുത്തണമെങ്കിൽ പ്രീവിയസ് ബട്ടൺ ഉപയോഗിച്ച് പുറകോട്ട് പോയി മാറ്റി വരുത്താം.


സ്റ്റെപ് 6 
Next ബട്ടൺ ഉപയോഗിച്ചോ സൈഡ് മെനുവിൽ ക്ലിക്ക് ചെയ്തോ  Save or Publish Scripts ടാബിൽ എത്തുക. ഈ വിൻഡോയിൽ വരുമ്പോൾ തന്നെ സ്ക്രിപിറ്റ് ജനറേറ്റ് ചെയ്ത് നമ്മൾ പറഞ്ഞു കൊടൂത്ത ലൊക്കേഷനിൽ സേവ് ആകും. 


ഈ സ്റ്റെപ്പോടെ നമ്മൾ ഡേറ്റാബേസിന്റെ സ്ക്രിപ് എടൂത്തു കഴിഞ്ഞു. ഇനിയുള്ളത് ഡേറ്റാബേസിന്റെ സ്ക്രിപിറ്റ് SQL Server ല്‍ റൺ ചെയ്യിക്കുക/ഡേറ്റാബേസ് ഉണ്ടാക്കുക എന്നുള്ളതാണ്

സ്റ്റെപ് 7
SQL Server Management Studio തുറന്ന് File മെനുവിൽ നിന്ന് OPen-File ഉപയോഗിച്ച് നമ്മൾ സേവ് ചെയത് സ്ക്രിപിറ്റ് (.sql ഫയല്‍) തുറക്കുക(പുതിയ ഒരു ക്വറി വിൻഡോയിൽ ഈ ഫയൽ ഓപ്പണായി വരും). അല്ലങ്കിൽ സേവ് ചെയ്ത ലൊക്കേഷനിൽ സ്ക്രിപിറ്റ് ഫയലിൽ ഡബിൾ ക്ലിക്ക് ചെയ്യുക.


സ്റ്റെപ് 8
സ്ക്രിപിറ്റ് എക്സിക്യൂട്ട് ചെയ്യുക. സെർവറിൽ ആ പേരിൽ ഡേറ്റാബേസ് ഉണ്ടങ്കിൽ എറർ ഉണ്ടാകും.


സ്റ്റെപ് 9
ഡേറ്റാബേസിനു പുതിയ പേര് നൽകാനായി Contol+H അടിച്ച് പഴയ പേര് റിപ്ലേസ് ചെയ്യാം.


ഇതിനു ശേഷം വീണ്ടൂം എക്സിക്യൂട്ട് ചെയ്യുക. സ്ക്രിപ് ഫയൽ എക്സിക്യൂട്ടായി പുതിയ ഡേറ്റാബേസ് ഉണ്ടാകും.


സ്റ്റെപ് 10.
ഡേറ്റാബേസ് മുഴുവനായി സ്ക്രിപിറ്റ് എടുത്ത് റൺ ചെയ്യിക്കുകയായിരുന്നു നമ്മൾ ചെയതത്. നിലവിലുള്ള ഡേറ്റാബേസിലേക്ക് ടേബിളോ പ്രൊസീജിയറോ ചേർക്കാനായും സ്ക്രിപ് എടുക്കാവുന്നതാണ്. ഏത് ടേബിളിന്റെ/ പ്രൊസീജയിന്റെ സ്ക്രിപ്റ്റാണോ എടൂക്കേണ്ടത് അതിൽ റൈറ്റ് ക്ലിക്ക് ചെയ്ത് സ്ക്രിപിറ്റ് എടൂക്കാം. (ചിത്രം നോക്കുക)


സ്റ്റെപ് 11.
ഇങ്ങനെയെടൂത്ത സ്ക്രിപിറ്റ് ഓപ്പണാക്കീ ഡേറ്റാബേസിന്റെ പേര് മാറ്റി (നമുക്കേത് ഡേറ്റാബേസിലാക്കാണോ സ്ക്രിപ്റ്റ് റൺ ചെയ്യേണ്ടത് USE എന്നതിനു ശേഷം ആ ഡേറ്റാബേസിന്റെ പേരാക്കണം. (ചിത്രത്തിൽ വട്ടമിട്ട ഭാഗം നോക്കുക)


Friday, August 15, 2014

Back Up and Restore of SQL Server

ഡേറ്റാബേസിന്റെ ബാക്കപ്പ് എടുത്ത് റീസ്റ്റോർ ചെയ്യുന്നതെങ്ങനെ??

1.ബാക്കപ്പ് ::  How to Backup Database in SQL Server - Create a Full Back up of Database

DB : SQL Server 2008 R2

സ്റ്റെപ് 1 . 
ബാക്കപ്പ് എടുക്കേണ്ട ഡേറ്റാബേസിൽ റൈറ്റ്ക്ലിക്ക് ചെയ്യുമ്പോൾ കിട്ടുന്ന മെനുവിൽ നിന്ന് റ്റാസ്കിൽ നിന്ന് ബാക്കപ്പ് എന്നതിൽ ക്ലിക്ക് ചെയ്യുക. 
DataBase(right Click) - Tasks-Back Up...



സ്റ്റെപ് 2.
ബാക്കപ്പ് ഡേറ്റാബേസ് എന്ന് പേരുള്ള ഒരു വിൻഡോ ഓപ്പണായി വരുന്നു. ഈ വിൻഡോയിൽ ബാക്കപ്പ് ഡെസ്റ്റിനേഷൻ ഭാഗത്ത് ഡെസ്റ്റിനേഷൻ ഫോൾഡർ/ലൊക്കെഷൻ പറഞ്ഞു കൊടുക്കുക. മുമ്പ് എടുത്ത ഡെറ്റാബേസിന്റെ ഡെസിറ്റിനേഷൻ ലൊക്കേഷൻ അവിടെ ഡിഫോൾട്ട് ആയി കാണിച്ചിട്ടൂണ്ടാവും. അത് റിമോവ് ചെയ്ത് ആഡ് ബട്ടണിൽ ക്ലിക്ക് ചെയ്ത് പുതിയ ഡെസ്റ്റിനേഷൻ ലൊക്കെഷൻ നൽകാം. 


ഇവിടെ ശ്രദ്ധിക്കേണ്ട ഒരു കാര്യം ഉണ്ട്. ഡെസ്റ്റിനേഷൻ പാത്ത് പറഞ്ഞു കൊടുത്തതിനു ശേഷം ഫയ്ല് നെയിം(ബാക്കപ്പ് ഫയലിന് നമ്മൾ നൽകുന്ന പേര്) നൽകുമ്പോൾ അതിന്റെ എക്സ്റ്റൻഷനായി .bak എന്ന് നൽകുന്നത് നന്നായിരിക്കും . 

സ്റ്റെപ് 3.
ഡെസ്റ്റിനേഷൻ ലൊക്കേഷൻ കൊടുത്തതിനു ശേഷം ഒകെ ബട്ടണിൽ ക്ലിക്ക് ചെയ്യുക. Progress ബാർ 100% കാണിച്ചു കഴിയുമ്പോൾ ഒരു മെസേജ് ബോക്സ് പ്രത്യക്ഷപ്പെടും. നിങ്ങൾ പറഞ്ഞു കൊടുത്ത ലൊക്കേഷനിൽ ഡേറ്റാബേസിന്റെ ബാക്കപ്പ് ഉണ്ടായിരിക്കും. (4,5)



2. റിസ്റ്റോർ :: How to Restore MS SQL Server 2008 Database Backup File ?

സ്റ്റെപ് 1. ബാക്കപ്പ് ചെയ്ത ഡേറ്റാബേസ് പുതിയ ഒരു ഡെറ്റാബേസിലാക്കാണ് റിസ്റ്റോർ ചെയ്യേണ്ടതെങ്കിൽ അതിനായി ഒരു പുതിയ ഡേറ്റാബേസ് ഉണ്ടാക്കുക 


സ്റ്റെപ് 2 : ഡേറ്റാബേസിൽ റൈറ്റ്ക്ലിക്ക് ചെയ്യുമ്പോൾ കിട്ടുന്ന മെനുവിൽ നിന്ന് റ്റാസ്കിൽ നിന്ന് റിസ്റ്റോറിൽ നിന്ന് ഡേറ്റാബേസ് എന്നതിൽ ക്ലിക്ക് ചെയ്യുക.


സ്റ്റെപ് 3 : റീസ്റ്റോർ ഡേറ്റാബേസ് എന്ന ഒരു വിൻഡോ പ്രത്യക്ഷപ്പെടും. To Database എന്ന ഭാഗത്ത് നിങ്ങൾക്ക് ഏത് ഡേറ്റാബേസിലാക്കാണോ ബാക്കപ്പ് റീസ്റ്റോർ ചെയ്യേണ്ടത് ആ ഡേറ്റാബേസിന്റെ പേരായിരിക്കൂം(നിങ്ങൾ റൈറ്റ് ക്ലിക്ക് ചെയ്ത ഡേറ്റാബേസിന്റെ പേര്). Source for REstore എന്ന ഭാഗത്ത് From Database, From device എന്നിങ്ങനെ രണ്ട് റേഡിയോ ബട്ടൺ ഉണ്ടാവും. നമുക്ക് റീ സ്റ്റോർ ചെയ്യേണ്ടത് നമ്മൾ നേരത്തെ എടുത്തു വച്ചിരിക്കുന്ന ബാക്കപ്പ് ആയതുകൊണ്ട് From device എന്ന റേഡിയോ ബട്ടൺ സെലക്റ്റ് ചെയ്തതിനുശേഷം ബാക്കപ്പിന്റെ ലൊക്കെഷൻ പറഞ്ഞു കൊടുക്കണം. 

Back Up Location ല് Add ബട്ടൺ ക്ലിക്ക് ചെയ്യുമ്പോൾ Locate BackUp file എന്നൊരു വിൻഡോ ഓപ്പണായി വരും.ഡിഫോൾട്ടായി എസ്ക്യുൽ ഇൻസ്റ്റാൾ ചെയ്തിട്ടുള്ള പാർട്ടീഷനിലെ പ്രോഗ്രാം ഫയലിൽ നിന്ന് MS SQL - Backup എന്ന പാത്തായിരിക്കും കാണീക്കുന്നത്. അത് മാറ്റി നമ്മുടെ ബാക്കപ്പ് ഫയൽ ഇരിക്കൂന്ന ലൊക്കെഷന്റെ പാത്ത് നൽകണം. ഒരു കാര്യം ശ്രദ്ധിക്കേണ്ടത് , ബാക്കപ്പ് ഫയലിനു പേര് നൽകിയപ്പോൾ .bak എന്ന് നൽകിയിട്ടീല്ലങ്കിൽ ബാക്കപ്പ് ഫോൾഡറിൽ ആ ഫയ്ല് കാണിക്കുകയില്ല. അപ്പോൾ Files of Type ല് BackUp Files എന്നുള്ളത് മാറ്റ്യി All Files (.*) എന്നാക്കുക. അപ്പോൾ നിങ്ങളുടെ ബാക്കപ്പ് ഫയൽ കാണാൻ കഴിയും.ഫയൽ സെലക്റ്റ് ചെയ്തതിനു ശേഷം ഒകെ ബട്ടൻ ക്ലിക്ക് ചെയ്യുക. 


സ്റ്റെപ് 4
വീണ്ടും നമ്മൾ Restore Database എന്ന വിൻഡോയിൽ തിരികെ എത്തി. അവിടെ കാണിക്കുന്ന ഡേറ്റാബേസിന്റെ ഭാഗത്ത് Restore എന്ന ചെക് ബോക്സ് സെലകറ്റ് ചെയ്തതിനുശേഷം (ടിക് ഇട്ടതിനു ശേഷം) ഒകെ ബട്ടൺ ക്ലിക്ക് ചെയ്യുക.

ഇത്രയും കൊണ്ട് ഡേറ്റാബേസ് റീസ്റ്റോർ ആകേണ്ടതാണ്, പക്ഷേ നിങ്ങളുടെ സിസ്റ്റത്തിലെ ഡേറ്റാബേസ് തന്നെയാണ് ബാക്കപ്പ് എടുത്ത് മറ്റൊരു പുതിയ ഡേറ്റാബേസിലേക്ക് റീസ്റ്റോർ ചെയ്യുന്നത് എന്നതുകൊണ്ട് താഴെയുള്ള ചിത്രത്തിലെപ്പോലെ ഒരു എറർ ഉണ്ടാകാം.

സ്റ്റെപ് 5
  നമ്മൾ ബാക്കപ്പ് എടുത്ത ഡെറ്റാബേസിന്റെ .mdf, .ldf എന്നീ ഫയലുകൾ തന്നെ പുതിയ ഡേറ്റാബേസിന്റെ .mdf, .ldf ഫയലുകളായി സെർവർ കണക്കാക്കുന്നതുകൊണ്ടാണ് ഈ എറർ ഉണ്ടാകുന്നത്. പുതിയ ഡെറ്റാബേസിന്റെ .mdf, .ldf ഫയലുകൾ സെ;അക്റ്റ് ചെയ്താൽ ഈ എറർ മാറും .Restore Database എന്ന വിൻഡോയിൽ Options എന്നൊരു ടാബ് ഉണ്ട്. അതിൽ ക്ലിക്ക് ചെയ്യുമ്പോൾ ഡെറ്റബേസിന്റെ .mdf, .ldf ഫയൽ ലൊക്കെഷൻ കാണിക്കും. അവിടെ നിന്ന് ലൊക്കെഷൻ മാറ്റി കൊടുക്കുക.     .mdf, .ldf എന്നീ ഫയലുകളുടെ ലൊക്കെഷൻ ഇങ്ങനെ മാറ്റിക്കൊടുക്കുക. (ചിത്രം നോക്കുക)


സ്റ്റെപ് 6
.mdf, .ldf ഫയലുകളുടെ ലൊക്കെഷൻ സെലക്റ്റ് ചെയ്ത് കൊടുത്തതിനു ശേഷം Restore OPtions ലെ ആദ്യത്തെ ഓപ്ഷൻ ടിക്ക് ചെയ്യുക (ഡേറ്റാബേസിൽ ഓവർ റൈറ്റ് ചെയ്യാൻ വേണ്ടിയാണ് ഇത് സെലക്റ്റ് ചെയ്യുന്നത്). ഇതിനു ശേഷം ഒക്കെ അടിക്കുക. ഡേറ്റാബേസ് റീസ്റ്റോർ ആയി എന്നുള്ള മെസേജ് ബോക്സ് പ്രത്യക്ഷപ്പെടൂം. ഇനി ഡേറ്റാബേസ് ഒന്ന് റിഫ്രഷ് ചെയ്തിട്ട് റീസ്റ്റോർ ചെയ്ത ഡേടാബേസിൽ നോക്കുക. പഴയ ഡേറ്റാബേസിലെ എല്ലാ ടേബിളും, പ്രൊസീജിയറും ഒക്കെ പുതിയ ഡേറ്റാബേസിൽ ഉണ്ടാവും.

മുന്നറിയിപ്പ് :: ഉപയോഗിച്ചുകൊണ്ടിരിക്കൂന്ന ഡേറ്റാബേസിൽ ആദ്യം പണി പഠിക്കരുത്  :)

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