رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
ارتباط LINQ با SQL
#1
برای بازیابی اطلاعات از پایگاه داده SQL روشی مشابه روش بالا مورد استفاده قرار می­گیرد. تنها تفاوت موجود به تعیین منبع داده در قسمت from از عبارت پرس و جوی LINQ مربوط می­گردد. در اینجا باید برای بازیابی اطلاعات از جداول داده و استفاده در برنامه کلاس­هایی را ایجاد کرد.

اولین کار اضافه کردن فضانام مربوط به استفاده از LINQ to SQL<> می باشد. برای این کار باید فضانام System.Data.Linq را به پروژه اضافه کنید. البته باید اسمبلی این فضانام را به Reference های برنامه اضافه نمود. اسمبلی حاوی این فضانام به صورت پیش فرض در لیست موجود در پنجره Add Reference به نام System.Data.Linq.dll وجود دارد.

پس از این کار باید به ازاء هر جدولی که قصد داریم در برنامه از آن استفاده کنیم، یک کلاس ایجاد کرد. البته تعریف این کلاس قدری با تعریف کلاس­های معمولی در #C تفاوت دارد.

برای شروع ایجاد کلاس ابتدا جدول زیر را در نظر بگیرید. در این جدول 3 فیلد وجود دارد.

در کلاسی که قرار است با این جدول ارتباط داده شود باید به ازاء هر فیلد در جدول یک فیلد خصوصی در کلاس ایجاد کنید؛ و البته برای دسترسی به اطلاعات این فیلد خصوصی باید یک خصوصیت عمومی نیز تعریف شود.

تفاوتی که در بالا به آن اشاره شد، به استفاده از ویژگی­هایِ جدید #C در تعریف کلاس برمی­گردد. اولین ویژگی، ویژگی Table است. هدف استفاده از این ویژگی این است که به کامپایلر اعلام شود این کلاس قرار است با کدام جدول در پایگاه داده ارتباط داده شود

کد پی‌اچ‌پی:
[Table(Name "Person")]

public class 
Person

{



خصوصیت Name از این ویژگی در واقع بیانگر نام جدول است. اگر از این خصوصیت استفاده نکنید، کامپایلر به صورت خودکار نام کلاس را به عنوان نام جدول در نظر می گیرد.

کد پی‌اچ‌پی:
[Table(Name "Person")]

public class 
Person

{



در ادامه باید فیلدهایِ خصوصی مناسبی برای نگهداری اطلاعات فیلدهای موجود در جدول ایجاد شود. ایجاد این فیلدها مانند ایجاد فیلدهای عادی است.

کد پی‌اچ‌پی:
[Table(Name "Person")]

public class 
Person

{

    private 
int _ID;



حال باید برای دسترسی به اطلاعات این فیلدها و همچنین ارتباط آنها با ستون های موجود در جدول، خصوصیت­های مناسبی تعریف کرد. البته در تعریف خصوصیت­ها باید از ویژگی Column نیز استفاده کرد.
کد پی‌اچ‌پی:
[Column(Name "ID"Storage "_ID"DbType "int NOT NULL IDENTITY"IsPrimaryKey trueIsDbGenerated true)]

    public 
int ID

    
{

        
get { return _ID; }

        
set _ID value; }

    } 

از این خصوصیت برای دسترسی به اطلاعات فیلد ID_ استفاده می­شود. البته با استفاده از ویژگی Column ستونی در جدول که قرار است اطلاعات آن در فیلد _ID قرار گیرد مشخص می­شود. در اینجا ستون مورد نظر ID است.

ویژگی Column دارای خصوصیات متعددی است. در ادامه تعدادی از آنها را که پر کاربرد هستند توضیح می­دهم.

Name: از این خصوصیت برای تعیین نام ستون مورد نظر در جدول داده­ها استفاده می­شود.

Storage: با استفاده از این خصوصیت نام فیلدی که قرار است اطلاعات ستون مورد نظر در آن قرار گیرد مشخص می شود.

DbType: از این خصوصیت برای تعیین نوعی که در جدول برای ستون مورد نظر در نظر گرفته شده است، استفاده می­کنیم. با به کارگیری این خصوصیت، کامپایلر قادر به چک کردن نوع مقادیری که انتساب داده می­شوند در زمان کامپایل می­باشد.

IsPrimaryKey: اگر ستونی که قرار است آن را Bind کنیم در جدول به عنوان کلید اصلی در نظر گرفته شده باشد، با استفاده از این خصوصیت باید این مورد را به کامپایلر و LINQ اعلام کرد.

IsDbGenerated: اگر در تعریف ستون مورد نظر در پایگاه داده اعلام شده باشد که مقدار این فیلد در توسط خود پایگاه داده تولید می­شود، باید از این خصوصیت به همراه مقدار true استفاده کرد.

در زیر کد کاملی که برای کلاس Person باید نوشته شود را مشاهده می کنید.

کد پی‌اچ‌پی:
[Table(Name "Person")]

public class 
Person

{

    private 
int _ID;

    private 
string _lastName;

    private 
string _firstName;

 

    [
Column(Name "ID"Storage "_ID"DbType "int NOT NULL IDENTITY"IsPrimaryKey trueIsDbGenerated true)]

    public 
int ID

    
{

        
get { return _ID; }

        
set _ID value; }

    }

 

    [
Column(Name "LastName"Storage "_lastName"DbType "nvarchar NOT NULL")]

    public 
string LastName

    
{

        
get { return _lastName; }

        
set _lastName value; }

    }

               

    [
Column(Name "FirstName"Storage "_firstName"DbType "nvarchar NOT NULL")]

    public 
string FirstName

    
{

        
get { return _firstName; }

        
set _firstName value; }

    }



