عملیات انتخاب، درج، حذف و ویرایش

در این درس شما را با نحوه ی کد نویسی در لایه ها آشنا می کنم . همانطور که در درس های قبلی خواندیم ، بانک اطلاعاتی برنامه متشکل از یک جدول با 3 فیلد می باشد . حال قصد داریم 4 عمل اصلی را برای این جدول پیاده سازی کنیم . ابتدا برای راحتی کار و ساده تر شدن نگهداری و تغییر برنامه باید رشته اتصال به بانک اطلاعاتی را در یک مکان تعریف کنیم تا اگر نیاز به تغییر آن داشتید فقط یک مکان را تغییر دهید . برای این کار باید رشته اتصال را در فایل App.config برنامه قرار دهید ، به شکل زیر این کار را انجام می دهیم :
ThreeLayer-In-Csharp-19

ThreeLayer-In-Csharp-20

بر روی فایل ایجاد شده دوبار کلیک کرده و کد های آن را به شکل زیر تغییر دهید :

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<connectionStrings>
<add name="DatabaseConnectionString" connectionString="Data Source=(LocalDB)\MSSQLLocalDB;
AttachDbFilename=|DataDirectory|\PhoneBookDatabase.mdf;
Integrated Security=True;Connect Timeout=30"/>
</connectionStrings>
</configuration>

حال چونکه که می خواهیم از این رشته اتصال در قسمت DataAccessLayer استفاده کنیم ، باید اسمبلی System.Configuration را به این قسمت اضافه کنیم . برای این کار به مراحل زیر توجه کنید :

ThreeLayer-In-Csharp-21

ThreeLayer-In-Csharp-22

و در نهایت فضای نام System.Configuration را به کلاس tablePerson موجود در لایه DataAccessLayer اضافه کنید .

برای نوشتن کد های دسترسی به بانک و 4 عمل اصلی باید کد ها را در لایه ی Data Access بنویسیم .

انتخاب اطلاعات

ابتدا بر روی فایل tablePerson.cs در لایه ی DataAccessLayer دوبار کلیک کنید Connection را به صورت زیر تعریف کنید :

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

using System.Configuration;

namespace DataAccessLayer
{
    public class tablePerson
    {
        private SqlConnection databaseConnection = new SqlConnection();

        public tablePerson()
        {
            this.databaseConnection.ConnectionString = ConfigurationManager.ConnectionStrings["DatabaseConnectionString"].ConnectionString;
        }
    }
}

در کد بالا نام رشته اتصالی را که قبلا در فایل App.Config تعریف کرده بودیم را در خاصیت ConnectionStrings کلاس ConfigurationManager و سپس خروجی آنرا در خاصیت ConnectionString فیلد databaseConnection قرار داده ایم.
برای نوشتن عمل واکشی اطلاعات ، بر روی فایل tablePerson.cs در لایه ی DataAccessLayer دوبار کلیک کرده و کد زیر را در کلاس tablePerson قرار دهید :

public DataTable Select()
{
    string selectQuery = "SELECT * FROM tablePerson;";
    SqlDataAdapter SqlDataAdapter1 = new SqlDataAdapter(selectQuery, this.databaseConnection);
    DataTable DataTable1 = new DataTable();
    SqlDataAdapter1.Fill(DataTable1);
    SqlDataAdapter1.SelectCommand.Connection.Close();
    return DataTable1;
}

کد بالا عمل واکشی اطلاعات را به صورت یک متد در لایه ی DataAccessLayer تعریف می کند . حال باید یک متد نظیر را در لایه ی BusinessLoginLayer برای آن تعریف کنیم . بر روی فایل tablePerson.cs لایه ی Business Logic دوبار کلیک کرده و کد زیر را بنویسید :

public DataTable Select()
{
    DataAccessLayer.tablePerson DALTablePerson1 = new DataAccessLayer.tablePerson();
    return DALTablePerson1.Select();
}

کد بالا یک شی از کلاس tablePerson موجود در لایه ی Data Access ساخته و متد Select آن را فراخوانی می کند . در مرحله آخر باید اطلاعات را در فرم نمایش دهیم . بر روی فرم دوبار کلیک کرده و کد زیر را در رویداد Load آن بنویسید :

BusinessLogicLayer.tablePerson BLLTablePersonels1 = new BusinessLogicLayer.tablePerson();
this.dataGridView1.DataSource = BLLTablePersonels1.Select();

برنامه را اجرا کنید و نتیجه را مشاهده کنید.

ثبت اطلاعات

نمای کلی عملیات ثبت به شکل زیر می باشد :
ThreeLayer-csharp-main
ابتدا یک متد در لایه DataAccessLayer برای عمل درج اطلاعات می نویسیم ، بر روی فایل tablePerson در این لایه دوبار کلیک کرده و یک متد به شکل زیر به این کلاس اضافه کنید :

public void Insert(DataEntityLayer.tablePerson newPerson)
{
    string insertQuery = "Insert Into tablePerson(Name,Family) VALUES(@Name, @Family);";
    try
    {
        SqlCommand insertCommand = new SqlCommand(insertQuery, this.databaseConnection);
        insertCommand.Parameters.AddWithValue("@Name", newPerson.Name);
        insertCommand.Parameters.AddWithValue("@Family", newPerson.Family);
        this.databaseConnection.Open();
        int result = insertCommand.ExecuteNonQuery();
    }
    catch (Exception ex)
    {
        throw ex;
    }
    finally {
        this.databaseConnection.Close();

    }
}

همانطور که در خط 8 مشاهده می کنید از آنجاییکه DataEntityLayer.tablePerson معادل یک رکورد از بانک اطلاعاتی می باشد ، مقادیر پارامتر ها را از خصوصیات این شی میگیریم و در بانک ثبت می کنیم .حال به مانند متد Select یک متد معادل در لایه BusinessLogicLayer برای متد Insert اضافه می کنیم . بر روی فایل tablePerson در لایه BusinessLogicLayer دوبار کلیک کرده و متدی به شکل زیر به این کلاس اضافه کنید :

public void Insert(DataEntityLayer.tablePerson newPerson)
{
    if (!string.IsNullOrEmpty(newPerson.Name) && !string.IsNullOrEmpty(newPerson.Family))
    {
        try
        {
            DataAccessLayer.tablePerson DALTablePerson1 = new DataAccessLayer.tablePerson();
            DALTablePerson1.Insert(newPerson);
        }
        catch (Exception)
        {
            throw new Exception("Error in inserting into the database, Please try again");
        }            
    }
    else
    {
        throw new Exception("Please Enter Name And Family ...");
    }
}

در متد بالا اعتبارسنجی مقادیری که در خصوصیات Name و Family وجود دارد را با استفاده از متد IsNullOrEmpty کلاس string انجام می دهیم.اگر کاربر مقادیر را وارد کرده باشد عمل اصلی را بر روی بانک اطلاعاتی انجام می دهیم . حال بر روی دکمه ی درج در فرم برنامه دوبار کلیک کرده و کد زیر را می نویسیم :

DataEntityLayer.tablePerson tablePerson1 = new DataEntityLayer.tablePerson(txtName.Text, txtFamily.Text);
BusinessLogicLayer.tablePerson BLLTablePerson1 = new BusinessLogicLayer.tablePerson();
try
{
    BLLTablePerson1.Insert(tablePerson1);
    MessageBox.Show("New person has been successfully inserted into database");
    this.dataGridView1.DataSource = BLLTablePerson1.Select();
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message);
}

در خط 2 یک شی از کلاس tablePerson که در لایه ی DataEntityLayer قرار دارد ایجاد می کنیم . داده هایی که از فرم می گیریم(نام و نام خانوادگی) نظیر به نظیر در خصوصیات این شی قرار می دهیم . سپس این شی را برای عملیات اعتبار سنجی به لایه ی Business Logic تحویل می دهیم .

حذف اطلاعات

برای نوشتن متد حذف ابتدا بر روی فایل tablePerson در لایه DataAccess دوبار کلیک کرده و سپس متد زیر را به این کلاس اضافه کنید :

public void Delete(int index)
{
    string deleteQuery = "DELETE FROM tablePerson Where Id = @Id;";
    try
    {
        SqlCommand SqlCommand1 = new SqlCommand(deleteQuery, this.databaseConnection);
        SqlCommand1.Parameters.AddWithValue("@Id", index);
        SqlCommand1.Connection.Open();
                
        int result = SqlCommand1.ExecuteNonQuery();                
    }
    catch (Exception ex)
    {
        throw ex;
    }
    finally {
        this.databaseConnection.Close();
    }
}

در مرحله دوم متد زیر را به کلاس tablePerson در لایه BussinessLogicLayer اضافه کنید :

public void Delete(int index)
{
    if (index > 0)
    {
        try
        {
            DataAccessLayer.tablePerson DALTablePerson1 = new DataAccessLayer.tablePerson();
            DALTablePerson1.Delete(index);
        }
        catch (Exception)
        {
            throw new Exception("Error in deleting record...Please try again");
        }
    }
    else
    {
        throw new Exception("Please enter person id");
    }
}

در نهایت بر روی دکمه ی حذف بر روی فرم دوبار کلیک کرده و کد زیر را در رویداد کلیک آن بنویسید :

if (this.dataGridView1.Rows.Count > 0)
{
    if (MessageBox.Show("Are you sure , you want to delete this record?",
                        "Warning", 
                        MessageBoxButtons.YesNo) == DialogResult.Yes)
    {
        int personelRowIndex = Convert.ToInt32(this.dataGridView1.CurrentRow.Cells[0].Value.ToString());
        BusinessLogicLayer.tablePerson BLLTablePerson1 = new BusinessLogicLayer.tablePerson();
        try
        {
            BLLTablePerson1.Delete(personelRowIndex);
            this.dataGridView1.DataSource = BLLTablePerson1.Select();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }                
}

در کد بالا ابتدا بررسی می کنیم که آیا رکوردی برای حذف وجود دارد یا نه . در صورتی درستی این مطلب شماره آن رکورد را گرفته و برای حذف به لایه BusinessLogicLayer ارسال می کنیم .

ویرایش اطلاعات

ابتدا متد زیر را به کلاس tablePerson در لایه DataAccessLayer اضافه می کنیم :

public void Update(DataEntityLayer.tablePerson personToUpdate)
{
    string updateQuery = "UPDATE tablePerson SET Name=@Name,Family=@Family WHERE Id=@Id;";            
    try
    {
        SqlCommand updateCommand = new SqlCommand(updateQuery, this.databaseConnection);
        updateCommand.Parameters.AddWithValue("@Name", personToUpdate.Name);
        updateCommand.Parameters.AddWithValue("@Family", personToUpdate.Family);
        updateCommand.Parameters.AddWithValue("@Id", personToUpdate.Id);
        updateCommand.Connection.Open();
        updateCommand.ExecuteNonQuery();
    }
    catch (Exception ex)
    {
        throw ex;
    }
    finally
    {
        this.databaseConnection.Close();
    }
}

سپس متد معادل را برای اعتبارسنجی مقادیر به لایه منطقی(BusinessLogicLayer) اضافه می کنیم :

public void Update(DataEntityLayer.tablePerson personToUpdate)
{
    if (personToUpdate.Id > 0 &&
        !string.IsNullOrEmpty(personToUpdate.Name) &&
        !string.IsNullOrEmpty(personToUpdate.Family))
    {
        try
        {
            DataAccessLayer.tablePerson DALTablePerson1 = new DataAccessLayer.tablePerson();
            DALTablePerson1.Update(personToUpdate);
        }
        catch (Exception)
        {
            throw new Exception("Error in updating information , Please try again");
        }
    }
    else
    {
        throw new Exception("Please enter all information");
    }
}

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

if (this.dataGridView1.Rows.Count > 0)
{
                
    if (this.btnUpdate.Text == "Update")
    {
        string Name = this.dataGridView1.CurrentRow.Cells[1].Value.ToString();
        string Family = this.dataGridView1.CurrentRow.Cells[2].Value.ToString();

        this.txtName.Text = Name;
        this.txtFamily.Text = Family;
        this.btnUpdate.Text = "Submit Update";
        this.btnInsert.Enabled = false;
        this.btnDelete.Enabled = false;
    }
    else
    {
        try
        {
            int personIndex = Convert.ToInt32(this.dataGridView1.CurrentRow.Cells[0].Value.ToString());
            DataEntityLayer.tablePerson personToUpdate = new DataEntityLayer.tablePerson(personIndex, 
                                                         txtName.Text.Trim(), 
                                                         txtFamily.Text.Trim());
            BusinessLogicLayer.tablePerson BLLTablePerson1 = new BusinessLogicLayer.tablePerson();
            BLLTablePerson1.Update(personToUpdate);
            this.dataGridView1.DataSource = BLLTablePerson1.Select();
            MessageBox.Show("Record updated successfully");
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
        finally
        {
            this.btnUpdate.Text = "Update";
            this.btnInsert.Enabled = true;
            this.btnDelete.Enabled = true;
            this.txtName.Text = string.Empty;
            this.txtFamily.Text = string.Empty;
        }
    }
}

این دکمه باید یک وضعیت 2 حالتی داشته باشد . اگر متد روی این دکمه “Update” باشد باید داده ها را از Datagridview به جعبه های متن انتقال دهیم و متن روی آن را به “Submit Update” تغییر دهیم . اگر متن روی آن “Submit Update” باشد باید عملیات ویرایش را انجام دهیم. روند عمل ویرایش نیز مانند ثبت و حذف می باشد . یعنی یک شی از کلاس tablePerson لایه ی DataEntityLayer می سازیم و بعد از اعتبار سنجی آن به وسیله ی لایه ی Business Logic آن را برای عملیات نهایی به لایه ی Data Access تحویل می دهیم .

 
دانلود پروژه معماری سه لایه