PDA

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



lonely1372
چهارشنبه 20 شهریور 1392, 18:31 عصر
سلام به همه دوستان و اساتید
سوالی راجع به برنامه نویسی سه لایه دارم

دستورات SQL باید تو لایه BLL نوشته بشن و ارسال بشن به لایه DAL یا کلا تو لایه DAL نوشته بشن ؟

یه نمونه کد اگه بدین ممنون میشم

robat7
چهارشنبه 20 شهریور 1392, 19:03 عصر
درود
لینک زیر پاسخ پرسش شما را شرح داده است
http://imar.spaanjaars.com/416/building-layered-web-applications-with-microsoft-aspnet-20-part-1

lonely1372
چهارشنبه 20 شهریور 1392, 20:18 عصر
برنامه نویسی سه لایه آفلاین هم همینجوره ؟

arash691
چهارشنبه 20 شهریور 1392, 20:19 عصر
سلام به همه دوستان و اساتید
سوالی راجع به برنامه نویسی سه لایه دارم

دستورات SQL باید تو لایه BLL نوشته بشن و ارسال بشن به لایه DAL یا کلا تو لایه DAL نوشته بشن ؟

یه نمونه کد اگه بدین ممنون میشم

دوست عزیز فیلم آموزشی زیر رو دانلود کنید تا جواب سوالتون رو بگیرید :


http://learnfiles.com/%D9%81%DB%8C%D9%84%D9%85-%D9%81%D8%A7%D8%B1%D8%B3%DB%8C-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%B3%D9%87-%D9%84%D8%A7%DB%8C%D9%87-%D8%AF.html?more=ok

lonely1372
چهارشنبه 20 شهریور 1392, 20:35 عصر
دوست عزیز فیلم آموزشی زیر رو دانلود کنید تا جواب سوالتون رو بگیرید :


http://learnfiles.com/%D9%81%DB%8C%D9%84%D9%85-%D9%81%D8%A7%D8%B1%D8%B3%DB%8C-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%B3%D9%87-%D9%84%D8%A7%DB%8C%D9%87-%D8%AF.html?more=ok



ممنون آرش جان من از روی همین دنبال کردم ولی فک میکنم مشکل داره واسه همین سوال پرسیدم
تو این آموزش دستورات SQL رو تو لایه BLL مینویسه میخوام ببینم درستش همینه چون یه جا دیگه دیدم تو لایه DAL نوشت فقط مقادیر از لایه BLL ارسال میشد

rezaei_y
چهارشنبه 20 شهریور 1392, 22:36 عصر
دستورات sql توی لایه DAL نوشته میشن

معمولا توی لایه BLL هر جدول به شکل یک کلاس پیاده میشه مثلا جدول student رو در نظر بگیرید یک کلاس Student با پراپرتی هایی که به ازای هر فیلد ایجاد میشه و دستورات ذخیره و حذف و آپدیت رو توی این کلاس مینویسن
اما نه دستورات Sql را
در حقیقت توی پروژه یک شی از نوع کلاس ایجاد میشه و مقدار دهی میشه و توسط متدهای لایه BLL ابتدا صحت اطلاعات بررسی میشه و اطلاعات رو برای اجرای دستورات sql به لایه DAL میفرستن

esafb52
چهارشنبه 20 شهریور 1392, 22:58 عصر
http://barnamenevis.org/showthread.php?73157-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%DA%86%D9%86%D8%AF-%D9%84%D8%A7%DB%8C%D9%87
http://barnamenevis.org/showthread.php?27351-%D9%BE%DB%8C%D8%A7%D8%AF%D9%87-%D8%B3%D8%A7%D8%B2%DB%8C-%D9%85%D8%B9%D9%85%D8%A7%D8%B1%DB%8C-3-%D9%84%D8%A7%DB%8C%D9%87-%D8%AF%D8%B1-%D8%B3%DB%8C-%D8%B4%D8%A7%D8%B1%D9%BE

http://barnamenevis.org/showthread.php?69806-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D9%84%D8%A7%DB%8C%D9%87-%D8%A7%DB%8C&highlight=%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87%20% D9%86%D9%88%DB%8C%D8%B3%DB%8C%20%DA%86%D9%86%D8%AF %20%D9%84%D8%A7%DB%8C%D9%87

cooper47
چهارشنبه 20 شهریور 1392, 23:07 عصر
دستورات sql توی لایه DAL نوشته میشن

معمولا توی لایه BLL هر جدول به شکل یک کلاس پیاده میشه مثلا جدول student رو در نظر بگیرید یک کلاس Student با پراپرتی هایی که به ازای هر فیلد ایجاد میشه و دستورات ذخیره و حذف و آپدیت رو توی این کلاس مینویسن
اما نه دستورات Sql را
در حقیقت توی پروژه یک شی از نوع کلاس ایجاد میشه و مقدار دهی میشه و توسط متدهای لایه BLL اطلاعات رو برای اجرای دستورات sql به لایه DAL میفرستن

سلام،

از نظر بنده کلاسی که شما عنوان میکنید هم در لایه DAL هست، بنده زیاد با C#‎ برنامه نمی نویسم، ولی اصول طراحی 3 لایه به این شکل هست

لایه BLL وظیفه این رو داره که اطلاعات ورودی رو چک کنه، صحت اطلاعات بررسی شه بعد بررسی کنه که به کدوم فایل از DAL نیازمند هست و فراخونی کنه،

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

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



The DAL wraps the database data in a custom object and returns it to the BLL.

همانطور که ذکر شد DAL در یک کلاس ( که مسلما از همون لایه هست و حق دسترسی به لایه بالایی رو نداره ) رو به BLL برمیگردونه و در واقع یک نوع helper محسوب میشه اون کلاس



با توجه به ویکی پدیا
http://en.wikipedia.org/wiki/Multitier_architecture


This tier consists of database servers. Here information is stored and retrieved. This tier keeps data neutral and independent from application servers or business logic. Giving data its own tier also improves scalability and performance.

موفق باشید،

veniz2008
چهارشنبه 20 شهریور 1392, 23:11 عصر
دستورات SQL رو تو لایه BLL مینویسه میخوام ببینم درستش همینه چون یه جا دیگه دیدم تو لایه DAL نوشت فقط مقادیر از لایه BLL ارسال میشد
سلام.
معمولا به همین صورت که گفتید پیاده سازی میشه.
در برنامه نویسی 3 لایه عموما دستور sql شما (خود کوئری یا stored procedure شما) در لایه BLL یا (Business Logic Layer) قرار میگیره ولی برای اجرای این کوئری (یا sp)، این کوئری رو به لایه (DAL (Data Access Layer تحویل میدن تا کوئری رو اجرا و نتیجه رو برگشت بده. با توجه به اینکه ما دو نوع از دستورات رو داریم که در یک نوع (همون select ها) یک جدول برگشت داده میشه برای این منظور معمولا متد موجود در لایه DAL رو که وظیفه اجرای یک کوئری Select رو داره خروجیش رو از نوع DataTable میگیرن (نتیجه select که یک جدول هست درون این دیتاتیبل ریخته و برگشت داده میشه).

esafb52
چهارشنبه 20 شهریور 1392, 23:30 عصر
سلام.
معمولا به همین صورت که گفتید پیاده سازی میشه.
در برنامه نویسی 3 لایه عموما دستور sql شما (خود کوئری یا stored procedure شما) در لایه BLL یا (Business Logic Layer) قرار میگیره ولی برای اجرای این کوئری (یا sp)، این کوئری رو به لایه (DAL (Data Access Layer تحویل میدن تا کوئری رو اجرا و نتیجه رو برگشت بده. با توجه به اینکه ما دو نوع از دستورات رو داریم که در یک نوع (همون select ها) یک جدول برگشت داده میشه برای این منظور معمولا متد موجود در لایه DAL رو که وظیفه اجرای یک کوئری Select رو داره خروجیش رو از نوع DataTable میگیرن (نتیجه select که یک جدول هست درون این دیتاتیبل ریخته و برگشت داده میشه).
با سلام به شما و بقیه دوستان من همون پروژه آزمون گیر رو به صورت سه لایه دارم پیاده سازی میکنم که هنوز کامل نیست کد دو تا لایه dal وbal رو میذارم
dal layer



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

namespace azmoon
{
public class dal
{

public SqlCommand cmd;
public SqlDataAdapter da;
public SqlConnection con = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirector y|\DBAZMOON.mdf;Integrated Security=True;User Instance=True");

public void conect()
{
con.Open();
}
public void disconect()
{
con.Close();
}
public void docomand()
{
cmd.Connection = con;
conect();
cmd.CommandType=CommandType.StoredProcedure;
cmd.ExecuteNonQuery();
disconect();
}
public DataTable select(string command)
{
DataTable dt = new DataTable();
da= new SqlDataAdapter(command,con);
da.SelectCommand.CommandType = CommandType.StoredProcedure;
da.Fill(dt);
return dt;
}
public DataTable selectQUSETIONTEXT(string command, int idgroup)
{
DataTable dt = new DataTable();
da = new SqlDataAdapter(command, con);
da.SelectCommand.CommandType = CommandType.StoredProcedure;
da.SelectCommand.Parameters.AddWithValue("@GROUPID",idgroup);
da.Fill(dt);
return dt;
}

}
}

bal layer

using System.Data;
using System.Data.SqlClient;

namespace azmoon
{
public class bal
{
private readonly dal db = new dal();
private QusetionGroup qg = new QusetionGroup();

//موارد مربوط به گروه های آزمونی

#region

public DataTable loadqusetiongroup()
{
DataTable dt = db.select("loaddall");
return dt;
}

public void addqusetiongroup(string groupname)
{
db.cmd = new SqlCommand("ADDGROUP");
db.cmd.Parameters.AddWithValue("@GROUPNAME", groupname.Trim());
db.docomand();
}

public void editquestiongroup(string groupname, int idcurentrow)
{
db.cmd = new SqlCommand("groupupdate");
db.cmd.Parameters.AddWithValue("@GROUPNAME", groupname.Trim());
db.cmd.Parameters.AddWithValue("@id", idcurentrow);
db.docomand();
}

public void deletequestiongroup(int idcurentrow)
{
db.cmd = new SqlCommand("deletegroup");
db.cmd.Parameters.AddWithValue("@id", idcurentrow);
db.docomand();
}

#endregion

////////////////////////
///
public void addQuestion(string QUSETIONTEXT, string CASE1, string CASE2, string CASE3, string CASE4, int answer,int groupid)
{
db.cmd = new SqlCommand("addqusetion");
db.cmd.Parameters.AddWithValue("@QUSETIONTEXT", QUSETIONTEXT);
db.cmd.Parameters.AddWithValue("@CASE1", CASE1);
db.cmd.Parameters.AddWithValue("@CASE2", CASE2);
db.cmd.Parameters.AddWithValue("@CASE3", CASE3);
db.cmd.Parameters.AddWithValue("@CASE4", CASE3);
db.cmd.Parameters.AddWithValue("@ANSWER", answer);
db.cmd.Parameters.AddWithValue("@GROUPID", groupid);
db.docomand();
}

public DataTable loadQUSETIONTEXT(int idgroup)
{
DataTable dt = db.selectQUSETIONTEXT("qustiontex", idgroup);
return dt;
}
}
}


اگه جایی باید اصلاح بشه راهنمایی کنین

esafb52
چهارشنبه 20 شهریور 1392, 23:34 عصر
تایپیک بالا شلوغ شد و در یک فرم به این صورت استفاده میکنم
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace azmoon
{
public partial class frmaddquestion : Form
{
bal db = new bal();
public frmaddquestion()
{
InitializeComponent();
}

private void frmaddquestion_Load(object sender, EventArgs e)
{

comboBox1.DataSource = db.loadqusetiongroup();
comboBox1.DisplayMember = "GROUPNAME";
comboBox1.ValueMember = "GROUPID";
comboBox2.SelectedIndex = 0;
dataGridView1.DataSource = db.loadQUSETIONTEXT(Convert.ToInt32(comboBox1.Sele ctedValue.ToString()));
}

private void addqustion_Click(object sender, EventArgs e)
{
int answer = Convert.ToInt32(comboBox2.Text);
int groupid = Convert.ToInt32(comboBox1.SelectedValue);
db.addQuestion(textBox1.Text,textBox2.Text,textBox 3.Text,textBox4.Text,textBox5.Text,answer,groupid) ;

MessageBox.Show("سوال درج شد");

}

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
}
}
}

صباح فتحی
چهارشنبه 20 شهریور 1392, 23:54 عصر
کلا دستورات مربوط به بانک توی لایه dalهست

veniz2008
پنج شنبه 21 شهریور 1392, 00:15 صبح
دوست من جناب esafb52:
نیازی نیست که برای خروجی های select بیش از یک متد ایجاد کنید. چرا؟ دلیلش در این سوال ساده مشخص میشه :
اگه ورودی های شما بیش از یک پارامتر باشند اونوقت باید یک متد جدید تعریف کرد؟
مثلا اگر من بخوام select ای بنویسم که در شرط اون دو پارامتر ورودی باشه (مثلا همون select ای که برای تشخیص یک مدیر در ویدئوی هفتم بود و همزمان نام کاربری و کلمه عبور رو در شرط select بررسی میکردیم) آیا باید یک متد جدید ایجاد کنیم؟
قطعا نه.
ما برای دستورات select خودمون فقط یک متد نیاز داریم و برای 3 دستور insert ، delete و update هم فقط به یک متد نیاز داریم. پس کلا دو متد برای دستورات اصلی نیاز داریم.
مورد دوم که باید رعایت کنید این هست که در ارسال پارامترها دو دستگی ایجاد کردید. یک بار در دستورات insert داخل کلاس BLL این کار رو انجام دادید ولی در مورد selectها ارسال پارامتر رو به لایه DAL واگذار کردید. همین کار باعث شده که دو متد برای select در نظر بگیری که صحیح نیست.
در 3 لایه روند کار بصورت درخواست و پاسخ هست. از طرف لایه UI شما باید درخواست خودتون رو به لایه BLL تحویل بدید (متد مورد نظر در کلاس BLL رو صدا می زنید و مقادیر رو بصورت پارامتر براش می فرستید). لایه BLL این مقادیر رو در متد مورد نظر بصورت پارامترهای ورودی دریافت و این مقادیر رو جهت اجرای نهایی تحویل لایه DAL میده (همون cmd.Parameters.Addwithvalue یا da.parameters.Addwithvalue).
حالا در لایه DAL بعد از اجرای دستور بایستی نتیجه به لایه BLL برگشت داده بشه و لایه BLL بعد از دریافت اونو به لایه UI پس میده تا خروجی رو کاربر مشاهده کنه.
یک نکته ای رو بگم و اونم اینه که این روشی که توضیح دادم لزوما" تنها راه نیست. ممکنه به جای پارامترهای ورودی در متد از فیلدها در لایه BLL استفاده بشه.
شکل زیر رو ببینید. به نظرم مفهوم چند جمله بالا رو بتونید در شکل زیر متوجه بشید :

110498

esafb52
پنج شنبه 21 شهریور 1392, 00:31 صبح
ممنون از پاسخ تون راستش باید اعتراف کنم از نابلدی هست من مبتدی هستم و تقریبا یک سالی میشه اونم به صورت جسته و گریخته دارم برنامه نویسی میکنم من قصد دارم این رو تو همون تایپیک خودمون ادامه بدم اگه البته صلاح بدونین راستش خیلی جاهم با مشکل مواجه شدم ولی چون حالت شخصی داشت و محور روش و پروژه شما رو در بر نمیگرفت مطرح نکردم
میشه این قسمت رو یه مثال بزنین
"ما برای دستورات select خودمون فقط یک متد نیاز داریم و برای 3 دستور insert ، delete و update هم فقط به یک متد نیاز داریم. پس کلا دو متد برای دستورات اصلی نیاز داریم."

esafb52
پنج شنبه 21 شهریور 1392, 00:33 صبح
دوست من جناب esafb52:
نیازی نیست که برای خروجی های select بیش از یک متد ایجاد کنید. چرا؟ دلیلش در این سوال ساده مشخص میشه :
اگه ورودی های شما بیش از یک پارامتر باشند اونوقت باید یک متد جدید تعریف کرد؟
مثلا اگر من بخوام select ای بنویسم که در شرط اون دو پارامتر ورودی باشه (مثلا همون select ای که برای تشخیص یک مدیر در ویدئوی هفتم بود و همزمان نام کاربری و کلمه عبور رو در شرط select بررسی میکردیم) آیا باید یک متد جدید ایجاد کنیم؟
قطعا نه.
ما برای دستورات select خودمون فقط یک متد نیاز داریم و برای 3 دستور insert ، delete و update هم فقط به یک متد نیاز داریم. پس کلا دو متد برای دستورات اصلی نیاز داریم.
مورد دوم که باید رعایت کنید این هست که در ارسال پارامترها دو دستگی ایجاد کردید. یک بار در دستورات insert داخل کلاس BLL این کار رو انجام دادید ولی در مورد selectها ارسال پارامتر رو به لایه DAL واگذار کردید. همین کار باعث شده که دو متد برای select در نظر بگیری که صحیح نیست.
در 3 لایه روند کار بصورت درخواست و پاسخ هست. از طرف لایه UI شما باید درخواست خودتون رو به لایه BLL تحویل بدید (متد مورد نظر در کلاس BLL رو صدا می زنید و مقادیر رو بصورت پارامتر براش می فرستید). لایه BLL این مقادیر رو در متد مورد نظر بصورت پارامترهای ورودی دریافت و این مقادیر رو جهت اجرای نهایی تحویل لایه DAL میده (همون cmd.Parameters.Addwithvalue یا da.parameters.Addwithvalue).
حالا در لایه DAL بعد از اجرای دستور بایستی نتیجه به لایه BLL برگشت داده بشه و لایه BLL بعد از دریافت اونو به لایه UI پس میده تا خروجی رو کاربر مشاهده کنه.
یک نکته ای رو بگم و اونم اینه که این روشی که توضیح دادم لزوما" تنها راه نیست. ممکنه به جای پارامترهای ورودی در متد از پراپرتی ها در لایه BLL استفاده بشه.
شکل زیر رو ببینید. به نظرم مفهوم چند جمله بالا رو بتونید در شکل زیر متوجه بشید :

110498
ممنون از پاسخ تون راستش باید اعتراف کنم از نابلدی هست من مبتدی هستم و تقریبا یک سالی میشه اونم به صورت جسته و گریخته دارم برنامه نویسی میکنم من قصد دارم این رو تو همون تایپیک خودمون ادامه بدم اگه البته صلاح بدونین راستش خیلی جاهم با مشکل مواجه شدم ولی چون حالت شخصی داشت و موضوع اش روش و پروژه شما رو در بر نمیگرفت مطرح نکردم
میشه این قسمت رو یه مثال بزنین
"ما برای دستورات select خودمون فقط یک متد نیاز داریم و برای 3 دستور insert ، delete و update هم فقط به یک متد نیاز داریم. پس کلا دو متد برای دستورات اصلی نیاز داریم."

veniz2008
پنج شنبه 21 شهریور 1392, 01:44 صبح
ممنون از پاسخ تون راستش باید اعتراف کنم از نابلدی هست من مبتدی هستم و تقریبا یک سالی میشه اونم به صورت جسته و گریخته دارم برنامه نویسی میکنم من قصد دارم این رو تو همون تایپیک خودمون ادامه بدم اگه البته صلاح بدونین راستش خیلی جاهم با مشکل مواجه شدم ولی چون حالت شخصی داشت و موضوع اش روش و پروژه شما رو در بر نمیگرفت مطرح نکردم
میشه این قسمت رو یه مثال بزنین
"ما برای دستورات select خودمون فقط یک متد نیاز داریم و برای 3 دستور insert ، delete و update هم فقط به یک متد نیاز داریم. پس کلا دو متد برای دستورات اصلی نیاز داریم."
روش های متنوعی وجود داره. یه روش اینطوری هست :
1. این برای درج و حذف و آپدیت :

public void AllCommand(SqlCommand mycmd)
{
mycmd.Connection = con;
con.Open();
mycmd.ExecuteNonQuery();
con.Close();
}
2. این هم برای select های شما :

public DataTable AllSelect(SqlDataAdapter myda)
{
myda.SelectCommand.Connection = con;
DtDAL = new DataTable();
myda.Fill(DtDAL);
return DtDAL;
}
فقط در سمت لایه BLL این دو خط کد رو علاوه بر ارسال پارامترها نیاز دارید. (بقیه کدها دقیقا مثل همون حالتی هست که در آموزش ها می بینید).

da.SelectCommand.CommandText = "SelectAllGroup";
da.SelectCommand = new SqlCommand();
همونطور که می بینید یه خط کدی که قبلا بصورت :

SqlDataAdapter da = new SqlDataAdapter("SelectAllGroup",con);
نوشته میشد حالا چون لایه ای کار میکنیم. دیگه نمیشه بصورت یکجا درون لایه DAL نوشت. چون قراره این متد برای select های دیگه هم استفاده بشه. به همین خاطر اونو در دو خط نوشتیم :
در لایه BLL :

da.SelectCommand.CommandText = "SelectAllGroup";
و
در لایه DAL :

myda.SelectCommand.Connection = con;
معمولا در اکثر آموزش ها،برای عمل select کدهای دیگه ای نوشته میشه که یه کم طولانی تر و پیچیده تر هست.
به نظرم کار صحیحی نباشه که در اون تاپیک سوال چند لایه رو مطرح کنید و بخوایم اونجا درباره چندلایه صحبت کنیم.
کدها رو درون notepad نوشتم. اگر خطایی داشتند بگید تا اصلاح کنم. کدها رو هم تایپ کنید تا احیانا خطای لغوی وجود نداشته باشه.
امیدوارم مطالب فوق تونسته باشه بهتون درباره چندلایه کمک کنه.
موفق باشید.

esafb52
پنج شنبه 21 شهریور 1392, 03:17 صبح
با سلام و تشکر از جناب ونیز2008
کدهای اصلاح شده رو میذارم شاید بدرد دوستان مبتدی مثل خودم بخوره و یه ذهنیتی برای پیاده سازی روش سه لایه داشته باشن
لایهDAL
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Text;
using System.Windows.Forms;

namespace azmoon
{
public class dal
{
public SqlConnection con =
new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirector y|\DBAZMOON.mdf;Integrated Security=True;User Instance=True");

public void conect()
{
con.Open();
}

public void disconect()
{
con.Close();
}
//اجرای تمام دستورات SQL
public void AllCommand(SqlCommand command)
{
command.Connection = con;
command.CommandType = CommandType.StoredProcedure;
conect();
command.ExecuteNonQuery();
disconect();
}
//برای پر کردن تمام گریدو....ها
public DataTable AllSelect(SqlDataAdapter dataAdapter)
{
dataAdapter.SelectCommand.Connection = con;
dataAdapter.SelectCommand.CommandType = CommandType.StoredProcedure;
DataTable dt = new DataTable();
dataAdapter.Fill(dt);
return dt;
}

}
}

لایهBAL

using System.Data;
using System.Data.SqlClient;

namespace azmoon
{
public class bal
{
private readonly dal db = new dal();


//موارد مربوط به گروه های آزمونی

#region

public DataTable loadqusetiongroup()
{
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = new SqlCommand();
da.SelectCommand.CommandText = "loaddall";
DataTable dt = db.AllSelect(da);
return dt;
}

public void addqusetiongroup(string groupname)
{

SqlCommand command = new SqlCommand("ADDGROUP");
command.Parameters.AddWithValue("@GROUPNAME", groupname.Trim());
db.AllCommand(command);
}

public void editquestiongroup(string groupname, int idcurentrow)
{

SqlCommand command = new SqlCommand("groupupdate");
command.CommandType = CommandType.StoredProcedure;
command.Parameters.AddWithValue("@GROUPNAME", groupname.Trim());
command.Parameters.AddWithValue("@id", idcurentrow);
db.AllCommand(command);
}

public void deletequestiongroup(int idcurentrow)
{
SqlCommand command = new SqlCommand("deletegroup");
command.Parameters.AddWithValue("@id", idcurentrow);
db.AllCommand(command);
}

#endregion


public void addQuestion(string QUSETIONTEXT, string CASE1, string CASE2, string CASE3, string CASE4, int answer,
int groupid)
{
SqlCommand command = new SqlCommand("addqusetion");
command.Parameters.AddWithValue("@QUSETIONTEXT", QUSETIONTEXT);
command.Parameters.AddWithValue("@CASE1", CASE1);
command.Parameters.AddWithValue("@CASE2", CASE2);
command.Parameters.AddWithValue("@CASE3", CASE3);
command.Parameters.AddWithValue("@CASE4", CASE3);
command.Parameters.AddWithValue("@ANSWER", answer);
command.Parameters.AddWithValue("@GROUPID", groupid);
db.AllCommand(command);
}

public DataTable loadQUSETIONTEXT(int idgroup)
{
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = new SqlCommand();
da.SelectCommand.CommandText = "qustiontex";
da.SelectCommand.Parameters.AddWithValue("@GROUPID", idgroup);
DataTable dt = db.AllSelect(da);
return dt;
}
}
}


و این هم پیاده سازی در یک فرم که هر 4مثال حذف درج ویرایش و لود اطلاعات در گرید رو داره اگر بدردتون خورد کلید تشکر رو فشار بدین

using System;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Windows.Forms;

namespace MYAZMOON
{
public partial class frmExamgroup : Form
{
bal db = new bal();

private int idcurentrow;

public frmExamgroup()
{


InitializeComponent();
}

private void frmExamgroup_Load(object sender, EventArgs e)
{
dataGridView1.DataSource = db.loadqusetiongroup();

}

private void btnadd_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(textBox1.Text))
{
errorProvider1.SetError(textBox1, "لطفا نام گروه رو وارد نمایید");
}
else
{
errorProvider1.SetError(textBox1, "");
db.addqusetiongroup(textBox1.Text);
frmExamgroup_Load(null, null);
MessageBox.Show("درج شد");
textBox1.ResetText();
textBox1.Focus();
}
}

private void btnedit_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(textBox1.Text))
{
errorProvider1.SetError(textBox1, "لطفا نام گروه رو انتخاب نمایید");
return;
}


db.editquestiongroup(textBox1.Text.Trim(), idcurentrow);
frmExamgroup_Load(null, null);
MessageBox.Show("بروز شد");
textBox1.Text = string.Empty;
btnedit.Enabled = false;
btnadd.Enabled = true;
}

private void dataGridView1_RowHeaderMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e)
{
btnedit.Enabled = true;
btnadd.Enabled = false;
idcurentrow = Convert.ToInt32(dataGridView1.CurrentRow.Cells[0].Value);
textBox1.Text = dataGridView1.CurrentRow.Cells[1].Value.ToString();
}

private void btndelete_Click(object sender, EventArgs e)
{
if (dataGridView1.Rows.Count > 0
&&
MessageBox.Show("آیامیخواهید حذف شود", "حذف", MessageBoxButtons.YesNo, MessageBoxIcon.Question) ==
DialogResult.Yes)
{
idcurentrow = Convert.ToInt32(dataGridView1.CurrentRow.Cells[0].Value);
db.deletequestiongroup(idcurentrow);
frmExamgroup_Load(null, null);
MessageBox.Show("حذف شد");
}
}
}
}

موفق باشین

FastCode
پنج شنبه 21 شهریور 1392, 04:59 صبح
یه چیزی رو تقریبا همتون دارید اشتباه میکنید:
DAL فقط/ وظیفه ارتباط با پایگاه داده رو نداره.

veniz2008
پنج شنبه 21 شهریور 1392, 18:29 عصر
یه چیزی رو تقریبا همتون دارید اشتباه میکنید:
DAL فقط/ وظیفه ارتباط با پایگاه داده رو نداره.
من عکسی رو که گذاشته بودی نگاه کردم و سعی کردم برداشتت رو از عکس بیرون بکشم!.
شاید با دیدن این عکس دو نتیجه گیری بشه کرد :
1. کوئری ها رو باید در لایه DAL اجرا کرد.
2. حتی خود کوئری ها رو هم باید در لایه DAL نوشت نه در BLL !.
آیا منظورت همین ها هست؟
ممنون میشم کامل توضیح بدی تا ابهامی باقی نمونه تا با توجه به جوابت بتونیم بحث بهتری رو داشته باشیم.

FastCode
پنج شنبه 21 شهریور 1392, 18:49 عصر
من عکسی رو که گذاشته بودی نگاه کردم و سعی کردم برداشتت رو از عکس بیرون بکشم!.
شاید با دیدن این عکس دو نتیجه گیری بشه کرد :
1. کوئری ها رو باید در لایه DAL اجرا کرد.
2. حتی خود کوئری ها رو هم باید در لایه DAL نوشت نه در BLL !.
آیا منظورت همین ها هست؟
ممنون میشم کامل توضیح بدی تا ابهامی باقی نمونه تا با توجه به جوابت بتونیم بحث بهتری رو داشته باشیم.
وظیفه اصلی DAL اینه که
۱.برنامه رو از دیتابیس جدا کنه و از وابستگی برنامه به دیتابیس جلوگیری کنه.
۲.درخواست های برنامه رو به شکل object پاسخ بده.
۳.در صورتی که درخواست داده شده توسط دیتابیس پشتیبانی نمیشه خودش راهی پیدا کنه.مثلا اگر دیتابیس توابع مربوط به مقایسه رشته نداره خودش مقایسه رو انجام بده.
۴.ساختاری ساده برای انجام تراکنش های دیتابیس به برنامه ارائه بده.
و یه سری جزئیات دیگه.
اون نمونه کدهایی که گزاشته شد هیچ کدوم از این کارها رو انجام نمیدن.
کوئری های SQL رو باید در DB Helper نوشت که البته در خیلی از برنامه ها جزئی از DAL هست.
به متن درخواست هایی که توی تصویر هست توجه کنید که هر کدوم با چه بیانی با لایه زیری خودش صحبت میکنه.