تا بدین­جا کلیه عملیات لازم برای ذخیره اطلاعات جدول Person در اشیاء موجود در برنامه انجام شده است. اکنون باید برای برقراری ارتباط با پایگاه داده تدبیری اندیشید برای اینکار دیگر لازم نیست مانند قبل از اشیاء SqlConnection استفاده کرد. LINQ برای برطرف کردن این مورد کلاسی به نام DataContext معرفی کرده است. برای استفاده از ویژگی­های این کلاس می­بایست ابتدا کلاسی ایجاد کنید و از کلاس DataContext ارث بری کنید

کد پی‌اچ‌پی:
public partial class PeopleDataContext DataContext

{



حال باید در سازنده کلاس PeopleDataContext سازنده کلاس پدر (DataContext) را فراخوانی کرد. در واقع DataContext یک کانال دوطرفه برای ارتباط با پایگاه داده می­باشد. یعنی از یک طرف دستورات LINQ را گرفته و آن را به دستورات معادل در SQL تبدیل می کند و آن را به سمت سرور پایگاه داده منتقل می­کند. و پس از اجرای دستورات در سرور نتایج بدست آمده را دریافت و در اشیاء مربوط در برنامه قرار می دهد.

بنابراین برای ارتباط به سرور پایگاه داده در کلاس DataContext سازنده های مختلفی در نظر گرفته شده است. ساده ترین سازنده استفاده از یک رشته اتصال است که در مدل­های قبلی اتصال به پایگاه داده نیز مورد استفاده قرار می گرفت.

برای این منظور باید کلاس PeopleDataContext را به صورت زیر تغییر داد:


کد پی‌اچ‌پی:
public partial class PeopleDataContext DataContext

{

