مشخصات مقاله
-
7782
-
0.0
-
22624
-
0
-
0
مفاهیم پایگاه داده در سی شارپ (Intro to C# ADO.NET)
وقتی توی یک برنامه با دادهها سر و کار داریم، فقط قرار نیست اطلاعات رو بخونیم. خیلی وقتها لازمه داده جدیدی اضافه کنیم، اطلاعات قبلی رو تغییر بدیم یا حتی بعضی دادهها رو حذف کنیم. برای انجام این کارها در .NET، کتابخانهای به نام ADO.NET در اختیارمون قرار داره که مجموعهای از ابزارها و کلاسهای کاربردی رو برای ارتباط با منابع داده و مدیریت اطلاعات فراهم میکنه.
توی این مقاله میخوایم با مفاهیم پایه ADO.NET و مهمترین Objectهای اون آشنا بشیم. اگه در مسیر یادگیری C# هستی، آشنایی با این مفاهیم کمک میکنه بهتر متوجه بشی برنامه چطور با پایگاه داده ارتباط برقرار میکنه و برای یادگیری مباحث بعدی هم آمادهتر بشی.
تقریباً توی همه برنامههای امروزی، به هر شکلی با دادهها سر و کار داریم؛ فرقی نمیکنه حجم این دادهها کم باشه یا زیاد. ممکنه لازم باشه اطلاعاتی رو بخونیم، داده جدیدی اضافه کنیم، اطلاعات موجود رو ویرایش کنیم یا بعضی دادهها رو حذف کنیم. برای انجام این کارها در دنیای .NET، کتابخانهای قدرتمند به نام ADO.NET طراحی شده که ابزارهای لازم برای پیادهسازی این فرایندها رو در اختیارمون قرار میده.
مقدمه ای بر ADO.NET
این درس در واقع یک شروع برای آشنایی با ADO.NET محسوب میشه. اول با مفاهیم پایه این فناوری آشنا میشیم و بعد سراغ بخشهایی میریم که در ادامه مسیر یادگیری بهشون نیاز داریم. مهمترین موضوعاتی که قراره در این درس یاد بگیریم، اینها هستن:
- ADO.NET چیست؟
- Data Provider چیست؟
- Connection Object چیست؟
- Command Object چیست؟
- DataReader Object چیست؟
- DataSet Object چیست؟
- DataAdapter Object چیست؟
مقدمه
ADO.NET مجموعهای از کتابخانههای شیءگرا (Object-Oriented) هست که به برنامه اجازه میده با یک Data Source یا منبع داده ارتباط برقرار کنه. وقتی از Data Source صحبت میکنیم، معمولاً منظورمون یک پایگاه داده (Database) هست، اما فقط به Database محدود نمیشه. یک فایل متنی، یک صفحه Excel یا یک فایل XML هم میتونه به عنوان Data Source مورد استفاده قرار بگیره. با این حال، در این درس تمرکز اصلی ما روی استفاده از ADO.NET برای ارتباط با پایگاه داده است.
پایگاه دادههای مختلفی وجود دارن که میتونیم برای ذخیره و مدیریت اطلاعات ازشون استفاده کنیم. SQL Server، Microsoft Access، Oracle، Borland Interbase و IBM DB2 چند نمونه از این پایگاه دادهها هستن. در مثالهایی که در ادامه این درس میبینیم، از SQL Server استفاده میکنیم.
MSDE2000 در واقع نسخه کوتاهشده SQL Server محسوب میشه. بنابراین مطالبی که در این بخش یاد میگیرید و کدهایی که بررسی میکنیم، با SQL Server کار میکنن. این درس به طور اختصاصی برای ADO.NET طراحی شده و مثالهای اون از پایگاه داده Northwind استفاده میکنن. MSDE بخشی از SQL Server نیست، بلکه یکی از Data Sourceهایی هست که میتونید از طریق ADO.NET باهاش ارتباط برقرار کنید.
Data Providers
همونطور که گفتیم، ADO.NET این امکان رو به ما میده که با انواع مختلف پایگاه داده و Data Source ارتباط برقرار کنیم. اما یک سؤال اینجا پیش میاد: آیا برای همه این منابع میتونیم دقیقاً از یک مجموعه کلاس استفاده کنیم؟ جواب نه هست. دلیلش هم اینه که Data Sourceهای مختلف از پروتکلهای متفاوتی برای ارتباط استفاده میکنن و طبیعتاً برای هرکدوم باید روش مناسب خودش رو داشته باشیم. بعضی Data Sourceهای قدیمی از پروتکل ODBC استفاده میکنن، بعضی منابع جدیدتر با OleDb کار میکنن و برای بعضی Data Sourceها هم امکان ارتباط مستقیم از طریق کتابخانههای کلاس .NET ADO.NET وجود داره.
برای اینکه کار با این Data Sourceهای مختلف سادهتر بشه، ADO.NET یک روش نسبتاً یکسان برای برقراری ارتباط در اختیارمون میذاره. برای هر روش ارتباطی هم مجموعهای از کتابخانهها وجود داره که به اونها Data Provider گفته میشه. معمولاً اسم این Providerها بر اساس نوع Data Source یا پروتکلی که برای ارتباط استفاده میکنن مشخص میشه. در جدول زیر میتونید تعدادی از معروفترین Data Providerها، API Prefix مربوط به هرکدوم و نوع Data Sourceهایی که از اونها پشتیبانی میکنن رو ببینید.
برای اینکه مفهوم API Prefix بهتر جا بیفته، بذارید یک مثال بزنیم. یکی از اولین Objectهایی که در ADO.NET باهاش کار میکنیم، شی اتصال یا Connection Object هست. این Object وظیفه داره ارتباط برنامه رو با Data Source برقرار کنه. حالا اگه Data Source ما یک واسط OleDb داشته باشه و از OleDb Data Provider استفاده کنیم، Object مربوط به اتصال اسمش OleDbConnection خواهد بود. برای یک Data Source مبتنی بر Odbc هم از OdbcConnection استفاده میکنیم. وقتی پای SQL Server وسط باشه، این Object با پیشوند Sql ساخته میشه و اسمش SqlConnection خواهد بود. از اونجایی که در این مبحث از MSDE، یعنی نسخهای کوچک از SQL Server، استفاده میکنیم، Objectهای API هم با پیشوند Sql شروع میشن؛ مثلاً SqlConnection.
ADO.NET Objects
ADO.NET Objectهای مختلفی داره که هرکدوم برای بخشی از کار با دادهها استفاده میشن. در این قسمت میخوایم با چند مورد از مهمترین و پرکاربردترین اونها آشنا بشیم. در ادامه مسیر، Objectهای بیشتری رو میبینیم و نحوه استفاده از اونها رو در کنار هم بررسی میکنیم. Objectهایی که در ادامه معرفی میشن، از مهمترین مواردی هستن که باید با کاربردشون آشنا باشید.
The SqlConnection Object
وقتی میخوایم به یک پایگاه داده وصل بشیم، اولین کاری که باید انجام بدیم ایجاد یک Connection یا اتصال هست. SqlConnection این امکان رو فراهم میکنه که اطلاعات موردنیاز برای برقراری ارتباط، مثل سرور پایگاه داده، نام Database، username، password و پارامترهای دیگه رو مشخص کنیم. این Connection Object بعداً توسط Objectهای دیگهای که برای اجرای دستورات روی پایگاه داده استفاده میشن، یعنی Command Objects، مورد استفاده قرار میگیره. به زبان ساده، Connection مشخص میکنه دستوری که میخوایم اجرا کنیم باید روی کدوم Database اجرا بشه.
The SqlCommand Object
وقتی ارتباط با پایگاه داده برقرار شد، باید مشخص کنیم دقیقاً چه کاری میخوایم روی دادهها انجام بدیم. اینجاست که Command Object وارد میشه. از Command Object برای ارسال دستورات SQL به پایگاه داده استفاده میکنیم. این Object برای اینکه بدونه دستور موردنظر رو روی کدوم Database اجرا کنه، از Connection Object کمک میگیره. میتونیم از Command Object به صورت مستقیم برای اجرای یک دستور استفاده کنیم یا یک Reference از اون رو در اختیار SqlDataAdapter قرار بدیم. SqlDataAdapter مجموعهای از Commandها رو نگهداری میکنه که برای انجام عملیات مختلف روی دادهها مورد استفاده قرار میگیرن.
The SqlDataReader Object
خیلی از مواقع کاری که با دادهها داریم فقط به خواندن اطلاعات محدود میشه. در این شرایط لازم نیست دادهها رو تغییر بدیم و فقط میخوایم نتیجه یک دستور SELECT رو بخونیم. SqlDataReader برای همین کار طراحی شده و به ما اجازه میده به نتیجه یک SELECT که از طریق Command Object اجرا شده، دسترسی داشته باشیم. دادهها در DataReader به صورت یک جریان سریع و فقط رو به جلو (Forward Only) در اختیارمون قرار میگیرن. یعنی نمیتونیم آزادانه بین رکوردها عقب و جلو بریم و دادهها رو به صورت ترتیبی دریافت میکنیم. این روش سرعت خوبی داره و برای خواندن دادهها بهینه است، اما اگه بخوایم دادهها رو در حافظه نگه داریم و روی اونها عملیات بیشتری انجام بدیم، DataSet انتخاب مناسبتری خواهد بود.
The DataSet Object
DataSet رو میتونیم یک نماینده از پایگاه داده در حافظه در نظر بگیریم. این Object میتونه چندین DataTable داشته باشه و هر DataTable هم مثل یک جدول معمولی پایگاه داده، شامل سطر و ستون هست. حتی میتونیم بین جدولها رابطه ایجاد کنیم و ارتباطهای Parent-Child رو هم تعریف کنیم. DataSet بیشتر زمانی به کارمون میاد که بخوایم دادهها رو در حافظه نگه داریم و بدون اینکه دائماً به پایگاه داده متصل باشیم، روی اونها کار کنیم؛ یعنی همون Disconnected Operations. یک نکته مهم دیگه اینه که DataSet توسط همه Data Providerها قابل استفاده است و به همین دلیل اسمش هیچ Prefix خاصی از نوع Provider نداره.
The SqlDataAdapter Object
بعضی وقتها دادههایی که باهاشون کار میکنیم فقط برای خواندن هستن و قرار نیست مرتب تغییرشون بدیم. در چنین شرایطی ممکنه بخوایم دادهها رو داخل حافظه نگه داریم تا برای اطلاعاتی که تغییر نکردن، مجبور نباشیم هر بار دوباره به پایگاه داده درخواست ارسال کنیم. Data Adapter برای همین نوع کارها خیلی کاربردیه و مدیریت دادهها در حالت Disconnected رو سادهتر میکنه. Data Adapter هنگام خواندن اطلاعات، یک DataSet رو با دادههای پایگاه داده پر میکنه و وقتی تغییرات رو دوباره به پایگاه داده برمیگردونیم، اونها رو به صورت یک مجموعه ثبت میکنه. این Object یک Reference به Connection Object داره و هنگام خواندن اطلاعات از پایگاه داده یا نوشتن اطلاعات در اون، اتصال رو در صورت نیاز برقرار و قطع میکنه. علاوه بر این، Data Adapter برای عملیات SELECT، INSERT، UPDATE و DELETE هم Referenceهایی به Command Objectها داره. برای هر جدول موجود در DataSet هم یک Data Adapter تعریف میشه و به این شکل مدیریت ارتباط با پایگاه داده انجام میگیره. در نهایت، کاری که ما باید انجام بدیم اینه که مشخص کنیم Data Adapter چه زمانی دادهها رو از پایگاه داده دریافت کنه و چه زمانی تغییرات رو دوباره در پایگاه داده ثبت کنه.
خلاصه
ADO.NET فناوری .NET برای ارتباط با منابع داده یا Data Source هست. بسته به نوع پایگاه داده یا پروتکل مورد استفاده، Data Providerهای مختلفی وجود دارن که ارتباط با Data Sourceهای مختلف رو ممکن میکنن. با وجود تفاوت بین Providerها، برای کار با Data Source از مجموعهای از Objectهای اصلی استفاده میکنیم. SqlConnection وظیفه مدیریت Connection با Data Source رو بر عهده داره و SqlCommand برای ارسال دستورات به پایگاه داده استفاده میشه. اگه فقط به خواندن سریع و رو به جلوی دادهها نیاز داشته باشیم، SqlDataReader انتخاب مناسبیه. برای کار با دادهها در حالت Disconnected هم میتونیم از DataSet استفاده کنیم و به کمک SqlDataReader، عملیات خواندن از Data Source و نوشتن در اون رو پیادهسازی کنیم.