شروع کار با ASP.NET :: ( قسمت بیست و هفتم): آموزش LINQ قسمت دوم LINQ To SQL

بازدید کنندگان : 1372 دسته بندی برنامه نویسی , شروع کار با ASP.NET

آموزش LINQ قسمت دوم LINQ To SQL

در قسمت گذشته با LINQ آشنا شده و نحوه استفاده از LINQ را برای کار با اشیا یاد گرفتیم ، در این مقاله به یکی از مهمترین کاربردهای LINQ یعنی LINQ 2 SQL می پردازم .

در این مقاله سعی می کنم اعمال متداول بانک اطلاعاتی مانند دریافت اطلاعات ،درج ، به روزرسانی و حذف را توسط LINQ پیاده سازی کنم ، بدین منظور ابتدا دیتابیس News در SQL Server را با  جدول TBLNews ایجاد نمایید :

 

 

در این مثال بنده از توضیح واضحات خود داری کرده و بیشتر به بخش ها اصلی می پردازم ، فایل پروژه در انتها به صورت ضمیمه ارائه خواهد شد .

توجه : دقت نمایید برای کار با LINQ همانطور که در مقاله قبل عرض کردم باید از Visual Studio 2008 و Dotnetframework 3.5 به بالا استفاده نمایید .

یک پروژه جدید ASP.NET به نام NewsLINQ با زبان #C ایجاد کنید ، قبل از هر چیز کلاس مربوط به اشیاء LINQ را ایجاد نمایید ، بدین منظور وارد منوی WebSite و سپس Add New Item شده و یک LINQ to SQL Classess انتخاب نمایید ، نام آن را News.dbml گذاشته و دکمه تایید را بفشارید .

این فایل هسته اصلی LINQ to SQL را تشکیل داده و تمامی اعمال مورد نیاز شما را مدیریت می نماید .

در این پنجره باید تمام جدول ها بانک اطلاعات به صورت کلاسی از اشیا قرار گیرند ، بدین منظور از پنجره Server Explorer استفاده کرده یک Connection جدید ایجاد می کنیم و سپس جداول مورد نظرمان را به داخل این صفحه وارد می نماییم ، بنابراین وارد منوی View شده و Server Explorer را انتخاب نمایید ، سپس بر روی Data Connections کلیک راست کرده و گزینه Add Connection را برگزینید ، در پنجره باز شده ابتدا Server Name خود را که معمولا (local) است وارد نمایید (در صورتی که با Instance دیگری به SQL Server وصل می شوید آن را انتخاب نمایید) و در قدم بعدی از دیتابیس مورد نظرتان را از لیست انتخاب و دکمه OK را بفشارید :

اکنون شما در پنجره Server Explorer یک اتصال جدید به دیتابیس News ایجاد کرده اید ، شاخه های زیرین اتصال را باز نموده تا به لیست Table ها برسید ، جداول موجود را به داخل صفحه Drag کنید تا کلاس ها مورد نظر ایجاد شوند :

 

اکنون شما یک کلاس از اشیاء بانک اطلاعاتی ایجاد کرده اید که توسط آن به راحتی قادر هستید درخواست های مختلفی از بانک اطلاعاتی بنمایید ، رشته اتصال هم به صورت خودکار در Web.Config قرار گرفت ، این صفحه را ذخیره کرده و آن را ببندید .

