HOW 2 LEARN ASP.NET
نویسنده : delshad
تاریخ  : ۱۳۸۸/۸/۴
امتیاز :
بازدید : 3928
موضوع : آموزش LINQ قسمت دوم LINQ To SQL
توضیحات : در این مقاله لینک به اس کیو ال و اعمال متداول بانک اطلاعاتی SQL Server توسط LINQ آموزش داده خواهد شد
     

آموزش 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 استفاده نموده ام .

 

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

 


 

 

 
امتیاز بدهید :

نویسنده : ندا ghasemzadehneda@yahoo.com ۱۳۸۹ بيست و چهارم فروردين
مقاله فوق العاده کاملی بود. متشکرم
نویسنده : sama hanaa_711@yahoo.com ۱۳۸۸ بيست و يکم بهمن
سلام.خدا قوت من در حال نوشتن يك برنامه به زبان asp.net هستم.كه اين برنامه به يك بانك اطلاعاتيsql server2005 متصل است.(صفحه جستجو شامل يك دكمه جستجو و يك textboxويك grid view مي باشد.) در صفحه جستجو خود در برنامه دچار مشكل شده ام چون مي خواهم در صفحه جستجو براساس نوشتن يك كد شناسايي در textbox اطلاعات را از بانك اطلاعاتي جستجو كرده ودر gridview قرار دهد.كد شناسايي دريافت مي شود اما اطلاعات مربوط به آن كد شناسايي در gridviewقرار داده نمي شود. باتشكر فراوان من به اين برنامه نياز خيلي فوري دارم.سپاس فراوان
نویسنده : lol lol@lol.lol ۱۳۸۸ پانزدهم بهمن
agar ahyanan manzooret az linq =>Language Integrated Query nist, in ro ba link avaz kon :D
نویسنده : Zorig zorig@aghakhanian.com ۱۳۸۸ پانزدهم آذر
خسته نباشید مقاله کاملی هست منتظر مقالات دیگر شما هستم

 
نظر بدهید :
لطفا سوالات فنی خود را در تالار گفتگو www.forum.how2learnasp.net مطرح نمایید
نام :  
ایمیل :    
نظرات :
 
Xml rss feed

 

Valid CSS! Atom rss feed
Ali Delshad Official Site