"> آموزش عملیات اضافه ویرایش حذف توسط LINQ To SQL در ASP.NET

آموزش عملیات اضافه ویرایش حذف توسط LINQ To SQL در ASP.NET

LINQ To SQL

در این مقاله عملیات CRUD از طریق LINQ to SQL را خواهیم دید.پیش از این مقاله دیگری درباره LINQ to SQL داشتیم. قبل از مطالعه این مقاله توصیه می شود که اطلاعات اولیه ای درباره LINQ to SQL داشته باشید. برای مطالعه و کسب اطلاعات اولیه می توانید به لینک زیر مراجعه نمایید:

آشنایی با LINQ

بنابراین، LINQ چیست؟

LINQ کوتاه شده عبارت زبان یکپارچه کوئری است و ما را قادر می سازد که روی هر منبع داده ای (داکیومنت های SQL Server، اشیای درون حافظه و…) کوئری بزنیم.

در این مقاله به پوشش جزئیات نخواهیم پرداخت. جزئیات را می توانید در لینک بالا مطالعه کنید.

پس شروع می کنیم:

یک مثال ساده LINQ to SQL برای عملیات CRUD خواهیم ساخت.

ابتدا، یک اپلیکیشن خالی ایجاد کرده و نام مناسبی برای آن انتخاب می کنیم.

حالا، جدولی با نام registration ایجاد می کنیم. اسکریپت مربوط به ساخت جدول به شکل زیر است:

USE [TEST]  
GO  
  
/****** Object:  Table [dbo].[registration]    Script Date: 1/16/2017 11:53:27 PM ******/  
SET ANSI_NULLS ON  
GO  
  
SET QUOTED_IDENTIFIER ON  
GO  
  
CREATE TABLE [dbo].[registration](  
    [id] [int] IDENTITY(1,1) NOT NULL,  
    [FirstName] [nvarchar](max) NULL,  
    [MiddleName] [nvarchar](max) NULL,  
    [LastName] [nvarchar](max) NULL,  
    [Address] [nvarchar](max) NULL,  
    [Landmark] [nvarchar](max) NULL,  
    [EmailID] [nvarchar](max) NULL,  
    [Country] [nvarchar](max) NULL,  
    [State] [nvarchar](max) NULL,  
    [City] [nvarchar](max) NULL,  
    [MobileNumber] [nvarchar](max) NULL,  
 CONSTRAINT [PK_registration] PRIMARY KEY CLUSTERED   
(  
    [id] ASC  
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]  
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]  
  
GO   

اضافه کردن فایل DBML

حالا، یک کلاس LINQ to SQL اضافه می کنیم. برای این کار روی نام پروژه راست کلیک کرده، Add New Items و سپس در تب Data، LINQ to SQL Classes را انتخاب کرده و نام آن را “Sample.dbml” می گذاریم و روی گزینه OK کلیک می کنیم.

LINQ To SQL

حالا Server Explorer را از ویژوال استودیو باز کرده و به دیتابیسی که ساختیم می رویم. پس از آن، جدول registration را جستجو کرده و جدول را گرفته و در کلاس designer مربوط به LINQ to SQL رها می کنیم.

LINQ To SQL

زمانی که جدول را کشیده و در LINQ to SQL designer رها کنیم، به طور اتوماتیک یک business object برای ما می سازد. در اینجا، sampledatacontext فایل اصلی و نقطه ورود یا دروازه اپلیکیشن ماست. عملیاتی که ما قصد انجام آن را داریم مانند insert (درج)، update (به روزرسانی و تغییر) و delete (حذف کردن)، از طریق این فایل اتفاق خواهد افتاد. Sampledatacontext، connection string را برای ما در فایل web.config وارد می کند.

به این ترتیب، connection string به شکل زیر است.

LINQ To SQL

بخش رابط گرافیکی کاربر (GUI)

یک وب فرم اضافه می کنیم. حالا اجازه دهید که قسمت GUI را طراحی کنیم. ابتدا، فایل های کتابخانه هایی مثل bootstrap و jQuery را وارد می کنیم.

این ها فایل های پشتیبانی برای اپلیکیشن ماست. در اینجا می خواهیم یک modal popup اضافه کنیم. به همین دلیل، اول یک کنترل Script Manager را به داخل فرم می کشیم.

<asp:ScriptManager runat="server" ID="ScriptManager1" />   

حالا، Grid View را داخل کنترل UpdatePanel قرار می دهیم.

<!-- Placing GridView in UpdatePanel-->  
            <asp:UpdatePanel ID="upCrudGrid" runat="server">  
                <ContentTemplate>  
                            
                    <asp:GridView ID="GridView1" runat="server" Width="940px" HorizontalAlign="Center" OnRowCommand="GridView1_RowCommand" AutoGenerateColumns="false" AllowPaging="true" CssClass="table table-hover table-striped">  
                        <Columns>  
                            
                              
                            <asp:BoundField DataField="id" HeaderText="ID"/>  
                            <asp:BoundField DataField="FirstName" HeaderText="FirstName"/>  
                                  <asp:BoundField DataField="MiddleName" HeaderText="MiddleName"/>  
                            <asp:BoundField DataField="LastName" HeaderText="LastName"/>  
                            <asp:BoundField DataField="Address" HeaderText="Address"/>  
                            <asp:BoundField DataField="Landmark" HeaderText="Landmark"/>  
                            <asp:BoundField DataField="EmailID" HeaderText="Email"/>  
                             <asp:BoundField DataField="Country" HeaderText="Country"/>  
                             <asp:BoundField DataField="State" HeaderText="State"/>  
                             <asp:BoundField DataField="City" HeaderText="City"/>  
                             <asp:BoundField DataField="MobileNumber" HeaderText="MobileNo"/>                          
                                    <asp:ButtonField CommandName="editRecord" ControlStyle-CssClass="btn btn-info" ButtonType="Button" Text="Edit" HeaderText="Edit Record" >  
                                <ControlStyle CssClass="btn btn-primary" ></ControlStyle>  
                            </asp:ButtonField>  
                            <asp:ButtonField CommandName="deleteRecord" ControlStyle-CssClass="btn btn-info" ButtonType="Button" Text="Delete" HeaderText="Delete Record">  
                                <ControlStyle CssClass="btn btn-danger"></ControlStyle>  
                            </asp:ButtonField>  
                        </Columns>  
                    </asp:GridView>  
                    <asp:Button ID="btnAdd" runat="server" Text="Add New Record" CssClass="btn btn-info" OnClick="btnAdd_Click" />  
                </ContentTemplate>  
                <Triggers>  
                </Triggers>  
            </asp:UpdatePanel>   

در این کد، ما رکوردها را از دیتابیس انتخاب کرده به همراه دکمه هایی برای ویرایش و حذف؛ و در پایین آن، دکمه ای برای اضافه کردن رکورد جدید قرار می دهیم.

بعد از تنظیم GUI برای “Select”، حالا با استفاده از LINQ to SQL متد ساده ای برای “Select” می سازیم.

private void BindEmployee()  
       {  
           SampleDataContext dbcontext = new SampleDataContext();  
           GridView1.DataSource = from reg in dbcontext.registrations  
                                  select reg;  
           GridView1.DataBind();  
       }   

یک متد با عنوان BindEmployee() ساخته، یک شی از کلاس Sampledatacontext می سازیم و Grid View را با کوئری LINQ متصل می نماییم.

خب همانطور که مشاهده کردید، کد ساده ای است. حالا برنامه را اجرا کرده و خروجی را بررسی می نماییم.

خروجی برای select

LINQ To SQL

کد Insert

حالا بخش GUI را برای insert می سازیم.


<!-- Add Record Modal Starts here-->




<div id="addModal" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="addModalLabel" aria-hidden="true">

<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>




<h3 id="addModalLabel">Add New Record</h3>




</div>




<asp:UpdatePanel ID="upAdd" runat="server">
<ContentTemplate>




<div class="modal-body">

<table class="table table-bordered table-hover">





<tr>




<td>شناسه: </td>


<td>
<asp:TextBox ID="txtIdAdd" runat="server"></asp:TextBox></td>




</tr>


<tr>




<td>نام: </td>


<td>
<asp:TextBox ID="txtFirstName" runat="server"></asp:TextBox></td>




</tr>


<tr>




<td>نام میانی: </td>


<td>
<asp:TextBox ID="txtMiddleName" runat="server"></asp:TextBox></td>




</tr>


<tr>




<td>نام خانوادگی: </td>


<td>
<asp:TextBox ID="txtLastName" runat="server"></asp:TextBox></td>




</tr>


<tr>




<td>آدرس: </td>


<td>
<asp:TextBox ID="txtAddress" runat="server"></asp:TextBox></td>




</tr>


<tr>




<td>نشانی اختصاصی: </td>


<td>
<asp:TextBox ID="txtLandmark" runat="server"></asp:TextBox></td>




</tr>


<tr>




<td>ایمیل: </td>


<td>
<asp:TextBox ID="txtEmailID" runat="server"></asp:TextBox></td>




</tr>


<tr>




<td>کشور: </td>


<td>
<asp:TextBox ID="txtCountry" runat="server"></asp:TextBox></td>




</tr>


<tr>




<td>استان: </td>


<td>
<asp:TextBox ID="txtState" runat="server"></asp:TextBox></td>




</tr>


<tr>




<td>شهر: </td>


<td>
<asp:TextBox ID="txtCity" runat="server"></asp:TextBox></td>




</tr>


<tr>




<td>شماره موبایل: </td>


<td>
<asp:TextBox ID="txtMobileNumber" runat="server"></asp:TextBox></td>




</tr>




</table>




</div>


<div class="modal-footer">
<asp:Button ID="btnAddRecord" runat="server" Text="اضافه کردن" CssClass="btn btn-primary" OnClick="btnAddRecord_Click" />
<button class="btn btn-info" data-dismiss="modal" aria-hidden="true">بستن</button>
</div>




</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="btnAddRecord" EventName="Click" />
</Triggers>
</asp:UpdatePanel>
</div>





در اینجا، textboxهای مربوطه را در modal popup قرار داده و modal popup را در رویداد کلیک دکمه فراخوانی می کنیم.

در کد زیر مشاهده می کنیم که چگونه modal را از طریق code behind بالا بیاوریم.

     protected void btnAddRecord_Click(object sender, EventArgs e)  
        {  
  
                System.Text.StringBuilder sb = new System.Text.StringBuilder();  
                ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "AddHideModalScript", sb.ToString(), false);  
           
}   

به این ترتیب، این modal popup روی دکمه “رکورد جدید” است. برنامه را اجرا کرده و خروجی را بررسی می کنیم.

LINQ To SQL

خب، تا اینجا modal popup را هم با موفقیت ایجاد کردیم. حالا، کدهای موردنیاز برای insert را می نویسیم.

protected void btnAddRecord_Click(object sender, EventArgs e)  
        {  
  
            using (SampleDataContext dbcontext = new SampleDataContext())  
            {  
                registration reg = new registration();  
                reg.id = Convert.ToInt32(txtIdAdd.Text);  
                reg.FirstName = txtFirstName.Text;  
                reg.MiddleName = txtMiddleName.Text;  
                reg.LastName = txtLastName.Text;  
                reg.Address = txtAddress.Text;  
                reg.Landmark = txtLandmark.Text;  
                reg.EmailID = txtEmailID.Text;  
                reg.Country = txtCountry.Text;  
                reg.State = txtState.Text;  
                reg.City = txtCity.Text;  
                reg.MobileNumber = txtMobileNumber.Text;  
                dbcontext.registrations.InsertOnSubmit(reg);  
                dbcontext.SubmitChanges();  
  
  
                System.Text.StringBuilder sb = new System.Text.StringBuilder();  
                ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "AddHideModalScript", sb.ToString(), false);  
           
                BindEmployee();  
               // clearfields();  
            }  
        }   

ما کلاس Sampledatacontext را درون بلاک using قرار دادیم، تنها به این دلیل که مطمئن باشیم connection string را به ترتیب باز و بسته می کنیم. پس از آن، یک متغیر به نام reg ایجاد می کنیم و رکوردهای جدول registration را که در کلاس SampledataContext تعریف شدند، ارسال می کنیم. این کار مقادیری را که با property ها (در اینجا textbox ها) پر شدند، ارسال می کند. و در آخر، submitchanges() را برای ثبت این جزئیات در دیتابیس و نمایش یک popup که رکوردها با موفقیت درج شدند، فراخوانی می شود.

LINQ To SQL

انجام ویرایش

روی دکمه ویرایش، ما می خواهیم جزئیات آن کارمند بارگذاری شود.

LINQ To SQL

اجازه بدهید قسمت GUI را برای ویرایش کردن آماده کنیم.




<blockquote>
div id="editModal" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="editModalLabel" aria-hidden="true">



<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>



<h3 id="editModalLabel">Edit Record</h3>



</div>



<asp:UpdatePanel ID="upEdit" runat="server">
<ContentTemplate>



<div class="modal-body">

<table class="table">




<tr>



<td>شناسه: </td>


<td>
<asp:TextBox ID="txtID" runat="server"></asp:TextBox></td>



</tr>


<tr>



<td>نام: </td>


<td>
<asp:TextBox ID="txtFirstNameEdit" runat="server"></asp:TextBox></td>



</tr>


<tr>



<td>نام میانی: </td>


<td>
<asp:TextBox ID="txtMiddleNameEdit" runat="server"></asp:TextBox></td>



</tr>


<tr>



<td>نام خانوادگی: </td>


<td>
<asp:TextBox ID="txtLastNameEdit" runat="server"></asp:TextBox></td>



</tr>


<tr>



<td>آدرس: </td>


<td>
<asp:TextBox ID="txtAddressEdit" runat="server"></asp:TextBox></td>



</tr>


<tr>



<td>نشانی اختصاصی: </td>


<td>
<asp:TextBox ID="txtLandmarkEdit" runat="server"></asp:TextBox></td>



</tr>


<tr>



<td>ایمیل: </td>


<td>
<asp:TextBox ID="txtEmailIDEdit" runat="server"></asp:TextBox></td>



</tr>


<tr>



<td>کشور: </td>


<td>
<asp:TextBox ID="txtCountryEdit" runat="server"></asp:TextBox></td>



</tr>


<tr>



<td>استان: </td>


<td>
<asp:TextBox ID="txtStateEdit" runat="server"></asp:TextBox></td>



</tr>


<tr>



<td>شهر: </td>


<td>
<asp:TextBox ID="txtCityEdit" runat="server"></asp:TextBox></td>



</tr>


<tr>



<td>شماره موبایل: </td>


<td>
<asp:TextBox ID="txtMobileNumberEdit" runat="server"></asp:TextBox></td>



</tr>



</table>



</div>


<div class="modal-footer">
<asp:Label ID="lblResult" Visible="false" runat="server"></asp:Label>
<asp:Button ID="btnSave" runat="server" Text="به روز رسانی" CssClass="btn btn-info" OnClick="btnSave_Click" />
<button class="btn btn-info" data-dismiss="modal" aria-hidden="true">بستن</button>
</div>



</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="GridView1" EventName="RowCommand" />
<asp:AsyncPostBackTrigger ControlID="btnSave" EventName="Click" />
</Triggers>
</asp:UpdatePanel>
</div>



<!-- Edit Modal Ends here -->


</blockquote>



حالا کد مربوط به ویرایش را می نویسیم.

if (e.CommandName == "editRecord")  
            {  
               
                int index = Convert.ToInt32(e.CommandArgument);  
  
                GridViewRow gr = GridView1.Rows[index];  
                txtID.Text = gr.Cells[0].Text;  
                txtFirstNameEdit.Text = gr.Cells[1].Text;  
                txtMiddleNameEdit.Text = gr.Cells[2].Text;  
                txtLastNameEdit.Text = gr.Cells[3].Text;  
                txtAddressEdit.Text = gr.Cells[4].Text;  
                txtLandmarkEdit.Text = gr.Cells[5].Text;  
                txtEmailIDEdit.Text = gr.Cells[6].Text;  
                txtCountryEdit.Text = gr.Cells[7].Text;  
                txtStateEdit.Text = gr.Cells[8].Text;  
                txtCityEdit.Text = gr.Cells[9].Text;  
                txtMobileNumberEdit.Text = gr.Cells[10].Text;  
               ViewState["id"]= txtID.Text;  
  
  
  
  
                System.Text.StringBuilder sb = new System.Text.StringBuilder();  
                ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "EditModalScript", sb.ToString(), false);  
  
            }   

در اینجا ما مقادیر را از دیتابیس بازیابی کرده و آن ها را در فیلدهای مربوطه قرار می دهیم.

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

protected void btnSave_Click(object sender, EventArgs e)  
        {  
  
  
            using (SampleDataContext dbcontext = new SampleDataContext())  
            {  
  
                {  
               //      var reg = dbcontext.registrations.SingleOrDefault(x => x.id == 4);  
                   var reg = dbcontext.registrations.Single(employee => employee.id == Convert.ToInt32(ViewState["id"].ToString()));  
                    // string id = lblid.Text;  
                    reg.id = Convert.ToInt32(txtID.Text);  
                    reg.FirstName = txtFirstNameEdit.Text.ToString();  
                    reg.MiddleName = txtMiddleNameEdit.Text.ToString();  
                    reg.LastName = txtLastNameEdit.Text.ToString();  
                    reg.Address = txtAddressEdit.Text.ToString();  
                    reg.Landmark = txtLandmarkEdit.Text.ToString();  
                    reg.Country = txtCountryEdit.Text.ToString();  
                    reg.State = txtStateEdit.Text.ToString();  
                    reg.City = txtCityEdit.Text.ToString();  
                    reg.EmailID = txtEmailIDEdit.Text.ToString();  
                    reg.MobileNumber = txtMobileNumberEdit.Text.ToString();  
                }  
                
  
            dbcontext.SubmitChanges();  
            
            BindEmployee();  
             
            BindEmployee();  
            System.Text.StringBuilder sb = new System.Text.StringBuilder();  
            ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "EditHideModalScript", sb.ToString(), false);  
            }  
  
        }   

ما کلاس Sampledatacontext را درون بلاک using قرار دادیم، تنها به این دلیل که مطمئن باشیم connection string را به ترتیب باز و بسته می کنیم. پس از آن، یک متغیر به نام reg ایجاد می کنیم و رکوردهای جدول registration را که در کلاس SampledataContext تعریف شدند، ارسال می کنیم. این کار مقادیری را که با property ها (در اینجا textbox ها) پر شدند، ارسال می کند. و در آخر، submitchanges() را برای ثبت این جزئیات در دیتابیس و نمایش یک popup که رکوردها با موفقیت درج شدند، فراخوانی می شود.

کد حذف کردن

بخش GUI


<!--Add Record Modal Ends here-->
<!-- Delete Record Modal Starts here-->


<div id="deleteModal" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="delModalLabel" aria-hidden="true">

<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>


<h3 id="delModalLabel">حذف رکورد</h3>


</div>


<asp:UpdatePanel ID="upDel" runat="server">
<ContentTemplate>


<div class="modal-footer">
<asp:Button ID="btnDelete" runat="server" Text="حذف" CssClass="btn btn-info" OnClick="btnDelete_Click" />
<button class="btn btn-info" data-dismiss="modal" aria-hidden="true">انصراف</button>
</div>


</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="btnDelete" EventName="Click" />
</Triggers>
</asp:UpdatePanel>
</div>


<!--Delete Record Modal Ends here -->

کدهای بخش Delete

if (e.CommandName == "deleteRecord")  
          {  
  
          int emp_ID = Convert.ToInt32(e.CommandArgument);  
          SampleDataContext empDB = new SampleDataContext();  
          var emp = empDB.registrations.Single(employee => employee.id == emp_ID);  
          empDB.registrations.DeleteOnSubmit(emp);  
          empDB.SubmitChanges();  
          BindEmployee();  
      }   

این قسمت کد ساده ای است. روی دکمه حذف، ابتدا ID کارمند را می گیریم و سپس شی Sampledatacontext را کلاس نمونه دوباره ایجاد می کنیم. متد DeleteOnSubmit() را فراخوانی کرده و ID را حذف می کنیم.

کد برای ویرایش و حذف

protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)  
        {  
  
            if (e.CommandName == "deleteRecord")  
                {  
  
                int emp_ID = Convert.ToInt32(e.CommandArgument);  
                SampleDataContext empDB = new SampleDataContext();  
                var emp = empDB.registrations.Single(employee => employee.id == emp_ID);  
                empDB.registrations.DeleteOnSubmit(emp);  
                empDB.SubmitChanges();  
                BindEmployee();  
            }  
          else   if (e.CommandName == "editRecord")  
            {  
               
                int index = Convert.ToInt32(e.CommandArgument);  
  
                GridViewRow gr = GridView1.Rows[index];  
                // string id = gr.Cells[0].Text;  
                // lblid.Text = gr.Cells[index].Text;  
                // int emp_ID = 0;  
                // lblid.Text = gr.Cells[0].Text;  
                //  txtID.Text = gr.Cells[0].Text;  
                txtID.Text = gr.Cells[0].Text;  
                txtFirstNameEdit.Text = gr.Cells[1].Text;  
                txtMiddleNameEdit.Text = gr.Cells[2].Text;  
                txtLastNameEdit.Text = gr.Cells[3].Text;  
                txtAddressEdit.Text = gr.Cells[4].Text;  
                txtLandmarkEdit.Text = gr.Cells[5].Text;  
                txtEmailIDEdit.Text = gr.Cells[6].Text;  
                txtCountryEdit.Text = gr.Cells[7].Text;  
                txtStateEdit.Text = gr.Cells[8].Text;  
                txtCityEdit.Text = gr.Cells[9].Text;  
                txtMobileNumberEdit.Text = gr.Cells[10].Text;  
               ViewState["id"]= txtID.Text;  
  
  
  
  
                System.Text.StringBuilder sb = new System.Text.StringBuilder();  
                ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "EditModalScript", sb.ToString(), false);  
  
            }  
        }   

به این ترتیب کار ما تمام شد. حالا برنامه را اجرا کرده و عملیات CRUD در LINQ to SQL اجرا می کنیم.
نمونه سورس پروژه نیز ضمیمه شده است میتوانید استفاده کنید.

فاطمه زکایی

فاطمه زکایی هستم. فارغ التحصیل کارشناسی مهندسی نرم افزار، مدت سه سال هست که در زمینه توسعه اپلیکیشن های تحت وب و اندروید و همچنین تولید محتوای تخصصی برنامه نویسی تحت وب و اندروید در مجموعه mspsoft در خدمت شما هستم.

نوشته‌های مرتبط

دیدگاه‌ها

*
*

این سایت از اکیسمت برای کاهش هرزنامه استفاده می کند. بیاموزید که چگونه اطلاعات دیدگاه های شما پردازش می‌شوند.