|
هنگانی که برنامه های Client/Server می نویسید، Component هایی که یک
ارتباط را با Database ایجاد می کنند و آن را تا زمانی که برنامه در
حال اجراست بصورت Open نگهداری می کنند دارای معایب زیر می باشند :
1) باز نگهداشتن یک ارتباط با Database مقدار قابل توجهی از منابع
سیستم را مصرف می کند و با توجه به اینکه در بیشتر مواقع Database می
تواند مقدار کمی از Connection ها را نگهداری کند، این عمل موجب کاهش
کارآیی برنامه ها می گردد.
2) همچنین در برنامه هایی که نیاز به یک ازتباط Open با Database دارند،
افزایش تغداد برنامه های در حال اجرا بسیار سخت می باشد. یک برنامه با
این وضعیت ممکن است تا چهار کاربر را پشتیبانی کند اما برای مثلاٌ صد
کاربر چطور؟
همجنین باید توجه کرد که بر روی WEB در مدت زمان کوتاهی تعداد کاربران
ممکن است بسیار افزایش پیدا کند.
3) در برنامه های ASP.NET کلیه قسمت ها از هم مجزا می باشند. به این
صورت که Browser یک Page را از server در خواست می کند و زمانی که
Server پردازش و انتقال Page را کامل کرد، ارتباط خود را با Browser
قطع می کند (تا زمانی که درخواست بعدی ارسال شود). با توجه به این
معماری، نگهداری یک ارتباط Open با Database لازم و ضروری نمی باشد.
زیرا روشی وجود ندارد که بتوان تشخیص داد که آیا برنامه Client بعداٌ
به داده ای نیاز پیدا خواهد کرد یا خیر.
4) با استفاده از مدل always-connected انتقال اطلاعات بین برنامه ها
بسیار سخت و حتی غیرممکن می باشد. زیرا اگر دو Component بخواهند یک
سری Data را به اشتراک بگذارند باید هر کدام یک ارتباط برای خود ایجاد
کنند.
به این منظور معماری ADO.NET بگونه ای طراحی شده است که دارای کمترین
Connection فعال باشد. در معماری ADO.NET یک برنامه تنها زمانی که نیاز
به خواندن و یا نوشتن اطلاعات داشته باشد، یک Connection را ایجاد می
کند و پس از انجام آن، Connection را از بین می برد. این کار باعث می
شود که Database نیاز به نگهداری تعداد زیادی Connection (که در بیشتر
مواقع بصورت Idle می باشند) نداشته باشد و در نتیجه بتواند تعداد بسیار
بیشتری از کاربران را سرویس دهی کند.
استفاده از Data Command برای کار با Database
به منظور انجام یک عملیات در Database شما یک دستور SQL یا یک Stored
procedure را اجرا می کنید. در واقع از دستورات SQL و Stored procedure
ها برای نوشتن و خواندن اطلاعات و یا انجام توابعی مثل میانگین گیری
استفاده می کنید. همچنین از آنها برای ایجاد و تغییر Table ها و Field
ها استفاده می کنید. مثلاٌ زمانی که نیاز به خواندن اطلاعات از
Database دارید، مراحل زیر را انجام می دهید:
1) باز کردن یک Connection
2) فراخوانی روال Execute یک Command
3) بستن Connection
همانطور که مشاهده می کنید یک Connection تنها در طول زمان اجرای دستور
SQL و یا Stored procedure باز می باشد.
زمانی که روال Execute یک Command را اجرا می کند، مقداری بازگردانده
می شود که می تواند تعداد رکوردهای Update شده و یا شماره Error اتفاق
افتاده و یا تعدادی Record که توسط دستور Select بدست آمده، باشند. اگر
حاصل این عملیات تعدادی Record باشد که بوسیله دستور Select واکشی شده
اند، شما می توانید با استفاده از Data Reader (که یک روش بسیار سریع
را جهت خواندن داده ها آن هم بصورت فقط خواندنی و حرکت تنها به جلو
ارائه می دهد) اطلاعات را واکشی کنید.
توجه
سعی کنید که تا جای ممکن بجای اجرای یک دستور SQL از Stored Procedure
ها استفاده کنید. زیرا موجب می شود که کاربران نتوانند با استفاده از
دستورات SQL به Database صدمه وارد کنند.
اگر نیاز به انجام چندین عمل باشد ، مثلاٌ خواندن تعدادی رکورد و تغییر
آنها و سپس اعمال آنها به Database باید بصورت زیر عمل کنید :
1) باز کردن یک Connection
2) خواندن رکوردهای مورد نظر
3) بستن Connection
4) اعمال تغییرات به رکوردها
5) باز کردن یک Connection
6) اعمال رکوردهای تغییر کرده به Database
7) بستن Connection
استفاده از Dataset برای Cache کردن داده ها
در بیشتر مواقع، کار با Data ها به این صورت انجام می شود که تعدادی
رکورد از Database خوانده می شوند، بر روی آنها عملیات هایی صورت می
گیرد، نمایش داده می شوند و یا به Component دیگری انتقال داده می
شوند. با توجه به اینکه عملیات فوق در بیشتر مواقع بر روی چندین رکورد
صورت می گیرد، درست نیست که برنامه برای خواندن هر رکورد به سراغ
Database برورد. بنابراین بهتر است که برنامه اطلاعات را بصورت Cache
شده برای خود بصورت خصوصی نگهداری کند.
در واقع عمل یک Dataset نیز همین می باشد. Dataset یک Cache است که
برای نگهداری اطلاعات واکشی شده از منبع داده استفاده می شود. یک
Dataset می تواند شامل یک یا چند Table باشد و همچنین می تواند ارتباط
بین انها را نگهداری کند.
در زمانی که شما از Dataset استفاده می کنید، می توانید ارتباط با
Database را قطع کنید و در نتیجه باعث شوید که Database بتواند به
کارهای دیگر خود بپردازد.
همچنین به منظور اعمال تغییرات ایجاد شده در Dataset می توانید روال
Update آن را فراخوانی کنید تا اطلاعات تعییر داده شده به Database
اعمال شوند.
البته باید توجه کنید که Dataset تنها یک وسیله برای نگهداری اطلاعات
می باشد و برای واکشی اطلاعات از Database باید از یک Data Adaptor
استفاده کنید. یک Data Adaptor در واقع شامل تعدادی دستور برای انجام
عملیات بر روی یک Table می باشد.(بصورت نرمال یک Data Adaptor شامل
چهار دستور است که یکی برای Select ، یکی برای Insert ، یکی برای
Update و یکی برای Delete می باشند.)
با استفاده از روال Fill یک Data Adaptor می توان اطلاعات موجود در یک
Table را به درون یک dataset انتفال داد. یعنی زمانی که شما روال Fill
یک Data Adaptor را فراخوانی می کنید، اطلاعات از Table موجود در
Database با توجه به دستور Select موجود در Data Adaptor (مثل Select *
from parts ) واکشی و به درون dataset انتقال داده می شوند تا بصورت
cache نگهداری شوند.
یکی از مزایای استفاده از Dataset این است که شما می توانید آن را بین
Component های مختلف انتقال دهید و این کار در حالی انجام می شود که
دیگر Query ای در Database اجرا نمی گردد.
عدم وابستگی Dataset ها به منابع داده ای
اگرچه Dataset ها برای cache کردن داده های واکشی شده از Database
استفاده می شوند، لیکن هیچ گونه ارتباطی بین آنها و Database وجود
ندارد و در نتیجه آنها می توانند Table های مختلفی از Database های
مختلف را در خود نگهداری کنند.
ADO.NET و XML
با توجه به اینکه اطلاعات باید از منبع داده ای خوانده و در Dataset
نگهداری و از آن به Component های دیگر ارسال شوند، در ADO.NET برای
این انتقالات از فرمت XML استفاده شده است. همچنین اگر نیاز باشد که
اطلاعات در یک فایل نگهداری شوند، آنها با فرمت XML نگهداری خواهند شد
و اگر شما یک فایل XML داشته باشید می توانید از آن به عنوان یک منبع
داده ای استفاده کنید و برای آن یک Dataset ایجاد نمایید.
در واقع در ADO.NET ، XML فرمت پایه اطلاعات قرار داده شده است. API
های ADO.NET بصورت خودکار یک فایل XML را ایجاد می کنند تا بتوان داده
ها را به Component های دیگر انتقال داد. همچنین در مقصد می توان با
استفاده از API های ADO.NET برای خواندن اطلاعات فایل XML استفاده کرد.
(البته توجه کنید که داده ها در Dataset بصورت XML نگهداری نمی شوند و
در عوض با یک فرمت بسیار کارآمدتر نگهداری می شوند).
استفاده از XML به عنوان Protocol داده ای دارای مزایای زیر می باشد:
1) XML یک فرمت استاندارد است و در نتیجه برنامه شما می تواند اطلاعات
خود را با هر Component در هر برنامه ای رد و بدل کند.
2) XML فرمت متنی دارد. در نتیجه به شما اجازه می دهد که آن را از طریق
هر protocol ای (مثلاٌ HTTP )ارسال کنید. (بدون درگیری با firewall
ها).
توجه کنید که در بیشتر مواقع، شما برای کار با ADO.NET نیاز به فراگیری
XML ندارید. زیرا ADO.NET بصورت خودکار عمل تبدیل از Dataset به XML و
از XML به درون Dataset را انجام می دهد.
طرح یک برنامه بر پایه ADO.NET بصورت شکل زیر می باشد. |