    public 
PeopleDataContext(String connString) :

        
base(connString) { }



بنابراین باید در هنگام نمونه سازی از این کلاس، باید رشته اتصال مورد نظر را به سازنده این کلاس ارسال کرد. کمی صبر کنید؛ هنوز کار تمام نشده است. باید برای نگهداری اطلاعاتی که قرار است از جدول Person بازیابی شوند باید شئ ای از نوع <Table<T را در کلاسی که از DataContext ارث بری می­کند اضافه کنیم. برای این منظور باید فیلد زیر را به کلاس PeopleDataContext اضافه کنیم.
کد پی‌اچ‌پی:
public Table<PersonPeople

نوع Table<T> یک کلاس جامع می باشد که توسط LINQ ارائه شده است.

اکنون همه چیز برای انجام پرس و جو ار پایگاه داده آماده است. فرض کنید که می­خواهیم اطلاعات افرادی که شماره شناسایی (ID) از 2 بیشتر است را بازیابی کنیم و در یک کنترل DataGridView نشان دهیم. برای این کار باید از کدهایی زیر استفاده کنیم.

کد پی‌اچ‌پی:
private void btnLoad_Click(object senderEventArgs e)

{

    
String connString = @" Data Source=.;Initial Catalog=People; Integrated Security=True";

    
PeopleDataContext people = new PeopleDataContext(connString);

    var 
query from p in people.People

                where p
.ID 2

                select p
;

    
dataGridView1.DataSource query;



کدهای فوق در رویداد کلیک از کنترل button نوشته شده است.

[عکس: New%20Picture.jpg]

همانطورکه مشاهده می­کنید نحوه پرس و جو دقیقاً مانند روشی است که برای پرس و جو از اشیاء درون حافظه به کار می­رود؛ فقط باید منبع داده­ای که برای پرس و جو در نظرگرفته شده است را مطابق با نیاز تنظیم کنیم. در انتها نیز برای نشان داده اطلاعات بازیابی شده کافی است به خصوصیت DataSource از کنترل DataGridView را به متغیری که برای ارجاع به خروجی پرس و جو در نظر گرفته شده است مرتبط کنیم.

کلاس DataContext خصوصیات پیشرفته دیگری نیز دارد که در ادامه تعدادی از آنها و همچنین نحوه درج و حذف اطلاعات را نیز بررسی می­کنیم.

یکی از خصوصیات جالب کلاس DataContext خصوصیت Log می­باشد. از این خصوصیت برای بدست آوردن دستوری که DataContext برای ارسال به پایگاه داده ایجاد می کند، استفاده می شود. به عنوان مثال تکه برنامه زیر را در نظر بگیرید، با استفاده از خصوصیت Log دستور Selectی که برای بازیابی اطلاعات ایجاد شده است، را مشاهده می کنیم.


کد پی‌اچ‌پی:
String connString = @"Server=.;database=People;integrated security=sspi";

PeopleDataContext people = new PeopleDataContext(connString);

people.Log Console.Out;

var 
query =

from p in people.People

where p
.ID == 1

select 
new

{

    
p.LastNamep.FirstName

};

foreach (var 
row in query)

{

    
Console.WriteLine("Name: {0}, {1}",row.LastNamerow.FirstName);



خروجی این برنامه که در حالت Console نوشته شده است، به صورت زیر می­باشد.

Asdadasdasd


منابع مورد استفاده :

· کتاب "LINQ در C# 2008" تالیف گروه واژه

· Ebook های موجود در سایت PersiaDevelopers
[عکس: <a href=www.Mojsazan.com.gif]" class="mycode_img" />
پاسخ
سپاس شده توسط database ، کلاه سفید


موضوعات مشابه ...
موضوع نویسنده پاسخ بازدید آخرین ارسال
  امکانات LINQ مهرداد عباسی 2 6,061 10-11-2011, 11:53 AM
آخرین ارسال: مهرداد عباسی
  حذف رکورد­ها LINQ مهرداد عباسی 0 4,420 12-16-2009, 01:29 AM
آخرین ارسال: مهرداد عباسی
  ویرایش رکوردها LINQ مهرداد عباسی 0 4,256 12-16-2009, 01:28 AM
آخرین ارسال: مهرداد عباسی
  درج رکورد با استفاده از LINQ مهرداد عباسی 0 4,968 12-16-2009, 01:27 AM
آخرین ارسال: مهرداد عباسی
  مروری بر LINQ در C# 2008 مهرداد عباسی 0 4,346 12-16-2009, 01:20 AM
آخرین ارسال: مهرداد عباسی

پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان