نمایش نتایج 1 تا 25 از 25

نام تاپیک: برنامه نویسی سه لایه

  1. #1
    کاربر جدید آواتار lonely1372
    تاریخ عضویت
    اردیبهشت 1391
    محل زندگی
    سمنان
    پست
    8

    برنامه نویسی سه لایه

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

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

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

  2. #2

    نقل قول: برنامه نویسی سه لایه

    درود
    لینک زیر پاسخ پرسش شما را شرح داده است
    http://imar.spaanjaars.com/416/build...pnet-20-part-1

  3. #3
    کاربر جدید آواتار lonely1372
    تاریخ عضویت
    اردیبهشت 1391
    محل زندگی
    سمنان
    پست
    8

    نقل قول: برنامه نویسی سه لایه

    برنامه نویسی سه لایه آفلاین هم همینجوره ؟

  4. #4

    نقل قول: برنامه نویسی سه لایه

    نقل قول نوشته شده توسط lonely1372 مشاهده تاپیک
    سلام به همه دوستان و اساتید
    سوالی راجع به برنامه نویسی سه لایه دارم

    دستورات 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

  5. #5
    کاربر جدید آواتار lonely1372
    تاریخ عضویت
    اردیبهشت 1391
    محل زندگی
    سمنان
    پست
    8

    نقل قول: برنامه نویسی سه لایه

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

    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 ارسال میشد

  6. #6
    کاربر دائمی
    تاریخ عضویت
    مهر 1388
    محل زندگی
    کرمانشاه
    سن
    37
    پست
    735

    نقل قول: برنامه نویسی سه لایه

    دستورات sql توی لایه DAL نوشته میشن

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

  7. #7

  8. #8

    نقل قول: برنامه نویسی سه لایه

    نقل قول نوشته شده توسط rezaei_y مشاهده تاپیک
    دستورات sql توی لایه DAL نوشته میشن

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

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

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

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

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

    1. 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.
    موفق باشید،

  9. #9
    کاربر دائمی
    تاریخ عضویت
    تیر 1389
    محل زندگی
    به جبر روزگار تهران هستم.
    پست
    2,718

    نقل قول: برنامه نویسی سه لایه

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

  10. #10
    کاربر دائمی
    تاریخ عضویت
    مرداد 1388
    محل زندگی
    کنار یه ساحل خیلی زیبا
    پست
    922

    نقل قول: برنامه نویسی سه لایه

    نقل قول نوشته شده توسط veniz2008 مشاهده تاپیک
    سلام.
    معمولا به همین صورت که گفتید پیاده سازی میشه.
    در برنامه نویسی 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;
    }
    }
    }


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

  11. #11
    کاربر دائمی
    تاریخ عضویت
    مرداد 1388
    محل زندگی
    کنار یه ساحل خیلی زیبا
    پست
    922

    نقل قول: برنامه نویسی سه لایه

    تایپیک بالا شلوغ شد و در یک فرم به این صورت استفاده میکنم
    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)
    {
    }
    }
    }

  12. #12
    کاربر دائمی آواتار صباح فتحی
    تاریخ عضویت
    خرداد 1389
    محل زندگی
    سنندج
    سن
    33
    پست
    661

    نقل قول: برنامه نویسی سه لایه

    کلا دستورات مربوط به بانک توی لایه dalهست

  13. #13
    کاربر دائمی
    تاریخ عضویت
    تیر 1389
    محل زندگی
    به جبر روزگار تهران هستم.
    پست
    2,718

    نقل قول: برنامه نویسی سه لایه

    دوست من جناب 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 استفاده بشه.
    شکل زیر رو ببینید. به نظرم مفهوم چند جمله بالا رو بتونید در شکل زیر متوجه بشید :

    3layer.jpg
    آخرین ویرایش به وسیله veniz2008 : پنج شنبه 21 شهریور 1392 در 20:50 عصر

  14. #14
    کاربر دائمی
    تاریخ عضویت
    مرداد 1388
    محل زندگی
    کنار یه ساحل خیلی زیبا
    پست
    922

    نقل قول: برنامه نویسی سه لایه

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

  15. #15
    کاربر دائمی
    تاریخ عضویت
    مرداد 1388
    محل زندگی
    کنار یه ساحل خیلی زیبا
    پست
    922

    نقل قول: برنامه نویسی سه لایه

    نقل قول نوشته شده توسط veniz2008 مشاهده تاپیک
    دوست من جناب 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 استفاده بشه.
    شکل زیر رو ببینید. به نظرم مفهوم چند جمله بالا رو بتونید در شکل زیر متوجه بشید :

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

  16. #16
    کاربر دائمی
    تاریخ عضویت
    تیر 1389
    محل زندگی
    به جبر روزگار تهران هستم.
    پست
    2,718

    نقل قول: برنامه نویسی سه لایه

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

  17. #17
    کاربر دائمی
    تاریخ عضویت
    مرداد 1388
    محل زندگی
    کنار یه ساحل خیلی زیبا
    پست
    922

    نقل قول: برنامه نویسی سه لایه

    با سلام و تشکر از جناب ونیز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("حذف شد");
    }
    }
    }
    }

    موفق باشین
    آخرین ویرایش به وسیله esafb52 : پنج شنبه 21 شهریور 1392 در 03:41 صبح

  18. #18
    کاربر دائمی آواتار FastCode
    تاریخ عضویت
    تیر 1388
    محل زندگی
    /dev/null
    پست
    3,486

    نقل قول: برنامه نویسی سه لایه

    یه چیزی رو تقریبا همتون دارید اشتباه میکنید:
    DAL فقط/ وظیفه ارتباط با پایگاه داده رو نداره.
    فایل های ضمیمه فایل های ضمیمه

  19. #19
    کاربر دائمی
    تاریخ عضویت
    تیر 1389
    محل زندگی
    به جبر روزگار تهران هستم.
    پست
    2,718

    نقل قول: برنامه نویسی سه لایه

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

  20. #20
    کاربر دائمی آواتار FastCode
    تاریخ عضویت
    تیر 1388
    محل زندگی
    /dev/null
    پست
    3,486

    نقل قول: برنامه نویسی سه لایه

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

  21. #21
    کاربر دائمی
    تاریخ عضویت
    تیر 1389
    محل زندگی
    به جبر روزگار تهران هستم.
    پست
    2,718

    نقل قول: برنامه نویسی سه لایه

    نقل قول نوشته شده توسط FastCode مشاهده تاپیک
    وظیفه اصلی DAL اینه که
    ۱.برنامه رو از دیتابیس جدا کنه و از وابستگی برنامه به دیتابیس جلوگیری کنه.
    متاسفانه این یکی از ایرادات ADO.Net هست که وابستگی برنامه به دیتابیس وجود داره.
    یکی از مزیت های خوب EF نسبت به ADO همین عدم وابستگی برنامه به دیتابیس هست.
    ADO چطور میتونه برنامه رو از این وابستگی نجات بده؟
    ۲.درخواست های برنامه رو به شکل object پاسخ بده.
    نظری ندارم.
    ۳.در صورتی که درخواست داده شده توسط دیتابیس پشتیبانی نمیشه خودش راهی پیدا کنه.مثلا اگر دیتابیس توابع مربوط به مقایسه رشته نداره خودش مقایسه رو انجام بده.
    یعنی ساختارهای کنترلی رو از روی لایه BLL به DAL منتقل کنیم؟
    اگر منظورت همچین چیزی هست اونوقت وظایف لایه BLL چی میشه؟
    یکی از تعریف هایی که برای لایه BLL میکنن اینه که میگن هسته اصلی و مغز متفکر برنامه در این لایه پیاده سازی میشه. اگر ساختارهای کنترلی رو از روی این لایه برداریم به نظرتون کارایی خودش رو از دست نمیده؟
    ۴.ساختاری ساده برای انجام تراکنش های دیتابیس به برنامه ارائه بده.
    این حرف قابل قبوله. چون مهمترین وظیفه این لایه ارتباط با دیتابیس هست و ارائه چنین ساختاری قابل پذیرش هست.

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

  22. #22
    کاربر دائمی آواتار FastCode
    تاریخ عضویت
    تیر 1388
    محل زندگی
    /dev/null
    پست
    3,486

    نقل قول: برنامه نویسی سه لایه

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

  23. #23
    کاربر دائمی
    تاریخ عضویت
    تیر 1389
    محل زندگی
    به جبر روزگار تهران هستم.
    پست
    2,718

    نقل قول: برنامه نویسی سه لایه

    نقل قول نوشته شده توسط FastCode مشاهده تاپیک
    منظور من از اینکه خودش یک سری عملیات رو در صورت لزوم انجام بده این بود:
    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 پیاده سازی بشه.

  24. #24
    کاربر دائمی
    تاریخ عضویت
    مرداد 1388
    محل زندگی
    کنار یه ساحل خیلی زیبا
    پست
    922

    نقل قول: برنامه نویسی سه لایه

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

  25. #25
    کاربر دائمی
    تاریخ عضویت
    تیر 1389
    محل زندگی
    به جبر روزگار تهران هستم.
    پست
    2,718

    نقل قول: برنامه نویسی سه لایه

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

تاپیک های مشابه

  1. مرجع آموزش برنامه نویسی سه لایه
    نوشته شده توسط maxpayn2 در بخش ASP.NET Web Forms
    پاسخ: 20
    آخرین پست: چهارشنبه 29 آبان 1387, 06:34 صبح
  2. مشکل با ReportViewr و برنامه نویسی چند لایه
    نوشته شده توسط mahdi_negahi در بخش ASP.NET Web Forms
    پاسخ: 0
    آخرین پست: شنبه 03 آذر 1386, 11:11 صبح
  3. برنامه نویسی چند لایه
    نوشته شده توسط niksoft در بخش VB.NET
    پاسخ: 2
    آخرین پست: سه شنبه 26 تیر 1386, 22:22 عصر
  4. استاندارد ماکروسافت برای برنامه نویسی 5 لایه
    نوشته شده توسط cactuskhan در بخش ASP.NET Web Forms
    پاسخ: 11
    آخرین پست: دوشنبه 24 اردیبهشت 1386, 10:22 صبح
  5. برنامه نویسی چند لایه در دلفی
    نوشته شده توسط Mahdavi در بخش مباحث عمومی دلفی و پاسکال
    پاسخ: 8
    آخرین پست: چهارشنبه 28 آبان 1382, 00:36 صبح

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •