PDA

View Full Version : کمک برای آموزش برنامه نویسی 3لایه



sobijoon
سه شنبه 31 خرداد 1390, 21:29 عصر
با سلام خدمت دوستان و اجازه از مدیر تالار از اینکه این تالار از اینکه این تایپیک رو مینویسم.
بابا خسته شدم بس گشتم .نبود کسی که بما برنامه نویسی 3لایه یاد بده.بخدا اگ یه برنامه کوچیک با توضیح هم بزارید میتونم(نیم) یاد بگیریم بخدا...اونقدر ها هم خنگ نیستم.:لبخندساده:
من هر تایپیکی رو که دیدم یا ارجاع داده به یه کتاب که مفید نبود یا اگ هم بود کلی وقت برا خوندنش میخواست یا در مورد 3لایه فقط حرف زده......:افسرده:
تو رو خدا یه کمکی به ما مبتدی ها بکنید .به من که برای یادگیری 3لایه له له میزنم.
بابا ما وسع مون نمیرسه بریم کلاس:ناراحت:

zarrinnegar
سه شنبه 31 خرداد 1390, 23:52 عصر
با سلام خدمت دوستان و اجازه از مدیر تالار از اینکه این تالار از اینکه این تایپیک رو مینویسم.
بابا خسته شدم بس گشتم .نبود کسی که بما برنامه نویسی 3لایه یاد بده.بخدا اگ یه برنامه کوچیک با توضیح هم بزارید میتونم(نیم) یاد بگیریم بخدا...اونقدر ها هم خنگ نیستم.:لبخندساده:
من هر تایپیکی رو که دیدم یا ارجاع داده به یه کتاب که مفید نبود یا اگ هم بود کلی وقت برا خوندنش میخواست یا در مورد 3لایه فقط حرف زده......:افسرده:
تو رو خدا یه کمکی به ما مبتدی ها بکنید .به من که برای یادگیری 3لایه له له میزنم.
بابا ما وسع مون نمیرسه بریم کلاس:ناراحت:





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


توی برنامه نویسی مبحثیداریم به نام معماری چند لایه (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 لایه ای رو نشون میده:


(http://csharpcorner.ir/image.axd?picture=tierS.jpg)


یه قانون خیلی مهم اینهکه هرگز توی سیستم لایه بندی یه لایه نباید لایه بالای سر خودش رو صدا بزنه، همیشهارتباط از بالا به پایینه و نه از پایین به بالا. یعنی هرگز لایه 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 هایی که برای استفاده از یه سریکلاسهای تعریف شده توی ویژوال استودیو و اجتناب از تکرار هر بار آدرسدقیقشون، باید اضافه کنیم . بی زحمت اضافه کنین:



usingSystem.Data;



usingSystem.Data.SqlClient;



usingPhone_Book.BLL;


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


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


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


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


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



SqlConnectioncon = new SqlConnection(PhoneBookDAL.ConnectionString);


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


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



SqlConnectioncon = new SqlConnection();
con.ConnectionString =PhoneBookDAL.ConnectionString

zarrinnegar
سه شنبه 31 خرداد 1390, 23:54 عصر
با سلام خدمت دوستان و اجازه از مدیر تالار از اینکه این تالار از اینکه این تایپیک رو مینویسم.
بابا خسته شدم بس گشتم .نبود کسی که بما برنامه نویسی 3لایه یاد بده.بخدا اگ یه برنامه کوچیک با توضیح هم بزارید میتونم(نیم) یاد بگیریم بخدا...اونقدر ها هم خنگ نیستم.:لبخندساده:
من هر تایپیکی رو که دیدم یا ارجاع داده به یه کتاب که مفید نبود یا اگ هم بود کلی وقت برا خوندنش میخواست یا در مورد 3لایه فقط حرف زده......:افسرده:
تو رو خدا یه کمکی به ما مبتدی ها بکنید .به من که برای یادگیری 3لایه له له میزنم.
بابا ما وسع مون نمیرسه بریم کلاس:ناراحت:



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

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

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

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

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

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



Public classTest



}



;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 staticint 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:


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

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


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

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 FromTable_pb



Where id=@id

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



Select Count* From Table_pb

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



Select *From Table_pb

متد Insert:


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

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

نکات:

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

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

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


متد 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 با انتخاب و کلیک کاربر روی سطر مورد نظرش مشخص می شه.

zarrinnegar
سه شنبه 31 خرداد 1390, 23:59 عصر
با سلام خدمت دوستان و اجازه از مدیر تالار از اینکه این تالار از اینکه این تایپیک رو مینویسم.
بابا خسته شدم بس گشتم .نبود کسی که بما برنامه نویسی 3لایه یاد بده.بخدا اگ یه برنامه کوچیک با توضیح هم بزارید میتونم(نیم) یاد بگیریم بخدا...اونقدر ها هم خنگ نیستم.:لبخندساده:
من هر تایپیکی رو که دیدم یا ارجاع داده به یه کتاب که مفید نبود یا اگ هم بود کلی وقت برا خوندنش میخواست یا در مورد 3لایه فقط حرف زده......:افسرده:
تو رو خدا یه کمکی به ما مبتدی ها بکنید .به من که برای یادگیری 3لایه له له میزنم.
بابا ما وسع مون نمیرسه بریم کلاس:ناراحت:


متد Retrieve :


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

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


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

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


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

با()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 سطر مورد ویرایش رو هم بفرستیم به دیتا بیس تا اطلاعات همونجا ذخیره شن و تغییرات رو ثبت می کنیم .

Programmer 1
چهارشنبه 01 تیر 1390, 01:23 صبح
البته تشکر میکنم از دوست عزیز zarrinnegar (http://barnamenevis.org/member.php?31940-zarrinnegar) ولی اگه منبع رو هم ذکر میکردید بد نبود (امانت داری در ارائه مطلب! خیلی مهمه)

http://csharpcorner.ir/category/-d9bed8b1d988da98d987-d8afd981d8aad8b1da86d987-d8aad984d981d986-d8a8d8b1d986d8a7d985d987-d986d988db8cd8b3db8c-d8a8d8a7-d985d8b9d985d8a7d8b1db8c-da86d986d8af-d984d8a7db8cd987-%283-d984d8a7db8cd987-d8a7db8c%29.aspx

sobijoon
پنج شنبه 02 تیر 1390, 12:39 عصر
همینکه این همه توجه داشتن. ازشون یک دنیا ممنونم:بوس:

fatemegoli
سه شنبه 27 تیر 1391, 01:18 صبح
سلام..دوستان من تو کدنویسی متد ویرایش این برنامه نویسی مشکل دارم ..طبق این توضیحات:
می خوایم این دکمه وقتی فعال بشه که کاربر روی سطری که می خواد ویرایش کنه کلیک کرده باشه ( ابتدای کار Enable این دکمه رو از توی پراپرتیزش false می کنیم) که واسه این کار همونطور که توی کدها می بینین یه شرط گذاشتیم(شرطمون رو هم می تونیم با کلیک روی دیتاگرید،بعد توی قسمت پراپرتیز برین روی Events که همون علامت رعد و برقه، اونجا SelectionChanged رو روش کلیک کنین قسمت کدش باز می شه و می تونین شرط رو بذارین)، از طرفی می خواییم اطلاعات این سطر به صفحه ی ویرایشمون منتقل بشه تا هر قسمت رو کاربر خواست ویرایش کنه، پس برای این کار نیاز به id سطر مورد نظر داریم و این id رو به فرم دوممون می فرستیم. بعدا توی فرم دوم می بینین که این id همونیه که ورودیه متد Retrieve می شه.
الان خب این که میگه ID رو بفرستیم به صفحه دوممون چطوریه؟!