ابتدا به سراغ فرم درج خبر ها می رویم ، پس از اینکه فرم را ایجاد کردید برای درج یک رکورد توسط LINQ به صورت زیر عمل نمایید :

       NewsDataContext db = new NewsDataContext(); // ایجاد یک شی جدید از کلاس بانک اطلاعاتی
        TBLNews news = new TBLNews(); // ایجاد یک شی جدید از جدول اخبار

        // نسبت دادن مقادیر داخل فرم به فیلد های جدول
        news.NewsTitle = txtAddTitle.Text;
        news.NewsDescription = txtAddDescription.Text;
        news.NewsContent = fckContent.Value;
        news.InsertDate = DateTime.Now;
        news.StartsDate = dpcAddStartsDate.EnDate;
        news.EndsDate = dpcAddEndsDate.EnDate;
        news.Flag = 1;
        news.Stat = 0;

        // بارگزاری تصویر
        if (fudAddPic.HasFile)
        {
            // نام فایل به یک نام تصادفی الصاق می شود ، این کار برای جلوگیری از ایجاد نام های تکراری است
            string PicName = System.IO.Path.GetRandomFileName() + "_" + fudAddPic.FileName;

            // تصویر بارگزاری می شود
            fudAddPic.SaveAs(Server.MapPath(@"~\Pics\") + PicName);


            news.NewsPic = PicName;

        }
        else
        {
            // در صورتی که عکسی انتخاب نشده باشد مقدار پیشفرض برای تصویر در بانک اطلاعاتی ذخیره می گردد
            news.NewsPic = "nopic.gif";
        }

        // پس از ثبت تغییرات این شی را داخل جدول مورد نظر درج کن
        db.TBLNews.InsertOnSubmit(news);
        // تغییرات ثبت شود
        db.SubmitChanges();

توجه  : بنده برای فیلد مشروح خبر ها از FckEditor و برای تاریخ شروع و پایان خبر از یک DatePicker استفاده کرده ام .

نکته : به دلیل استفاده از FCKEditor در این صفحه باید خاصیت ValidateRequest را در CodePage صفحه false نمایید (این کار مشکلی از نظر امنیتی به وجود نمی آورد چرا که این صفحه در بخش مدیریت سایت قرار خواهد گرفت):

<%@ Page Title="" Language="C#" MasterPageFile="~/Admin/AdminMasterPage.master" AutoEventWireup="true"
    CodeFile="News.aspx.cs" Inherits="Admin_News" ValidateRequest="false" %>

برای نمایش لیست خبر ها هم میتوانید از LinqDataSource به صورت ویزارد استفاده کنید هم می توانید یک Query به شکل زیر نوشته و آن را به یک GridView بایند نمایید :

NewsDataContext db = new NewsDataContext();

        var query = from row in db.TBLNews
                    orderby row.NewsID descending
                    select new
                    {
                        row.NewsID,
                        row.NewsTitle,
                        row.NewsDescription,
                        row.InsertDate,
                        row.Flag,
                        row.Stat

                    };

        gvNews.DataSource = query;
        gvNews.DataBind();

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

                // ایجاد یک شی جدید از کلاس بانک اطلاعاتی
                NewsDataContext db = new NewsDataContext();

                // رکورد مورد نظر با شرط بر روی فیلد مورد نظر دریافت می شود
                TBLNews news = db.TBLNews.Single(n => n.NewsID == Convert.ToInt32(e.CommandArgument));

                // پس از ثبت رکورد مورد نظر را حذف کن
                db.TBLNews.DeleteOnSubmit(news);


                // تغییرات ثبت شود
                db.SubmitChanges();

یا میتوان به صورت زیر هم نوشت :

                // ایجاد یک شی جدید از کلاس بانک اطلاعاتی
                NewsDataContext db = new NewsDataContext();

                // رکورد مورد نظر با شرط بر روی فیلد مورد نظر دریافت می شود
                var news = from row in db.TBLNews
                           where row.NewsID == Convert.ToInt32(e.CommandArgument)
                           select row;

                // پس از ثبت رکورد مورد نظر را حذف کن
                db.TBLNews.DeleteAllOnSubmit(news);

                // تغییرات ثبت شود
                db.SubmitChanges();

برای ویرایش یک رکورد ابتدا رکورد مورد نظر را دریافت کرده و فرم را از اطلاعات پر می کنیم ، پس از تایید تغییرات اطلاعات به روز رسانی خواهد شد .

کد LINQ برای دریافت رکورد مربوطه و نسبت دادن مقادیر به کنترل های فرم به صورت زیر  است :

   // ایجاد یک شی جدید از کلاس بانک اطلاعاتی
                NewsDataContext db = new NewsDataContext();

                // رکورد مورد نظر با شرط بر روی فیلد مورد نظر دریافت می شود
                TBLNews news = db.TBLNews.Single(n => n.NewsID == Convert.ToInt32(e.CommandArgument));

                // اطلاعات وارد فرم می شود

                txtEditTitle.Text = news.NewsTitle;
                txtEditDescription.Text = news.NewsDescription;

                dpcEditStartsDate.EnDate = news.StartsDate;
                dpcEditEndsDate.EnDate = news.EndsDate;

                fckEditContent.Value = news.NewsContent;

                ThumbPic1.ImageUrl = "~/Pics/" + news.NewsPic;

                // کد خبر در یک ویو استیت برای مرحله بعد ذخیره می شود
                ViewState["newsId"] = news.NewsID;

و کد های LINQ برای به روز رسانی مقادیر تغییر یافته به شکل زیر خواهد بود :

  // ایجاد یک شی جدید از کلاس بانک اطلاعاتی
        NewsDataContext db = new NewsDataContext();

        // رکورد مورد نظر با شرط بر روی فیلد مورد نظر دریافت می شود
        TBLNews news = db.TBLNews.Single(n => n.NewsID == Convert.ToInt32(ViewState["newsId"]));

        // نسبت دادن مقادیر جدید داخل فرم به فیلد های جدول
        news.NewsTitle = txtEditTitle.Text;
        news.NewsDescription = txtEditDescription.Text;
        news.NewsContent = fckEditContent.Value;
        news.StartsDate = dpcEditStartsDate.EnDate;
        news.EndsDate = dpcEditEndsDate.EnDate;

        // بارگزاری تصویر
        if (fudEditPic.HasFile)
        {
            // اگر خبر دارای تصویر بود
            if (news.NewsPic != "nopic.gif")
            {
                // تصویر قبلی حذف می شود
                try
                {
                    System.IO.File.Delete(Server.MapPath(@"~\Pics\") + news.NewsPic);
                }
                catch { }
            }

            // عکس جدید بارگزاری می شود
            // نام فایل به یک نام تصادفی الصاق می شود ، این کار برای جلوگیری از ایجاد نام های تکراری است
            string PicName = System.IO.Path.GetRandomFileName() + "_" + fudEditPic.FileName;

            // تصویر بارگزاری می شود
            fudEditPic.SaveAs(Server.MapPath(@"~\Pics\") + PicName);

            // نام تصویر جدید نسبت داده می شود
            news.NewsPic = PicName;

        }

        // تغییرات ثبت می شود
        db.SubmitChanges();

نکته 1 : به بخش بارگزاری فایل دقت بیشتری نمایید ، در صورتی که نام عکس Nopic.gif نباشد (یعنی خبر دارای تصویر باشد) ابتدا عکس را حذف کرده و سپس عکس جدید را بارگزاری می کنیم

نکته 2 : از ViewState برای انتقال کد خبر پس از PostBack استفاده شده است

نکته 3 : برای نمایش تصویر در ابعاد کوچک تر در هنگام ویرایش از کنترل Delshad ThumbPic استفاده نموده ام .

 

فایل ضمیمه پروژه را میتوانید از اینجا دانلود فرمایید .

 

نظرات کاربران