دفترچه ی تلفن (نسخه جدید.برنامه نویسی لایه ای)، بخش چهارم(بخش آخر)،لایه ی نمایش...

نوشته شده بوسیله تبسم 20. آبان 1388 20:23

سلام . توی پست قبل رسیدیم تا متد Retrieve . اول این متد رو بررسی می کنیم بعدش می ریم سراغ لایه ی نمایش.

متد Retrieve :

  1. این متد چی کار می کنه؟

همونطور که از معنی این کلمه مشخصه از این متد برای بازیابی داده ها استفاده می کنیم. اما کجا؟! یادتونه که یه متد ویرایش داشتیم، خوب این یعنی ما قراره یه دکمه برای ویرایش اطلاعاتمون داشته باشیم و برای اینکه کاربر بخواد داده های خاصی رو تغییر بده باید این داده ها و در واقع اون سطری از جدول که مد نظر کاربر هست، بازیابی بشه و در تکست باکس (TextBox)هایی که داریم نمایش داده بشن. این متد Retrieve این کارو برامون انجام می ده و داده های مورد نظر رو به تکست باکس ها منتقل می کنه.

  1. چه جوری می فهمه کدوم سطر رو کاربر می خواد ویرایش کنه که بیارتش؟

خوب، اگه دقت کنید می بینین این متد یه ورودی داره از نوع اینتیجر (Integer) - همون int در سی شارپ مون (  C#.net) البته- به نام id که بعدا توی لایه نمایش می بینین که این id شماره ی همون سطریه که کاربر روش کلیک کرده تا ویرایشش کنه، بعد این id می ره توی استورد پروسیجر (Stored procdure) ی که به همین نام توی دیتا بیس داریم و اطلاعات رو برمیگردونه.

همین جا اشاره کنم به اینکه این تابع خروجی هم داره از جنس کلاس BLL مون چون قراره یه سری داده رو از دیتا بیس برگردونه .

  1. داده ها رو چه جوری از توی دیتابیس برمی گردونه؟

با()ExecuteReader داده ها رو می خونه و توی یه جدول لودشون می کنه. این جدول یه سطر بیشتر نداره چرا؟! معلومه دیگه چون کاربر یه سطرو انتخاب می کنه که ویرایش کنه. درواقع پروسیجر ما سطری از جدول رو که idش با id مورد نظر ما یکی بوده برگردونده. حالا ما باید اینا رو برگردونیم به لایه ی نمایش. یک شی از کلاس BLL یا همون کلاس PhoneBookEntry مون، نیو (New) می کنیم و ستونهای این سطر جدولمون رو به لایه ی نمایش می فرستیم. (دینگ دینگ: حواستون هست دیگه چون کلاس PhoneBookEntry رو استاتیک (Static) تعریف نکردیم پس اینجا باید شی نیو کنیم.)

سوال : این Convert ها جریانش چیه؟

اگه یادتون باشه توی متدهای دیگه که ما مثلا دیتاها رو به دیتابیس اضافه می کردیم از SqlDbType استفاده می کردیم.در واقع داده هامون رو به اون جنسی که دیتا بیس نیاز داشت و براش تعریف کرده بودیم، در می آوردیم.

اینجا هم همونه.منتها داریم از دیتا بیس می آریم ببریم جای دیگه. و از اونجایی که داریم از کلاس PhoneBookEntry استفاده می کنیم باید داده ها به جنس و نوع (Type) پراپرتی های همون کلاس در بیان. پس داده ها رو از دیتا بیس می گیره، تبدیلشون می کنه و در واقع مناسبه ظرفی که باید توش ریخته بشن درشون می آره بعد می ریزه توشون.

--------------

و اما رسیدیم به لایه ی نمایش(Presentation Layer):

توی لایه ی نمایش ما 2 تا فرم داریم. که فرم اولمون در واقع صفحه ی اصلی برنامه مون رو تشکیل می ده و فرم دوم برای ویرایش داده ها استفاده می شه. فرم ها رو هم که با راست کلیک روی اسم برنامه (Phone Book) و ADD و بعدش هم که انتخاب Windows Form ، اضافه می کنیم.

می مونه ساختار ظاهری برنامه که اضافه کردن یک سری تکست باکس (TextBox) و دکمه(Button) و لیبل(Label) و دیتاگرید(DataGrid) هست که اضافه کردن اینها مخصوصا دیتاگرید رو، توی پست (دفترچه تلفن، بخش دوم،کدها) بررسی کردیم. اینا رو از توی ToolBox می آریم روی فرممون و از توی properties تنظیمات دلخواه مون من جمله سایز و نوع خط نوشته و رنگ نوشته ها و فرمها رو و... انجام می دیم.

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

فرم 1:

1.       اول از همه باید حواستون باشه که به using ها  باید دو تا کلاس DAL و BLL مون اضافه بشه چون قراره از متغییرها و متدهاشون اینجا استفاده کنیم . البته به اضافه ی using های Sql و    Windows.Forms .   

;using System.Data

;using System.Data.SqlClient

;using System.Windows.Forms

;using Phone_Book.BLL

;using Phone_Book.DAL

2.         متد () FillGrid :

این متد داده ها رو به وسیله متد()GetEntriesاز دیتابیس می گیره و می ریزه توی یه DataTable .(اگه یادتون مونده باشه این متد خروجی داشت از نوع دیتا تیبل). اول از همه دیتاگرید رو با Null و بعد با داده های دیتاتیبل که توی dt ریختیم  پر می کنیم. چرا با Null پر می کنیم؟ تا اگر جایی مقداری وارد نشده بود همون Null بمونه.

پس کلا این متد وظیفه ی پر کردن دیتاگرید رو به عهده داره.و در حقیقت اطلاعاتی رو که توی پایگاه داده ثبت کردیم نشونمون می ده. مثل نام و شماره ها و آدرس ها...

3.       وقتی فرم لود (Load) می شه اول از همه باید دیتاگرید پر بشه، پس متد FillGrid توی لود ِفرم فراخوانی می شه.

4.       و اما دکمه ی اضافه کردن :

همونطور که یادتونه متد insert توی کلاس DAL یک ورودی از جنس PhoneBookEntry داشت که از طریق این ورودی داده های کاربر رو که توی تکست باکس ها نوشته می شدن می گرفت و به دیتابیس اضافه می کرد. پس نیازه که یک شی نیو کنیم و داده ها رو از طریق این شی که اینجا اسمش PBE هست به متد Insert بدیم. بعدشم که دیتاگرید پر می شه و می تونیم اطلاعات جدید رو ببینیم.

سوال: چرا ;( DAL.PhoneBookDAL.insert( PBE ؟؟ چون داریم از یک NameSpace یا همون فضای نام ِ DAL استفاده می کنیم باید اینجا آورده بشه. اما چون ما توی using هامون اضافه ش کردیم اگر ننویسیم هم مشکلی نیست اما روش کلیش اینه.

نکته: گاهی وقتها توی فضای های نام مون کلاسهای هم نام داریم.در اون صورت حتی اگر توی using ها هم آورده باشیمشون باید توی کد هم بنویسیم (مثل مثال) تا مشخص بشه که کلاس مورد نظر مال کدوم فضای نام هست.

5.       دکمه ی پاک کردن :

می خواییم وقتی کاربر روی یک سطر کلیک کرد و خواست پاکش کنه با زدن این دکمه این اتفاق بیافته. پس id سطر انتخاب شده رو می گیریم و به متد Delete توی کلاس DAL مون می فرستیم.(یادتونه که ورودیش یه id بود.)

6.       دکمه ی ویرایش :

می خوایم این دکمه وقتی فعال بشه که کاربر روی سطری که می خواد ویرایش کنه کلیک کرده باشه ( ابتدای کار Enable این دکمه رو از توی پراپرتیزش false می کنیم) که واسه این کار همونطور که توی کدها می بینین یه شرط گذاشتیم(شرطمون رو هم می تونیم با کلیک روی دیتاگرید،بعد توی قسمت پراپرتیز برین روی Events که همون علامت رعد و برقه، اونجا SelectionChanged رو روش کلیک کنین قسمت کدش باز می شه و می تونین شرط رو بذارین)، از طرفی می خواییم اطلاعات این سطر به صفحه ی ویرایشمون منتقل بشه تا هر قسمت رو کاربر خواست ویرایش کنه، پس برای این کار نیاز به id سطر مورد نظر داریم و این id رو به فرم دوممون می فرستیم. بعدا توی فرم دوم می بینین که این id همونیه که ورودیه متد Retrieve می شه.

اون دو تا دکمه ی دیگه ی فرم 1 چیز خاصی نداره. می ریم سراغ فرم دوم.

فرم 2:

1.       توی این فرم فقط using کلاس BLL و Windows.Forms رو لازم داریم.

2.       Id فرستاده شده از فرم 1 رو می گیریم و توی یک آی دی ِ پرایویت (Private) میریزیم که معمولا متغییرهای پرایویت مون رو با _ مشخص می کنیم پس می شه _id . حالا که id رو داریم می دیمش به متد Retrieve . و مطمئنا یادتونه که این متد یه خروجی داشت از نوع PhoneBookEntry که داده ها رو برمی گردوند به لایه ی نمایش. خوب پس یه شی ازش نیو می کنیم به نام ent که از این طریق داده های سطر مورد نظر از دیتابیس خونده می شه و به تکست باکس های فرم 2 منتقل می شه.

3.       بعد از اینکه کاربر تغییرات رو اعمال کرد دکمه ی ثبت تغییرات رو می زنه. که اونجا مشابه دکمه ی اضافه کردن از متد Update استفاده می کنیم با این تفاوت که باید id سطر مورد ویرایش رو هم بفرستیم به دیتا بیس تا اطلاعات همونجا ذخیره شن و تغییرات رو ثبت می کنیم .

// تا اونجایی که می شد سعی کردم جزئیات رو توی این پست ها بگم. حالا هر جایی رو که جا انداختم یا خوب نگفتم و یا جدای همه ی اینا، براتون سوال پیش اومده بپرسین لطفا.

// رونوشت از وبلاگ قبلیم : پویش

دفترچه ی تلفن (نسخه جدید.برنامه نویسی لایه ای)، بخش سوم،متدهای کلاس DAL و مروری بر عضوهای استاتیک...

نوشته شده بوسیله تبسم 20. آبان 1388 19:47

سلام و سلامتی.

خوب، رسیدیده بودیم به متدهای کلاس DAL مون. قبلا هم گفتم که این کلاس برای ارتباط با پایگاه داده و خوندن ازش و اعمال تغییرات روشه. همونطور که توی پست های قبلی هم بررسی کرده بودیم، می تونیم هم از استورد پروسیجرها استفاده کنیم و هم می تونیم مستقیما دستورات اس کیو ال مونو اینجا بنویسیم. ما توی این برنامه از استورد پروسیجر استفاده می کنیم ،اینجوری خیلی بهتره چون اینجوری تمرین کردن برای پروژه های دیگه که نیاز به نوشتن کوئیری ها و پروسیجرها و توابع پیچیده تر دارین، مفیدتره،اینکه اونا توی پایگاه داده تون بمونن و تازه تستش هم راحتتر خواهد بود تا اینکه مستقیم توی کد نوشته بشن و همه چی قاطی شه.

قبل از اینکه شروع کنیم، توی پست قبلی راجع به استاتیک بودن یک عضو صحبت کردیم. اجازه بدین یه کم بیشتر راجع به اینکه اصلا این استاتیک چیه صحبت کنیم:

اعضای استاتیک (Static (Shared) Members):

اول از همه بگم که کلمه ی کلیدی Shared توی ویژوال بیسیک دات نت (Visual Basic.net) استفاده می شه و Static در سی شارپ دات نت (C#.net) .

وقتی فیلد، متد یا کلاسی رو حتی، استاتیک تعریف می کنیم همیشه از این عضو یکی و همه جا یکسان ازش داریم. چرا؟ چون الان براتون با مثال نشون می دم که عضوهای استاتیک بدون ایجاد شی یا نمونه (object ,instance) - یا بهش وهله هم گفته می شه – استفاده می شن و مستقیما به اسم کلاس می چسبن نه به وهله یا شی. به همین دلیل بعد از تعریف یک فیلد استاتیک شما می تونین بدون ایجاد شی، بهش مقدار بدین.

فرضا اینو داریم: یک فیلد که استاتیک تعریف شده:

Public class Test

}

    ;public  static int MyField

{

حالا شما نیاز ندارین شی ای از این کلاس Test بسازین (newکنین) بعد از این فیلد استفاده کنین. همونجا می تونین بهش مقدار اولیه هم بدین. مثلا:

;Public static int MyField = 20

توی برنامه مون فقط کافیه هر جا بهش احتیاج داشتین از Test.MyField (نام فیلد استاتیک . نام کلاس) استفاده کنین که مقدارش هم همیشه مشخص و یکسانه.

اما حالا اگه این MyField استاتیک نبود چی؟ اونوقت شما باید شی نیو می کردین بعد ازش استفاده می کردین.اینجوری:

;()Test  Object1 = new Test

;()Test  Object2 = new Test

;Object1.MyField = 10

;Object2.MyField = 30

خوب چی شد؟! الان این شد 2تا فیلد متفاوت با مقدارهای متفاوت. (دینگ دینگ: Object1 بعنوان مثال، یک Instance از کلاس Test است.)

پس از اعضای استاتیک، فقط یه نمونه داریم صرف نظر از اینکه چه تعداد نمونه(Instance) از نوعشون (Type)ساخته شده.

نمی شه اعضای استاتیک رو با Instance صدا کرد یعنی اگر توی مثال بالا MyField استاتیک باشه نمی شه نوشت  ;Object1.MyField = 10 .

در مورد متد ها هم همینه، یعنی به Type وابسته هستن نه نمونه ای(instance) از نوع (Type). مثلا شما یه سری متد مهم دارین. اینا رو Static تعریف میکنین و می ذارین توی یه کلاس. بعد هر جا خواستین ازشون استفاده کنین دیگه لازم نیست اول از کلاس یه شی بسازین و بعد از متد استفاده کنین.مستقیم از اسم کلاس و متد استفاده می کنیم.دقیقا مثل کاری که توی دفترچه تلفن کردیم. اگه دقت کنین می بینین متدهای کلاس ِ DALمون رو public static  تعریف کردیم و توی لایه ی نمایش برای فراخوانیش از اسم کلاس . اسم متد استفاده کردیم.

نکته:

1.اعضای استاتیک (static members)، می تونن public  یا private باشن.

2. از یک عضو استاتیک نمی شه به یک عضو غیر استاتیک (داینامیک) دسترسی داشت. اما

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

حالا چرا اینجوریه؟ برای این نمی شه از عضو استاتیک به عضو داینامیک دسترسی داشت چون عضو استاتیک خارج از وهله کار می کنه و معنی نمی ده که بخواییم به فیلد داینامیک دسترسی پیدا کنیم چون این فیلد بعد از تعریف وهله (new کردن یه شی از کلاس) معنی پیدا می کنه نه توی نام کلاس. مثلا:

}public class MyClass

;public static int A

    ;public int B

    }  ()public static int Add 

   ??!!! return (MyClass.A + B);  // error, B

{

{

---------------------------------

و اما می ریم سراغ متدهای کلاس DAL . درکلاس DAL معمولا یک سری متدهایی داریم که با دیتا بیس در ارتباط هستن. در نتیجه هر متدی که توی DAL داریم معادلش یه استورد پروسیجر (Stored procedure) هم توی دیتا بیس داریم. برای برنامه هایی مشابه دفترچه ی تلفن اصطلاحی داریم با نام CRUD (Create ,Retrieve ,Update ,Delete)،که توابعی هستند که هم توی کلاس DAL ازشون استفاده می شه هم استورد پروسیجرهاش رو داریم.

متد () GetEntries:

  1. این متد قراره چی کار کنه؟

همونطور که از اسمش مشخصه قراره یه سری داده هامون رو  از پایگاه داده بخونه. برای اینکه داده های پایگاه داده رو به کاربر نشون بدیم احتیاج به این متد داریم تا به پایگاه داده وصل بشه و این کارو برامون انجام بده با استفاده از استورد پروسیجر ِ Select . مثلا نام و نام خانوادگی و شماره تلفن و ... که قبلا کاربر ثبت کرده و حالا می خواد ببینتشون.

  1. این متد چه جوری کار می کنه؟

1-2 . اول باید یک شی از کلاس SqlConnection ایجاد کنیم و با ConnectionString آدرس دهیش کنیم .(به پست قبل مراجعه کنین.). این کار یه کانال به پایگاه داده برامون باز می کنه.

2-2. حالا یک شی از کلاس SqlCommand ایجاد می کنیم. همونطور که از اسمش مشخصه کامندها برای دستوراتی که قراره به پایگاه داده فرستاده بشن استفاده می شه.

3-2. حالا کانکشنمون رو باز می کنیم. یعنی چی؟! خوب کانالمون رو به پایگاه داده باز می کنیم دیگه. این کارو ابتدای ارتباط و دادن دستورات به دیتابیس انجام می دیم و در آخر کار هم می بندیمش. می دونین که امنیت و اینا...

4-2. حالا باید پارامترهای کامندمون رو مشخص کنیم. اول کانکشن رو بهش می دیم یعنی می گیم از کجا دستورات رو بفرسته. بعدش نوع دستور رو که قرار استفاده از استورد پروسیجر باشه بهش می گیم و در انتها هم اسم ِ استورد پروسیجرمون رو می دیم.

** اینجا یک ;cmd.Parameters.Clear // داریم. (این دوتا اسلش رو گذاشتم تا این خط جز اجرای برنامه نباشه، چون اینجا بودن یا نبودش فرقی نداره.) این دستور پارامترهایی که قبلا به کامند اضافه شده باشن رو حذف می کنه تا مشکلی توی اجرای کامندی که ما می خواییم پیش نیاد.اما توی این برنامه چون ما در هر قسمت،در هر متد از اول ایجادش می کنیم (New) نیازی نیست.

5-2. همونطور که در تعریف متد می بینین، متد ما یک خروجی از جنس دیتاتیبل داره(پشت متد نوع خروجی ای که به ما می ده رو می نویسیم و جلوش توی پرانتز ورودیای که می گیره همراه با جنسش- جلوتر می بینین!). یک جدول که داده ها رو توش می ریزه و به ما برمیگردونه. پس باید یه شی از جنس دیتاتیبل ایجاد کنیم و داده ها رو توش بریزیم که اینجا اسمش رو گذاشتیم dt .

6-2. حالا چه جوری داده های Select شده رو می خونه؟ و همین جا بگم وقتی داره چیزی رو می خونه باید یه جایی هم داده های خونده شده رو بریزه درسته؟ خوب کامند یک دستور داره برای این کار به اسم ()ExecuteReader . خوب وقتی این دستور داده ها رو خوند اونا رو می ریزیم توی شی ای از جنس SqlDataReader به نام مثلا dr .

7-2. و سرانجام جدول dtمون رو با داده های dr لود می کنیم و returnهم که جدول رو برمی گردونه.

8-2. در آخر کار هم کانکشن رو می بندیم. این باید همیشه یادتون بمونه که هر بار که کانکشنی رو باز می کنین باید حتما ببندیدش.

سوال:

1.       این{}try و {}finally برای چی هستن؟

جواب: در برنامه نویسی مبحی داریم بانام Exception Handling. که در واقع برنامه ریزی و رفع Errorهایی که در زمان اجرای برنامه ممکنه پیش بیان که بهش می گن (Run - Time Error)،اینا error هایی هستند که بعد از Test و Debug برنامه ممکنه پیش بیان، بعد از اینکه مثلا errorهای مربوط به Syntax ِ برنامه رو رفع کردیم.

برای اداره کردن Exception ها از سینتکسی با نام Try…Catch…Finally… استفاده می کنیم.

Try

{

کدهای معمولی برنامه مون رو اینجا توی بلوک try می نویسیم.

}

Catch

{

کدهایی که باید در صورت مواجه شدن با خطاهای زمان اجرا(run-time errors)، اجرا بشن تا خطا را اداره (Handle) کنند اینجا قرار می گیرند.

}

بعد از بلوک try می تونه یک یا چندین Catch وجود داشته باشد که هر کدوم یه Exception رو برطرف کنه...

.

.

Finally

{

کدهایی رو که می خواییم در هر صورت اجرا بشن، حتی مثلا وقتایی که اگر خواستیم error  رو برگردونیم،به اصطلاح پرتاب کنیم ، یعنی به کاربر پیغام بدیم (Throw)، یا حتی اگر توی کدها Return داشتیم و از برنامه خارج شدیم،باز اجرا بشن از این بلوک استفاده می کنیم.که قبل از خارج شدن از برنامه کدهای اینجا اجرا بشن.

}

2.       دستورهای کامند(Command) چند دسته هستن؟

جواب: و اما دستورات کامند 3 جورن:

1.       دستوراتی که جوابی ندارن و چیزی برنمی گردونن، مثلا بهش می گین برو فلان دیتا رو از فلان تیبل پاک کن، یا فلان داده رو اضافه کن. اسم این دستور هست: ()ExecuteNonQuery .

یه مثال توی SQL برای این دستور :

Delete From Table_pb

Where  id=@id

2.       دستوراتی هستن که جوابشون یک عددِ. مثلا می خوایید بدونین چندتا شماره ی تلفن توی دفترچه تلفنتون دارین.اسم این دستورم هست : ()ExecuteScaler .

Select Count *  From  Table_pb

3.       و نوع سوم همونطور که استفاده کردیم، یک مجموعه دیتا برمی گردونه. ()ExecuteReader .

Select * From  Table_pb

متد Insert :

  1. قراره این متد چی کار کنه؟

اولین چیزی که از دفترچه تلفنمون انتظار داریم اینه که بتونیم یه سری نام و شماره و آدرس و ... رو توش ذخیره کنیم.خوب برای این کار به متدی احتیاج داریم که اطلاعات رو از کاربر بگیره (توسط تکست باکس ها) و بعد اونا رو به پایگاه داده مون اضافه کنه.

نکات:

1-1.      همونطور که مشخصه این متد قرار نیست خروجی داشته باشه پس void تعریف می شه که پشت متد نوشته می شه و به این معنیه که متد ما خروجی نخواهد داشت.

2-1.      دلیل پابلیک بودن و استاتیک بودن رو هم که توی پست قبلی بررسی کردیم.

3-1.      خوب رسیدیم به اولین جایی که از کلاس BLL استفاده می کنیم. قرار شد یه سری ورودی از کاربر بگیریم و به این متد بدیم و همونطور که قبلا هم گفتم لایه ی BLL رابط بین کاربر و لایه ی DAL ِ که به دیتابیس متصله. پس یه شی از جنس کلاس BLL تعریف می کنیم که این می شه وردیه متد Insert .

  1. متد Insert چطوری کار می کنه؟

1-2. قسمت اولش که باز کردن یه کانال و مقدار دهی پارامترهای کامنده مثل متد قبلیه...

2-2.  خوب اینجا یه سری دستور مشابه پشت هم داریم که پارامترهایی رو که می خواهیم برای اجرا به دستورمون بدیم تا اضافه کنه به دیتا بیس اینجا به کامند می دیم. برای فراخونی پارامترها لازمه که نوع داده شون رو هم مشخص کنیم، که همه از همون نوعی هستند که توی جدول دیتابیس و همینطور ورودی استورد پروسیجرها تعیین کردیم. (SqlDBType یک نوع داده توی پایگاه داده ست،تقریبا مشابه ی انواع داده در برنامه نویسی.)

3-2. و بعد از این پارامترها توسط ورودیهایی که کاربر توی تکست باکس ها وارد می کنه و کلاس BLL برامون می فرسته، مقداردهی می شن و با دستور ExecuteNonQuery که جلوتر گفتم داده ها به دیتا بیس اضافه می شن.

سوال:

1.       چرا برای 3تا از ورودیهامون شرط گذاشتیم؟ و شرط چی رو بررسی می کنه؟

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

و اما شرط ما هم ،همین کارم می کنه ، یعنی اگر اطلاعات پر شده باشه و خالی نباشه (علامت ! یعنی نامساوی) ، مقدار تکست باکس و بده به پارامتری که قراره با کامند واسه اجرا بره به دیتابیس .

2.       String پشت ِ ()IsNullOrEmpty واسه چیه؟

جواب: IsNullOrEmpty یک متد استاتیک از کلاس ِ String است بنابر داستان مفصل Static ها، اسم متد استاتیک با اسم کلاس می آد. ;()String.IsNullOrEmpty

خوب، می مونن متدهای Delete و Update و Retrieve.

متد (Update)با متد (Insert) فرق چندانی نداره جز اینکه یک آی دی (Id) هم می گیره که این id در واقع شماره ی سطریه که کاربر می خواد ویرایشش کنه. که بعدا توی لایه ی نمایش می بینین که از این id چه جوری استفاده می شه.

متد (Delete) هم مشابه متد(Insert) هست با این تفاوت که فقط مقدار (Value) ِ آی دی (id) تنظیم می شه. که در واقع با این کار id سطری رو که می خواییم از جدولمون توی پایگاه داده پاک بشه به دیتا بیس ارسال می کنیم. توی لایه ی نمایش می بینین که این id با انتخاب و کلیک کاربر روی سطر مورد نظرش مشخص می شه.

فقط متد (Retrieve) از این کلاس DAL می مونه برای پست بعدی.

//  اگر تا اینجا سوالی براتون پیش اومده ، تبسم خوشحال می شه بتونه کمک کنه.

 

دفترچه ی تلفن (نسخه جدید.برنامه نویسی لایه ای)، بخش دوم. لایه ها...

نوشته شده بوسیله تبسم 20. آبان 1388 19:36

سلام.

امیدوارم تونسته باشین فایل برنامه رو از پست قبل دانلود کرده باشین و موفق شده باشین ساختار و کدهای برنامه رو ببینین. چون دیگه تصویر رو نمی ذارم پس شما باید به کد مراجعه کنین و توضیحات رو تطبیق بدین. قصد دارم به صورت سوال و جواب کدها رو توضیح بدم،سوالهایی که ممکن براتون پیش بیاد.(سعی می کنم همه رو حدس بزنم!) اگه روشی بهتری به ذهنتون می رسه که می تونه بهتر کمک کنه خوشحال می شوم در جریان بذارینم.

دینگ دینگ: بعضی مفاهیم که مربوط به ساختارها و سینتکس های سی شارپ می شه رو در ادامه ی پست بحث مفاهیم می گم براتون.فعلا فقط باهاشون کار می کنیم.

خوب، بذار شروع کنیم:

1.معماری چند لایه چیه و اصلا چرا ازش استفاده می کنیم؟

توی برنامه نویسی مبحثی داریم به نام معماری چند لایه (n-tier) ، که متداولترینش معماری 4 لایه ست.یعنی چی؟ یعنی برنامه رو به 4 لایه، 3 بخش تقسیم می کنیم که این 4 لایه با هم در ارتباط هستند. ما می تونیم همه کدهامون رو توی همون فرم ها (Forms) و دکمه ها(Buttons) بنویسیم ،اما این کار وقتی پروژه کوچک و ساده ست، کار خوبی ایه، ولی وقتی برنامه بزرگتر می شه و کدها بیشتر می شن و همچنین صفحه هات و فرم هامون که با کاربر از طریقشون ارتباط برقرار می کنیم خیلی مفید نیست،نه اینکه برنامه تون کار نکنه، چرا، اما همونطور که توی پست قبل گفتم می شه اسپاگتی کد یعنی مثل رشته های ماکارانی کدها توی هم گره می خورن. پیدا کردن متغییرها و متدهایی که لازم دارین سختتر می شه،برای یه تغییر جزئی باید کلی بگردین و کلی جاها رو تغییر بدین،گاهی هم مجبور می شین یه متد رو چند جا توی صفحه ها یا فرم ها و دکمه های مختلف بنویسین و...

مهمترین علتی که لایه بندی رو انجام میدیم برای اینه که وظیفه هر بخش از برنامه جدا از هم تعریف میشه، یعنی یه لایه میشه مسئول برقراری ارتباط با پایگاه داده (لایه DAL)، یه لایه مسئول نمایش به کاربر (لایه Presentation) و همینطور تا آخر . برای همین وقتی که بخواین یه بخش رو یه مقدار عوض کنیم لایه های دیگه دست نمیخورن. مثلا اگه بخوایم یه برنامه تحت ویندوز رو به برنامه تحت وب تبدیل کنیم تنها لایه Presentation عوض میشه. یا مثلا اگه بخوایم دیتابیس رو از SQLServer ببریم روی Access یا برعکس، فقط لایه DAL عوض میشه.

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

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

یکی از مهمترین مزیت هایی که لایه ای کردنه پروژه مون داره افزایش امنیت داده های برنامه مونه. چطوری؟ خوب اول اینکه جلوتر برات خواهم گفت که یکی از این بخش ها برای ارتباط با داده هاست و فقط این بخشه که مستقیم به پایگاه داده مون دسترسی داره و ما از لایه ای که با کاربر سرو کار داره توسط یه لایه ی منطقی که شرایط امنیتی رو اونجا بیشتر روی موجودیت هامون (اشیامون،متغییرهامون) اعمال می کنیم، به این لایه دسترسی داریم. به علاوه ممکنه توی بعضی پروژه های بزرگ که نیاز به امنیت بالاتری دارن، لایه ها روی سیستم های جدا قرار بگیرن. که هر کسی اجازه ی دسترسی به سورس برنامه رو نداشته باشه.

البته لایه بندی برای برنامه نویسی های تحت وب، ASP.Net هم کاربردهای خوبی داره. هرجند که نوشتن چند تا کلاس اصافه شاید به نظر از معایبش بیاد اما در برابر سودی که این کلاس های اضافه با خودش همراه دارن قابل چشم پوشیه. علی الخصوص توی همین برنامه های تحت وب که تعداد صفحه هات زیادتر هستند.

حالا ما می آییم و برنامه رو به 3 قسمت تقسیم می کنیم و هر قسمت یه کاری برامون انجام می ده. اینطوری می دونیم برای هر تغییر یا موردی که نیاز داریم دقیقا کجا بریم .

2.لایه های معماری 3 لایه چی هستند و چی کار می کنن؟

۱) لایه پایگاه داده

2) لایه ی دسترسی به داده ها (Data Access Layer که به اختصار DAL نامیده میشه)
3) لایه ی منطقی (Business Logic Layer که به اختصار BLL نامیده میشه)
4) لایه نمایش (Presentation Layer)

لایه ی نمایش که همون رابط گرافیکی با کاربره (همون GUI)، یعنی مثلا اینجا فرم ها و آبجکت هایی که روش داریم، این لایه از طریق لایه ی BLL با لایه ی DAL ارتباط برقرار می کنه و به داده ها و در واقع پایگاه داده دسترسی پیدا می کنه.

پس از اونجایی که BLL نشون می ده ما چه موجودیت هایی توی برنامه داریم (مثلا توی این برنامه ما نام  و نام خانوادگی و شماره ها و ... رو داریم.)،اولین جایی توی کل برنامه ست که باید نوشته بشه. در واقع این لایه مسئول داده هاییه که بین لایه ی نمایش و لایه ی DAl ِ ، رد و بدل می شن. در واقع یه جور محافظت از داده هاست ، شروطی که لازمه روی اطلاعات اعمال بشه به لحاظ درجه ی اعتبارشون مثلا.

و بعد می رسیم به DAL ، توی این لایه ما کلا مواردی که به پایگاه داده ارتباط پیدا می کنه  و سر و کله زدن با داده هاست رو می نویسیم، مثل کانکشن ها و متدهایی مثل اضافه کردن و حذف کردن و خوندن اطلاعات و... در واقع این لایه ، واسط ما با پایگاه داده ست و از طریق این لایه داده ها رو از پایگاه می خونیم، روشون تغییرات خواسته شده رو مثل ِ مثلا پاک کردن و آپدیت کردن اعمال می کنیم و یا داده ها رو به پایگاه داده اضافه می کنیم. 

