PDA

View Full Version : برنامه نویسی سه لایه



amirferdowsi
پنج شنبه 31 مرداد 1387, 00:28 صبح
سلام
من با استفاده از معماری سه لایه دارم یک برنامه می نویسم که در آن دو مفدار رو باید درون دو TextBox قرار بدم که به صورت زیر اقدام به نوشتن کردم :

لایه DAL :


public SqlDataReader Get(string Name)
{
SqlConnection obj_Connection = new SqlConnection("");
SqlCommand obj_Command = new SqlCommand("sp_GetTest", obj_Connection);
obj_Command.CommandType = CommandType.StoredProcedure;
SqlParameter prm_test;
prm_test = obj_Command.Parameters.Add("@Name", SqlDbType.NVarChar, 20);
prm_test.Value = Name;
SqlDataReader obj_DataReader = null;
try
{
obj_Connection.Open();
obj_DataReader = obj_Command.ExecuteReader();
return obj_DataReader;
}
catch (SqlException obj_ex)
{
throw obj_ex;
}
catch (Exception obj_ex)
{
throw obj_ex;
}
finally
{
if (obj_Connection.State != ConnectionState.Closed)
obj_Connection.Close();
}
}


لایه BLL :


public SqlDataReader Get(string Name)
{
try
{
DA_Test obj_Test = new DA_Test();
SqlDataReader obj_DataReader = obj_Test.Get(Name);
return obj_DataReader;
}
catch (SqlException obj_ex)
{
throw obj_ex;
}
catch (Exception obj_ex)
{
throw obj_ex;
}
}


لایه PL :


protected void Page_Load(object sender, EventArgs e)
{
GetTest("Test1");
}
public void GetTest(string Name)
{
BL_Test obj_Test = new BL_Test();
SqlDataReader obj_DataReader = obj_Test.Get(Name);
string Farsi, English;
do
{
Farsi = obj_DataReader["Farsi"].ToString();
English = obj_DataReader["English"].ToString();
} while (obj_DataReader.Read());
test_Fa.Text = Farsi;
test_En.Text = English;
}


اما موقع اجرا برنامه از دو خطی که به رنگ قرمز هست خطا میگیره ، که متن خطا رو در اینجا نوشتم :


Invalid attempt to call MetaData when reader is closed.


ممنون میشم من رو در این زمینه راهنمایی بفرمائید ، و بفرمائید که اصلاً میشه دیتا رو بین لایه ها با استفاده از SQLDataReader منتقل کرد یا خیر ؟

linux
پنج شنبه 31 مرداد 1387, 00:47 صبح
سلام
من با استفاده از معماری سه لایه دارم یک برنامه می نویسم که در آن دو مفدار رو باید درون دو TextBox قرار بدم که به صورت زیر اقدام به نوشتن کردم :

لایه DAL :


public SqlDataReader Get(string Name)
{
SqlConnection obj_Connection = new SqlConnection("");
SqlCommand obj_Command = new SqlCommand("sp_GetTest", obj_Connection);
obj_Command.CommandType = CommandType.StoredProcedure;
SqlParameter prm_test;
prm_test = obj_Command.Parameters.Add("@Name", SqlDbType.NVarChar, 20);
prm_test.Value = Name;
SqlDataReader obj_DataReader = null;
try
{
obj_Connection.Open();
obj_DataReader = obj_Command.ExecuteReader();
return obj_DataReader;
}
catch (SqlException obj_ex)
{
throw obj_ex;
}
catch (Exception obj_ex)
{
throw obj_ex;
}
finally
{
if (obj_Connection.State != ConnectionState.Closed)
obj_Connection.Close();
}
}


لایه BLL :


public SqlDataReader Get(string Name)
{
try
{
DA_Test obj_Test = new DA_Test();
SqlDataReader obj_DataReader = obj_Test.Get(Name);
return obj_DataReader;
}
catch (SqlException obj_ex)
{
throw obj_ex;
}
catch (Exception obj_ex)
{
throw obj_ex;
}
}


لایه PL :


protected void Page_Load(object sender, EventArgs e)
{
GetTest("Test1");
}
public void GetTest(string Name)
{
BL_Test obj_Test = new BL_Test();
SqlDataReader obj_DataReader = obj_Test.Get(Name);
string Farsi, English;
do
{
Farsi = obj_DataReader["Farsi"].ToString();
English = obj_DataReader["English"].ToString();
} while (obj_DataReader.Read());
test_Fa.Text = Farsi;
test_En.Text = English;
}


اما موقع اجرا برنامه از دو خطی که به رنگ قرمز هست خطا میگیره ، که متن خطا رو در اینجا نوشتم :


ممنون میشم من رو در این زمینه راهنمایی بفرمائید ، و بفرمائید که اصلاً میشه دیتا رو بین لایه ها با استفاده از SQLDataReader منتقل کرد یا خیر ؟
این روش را خودتان یاد گرفید از جایی یا کسی به شما گفته این کار را کنید!؟این که نشد برنامه نویسی سه لایه همون یک لایه هست که به چند قسمت خورد شده!
باید برای هر یک از entity ها یک کلاس بسازید.
توابعی برای خواندن و نوشتن و ویرایش کردن و حذف داشته باشید.
و کلاس را بین لایه ها منتقل کنید ، وقتی شما کانکشن را می بندید دیگر نمی توانید به datareader دسترسی داشته باشید.