veniz2008
پنج شنبه 21 شهریور 1392, 20:29 عصر
وظیفه اصلی DAL اینه که
۱.برنامه رو از دیتابیس جدا کنه و از وابستگی برنامه به دیتابیس جلوگیری کنه.
متاسفانه این یکی از ایرادات ADO.Net هست که وابستگی برنامه به دیتابیس وجود داره.
یکی از مزیت های خوب EF نسبت به ADO همین عدم وابستگی برنامه به دیتابیس هست.
ADO چطور میتونه برنامه رو از این وابستگی نجات بده؟


۲.درخواست های برنامه رو به شکل object پاسخ بده.نظری ندارم.


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


۴.ساختاری ساده برای انجام تراکنش های دیتابیس به برنامه ارائه بده.این حرف قابل قبوله. چون مهمترین وظیفه این لایه ارتباط با دیتابیس هست و ارائه چنین ساختاری قابل پذیرش هست.


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

FastCode
پنج شنبه 21 شهریور 1392, 21:16 عصر
متاسفانه این یکی از ایرادات ADO.Net هست که وابستگی برنامه به دیتابیس وجود داره.
یکی از مزیت های خوب EF نسبت به ADO همین عدم وابستگی برنامه به دیتابیس هست.
ADO چطور میتونه برنامه رو از این وابستگی نجات بده؟
نظری ندارم.