و حالا لایه ی نمایش از طریق یه آبجکت از جنس کلاس BLL اطلاعات رو از کلاس DALمی گیره یا بهش اطلاعات می فرسته .

لایه پایگاه داده هم که در واقع همون سیستم مدیریت پایگاه داده ای (DBMS) هست که باهاش کار میکنین (اسمش خارجیه ولی همون SQLServer یا Access یا Oracle میشن این لایه)

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

tierS

یه قانون خیلی مهم اینه که هرگز توی سیستم لایه بندی یه لایه نباید لایه بالای سر خودش رو صدا بزنه، همیشه ارتباط از بالا به پایینه و نه از پایین به بالا. یعنی هرگز لایه BLL نمیتونه تابعی از یک فرم رو که به لایه Presentation مربوطه رو صدا کنه یا یه چیز رو توش تغییر بده. چون اگه این اتفاق بیفته در صورتی که بخوایم لایه بالایی رو تغییر بدیم مجبوریم لایه پایین رو هم تغییر بدیم و عملا لایه بندی دیگه مفهوم خودش رو از دست میده.

3. چه جوری لایه ها رو بسازیم؟

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

لایه ی BLL :

1.       توی پنجره ی سولوشن اکسپلورر (اگر پنجره تون باز نبود از منوی View بازش کنین) ، رویBook   Phone (اسم برنامه تون)، راست کلیک می کنین و از گزینه ی ADD یک New Folder می سازین به اسم BLL.

