دسترسی به منابع داده‌ای با LINQ
تکنیک‌های کاربردی استخراج داده‌ها با لینک (بخش دوم)
در شماره گذشته با تعدادی از محاوره‌های لینک آشنا شدیم. در این شماره در نظر داریم تعداد دیگری از محاوره‌های لینک را که در ارتباط با اجرای مرحله به مرحله دستورات، اتصال به بانک‌های اطلاعاتی و... است مورد بررسی قرار دهیم. با توجه به این‌که لینک از سوی برنامه‌نویسان با تجربه مورد استفاده قرار می‌گیرد در نتیجه برای آن‌که مقاله بیش از اندازه طولانی نشود، ما به‌طور مستقیم محاوره‌ها را مورد بررسی قرار داده و خروجی آن‌ها را به شما نشان داده‌ایم.

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

محاوره شماره شش، به‌کارگیری دیباگر برای اجرای مرحله به مرحله یک 
شاید بزرگ‌ترین و شاخص‌ترین ویژگی لینک در ارتباط با اجرای مرحله به مرحله یک محاوره باشد. درست به‌همان شکلی که در برنامه‌نویسی‌های روزمره می‌توانید از نقاط شکست برای اجرای خط به خط دستورات استفاده کنید، در زمان اجرای محاوره‌های لینک هم می‌توانید از چنین قابلیتی استفاده کنید. این تکنیک به شما اجازه می‌دهد تا در پنجره‌های دیباگ مراحل اجرای کامل یک محاوره را مشاهده کنید. قطعه کدی که در فهرست شماره یک مشاهده می‌کنید را در یک برنامه کاربری وارد کرده و کلید (F10 (Step Over را فشار دهید. 

Static void Main(string[] args)
{
            Int32[] ArrayA = {1،2،3،4،5};
            Int32[] ArrayB = { 6،7،8،5،4};
            var MyQuery =
   from QueryA in ArrayA
   from QueryB in ArrayB
   let TheSquare = QueryA * QueryB
   where TheSquare > 4
   select new { QueryA، QueryB، TheSquare };
            foreach(var str in MyQuery)
            Console.WriteLine(str);
        }

فهرست شماره یک

مطلب پیشنهادی

تکنیک‌های کاربردی استخراج داده‌ها با لینک (بخش اول)

به پنجره Locals دقت کنید. با اجرای مرحله به مرحله این محاوره (فشار کلید F10) این پنجره اطلاعات کاملی در ارتباط با محاوره‌ای که در حال اجرا است به شما نشان می‌دهد. (شکل 1) اما سوال اصلی این است که عناصر نشان داده شده در پنجره Locals چه اطلاعاتی را در اختیار ما قرار می‌دهند؟ همان‌گونه که در شکل یک مشاهده می‌کنید،  این محاوره از اجزا مختلفی ساخته شده است. 

شکل 1

MyQuery: اگر به یاد داشته باشید، گفتیم که متغیر نگهدارنده یک عبارت یکی از اجزاء اصلی یک محاوره لینک به‌شمار می‌رود و محاوره را در خود ذخیره‌سازی می‌کند. اگر در شکل 1 دقت کنید، مشاهده می‌کنید که MyQuery متغیری از نوع <String> System.Collections.Generic.Ienumerable است که نشان می‌دهد لینک با آرایه‌ایی از مقادیر رشته‌ایی در حال کار است، بدون آن‌که شما به‌طور صریح نوع آن‌را مشخص کرده باشید. در زمان کار با محاوره‌های لینک متدها و خاصیت‌های مختلفی وجود دارند که به شما در زمان کار با داده‌ها کمک می‌کنند. 
خاصیت‌ System.Collections.Generic.Ienumerator.Current : به ما اعلام می‌دارد که هم اکنون چه مقادیری در حال پردازش هستند. 
Result View: این متد مقادیر دریافتی را در قالب فهرستی و پیش از آن‌که محاوره در حلقه foreach اجرا شود، نشان می‌دهد. زمانی‌که محاوره وارد حلقه اجرایی شد این متد غیرفعال می‌شود.
Index: تعداد عناصر برگشتی توسط محاوره را نشان می‌دهد.
محاوره‌هایی که تا این بخش از مقاله به آن‌ها اشاره کردیم در گروه محاوره‌های ساده لینک شناخته می‌شوند. محاوره‌هایی که عملگرها و متدهای ساده‌ای را به‌خدمت می‌گرفتند. اکنون در نظر داریم تا محاوره‌های سطح بالاتری از لینک را به شما نشان دهیم. به‌شکلی که با استفاده از آن‌ها بتوانید داده‌هایی را از یک منبع داده‌ای دریافت کرده، داده‌ها را ویرایش کرده یا آن‌ها را حذف کنید. در ابتدا در نظر داریم به سراغ بانک‌های اطلاعاتی رابطه‌ای برویم. 
برای این منظور به سراغ محاوره‌هایی خواهیم رفت که در گروه LINQ to SQL قرار می‌گیرند. محاور‌ه‌های قدرتمندی که کار با بانک‌های اطلاعاتی را ساده می‌کنند.

LINQ to SQL چیست؟
LINQ to SQL یک ابزار نگاشت رابطه‌ای اشیا است که به شما اجازه می‌دهد عناصر بانک‌های اطلاعاتی رابطه‌ای را شبیه به کلاس‌های دات‌نت مورد استفاده قرار دهید. در نتیجه به‌سادگی این توانایی را خواهید داشت تا محاوره‌ها را روی بانک‌های اطلاعاتی پیاده‌سازی کنید. LINQ to SQL با پشتیبانی کامل از تراکنش‌ها، نماها و روال‌های ذخیره شده یک راه آسان برای پیاده‌سازی محاوره‌هایی با دقت و ظرافت بالا را امکان‌پذیر می‌سازد. با استفاده از LINQ to SQL این توانایی را دارید تا کلاس‌هایی را به‌عنوان موجودیت‌ها معرفی کنید. موجودیت‌هایی که هر کدام به جداول، سطرها و ستون‌های داده‌ایی که در یک بانک اطلاعاتی قرار دارند اشاره می‌کنند. یک کلاس موجودیتی (entity) مشتمل بر خصلت‌هایی است که برای تعریف کلیدهای اصلی و خارجی در یک بانک اطلاعاتی مورد استفاده قرار می‌گیرد. با استفاده از این قابلیت می‌توانید رابطه‌هایی که جدول‌ها در یک بانک اطلاعاتی بر مبنای آن‌ها کار می‌کنند را در لینک تعریف کنید. برای این منظور لینک تدارک‌بیننده Linq to SQL را در اختیار شما قرار می‌دهد. با استفاده از این تدارک‌بیننده و همچنین تدارک بیننده LINQ to Dataset توانایی دسترسی به طیف گسترده‌ای از منابع داده‌ایی را خواهید داشت. 

محاوره شماره هفت، نحوه اتصال DataContext به یک بانک اطلاعاتی چگونه است؟
محاوره‌هایی که در گروه LINQ to SQL قرار می‌گیرند به لطف کلاس dataContext قدرت بسیار بالایی دارند. اما برای بهره‌مندی از این کلاس لازم است در برنامه کاربردی خود کلاس جدیدی را برای بانک اطلاعاتی هدف ایجاد کرده و آن‌را از کلاس DataContext مشتق کنید. نام کلاس مشتق شده به‌‌طور معمول با نام بانک اطلاعاتی هدف یکسان است. این کلاس مشتق شده تمامی جزییات مربوط به بانک اطلاعاتی را در خود جای می‌دهد. مکانیزم کلاس DataContext به‌شکلی است که نقطه شروعی برای دسترسی به داده‌ها را در اختیارتان قرار می‌دهد. این کلاس ارتباط با بانک اطلاعاتی و تعریف جدول‌ها در بانک اطلاعاتی را مدیریت می‌کند. برای آن‌که بتوانید از این کلاس استفاده کنید، مراحل زیر را انجام دهید.
گام اول، ویژوال استودیو را باز کرده و پروژه‌ایی از نوع Console Application ایجاد کنید.
گام دوم، در پنجره Solution Explorer روی نام پروژه کلیک راست کرده و گزینه Add New Item  را انتخاب کنید. در پنجره ظاهر شده گزینه LINQ to SQL را انتخاب کرده و نام فایل را MyLINQtoSQL قرار دهید. 


شکل 2

گام سوم، با انتخاب گزینه فوق کلاس‌های مرتبط با اشیاء لینک در برنامه کاربردی وارد می‌شوند. در مرحله بعد باید بانک اطلاعاتی را در برنامه کاربردی وارد کنید. در سمت چپ صفحه روی زبانه Server Explorer کلیک کرده گزینه Add Connection را انتخاب کنید. در پنجره ظاهر شده نام سرور و در ادامه نام بانک اطلاعاتی موردنظر خود را انتخاب کرده و کلید ok را فشار دهید. اگر همه‌چیز به‌درستی انجام شود، بانک اطلاعاتی به برنامه کاربردی اضافه می‌شود. حال باید جدول‌هایی که به آن‌ها نیاز دارید را در برنامه وارد کنید. در این مثال ما به دو جدول Person و PersonPhone نیاز داریم. در پنجره Server Explorer گره مربوط به Tables را باز کرده، جداول موردنظر را از درون این گره انتخاب کرده و آن‌ها را به‌سمت فرم بکشید. (شکل 3) بعد از اضافه شدن جدول‌ها به برنامه کاربردی، کلاس‌های متناظر به این جدول‌ها در اختیار شما قرار دارند. اکنون زمان آن رسیده است تا یک تعامل کاربردی را با بانک اطلاعاتی برقرار کنیم. ( دقت کنید حتما باید جداول مورد‌نظر خود را به‌سمت فرم بکشید تا کلاس‌های متناظر با جدول‌ها در فایل MyLINQtoSQL وارد شوند.)


شکل 3

محاوره شماره هشت، دریافت رکوردها از جدول‌ها 
بانک اطلاعاتی 

اولین گامی که برای ساخت یک محاوره مبتنی بر یک بانک اطلاعاتی به آن نیاز دارید، پیاده‌سازی یک نمونه شی از سازنده کلاس DataContext است. کلاسی که به بانک اطلاعاتی وارد شده در برنامه اشاره می‌کند. برای پیاده‌سازی این شی فایل Program.cs را باز کرده و در متد Main دستوراتی که در فهرست دو مشاهده می‌کنید را تایپ کنید. 

        static void Main(string[] args)
        {
            MyLINQtoSQLDataContext dc = new MyLINQtoSQLDataContext();
              IEnumerable<Person> myquery = from p in dc.Persons
                                          where p.FirstName == “Mae”
                                          orderby p.LastName
                                          select p;
            foreach (var ss in myquery)
     Console.WriteLine(“Last name of {0} is {1}. “, ss.FirstName, ss.LastName);
        }

فهرست شماره دو

شکل 4 خروجی فهرست شماره دو را نشان می‌دهد. 


شکل 4

محاوره شماره نه، به‌روزرسانی رکوردهای درون یک جدول 
به‌روزرسانی رکوردهای درون جدول بدون هیچ‌گونه توضیحی یک نیاز اساسی است. به‌روزرسانی رکوردهای یک جدول همواره با مشکلات زیادی روبرو است که عدم همسان بودن نوع مقادیر ورودی با فیلدهای جدول و عدم تطابق عناصر انتخاب شده با یکدیگر همواره باعث به‌روز خطاهایی می‌شود. اما لینک این قابلیت را در اختیار برنامه‌نویسان قرار می‌دهد تا به‌روزرسانی رکوردهای یک جدول را به شیوه ساده‌ای مدیریت کنند. در فهرست شماره سه ما به‌دنبال رکوردهایی در جدول Persons هستیم که فیلد FirstName آن‌ها برابر با Ken باشد. در ادامه فیلد MiddleName از اولین رکورد پیدا شده را با مشخصاتی که در فهرست سه مشاهده می‌کنید به‌روزرسانی خواهیم کرد. 

      static void Main(string[] args)
        {
         MyLINQtoSQLDataContext dc = new MyLINQtoSQLDataContext();
IEnumerable<Person> myquery = from p in dc.Persons
where p.FirstName== “Ken”
orderby p.LastName
select p;

Person per = myquery.ElementAtOrDefault(1);
if (per != null)
{
    Console.WriteLine(“Last name of {0} is {1} {2}. “,
    per.FirstName, per.LastName, per.MiddleName);
    Console.ReadLine();
    per.MiddleName = “Waht was it”;
    Console.WriteLine(“------------”);
    dc.SubmitChanges();

    Console.WriteLine(“Last name of {0} is {1} {2}. “,
    per.FirstName, per.LastName, per.MiddleName);
}
        }

فهرست سه

در فهرست شماره سه متد elementAtorDefault برای دسترسی به اولین رکورد از میان رکوردهایی که پیدا شده مورد استفاده قرار گرفته است. البته به این نکته توجه داشته باشید که از متد ElementAt نیز می‌توانید استفاده کنید. در ادامه خصلت MiddleName که معرف ستونی در جدول Person است را با مقدار موردنظر خود تنظیم کرده و با فراخوانی متد SubmitChanges تغییرات را ثبت کردیم. شکل 5 خروجی فهرست سه را نشان می‌دهد.


شکل 5

محاوره شماره ده، افزودن رکوردهایی به‌یک جدول 
ویژگی افزودن رکوردها به یک جدول همواره مورد نیاز است. اضافه کردن رکوردها نیز همانند به‌روزرسانی رکوردها دردسرهای خاص خود را دارد. اما لینک به شما اجازه می‌دهد رکوردها را ساده‌تر از آن چیزی که تصور می‌کنید به یک جدول اضافه کنید. 
فهرست شماره چهار نحوه اضافه کردن رکوردها به جدول PersonPhone را نشان می‌دهد.

        static void Main(string[] args)
        {
            MyLINQtoSQLDataContext dc = new MyLINQtoSQLDataContext();

            try
            {
                PersonPhone newRecord = new PersonPhone
                {
                    BusinessEntityID = 202,
                    PhoneNumber = “697-555-0142”,
                    PhoneNumberTypeID = 1,
                    ModifiedDate = System.DateTime.Now
                };
                dc.PersonPhones.InsertOnSubmit(newRecord);
                dc.SubmitChanges();
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }

        }

فهرست شماره چهار

محاوره شماره یازده، پیاده‌سازی محاوره‌هایی برای حذف رکوردها 
لینک به شما اجازه می‌دهد به ساده‌ترین شکل ممکن جستجویی را در جدول‌ها انجام داده و رکوردهای مورد نظر خود را حذف کنید. زمانی که رکوردی حذف شد فراخوانی متد DeleteOnSubmit عملیات را در بانک‌اطلاعاتی ثبت می‌کند. فهرست شماره پنج نحوه پیاده‌سازی این‌گونه محاوره‌ها را نشان می‌دهد. 

                static void Main(string[] args)
        {
            MyLINQtoSQLDataContext dc = new MyLINQtoSQLDataContext();

            try
            {

                PersonPhone delRecord = (from p in dc.PersonPhones
                                         where p.BusinessEntityID == 201
                                         select p).FirstOrDefault();
                if (delRecord != null)
                    dc.PersonPhones.DeleteOnSubmit(delRecord);
                dc.SubmitChanges();

            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }

        }

فهرست پنج

محاوره دوازده، شناسایی فعالیت‌هایی که روی بانک اطلاعاتی انجام شده
به‌عنوان یک برنامه‌نویس باید همواره به این نکته توجه داشته باشید که ویژگی بررسی رخدادها و فعالیت‌هایی که روی یک بانک اطلاعاتی انجام می‌شود را در برنامه کاربردی خود لحاظ کنید. این ویژگی زمانی حائز اهمیت خواهد بود که اتفاق ناخواسته‌ای در بانک اطلاعاتی رخ دهد. در چنین حالتی فایل‌های گزارش قادر هستند جزییات را در اختیار شما قرار دهند. خوشبختانه لینک قادر است دسترسی به چنین اطلاعاتی را در اختیار شما قرار دهد. کلاس DataContext مجهز به متدی است که هر دستور SQL اجرا شده را ثبت می‌کند. برای مشاهده گزارش‌ها کافی است دستور زیر را بعد از معرفی شی DataContext در برنامه خود قرار دهید.

dc.Log = Console.Out;

فهرست شماره شش نحوه به‌کارگیری این ویژگی را به شما نشان می‌دهد.

        static void Main(string[] args)
        {
            MyLINQtoSQLDataContext dc = new MyLINQtoSQLDataContext();
            dc.Log = Console.Out;
            IEnumerable<Person> myquery = from p in dc.Persons
                                          where p.FirstName == “Mae”
                                          orderby p.LastName
                                          select p;
            foreach (var mystr in myquery)
                Console.WriteLine(“Last name is:{0}”, mystr.LastName);

        }

فهرست شش

اگر قطعه کدی که در فهرست شش مشاهده می‌کنید را اجرا کنید، طیف گسترده‌ای از اطلاعات در اختیار شما قرار می‌گیرند. بدون شک دسترسی به این اطلاعات برای پیشگیری از هرگونه مسئله‌ ناخواسته‌ای کمک کننده خواهند بود. شکل 6 خروجی قطعه کد فوق را  نشان می‌دهد.


شکل 6

محاوره سیزده، نحوه اضافه کردن جدول‌ها به‌یک بانک اطلاعاتی 
اضافه کردن جدول‌ها به یک بانک اطلاعاتی بعضی مواقع مورد نیاز است. لینک به شما اجازه می‌دهد با استفاده از متد ExecuteCommand که یکی از متدهای کلاس dataContext است این‌کار را انجام دهید. این متد دستورات SQL را به‌صورت مستقیم روی بانک اطلاعاتی اجرا می‌کند. در فهرست شماره هفت جدولی به نام MyTestTable به بانک اطلاعاتی ما افزوده می‌شود. 

   static void Main(string[] args)
        {
String connectionString =”Data Source=APPLE-PC\\MSSQLSERVER1;Initial Catalog=AdventureWorks2012;Integrated Security=True”;

            MyLINQtoSQLDataContext dc = new MyLINQtoSQLDataContext(connectionString);
            try
            {
                dc.ExecuteCommand(“CREATE TABLE MyTestTable(MytableID int NOT NULL PRIMARY KEY (MytableID ),TablelName varchar(30))”);
                dc.SubmitChanges();
            }

            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
        }

فهرست هفت

قطعه کدی که در فهرست شماره هفت مشاهده می‌کنید جدول MyTestTable را به بانک اطلاعاتی AdventureWorks2012 اضافه می‌کند. این جدول همراه با ستون‌هایی که برای آن تعیین شده در بانک اطلاعاتی فوق افزوده می‌شود. 
در شماره آینده تعداد دیگری از محاوره‌های مبتنی بر بانک‌های اطلاعاتی رابطه‌ای را مورد بررسی قرار خواهیم داد.

 

ماهنامه شبکه را از کجا تهیه کنیم؟
ماهنامه شبکه را می‌توانید از کتابخانه‌های عمومی سراسر کشور و نیز از دکه‌های روزنامه‌فروشی تهیه نمائید.

ثبت اشتراک نسخه کاغذی ماهنامه شبکه     
ثبت اشتراک نسخه آنلاین

 

کتاب الکترونیک +Network راهنمای شبکه‌ها

  • برای دانلود تنها کتاب کامل ترجمه فارسی +Network  اینجا  کلیک کنید.

کتاب الکترونیک دوره مقدماتی آموزش پایتون

  • اگر قصد یادگیری برنامه‌نویسی را دارید ولی هیچ پیش‌زمینه‌ای ندارید اینجا کلیک کنید.

ایسوس

نظر شما چیست؟