PDA

View Full Version : آموزش: طریقه نوشتن برنامه نویسی چند لایه با ADO.NET



rahmatipoor
دوشنبه 01 شهریور 1395, 19:14 عصر
روش نوشتن برنامه نویسی سه لایه برای دوستانی که آشنایی ندارند (گفتم شاید به درد برخی دوستان بخوره )

توضیحات کلی برنامه نویسی چندلایه ( 3 لایه ) :

شما یک لایه ( کلاس ) طراحی میکنید به نام لایه DAL یا ارتباط با داده ها :
یک کلاس ایجاد میکنید و اسمش رو هرچی دوست داشتید میذارید. من اسمش رو clsAccessData گذاشتم.
توی این لایه کلاسهای کار با دیتابیس و کانکشن استرینگ و ... رو تعریف می کنید . این کلاس دو تا متد داره که هر دو از نوع Public هستند چون باید توی لایه های دیگه فراخوانی بشن.
یکی برای اجرای دستوراتی که Select هستند و یکی برای سایر دستورات غیر Select
اینطوری :


using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Text;
using System.Windows.Forms;

namespace Daftar_Rahnama
{
class clsAccessData
{
string ConStr = @"Data Source=.\SQLABRAR ; AttachDbFilename=" + Application.StartupPath
+ @"\Data\Daftar_Rahnama.mdf; Initial Catalog=Daftar_Rahnama; Integrated Security=True";


public DataView dv;
SqlConnection MyCn;

public clsAccessData()
{
MyCn = new SqlConnection(ConStr);
}

public void ExexuteSelectCommand(SqlCommand cmd)
{
DataTable dt = new DataTable();
SqlDataAdapter da = new SqlDataAdapter(cmd);
dv = new DataView();
cmd.Connection = MyCn;
if (MyCn.State == ConnectionState.Closed)
{
MyCn.Open();
}
cmd.ExecuteNonQuery();
da.Fill(dt);
dv = dt.DefaultView;
MyCn.Close();
MyCn.Dispose();




}

//************************************************** ********************

public void ExexuteCommand(SqlCommand cmd)
{

cmd.Connection = MyCn;
if (MyCn.State == ConnectionState.Closed)
{
MyCn.Open();
}
cmd.ExecuteNonQuery();
MyCn.Close();
MyCn.Dispose();

}




}
}



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

حالا برای کارهای مشابه مثلا برای دفتر تلفن یک کلاس دیگه تعریف میکنید مثلا (clsTel) و توابع موردنیاز و کامندها رو اونجا می نویسید و و برای اجرا یک نمونه از کلاس DAL ایجاد میکنید و کامندها رو به اون پاس میدید تا اجرا کنه( به این لایه میگن BAL یا لایه منطق )
توی این لایه برای قسمتهای مختلف میتونید کلاسهای مختلف داشته باشید مثلا یک کلاس برای بک آپ و ریستور ، یک کلاس برای کار با دفتر تلفن و .... .
متدهایی هم که باید از لایه های دیگه فراخوانی بشن باید Public تعریف کنید
اینطوری :


نمونه دستورات Select :

public DataView SelectOneGroup(int GroupID)
{
SqlCommand myCmd = new SqlCommand();
myCmd.CommandText = @"
SELECT GroupID, GroupName, Tozihat
FROM tblGroups
WHERE (GroupID = @GroupID)";

//
myCmd.Parameters.AddWithValue("@GroupID", GroupID);

//
clsAccessData dbAccess = new clsAccessData();
dbAccess.ExexuteSelectCommand(myCmd);
return dbAccess.dv;
}


نمونه دستورات غیر از Select که چند تا دستور اس کیو ال رو از طریق یک کامند اجرا میکنه ( دقت کنید که باید بین دستورات علامت ; بذارید ) :