2.       حالا روی این پوشه ی BLL راست کلیک کنین و از گزینه ی ADD برین و یک Class ایجاد کنین.

3.       حالا با کلیک روی این کلاس که پسوند cs داره کلاس باز می شه. اسم  کلاس رو که توی NameSpace ِ   Phone_Book .BLL قرار داره (به خاطر این فولدر بندی خود به خود این فضای نام NameSpace   ایجاد میشه) به  public class PhonBookEntryتغییر می دیم.کلاس رو پابلیک تعریف می کنیم چون قراره ازش توی لایه های دیگه مون (کلاسهای دیگه ی برنامه مون) استفاده کنیم.

4.       حالا کدهایی که توی این کلاس هست رو یا بنویسین یا خوب نگاه کنین. می بینین که اینجا متغییرها و در واقع ستون های جدول پایگاه داده مون رو که از طریق اونها اطلاعات رو دریافت و ثبت می کنیم تعریف شدن. همونطور که می بینین یه کمی تعریفش فرق داره. اینجا از Get و Set استفاده شده که بهشون می گیم پراپرتی . در واقع استفاده از پراپرتی ها برای تعریف خصوصیت های اشیامونه اما اینجا که بدون هیچ شرطی ازشون استفاده شده در واقع برای بالا بردن امنیت متغییرهاست چون همونطور که می بینین متغییرها پابلیک تعریف شدن تا توی کلاسهای دیگه استفاده بشن پس باید امنیت رو ببریم بالا.