یعنی ساختارهای کنترلی رو از روی لایه BLL به DAL منتقل کنیم؟
اگر منظورت همچین چیزی هست اونوقت وظایف لایه BLL چی میشه؟
یکی از تعریف هایی که برای لایه BLL میکنن اینه که میگن هسته اصلی و مغز متفکر برنامه در این لایه پیاده سازی میشه. اگر ساختارهای کنترلی رو از روی این لایه برداریم به نظرتون کارایی خودش رو از دست نمیده؟
این حرف قابل قبوله. چون مهمترین وظیفه این لایه ارتباط با دیتابیس هست و ارائه چنین ساختاری قابل پذیرش هست.

حرفت درسته. در کدهای بالا تقریبا هیچ خبری از این موارد نیست.
من تا حالا چندین مجموعه مختلف و کتاب درباره چندلایه خوندم. این اولین باری هست که چنین مفاهیم و وظایفی رو برای لایه DAL می بینم (ندیدن من دلیل بر نبودن نیست). ممنون میشم اگر مرجعی در این باره هست رو معرفی کنی.
اینقدر بدیهیه که فکر نمیکنم مرجع بخواد.
۱.DAL باید اشیا خودش رو برگردونه و در واقع لایه ای باشه روی ADO.
من با EF کار نکردم ولی توی نمونه کدهایی که دیدم به نظرم توی این ضمینه بد عمل نکرده و میشه از خودش برای این کار استفاده کرد.
۳.خیر.
وظیفه BLL اینه که مثلا وقتی مثلا چکی خواست پاس بشه چک کنه قبلا به حساب خوابونده شده باشه.
منظور من از اینکه خودش یک سری عملیات رو در صورت لزوم انجام بده این بود:

SelectQuery Q = new SelectQuery(Tables.TableX);
Q.Columns.Add(TableX.Columns.All);
Parameter P = new Parameter();
Q.Conditions.Add(ComparisonOperators.Equal, TableX.Columns.Id, P);
P.Value = null;
List<TableX> = Q.Evaluate<TableXRow>();
این یک نمونه درخواست هست که BLL میتونه به DAL بفرسته.
فرض کنید اینجا تابعی استفاده بشه که دیتابیس مورد نظر پشتیبانی نکنه.
چه اتفاقی میافته؟مثلا تا دیروز از Oracle 11g استفاده میشده.امروز از csv استفاده میشه.به نظرتون باید همه ی BLL از اول نوشته بشه چون csv فقط سه عمل اصلی رو پشتیبانی میکنه؟
در این مدلی که گزاشتم خیلی راحت میشه از تمام توابع در دسترس زبان و فریمورک برنامه نویسی(در اینجا C#‎‎.net) استفاده کرد.پیاده سازیش هم خیلی طول نمیکشه.چون چند بار این کار رو کردم میگم.با linq هم میشه این کار رو کرد ولی هشدار من رو جدی بگیرید و قبلش برای کاشت مو نوبت بزنید.چون اینقدر طولانی و مذخرف implement میشه که اگر آخرش کچل نشید یعنی احتمالا یه قسمت رو جا انداختید.

veniz2008
پنج شنبه 21 شهریور 1392, 21:47 عصر
منظور من از اینکه خودش یک سری عملیات رو در صورت لزوم انجام بده این بود:

SelectQuery Q = new SelectQuery(Tables.TableX);
Q.Columns.Add(TableX.Columns.All);
Parameter P = new Parameter();
Q.Conditions.Add(ComparisonOperators.Equal, TableX.Columns.Id, P);
P.Value = null;
List<TableX> = Q.Evaluate<TableXRow>();
این یک نمونه درخواست هست که BLL میتونه به DAL بفرسته.
فرض کنید اینجا تابعی استفاده بشه که دیتابیس مورد نظر پشتیبانی نکنه.
چه اتفاقی میافته؟مثلا تا دیروز از Oracle 11g استفاده میشده.امروز از csv استفاده میشه.به نظرتون باید همه ی BLL از اول نوشته بشه چون csv فقط سه عمل اصلی رو پشتیبانی میکنه؟
در این مدلی که گزاشتم خیلی راحت میشه از تمام توابع در دسترس زبان و فریمورک برنامه نویسی(در اینجا C#‎‎.net) استفاده کرد.پیاده سازیش هم خیلی طول نمیکشه.چون چند بار این کار رو کردم میگم.با linq هم میشه این کار رو کرد ولی هشدار من رو جدی بگیرید و قبلش برای کاشت مو نوبت بزنید.چون اینقدر طولانی و مذخرف implement میشه که اگر آخرش کچل نشید یعنی احتمالا یه قسمت رو جا انداختید.
تمام این جملات درست و منم باهاش مخالفتی ندارم ولی در همه این کارها بطور ضمنی داری میپذیری که داری برای "دسترسی به دیتابیس و داده ها" چنین اقداماتی رو میکنی. بنابراین طبیعی هست که این قطعه کد رو در DAL بنویسی.
این حرفهات نقض کننده حرف های گذشته من نیست. من هم تاکید میکنم هرجایی که نیاز به کانکت و ارتباط با دیتابیس هست بهتره که در DAL پیاده سازی بشه.

esafb52
پنج شنبه 21 شهریور 1392, 23:22 عصر
طبق چیزهایی که گفتین پس آخر داستان چی شد؟؟؟؟؟؟؟؟؟من چند نمونه دیدم به این روش کار میکنند یه نمونه هم دیدم همه کدها ی crud رو تو لایه دال پیاده کرده بود و بعد از موجودیتش یک کلاس ساخته بود و با پراپرتی های اون کلاس با عنوان پارامتر کار میکرد لطفا راهنمایی کنید

veniz2008
جمعه 22 شهریور 1392, 00:22 صبح
طبق چیزهایی که گفتین پس آخر داستان چی شد؟؟؟؟؟؟؟؟؟من چند نمونه دیدم به این روش کار میکنند یه نمونه هم دیدم همه کدها ی crud رو تو لایه دال پیاده کرده بود و بعد از موجودیتش یک کلاس ساخته بود و با پراپرتی های اون کلاس با عنوان پارامتر کار میکرد لطفا راهنمایی کنید
بحث ما یه چیز دیگه بود. این چیزی که شما میگی یه چیز دیگست.
در چند لایه معمولا عرف به این شکل هست که هر جدول که معرف یک موجودیت یا یک رابطه هست واسش یک کلاس در نظر میگیرن (مثل موجودیت دانشجو یا رابطه خرید) . یعنی برای دانشجو یک کلاس و برای خرید هم یک کلاس.
حالا میان داخل این کلاس ها، برای هر عمل مورد نظر یک متد مینویسن.
مثلا برای ثبت دانشجو داخل کلاس student یک متد برای ثبت مینویسن. برای ویرایش هم یک متد داخل کلاس مینویسن.
برای خرید هم همینطور. واسه ثبت خرید یک متد، واسه ویرایش خرید یک متد، واسه مشاهده لیست همه خریدهای امروز یکی و ...
این کلاس ها و متدهای داخلش عموما همون لایه BLL شما میشه.
حالا این مقادیر رو یا بصورت پارامترهای ورودی به متدها پاس میدن یا در سطح کلاس فیلد مسازن یا ... استفاده میکنن.
البته در پروزه های بزرگ معمولا برای هر لایه یک Class Library به پروژه اضافه میکنن و کلاس ها رو درون این class library ها ایجاد میکنن.