public void DeleteGroup(int GroupID)
{
SqlCommand myCmd = new SqlCommand();
myCmd.CommandText = @"
--حذف فايلهاي اعضا
DELETE FROM tblFile
WHERE (OzvID IN
(SELECT ID
FROM tblDaftarRahnam
WHERE (Parent_GroupID = @GroupID)));


--حذف اعضا
DELETE FROM tblDaftarRahnam
WHERE (Parent_GroupID = @GroupID);

--حذف گروه
DELETE FROM tblGroups
WHERE (GroupID = @GroupID)";

//
myCmd.Parameters.AddWithValue("@GroupID", GroupID);

//
clsAccessData dbAccess = new clsAccessData();
dbAccess.ExexuteCommand(myCmd);
}



توی فرمهاتون هم از کلاس CLsTel نمونه میسازید و متد موردنظرتون رو اجرا میکنید. به عنوان مثال:


ClsTel MyTel = new ClsTel

Mytel.DeleteGroup(5);



به این میگن برنامه نویسی چند لایه.

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

javadghorbani27
دوشنبه 01 شهریور 1395, 19:17 عصر
اگر با پروسیجر بنویسیم هم امنیتش بالاست و هم سریع است
کد های اسکیوال هم در فرم های مان نمی نویسیم

nunegandom
دوشنبه 01 شهریور 1395, 19:20 عصر
ممنون از آموزش خوبتون
منبع فارسی برای چند لایه نویسی با Entity Framework ندیدم تا الان
مثلا یک همچین منبعی (https://www.ordina.nl/nl-nl/overige-content/2013/februari/entity-framework-in-a-multi-layered-application/) هست به صورت انگلیسی
حالا دوستان هر کس وقت داشت زحمتشو بکشه

rahmatipoor
دوشنبه 01 شهریور 1395, 19:27 عصر
اگر با پروسیجر بنویسیم هم امنیتش بالاست و هم سریع است
کد های اسکیوال هم در فرم های مان نمی نویسیم

حرفتون درسته
استور پروسیجر مزایایی داره و معایبی.

مزایاش رو کاری ندارم ولی چند تا از معایبش رو میگم که طی چند سال کار برخورد کردم:

1. اگه نرم افزار رو مثل من به مشتریهای زیادی فروخته باشید و مشتریها طی چند سال اطلاعات وارد کرده باشند و چندوقت یکبار نرم افزارتون تغییرات داشته باشه ( مثلا یکی از sp هاتون یه تغییر کوچیک داشته ) ارتقای نرم افزارتون یه مقدار مشکل میشه و باید برای ارتقای استورپروسیجر هم فکر کنید یعنی فایل دیتابیستون رو هم باید ارتقا بدید. اما اگه کدهاتون رو توی خود برنامه نوشته باشید این مشکل رو ندارید. فقط آخرین نسخه فایل اجرایی برنامه رو به مشتری میدید. ( مگر اینکه جداول رو هم تغییر داده باشید)

2. کسی که به اس کیو ال سرور دسترسی داشته باشه میتونه sp ها رو تغییر بده یا دستکاری کنه و از منطق برنامه تون سر در بیاره ، ولی توی حالت دوم نمیتونه
و ...

من توی بعضی از کارهای اولیه ام از sp استفاده کردم ولی بعدا دیدم که به دردسرهاش نمی ارزه . یه تغییر کوچیک بخوای توی یک sp بدی باید کل دیتابیس مشتری رو آپدیت کنی .

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

فکر کنم توی این سایت مقایسه هر دو حالت هست. سرچ کنید پیدا می کنید.

nunegandom
دوشنبه 01 شهریور 1395, 19:32 عصر
Entity Framework نه ADO.NET :لبخند:

rahmatipoor
دوشنبه 01 شهریور 1395, 19:34 عصر
ممنون از آموزش خوبتون
منبع فارسی برای چند لایه نویسی با Entity Framework ندیدم تا الان
مثلا یک همچین منبعی (https://www.ordina.nl/nl-nl/overige-content/2013/februari/entity-framework-in-a-multi-layered-application/) هست به صورت انگلیسی
حالا دوستان هر کس وقت داشت زحمتشو بکشه

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

javadghorbani27
دوشنبه 01 شهریور 1395, 19:36 عصر
Entity Framework نه ADO.NET :لبخند:

به روش ado.net هست شما برید ببینید فیلم آموزشی است:متفکر:

Marjan96
چهارشنبه 03 شهریور 1395, 19:51 عصر
سلام
یه سوال :
ADO16 تفاوتی با این روش که شما نوشتید داره؟؟؟ سایتی که یه چیزی دربارش گفته شده باشه سراغ نداره کسی؟

mrprestige
چهارشنبه 03 شهریور 1395, 21:23 عصر
سلام
یه سوال :
ADO16 تفاوتی با این روش که شما نوشتید داره؟؟؟ سایتی که یه چیزی دربارش گفته شده باشه سراغ نداره کسی؟

عرض سلام و ادب ، عذر میخوام میشه بفرمایین منظورتون از ADO16 چیه ؟؟؟؟ تکنولوژی جدیدیه !!

rahmatipoor
پنج شنبه 04 شهریور 1395, 00:13 صبح
سلام
یه سوال :
ADO16 تفاوتی با این روش که شما نوشتید داره؟؟؟ سایتی که یه چیزی دربارش گفته شده باشه سراغ نداره کسی؟

سلام
من هم تا حالا نشنیدم

ebrahim.rayatparvar
پنج شنبه 04 شهریور 1395, 10:05 صبح
سلام مهندس جان



2. کسی که به اس کیو ال سرور دسترسی داشته باشه میتونه sp ها رو تغییر بده یا دستکاری کنه و از منطق برنامه تون سر در بیاره ، ولی توی حالت دوم نمیتونه
و ...

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



1. اگه نرم افزار رو مثل من به مشتریهای زیادی فروخته باشید و مشتریها طی چند سال اطلاعات وارد کرده باشند و چندوقت یکبار نرم افزارتون تغییرات داشته باشه ( مثلا یکی از sp هاتون یه تغییر کوچیک داشته ) ارتقای نرم افزارتون یه مقدار مشکل میشه و باید برای ارتقای استورپروسیجر هم فکر کنید یعنی فایل دیتابیستون رو هم باید ارتقا بدید. اما اگه کدهاتون رو توی خود برنامه نوشته باشید این مشکل رو ندارید. فقط آخرین نسخه فایل اجرایی برنامه رو به مشتری میدید. ( مگر اینکه جداول رو هم تغییر داده باشید)


به نظر من این مشکلی که گفتین بهتر از اینه که امنیت برنامه بیاد پایین و اگه برنامه شما بزرگ بشه و دادهای مشتری زیاد بشه مدیریت حافظه و .... رو نمیشه سمت کد های sql در فایل EXE کرد ولی در پروسیجر خیلی دستتون بازه و خود SQL هم در این امر یاریتون میکنه

ebrahim.rayatparvar
پنج شنبه 04 شهریور 1395, 10:08 صبح
یه نکته دیگه هم که هست فراموش کردم بگم اینه که برای آپدیت کردن مهم اون آپدیتری هست که به مشتری میدین و چطور کار میکنه.

rahmatipoor
پنج شنبه 04 شهریور 1395, 12:04 عصر
سلام و تشکر


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

میشه بفرمایید sp ها رو چطوری میشه قفل کرد؟؟

rahmatipoor
پنج شنبه 04 شهریور 1395, 12:04 عصر
یه نکته دیگه هم که هست فراموش کردم بگم اینه که برای آپدیت کردن مهم اون آپدیتری هست که به مشتری میدین و چطور کار میکنه.

متوجه منظورتون نشدم

ebrahim.rayatparvar
پنج شنبه 04 شهریور 1395, 13:06 عصر
سلام و تشکر



میشه بفرمایید sp ها رو چطوری میشه قفل کرد؟؟


سلام مهندس در مورد WITH ENCRYPTION یه جستجو کنید فقط مال پروسیجر فقط نیست

ebrahim.rayatparvar
پنج شنبه 04 شهریور 1395, 13:08 عصر
متوجه منظورتون نشدم

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