توجه: در پروژه های واقعی لایه ها هر کدوم یک یا چند پروژه جداگانه هستند که به صورت فایلهای DLL کامپایل میشن، اما توی این پروژه آموزشی همه رو توی یک پروژه میذاریم.

لایه ی DAL :

1.        مجددا روی phonebook راست کلیک کنین و پوشه ی DALرو ایجاد کنین و بعد توی این پوشه یه کلاس ایجاد کنین به نام public class PhoneBookDAL ، تا اینجاش که شبیه BLL بود. (اینم خود به خود میره توی فضای نام Phone_Book .DAL)

2.       خوب اینجا حالا باید یه کار خیلی مهم انجام بدیم و اون اضافه کردنه Using هایی که برای استفاده از یه سری کلاسهای تعریف شده توی ویژوال استودیو  و اجتناب از تکرار هر بار آدرس دقیقشون، باید اضافه کنیم . بی زحمت اضافه کنین:

using System.Data;

using System.Data.SqlClient;

using Phone_Book.BLL;

که دو تای اولی برای استفاده از کتابخانه ی توابع مربوط به پایگاه داده ی اس کیو ال هست و سومی هم برای استفاده از کلاس BLL توی این کلاس DAL.

3.       همونطور که قرار شد، توی این کلاس باید متدهایی که لازم داریم رو تعریف کنیم و یکسری تنطیمات مربوط به اتصال به پایگاه داده مون.

قبل از تعریف متدهامون توی کلاس، ConnectionString رو تنظیم می کنیم. همونطور که توی پست قبل گفتم.

سوال : حالا این سوال پیش می آد که اصلا این کانکشن استرینگ چی هست و چرا اصلا استاتیک (Static)تعریف شده؟(اینکه چرا پابلیک تعریف شده که معلومه دیگه ؟! چون قراره توی متدهای این کلاس که خودشون توی کلاسهای دیگه استفاده می شن، به کار گرفته بشه.)

جواب: برای جواب به این سوال می خوام چند خط جلوتر به SqlConnection دقت کنین. کانکشن استرینگ در واقع یه سری تنظیماته مثل اسم پایگاه داده و اسم سرور که اس کیو ال کانکشن برای دسترسی به داده های پایگاه داده به این تنظیمات و در واقع به این آدرس دهی احتیاج داره برای اینکه بفهمه باید به کجا و از چه طریقی وصل بشه.

SqlConnection con = new SqlConnection(PhoneBookDAL.ConnectionString);

حالا به ورودیه اس کیو ال کانکشن دقت کنین! خوب می بینین که کانکشن استرینگ چسبیده به خود ِکلاس. این به خاطر اینه که استاتیک تعریفش کردیم و این یعنی یه دونه کانکشن استرینگ داریم که فقط به خود کلاس می چسبه و نه به آبجکت (شی،اینتس(Instance)، وهله) های  Newشده از کلاس.

