16
ﺧﺪا ﺑﻨﺎم ﮐﻨﻢ ﺳﺎزي ﭘﯿﺎده اﻧﺘﻬﺎ ﺗﺎ اﺑﺘﺪا از اي ﻻﯾﻪ ﻣﻌﻤﺎري ﺗﻮﺳﻂ ﺳﺎده ﺑﺮﻧﺎﻣﻪ ﯾﮏ دارم ﻗﺼﺪ ﻣﻘﺎﻟﻪ اﯾﻦ در. دارﯾﻢ ﻧﯿﺎز زﯾﺮ ﻣﻮارد ﺑﻪ ﭼﯿﺰ ﻫﺮ از ﻗﺒﻞ: - visual studio ﻫﺎي ﻧﺴﺨﻪ از ﯾﮑﯽ2003 ﺑﻌﺪ ﺑﻪ- اﻃﻼﻋﺎﺗﯽ ﺑﺎﻧﮏ ﻣﻮﺗﻮر ﯾﮏSQL اي ﻧﺴﺨﻪ ﻫﺮ از) 2000,2005,2008 )( express, enterprise,… ( اﻣﮑﺎﻧﺎت ﻓﻌﻠﯽ ﺷﻮد ﻣﯽ زﯾﺮ ﻣﻮارد ﺷﺎﻣﻞ ﺑﺮﻧﺎﻣﻪ- اﻣﮑﺎنLogin ﮐﺎرﺑﺮ- در اﻃﻼﻋﺎت ﯾﮑﺴﺮي ﻣﺸﺎﻫﺪهGrid View - در ﺷﺪه اﻧﺘﺨﺎب ردﯾﻒ از اﻃﻼﻋﺎت ﺣﺬف اﻣﮑﺎنGrid View - ﺷﺪه اﻧﺘﺨﺎب ردﯾﻒ وﯾﺮاﯾﺶ اﻣﮑﺎن- اﻃﻼﻋﺎت ﺟﺴﺘﺠﻮيGrid View - ﺟﺪﯾﺪ رﮐﻮرد ﯾﮏ ﺛﺒﺖ* ﺑﻬﯿﻨﻪ و دارد ﻣﺜﺎﻟﯽ ﺟﻨﺒﻪ ﺻﺮﻓﺎ ﺑﺮﻧﺎﻣﻪ اﯾﻦ ﺗﮑﻤﯿﻞ و ﺳﺎزي ﮐﺪﻫﺎ اﺳﺖ ﺷﺪه واﮔﺬار ﺧﻮاﻧﻨﺪه ﺑﻪ. * ﺷﺪ ﺧﻮاﻫﺪ ﺿﻤﯿﻤﻪ ﻧﻬﺎﯾﺖ در ﺑﺮﻧﺎﻣﻪ ﺳﻮرس. اﺳﺖ ﻻﯾﻪ ﯾﮏ ﻗﺎﻟﺐ در ﮐﺎرﻫﺎ ﺑﻨﺪي دﺳﺘﻪ و ﺗﻘﺴﯿﻢ اي ﻻﯾﻪ ﻣﻌﻤﺎري ﮐﻠﯽ ﻫﺪف. ﻻﯾﻪ ﺳﻪ ﻣﺎ ﻣﻌﻤﺎري اﯾﻦ درInterface, Logic, DataAccess دارﯾﻢ. - ﯾﻪDataAccess آن ﺑﻪ ﮐﻪ دﺳﺘﻮراﺗﯽ اﺟﺮاي و اﻃﻼﻋﺎﺗﯽ ﺑﺎﻧﮏ ﺑﺎ ﮐﺮدن ﺑﺮﻗﺮار ارﺗﺒﺎط وﻇﯿﻔﻪ دارد را ﻣﯿﺪﻫﯿﻢ.

Learning

Embed Size (px)

Citation preview

Page 1: Learning

بنام خدا

.در این مقاله قصد دارم یک برنامه ساده توسط معماري الیه اي از ابتدا تا انتها پیاده سازي کنم

:قبل از هر چیز به موارد زیر نیاز داریم

-visual studio به بعد 2003یکی از نسخه هاي

,express)(2000,2005,2008(از هر نسخه اي SQLیک موتور بانک اطالعاتی -enterprise,…(

برنامه شامل موارد زیر می شود فعلی امکانات

کاربر Loginامکان -

Grid Viewمشاهده یکسري اطالعات در -

Grid Viewامکان حذف اطالعات از ردیف انتخاب شده در -

امکان ویرایش ردیف انتخاب شده-

Grid Viewجستجوي اطالعات -

ثبت یک رکورد جدید-

.به خواننده واگذار شده استکدها سازي و تکمیلاین برنامه صرفا جنبه مثالی دارد و بهینه *

.سورس برنامه در نهایت ضمیمه خواهد شد*

.هدف کلی معماري الیه اي تقسیم و دسته بندي کارها در قالب یک الیه است

.داریم Interface, Logic, DataAccessدر این معماري ما سه الیه

وظیفه ارتباط برقرار کردن با بانک اطالعاتی و اجراي دستوراتی که به آن DataAccessیه ال- .میدهیم را دارد

Page 2: Learning

مثال در مثال اداره آموزش یک دانشجوي . وظیفه ایجاد قوانین و منطق برنامه را دارد Logicالیه -در شرایط مختلف این قوانین بدیهی است که .واحد درس انتخاب کند 14مشروطی نمیتواند بیش از

.است تا به عنوان مغز متفکر سیستم عمل کند Logicدر نتیجه این وظیفه الیه . متفاوت است

طراحی فرم ها و . این الیه مربوط به رابط کاربري برنامه است. می باشد Interfaceالیه آخر - .در این الیه قرار می گیرد... گزارشات و

.ادامه مبحث می پردازیمه با معماري الیه اي آشنایی دارد به با فرض این که خوانند

با توجه به امکاناتی که در باال گفته شد جداول زیر متصور است

:جدول کاربران

نام کاربر-

رمز عبور-

:یک جدول دلخواه دیگر مثال جدول کاال

کد کاال-

نام کاال-

کمپانی سازنده-

قیمت-

ابیس و جداول باال بکار بگیریددستورات زیر را براي ساخت دیت

Create database dataSample

go

use dataSample

go

Create table users

Page 3: Learning

(

code smallint primary key iden ty(1,1),

name nvarchar(50) not null,

pass nvarchar(50) not null

)

go

Insert into users(name,pass)values('admin','1')

go

Create table product

(

code int primary key iden ty(1,1),

name nvarchar(50) not null,

company nvarchar(50),

price float not null

)

insert into product(name,company,price)values('Cpu','AMD',60000)

insert into product(name,company,price)values('Cpu','Intel',70000)

insert into product(name,company,price)values('Graphic 9500','Geforce',80000)

insert into product(name,company,price)values('Ram 1GB','Kingmax',24000)

Page 4: Learning

insert into product(name,company,price)values('Hard 500GB','Maxtor',54000)

در نتیجه کافیست دیتابیس را به هر نحوي ایجاد . ادامه پروژه منوط به ساخت دیتابیس باال می باشد* .و در صورت تمایل تعدادي کاال هم اضافه کنیدل کاربران و موقتا یک کاربر به جدو کنید

.پرهیز می کنم ...و SPو viewبه خاطر پیچیده نشدن و طوالنی نشدن مقاله از ساخت *

ند الیه اي معموال بجز الیه رابط کاربر سایر الیه ها بصورت کتابخانه هاي برنامه هاي چ پیاده سازي درdll پیاده سازي می شوند.

:بصورت زیر عمل میکنیم VSبراي ساخت چنین برنامه هایی در محیط

ایجاد dataSampleبا نام اي Windows applicationدر محیط ویژوال استودیو یک پروژه .دهد یک فرم آماده به ما تحویل می Visual studioبعد از ایجاد معموال .میکنیم

.تغییر دهید frmLoginرا به ایجاد شده نام فرم Solution Explorerدر پنجره

:را بصورت زیر طراحی میکنیم Loginفرم

.حاال یک فرم در الیه رابط ایجاد شد

:ساخت سایر الیه ها

قرار است که کاربر رمز عبور خود را وارد کرده و بعد از زدن کلید ورود در صورت معتبر بودن رمز به :کلی به صورت زیر خواهد بود طوردر نتیجه روال کار ب.صفحه اصلی منتقل شود

میشود فرستاده به یک تابع رمز-

Page 5: Learning

انتخاب میشود که داراي رمز عبور کاربران شخصی از جدول که بر اساس آن یک کوئري نوشته شده- .وارده است

ب نمایش داده سصورت میگیرد و در غیر این صورت پیغام منا Login ،در صورت وجود شخص- .میشود

:از سناریوي باال کارهاي زیر استنباط میشود

)کوئرينوشتن ( خواندن اطالعات از دیتابیس-

)کاربري وجود دارد یا خیر( تصمیم گیري بر طبق اطالعات خوانده شده-

)منتقل شدن به فرم اصلی و یا پیغام خطا( واکنش نهایی-

)Logic( تصمیم گیري را انجام دهد حال با این دیدگاه الیه اي ایجاد میکنیم که

.را انتخاب میکنیم add new projectو سپس Addگزینه Fileدر منوي

همانطور که میبینید این نوع از .اضافه می کنیم Solutionبه Logicبا نام طبق تصویر پروژه را .به عنوان خروجی تحویل میدهند dllپروژه ها فایل

Page 6: Learning

را به نام Class1که هم اکنون ایجاد شد نام Logicدر الیه Solution Explorerدر پنجره Business.cs بعد از تغییر نام پیغامی که ظاهر می شود را . تغییر دهیدYes کنید تا نام کالسی که در .بود نیز تغییر پیدا کند Class1داخل محتویات

باید ارتباط الیه حاال از آنجایی که هر الیه فقط میتواند با الیه پایین تر از خود در ارتباط باشدInterface با الیه راLogic تصویر زیر را مالحظه کنید. برقرار کنیم:

Page 7: Learning

Solutionهاي Projectاز میان Reference. براي الیه رابط اضافه کردیم Referenceیک

حاال .با این کار در واقع گفتیم که الیه رابط تنها می تواند با الیه منطق ارتباط برقرار کند .انتخاب شده .از درون الیه رابط میتوانیم توابع الیه منطق را فرا خوانی کنیم

را باز کرده و متد زیر را Businessقرار است یک متد براي اعتبار سنجی ایجاد کنیم، پس کالس :براي کالس می نویسیم

public static bool Login(string password) { }

در نظر میگیریم تا نیازي به Static الیه ها متدهاي کالسها ران تعداد رجوعات به به خاطر زیاد بوددر بدیهی است که در این روش نیاز به رعایت دقت بیشتري .ساخت یک شیئ از نوع آن کالس نباشد

.برنامه نویسی است

نیاز به اطالعات از بانک دارد پس باید اطالعات از بانک خوانده شده و در صورت وجود Login متد DataAccessاز آنجایی که خواندن اطالعات در الیه . شخص با چنین رمزي ورود صورت گیرد

نام الیه را .است) Logic(مراحل ایجاد همانند الیه قبلی . صورت می گیرد الیه را ایجاد می کنیمDataAccess و نام کالس درون آن راAccess و به .بنامیدReference هاي الیه منطقDataAccess تا این لحظه . را اضافه کنیدSolution Explorer باید شکل زیر را نمایش دهد

Page 8: Learning

اما از آنجایی که ممکن است متدهاي درون آن . این الیه تنها وظیفه خواندن و نوشتن در بانک را داردزیاد شوند و تعداد دستورات براي ایجاد اتصال به بانک در این الیه نیز افزایش پیدا کند لذا براي افزایش

به پروژه Executeبا یک کالس به نام Databaseانعطاف پذیري یک الیه دیگر تحت عنوان .به الیه دیتابیس براي الیه دسترسی به داده اضافه می کنیمReference و یک .اضافه می کنیم

Page 9: Learning

.حاال برنامه داراي چهار الیه شد

گرفته و اجرا میکند DataAccessرا از الیه SQLیک دستور databaseالیه -

ایجاد میکند و براي اجرا به الیه Logicرا بر طبق نیاز الیه SQLیک دستور DataAccessالیه -Database ارسال میکند.

.می کند DataAccessتقاضاي اطالعات از الیه Logicالیه -

.ارسال میکند Logicتقاضاهاي خود را به Interfaceالیه -

کد زیر را مینویسیم Interfaceدر الیه ورودکلید مربوط به Clickدر متد private void btnLogin_Click(object sender, EventArgs e) { if (Logic.Business.Login(txtPassword.Text) == true) { //goto main menu } }

در ابتداي Logicرا به ابتداي فرم اضافه کنیم نیازي به نوشتن Logicبدیهی است که اگر فضاي نام .دستورات نمی باشد

درصورت درستی دستورات . بر میگرداند true,falseالیه منطق اجرا میشود و دو حالت Loginمتد .داخل شرط اجرا شده به صفحه اصلی منتقل میشویم

Page 10: Learning

معموال کنترلی که در این الیه صورت میگیرد میتواند این باشد که کاربر مثال مقدار خالی را به الیه .ر ابتداي متد کلیک این بررسی را میتوان انجام دادبا گذاشتن یک شرط د. منطق ارسال نکند

.falseیا برگرداند trueحاال الیه منطق باید تصمیم گیري کند که

executeReadو executeNoneدر این الیه دو متد به نام هاي . میرویم databaseبه الیه فقط اجرا میکند و تعداد گرفته و را SQL متد اول یک دستور .ایجاد میکنیم Executeدر کالس

بعد از اجرا متد دوم یک دستور را گرفته و .رکوردهایی که تحت تاثیر دستور قرار گرفته اند را برمیگرداند .بر میگرداند DataTableیک

:است به این صورت Executeمحتویات کالس using System.Data; using System.Data.SqlClient; namespace Database { public class Execute { static string cnn = "Data Source=.;Initial Catalog=dataSample;Integrated Security=True"; static SqlConnection conection = new SqlConnection(cnn); static SqlCommand cmd = new SqlCommand("", conection); static SqlDataAdapter da = new SqlDataAdapter(cmd); public static int executeNone(string sql) { conection.Open(); cmd.CommandText = sql; int a = cmd.ExecuteNonQuery(); conection.Close(); return a; } public static DataTable executeRead(string sql) { DataTable dt = new DataTable(); da.SelectCommand.CommandText = sql; da.Fill(dt); return dt; } } }

:را بصورت زیر مینویسیم Loginمتد Accessو در کالس DataAccessدر الیه using System.Data; namespace DataAccess { public class Access {

Page 11: Learning

static string q = ""; public static DataTable Login(string password) { DataTable dt = new DataTable(); q = "select * from users where pass='" + password + "'"; dt = Database.Execute.executeRead(q); return dt; } } }

خروجی . ارسال میکند Databaseیک کوئري ایجاد و براي اجرا و دادن خروجی به Loginمتد .ارسال خواهد شد Logicحاصل نیز به عنوان یک جدول به الیه

:Businessکالس ،Logicمحتویات الیه using System.Data; namespace Logic { public class Business { public static bool Login(string password) { DataTable dt = new DataTable(); dt = DataAccess.Access.Login(password); if (dt==null) { return false; } if (dt.Rows.Count > 0) { return true; } else return false; } } }

یه المی آید را پردازش میکند و در نهایت یک مقدار را به DataAccessخروجی جدولی که از الیه .رابط بر میگرداند

Clickبه برنامه اضافه میکنیم و رویداد frmMainیک فرم با نام .حاال الیه رابط را تکمیل میکنیم :را تکمیل میکنیم frmLoginدر فرم مربوط به کلید ورود

private void btnLogin_Click(object sender, EventArgs e) { if (Logic.Business.Login(txtPassword.Text) == true) { frmMain f = new frmMain(); f.Show(); Hide(); } else {

Page 12: Learning

MessageBox.Show("است اشتباه عبور رمز"); } }

مینویسیم frmMainمربوط به FormClosedو در نهایت براي تکمیل برنامه در رویداد

private void frmMain_FormClosed(object sender, FormClosedEventArgs e) { Application.Exit(); }

.شتیمبه این ترتیب یک سناریو براي ورود کاربر به برنامه با استفاده از معماري الیه اي نو

سناریوي بعدي Grid Viewنمایش اطالعات در -

Logicدقت داشته باشید که معموال براي انجام هر کاري در نرم افزار نیاز به نوشتن یک متد در الیه را GetProductsمتد DataAccessدر الیه Girdنمایش اطالعات جدول کاال در براي .هست

.گرداند بر می DataTableخروجی یک در که نویسیم به صورت زیر میpublic static DataTable GetProducts() {

DataTable dt = new DataTable(); q = "select * from product"; dt = Database.Execute.executeRead(q); return dt; }

و جدول را بر ریزد می dtخوانده و در databaseمتد باال اطالعات را در قالب یک جدول از الیه .گرداند می

پس در . بر گرداند Gridجدول براي نمایش در متدي نوشته که یک Logicدر الیه توانیم حاال می :می کنیم الیه منطق متد زیر را اضافه

public static DataTable GetProducts() { DataTable dt = new DataTable(); dt = DataAccess.Access.GetProducts(); return dt; }

کنیم این کدها را اضافه می frmMainو در نهایت داخل الیه رابط در فرم DataTable dt = new DataTable(); protected void showProducts() { dt = Logic.Business.GetProducts(); DG.DataSource = dt; } private void btnShowProducts_Click(object sender, EventArgs e) { showProducts(); }

Page 13: Learning

. می باشد بریزد و یک کلید که متد را فراخوانی کند Gridیک متد که اطالعات را در کد باال شامل :بصورت زیر باید طراحی شود frmMainشکل

.تغییر داده ام DGکه نام آن را به DataGridViewشامل یک کلید و یک بصورت سراسري تعریف کردم این است که DataTableاین فرم یک قسمت کد علت این که در

.بعدا براي جستجوي اطالعات از آن استفاده خواهیم کرد .حاال نوبت جستجوي اطالعات هست. به اتمام رسید Gridسناریوي نمایش اطالعات در

که در باال بصورت dtکافیست اطالعات داخل . جستجوي اطالعات را میتوان در همین الیه انجام دادو یک کلید براي جستجو روي فرم TextBoxبراي شروع یک .سراسري تعریف کردیم را فیلتر کنیم

.اضافه کنید تا بتوان نوع جستجو را مشخص کرد DropDownهمچنین میتوانید یک . اضافه کنید :مانند زیر

Page 14: Learning

:کد زیر را هم در رویداد کلیک مربوط به کلید جستجو می نویسیمprivate void btnSearch_Click(object sender, EventArgs e) { if (dt==null) { return; } if (txtSearchKey.Text == "") { dt.DefaultView.RowFilter = ""; } else { switch (drpSearch.Items[drpSearch.SelectedIndex].ToString()) { case "name": dt.DefaultView.RowFilter = "name like '%" + txtSearchKey.Text + "%'"; break; case "company": dt.DefaultView.RowFilter = "company like '%" + txtSearchKey.Text + "%'"; break; case "price": dt.DefaultView.RowFilter = "price =" + txtSearchKey.Text; break; } } DG.DataSource = dt; }

.Grid View ساده جستجويیک این هم از

سناریوي بعدي .اطالعاتی افزودن کاال به جدول بانک

سترسی یک متد در الیه منطق و یک متد در الیه دفرم دریافت اطالعات و یک براي این بخش نیاز به .به داده داریم

Page 15: Learning

در الیه ابتدا پس. قرار است اطالعات کاال به عنوان آرگومان ورودي به الیه منطق ارسال شودDataAccess متد زیر را می نویسیم:

public static int AddProduct(string name, string company, float price) { q = "insert into product(name,company,price)values('" + name + "','" + company + "'," + price + ")"; int a = Database.Execute.executeNone(q); return a; }

:و در الیه منطق متد زیر را اضافه می کنیم

public static bool AddProduct(string name, string company, float price) { if (DataAccess.Access.AddProduct(name, company, price) > 0) { return true; } return false; }

یک کلید براي باز کردن فرم ثبت کاال و یک فرم با . حاال به الیه رابط رفته و فرم را طراحی می کنیم :مورد نیاز است ت اطالعات کاالبراي دریاف طراحی زیر

:مدر رویداد کلیک مربوط به کلید ثبت کد زیر را می نویسیprivate void btnAdd_Click(object sender, EventArgs e) { if (txtName.Text=="") { MessageBox.Show("کنید وارد را کاال نام"); return; } if (txtCompany.Text == "") { MessageBox.Show("کنید وارد را شرکت نام");

Page 16: Learning

return; } float f; if (float.TryParse(txtPrice.Text,out f)==false) { MessageBox.Show("کنید وارد درست را قیمت"); return; } if ( Logic.Business.AddProduct ( txtName.Text, txtCompany.Text, float.Parse(txtPrice.Text) )==true ) { Close(); } else { MessageBox.Show("اطالعات ثبت در خطا"); } }

.کد باال ابتدا یک اعتبار سنجی از اطالعات کرده و سپس متد ثبا کاال در الیه منطق را فراخوانی می کند

.ثبت هم به اتمام رسیدشود و بعد در الیه دسترسی به داده دستور حذف ادهتکافیست یک کد به الیه منطق فرسبراي حذف

و بعده خواننده گذاشته می .ن صورت انجام خواهد شدهمی ویرایش اطالعات هم به. رکورد اجرا شود .شود

.از صبر و حوصله شما سپاسگذارم با تشکر محمد باقرانی