سار
پنج شنبه 31 مرداد 1387, 09:10 صبح
http://msdn.microsoft.com/en-us/library/bb384587.aspx

amirferdowsi
پنج شنبه 31 مرداد 1387, 14:33 عصر
این که نشد برنامه نویسی سه لایه همون یک لایه هست که به چند قسمت خورد شده!
باید برای هر یک از entity ها یک کلاس بسازید.

سلام
دوست عزیز من هم برای هر لایه یک کلاس ساختم ، برای لایه DAL کلاسی به نام DA_Test و برای لایه BLL کلاسی به نام BL_Test ایجاد کردم که در آنها توابعی برای ایجاد ، ویرایش ، حذف و خواندن اطلاعات نوشتم ، که مشکل من با خواندن اطلاعاته .



کلاس را بین لایه ها منتقل کنید ، وقتی شما کانکشن را می بندید دیگر نمی توانید به datareader دسترسی داشته باشید.

من هم دقیقاً همین کار رو انجام دادم که در لایه DAL یک تابع برای خواندن اطلاعات ایجاد کردم که کلیه کارها با بانک رو انجام می دهد که خروجی اون از نوع DataReader هست که در این تابع مقدار گرفته ، اگه دقت کرده باشید مشکل من در لایه PL هست که نمی تونه اطلاعات رو از DataReader بخونه .

linux
پنج شنبه 31 مرداد 1387, 17:26 عصر
سلام
دوست عزیز من هم برای هر لایه یک کلاس ساختم ، برای لایه DAL کلاسی به نام DA_Test و برای لایه BLL کلاسی به نام BL_Test ایجاد کردم که در آنها توابعی برای ایجاد ، ویرایش ، حذف و خواندن اطلاعات نوشتم ، که مشکل من با خواندن اطلاعاته .


من هم دقیقاً همین کار رو انجام دادم که در لایه DAL یک تابع برای خواندن اطلاعات ایجاد کردم که کلیه کارها با بانک رو انجام می دهد که خروجی اون از نوع DataReader هست که در این تابع مقدار گرفته ، اگه دقت کرده باشید مشکل من در لایه PL هست که نمی تونه اطلاعات رو از DataReader بخونه .
فرض کن شما دارید اطلاعات مشتریان را از دیتابیس می گیرید
یک کلاس به نام مشتریان بسازید با دو متغیر ، کد مشتری ، نام مشتری
در dal به ازای هر مشتری که از دیتابیس برگردانده می شود یک یک نمونه جدید ایجاد کنید و به یک متغیر از نوع آرایه یا جنریک کالاکشن اضافه کنید آن آرایه را به لایه بعدی بفرستید

fat_roze2000
پنج شنبه 31 مرداد 1387, 18:16 عصر
فرض کن شما دارید اطلاعات مشتریان را از دیتابیس می گیرید
یک کلاس به نام مشتریان بسازید با دو متغیر ، کد مشتری ، نام مشتری
در dal به ازای هر مشتری که از دیتابیس برگردانده می شود یک یک نمونه جدید ایجاد کنید و به یک متغیر از نوع آرایه یا جنریک کالاکشن اضافه کنید آن آرایه را به لایه بعدی بفرستید

شما dal و bll را با هم ترکیب کرده اید

linux
پنج شنبه 31 مرداد 1387, 19:27 عصر
http://www.codeproject.com/KB/architecture/three_tier_architecture.aspx
این مثال را ببنید شاید مفید بود برای شما

اَرژنگ
پنج شنبه 31 مرداد 1387, 19:43 عصر
N-Tier Data Applications
http://msdn.microsoft.com/en-us/library/bb384587.aspx

impression
چهارشنبه 13 شهریور 1387, 19:27 عصر
سلام
میشه یه نفر یه تویح جامع راجع به برنامه نویسی سه لایه بده؟
این که آیا این سه لایه باید هرکدوم تو یه پروژه ویژوال استودیو چدا باشند؟
و این که چه جوری باید بین آنها ارتباط برقرار کرد؟
لطفا یه جوری توضیح بدین که من مبتدی بفهمم.
با تشکر

Sajjad.Aghapour
چهارشنبه 13 شهریور 1387, 21:48 عصر
سلام
میشه یه نفر یه تویح جامع راجع به برنامه نویسی سه لایه بده؟
این که آیا این سه لایه باید هرکدوم تو یه پروژه ویژوال استودیو چدا باشند؟
و این که چه جوری باید بین آنها ارتباط برقرار کرد؟
لطفا یه جوری توضیح بدین که من مبتدی بفهمم.
با تشکر

http://barnamenevis.org/forum/showpost.php?p=349649&postcount=2