** البته توی متد Insert می بینین که می شه یه جور دیگه هم  کانکشن استرینگ رو به اس کیو ال کانکشن داد که البته عملا هیچ فرقی ندارن.

SqlConnection con = new SqlConnection();

con.ConnectionString = PhoneBookDAL.ConnectionString;

4.       ... متدهای کلاس ِ   DAL  ، بمونه واسه پست بعدی...

// تا اینجا رو اگه سوالی دارین بپرسین لطفا... ممنونم. موفق باشین.

 

دفترچه ی تلفن (نسخه جدید.برنامه نویسی لایه ای)، بخش اول،اجرای برنامه به همراه سورس برنامه...

نوشته شده بوسیله تبسم 19. آبان 1388 20:05

سلام. .

و اما جناب دفترچه تلفن محترم.

اگر یادتون مونده باشه قرار شد ویرایشش کنیم و یه ذره اصولیتر و کاملتر بنویسیمش.(به قول بعضی ها یه مقدار از اسپاگتی کد نوشتن فاصله بگیریم) با توجه به اینکه یه سری از دوستان در شروع کارن شاید براشون ردیف شدن یه سری مفهوم پشت هم، به نظر سخت بیاد اما به قول این خارجی ها، تِراست می! (trust me!)، اینجوری شاید به نظر بیاد اولش گیج می شی اما کم کم که جلو می بریش و خط به خط یاد می گیریش بعد از زمانی که بستگی به خودمون داره، می بینی که با یه پروژه،  کلی چیز یاد گرفتی، نه تنها مفاهیمو بلکه نحوه ی استفاده شون رو.

خوب اینا رو گفتم چون اگر بخوام کدها رو توضیح بدم ، جزئیات زیاده. سعی می کنم تا اونجایی که می شه همشو بگم اما اگه جایی رو جا گذاشتم یا خوب نگفتم و یا خدا رو چه دیدی! اگه اشتباه کردم، لطف کن بگو به من دوست من.

قبل از همه اینکه اگر بخوام تصویر کدها رو بذارم خیلی برداشتنش و ردیف کردش ممکنه مشکل باشه،پس سورس برنامه رو می ذارم،لطفا دانلود کنین تا بریم سراغ توضیحات از ابتدای ابتدا.اگر بعضیاتون بعضی جاهاش حوصله تون سر می ره، تند تند ورق بزنین!

  1. لطفا دقت کنین که این برنامه با زبان سی شارپ دات نت و در ویژوال استودیوی 2008 نوشته شده، پس اگر نتونستید به هر دلیلی بازش کنید بگید که کدها رو یه جور دیگه بهتون بدم. بعلاوه فایل پایگاه داده هم توی پوشه هست. کافیه یه پایگاه داده ی خالی بسازین و این فایل رو اونجا اجرا کنید تا جداول و استورد پروسیجرها ایجاد بشن.
  2. و بعد نحوه ی اتصال با پایگاه داده است که قبلا بررسی کردیم .فقط لازمه شما دیتا سورس رو در کانکشن استرینگ با کامپیوتر خودتون سِت کنید. (خوب راهنمایی : کانکشن استرینگِ مورد نظر، توی پوشه ی DAL و توی کلاس DAL قرار داره، پیداش کردین؟! خوبه. اونی که جلوی دیتا سورس نوشتم رو بردارین و به جاش مال خودتونو بذارین. )
  3. از منوی view، برین و Server Explorer رو باز کنید. خوب از اینجا می تونید کانکشنتون رو اضافه کنین.(Add کنین).شایان ذکره که از   Sql Server استفاده کردم. وقتی زیر شاخه ی Data Connections، اسم دیتا بیستونو دیدید،روش راست کلیک کنید و Properties رو انتخاب کنید . توی پنجره ی پراپرتیز، کانکشن استرینگتون رو پیدا می کنین.
  4. خوب حالا می تونین اجراش کنین . اگه همه چیزو تست کنین می فهمین یه جای کار این برنامه می لنگه اگه گفتین؟!! (نه اینکه کلا بلنگه ها، نه، فقط می شه بهترش کرد!)

توضیحات کد رو از پست بعدی شروع می کنم چون این پست خیلی طولانی و براتون خسته کننده می شه. کدها رو یه نگاه بندازین ، فعلا فقط اینو می گم که همونطور که می بینن از معماری 3لایه استفاده کردیم تا کدهامون در هم و برهم نباشه. اگه دقت کنین می بینین که توی سولوشن اکسپلورر، کدها به 3دسته تقسیم شدن، پوشه ی BLL که می شه لایه ی BLL، پوشه ی DAL که می شه لایه ی DAL، و فرمهامون که در واقع از طریق اونها با کاربر ارتباط داریم که می شه لایه ی نمایش. حالا این لایه ها چی هستن و چی کار می کنن به زودی مشخص می شه...

       سورس برنامه :Phone Book.rar (160.49 kb)

                                                                                                 موفق باشید.

 رونوشت از وبلاگ قبلیم : پویش

استفاده از مطالب این وبلاگ با ذکر منبع مجاز است، لطفا!!

ایده هات مثل یه پَر که آرووم فرود می آد...

می تونی مفهوم و زیبایی تمام زندگی رو ، دنیا رو جمع کنی توی فقط یه نقطه که در بی نهایت غرقه... محیطِ مجتمع ِ "ویژوال استادیو دات نت" ، یه دنیاست مثل همین دنیا، لایه لایه، صفحه صفحه، دنیا دنیا...می شه توش سفر کرد و زندگی ساخت...دنیایی که قدرتت اونو ساخته، می سازه...مثل ِ یک محیط بازی، جایی برای یادگرفتن و تمرین زندگیه... مثل تمام موقعیت ها ولحظه های زندگی...

---------------------------

tabasom.world@gmail.com 

توجه:

بخش نظرات پس از 3 روز از ارسال پست بسته خواهد شد. برای ارسال سوال یا نظرات از بخش تماس سایت اقدام نمایید. در صورت نیاز از طریق ایمیل پاسخ داده خواهد شد.

پست های قبلی