پس از فعال كردن پتانسيل  caching در كنترل SqlDataSource ، ماحصل اجرای SelectQuery برای استفاده آتی Cache  می گردد . در صورت اجراء يك  select query پارامتريك ، كنترل فوق برای هر مجموعه از مقادير پارامترها يك نسخه جداگانه را cache می نمايد .
مثلا” ‌فرض كنيد قصد داريم صفحه ای را ايجاد نمائيم  كه در آن ليست كاركنان بر اساس نام شهر نمايش داده شود . پس از انتخاب شهر توسط كاربر ، از يك كنترل SqlDataSource برای برگرداندن ركوردهای كاركنانی كه با نام شهر مطابقت می نمايند جهت نمايش در يك grid استفاده شده است .
كد زير نحوه استفاده از كنترل SqlDataSource با هدف فعال كردن caching را نشان می دهد

 

<asp:SqlDataSource ID=”sourceEmployees” runat=”server”
ProviderName=”System.Data.SqlClient”
  EnableCaching=”True” CacheDuration=”600″
ConnectionString=”<%$ ConnectionStrings:Northwind %>”
SelectCommand=”SELECT EmployeeID, FirstName, LastName, Title, City FROM Employees WHERE City=@City”>
<SelectParameters>
<asp:ControlParameter ControlID=”lstCities” Name=”City” PropertyName=”SelectedValue” />
</SelectParameters>
</asp:SqlDataSource>

در مثال فوق ، پس از انتخاب شهر توسط كاربر ، يك query جداگانه اجراء خواهد شد تا ليست كاركنان با توجه به شهر انتخاب شده ، بازيابی و در يك DataSet به ميزان 10 دقيقه ( 600 ثانيه ) ، cache گردد . در صورت انتخاب يك شهر ديگر توسط كاربر ، پردازش فوق تكرار و مجددا” يك DataSet جديد ايجاد و cache می گردد. در صورت انتخاب يك شهر توسط كاربری كه قبلا” توسط كاربران ديگر انتخاب شده است ، DataSet مورد نظر از cache بازيابی خواهد شد ( مشروط به عدم اتمام مدت زمان اعتبار حضور آن در cache ) .
توجه داشته باشيد زمانی كه مقدار خصلت DataSourceMode معادل DataSet در نظر گرفته شده باشد (مقدار پيش فرض) ، پتانسيل caching در كنترل منبع داده SqlDataSource به خوبی كار می كند . شی DataReader نمی تواند بطور موثر cache گردد چراكه شی فوق قادر به برقراری يك ارتباط مستقيم و زنده با بانك اطلاعاتی نمی باشد .
در صورتی كه برخی پارامترها نسبت به پارامترهای ديگر با فركانس بيشتری استفاده شده باشند ، caching جداگانه نتايج با توجه به  مقادير مختلف پارامترها وضعيت مطلوبتری را به دنبال خواهد داشت . مثلا” اگر نتايج مربوط به شهر “X ” بمراتب بيش از نتايج شهر “Y” درخواست گردد ، اين اطمينان ايجاد خواهد شد  كه نتايج شهر “X” بمراتب بيش تر در cache باقی خواهند ماند حتی اگر DataSet مربوط به شهر “Y” از حافظه خارج شده باشد .
به عبارت ديگر ، در صورتی كه مقادير پارامتر ها جملگی با فركانس مشابهی استفاده شوند ، روش فوق يك راه حل مناسب نمی باشد . يكی از مسائل مرتبط با راه حل فوق ، زمانی است كه مدت زمان حضور آيتم های cache شده به اتمام رسيده باشد و لازم است كه جندين query را بر روی بانك اجراء نمود تا نسخه های جداگانه ای از cache را ايجاد نمايد ( نسخه های cache جداگانه با توجه به مقدار پارامتر ) . قطعا” روش فوق دارای كارآئی بمراتب كمتری نسبت به حالتی است كه تمامی نتايج صرفا” با يك query بازيابی می گردد .
در چنين مواردی می توان تمامی ركوردهای كاركنان را بازيابی و در cache ذخيره نمود . در ادامه ، كنترل SqlDataSource  می تواند صرفا” ركوردهای مورد نياز را متناسب با درخواست كاربر از DataSet بازيابی نمايد . بدين ترتيب ، يك DataSet به همراه تمامی ركوردهای cache شده می تواند صرفنظر از مقدار پارامتر دريافتی پاسخگو باشد .
برای نيل به خواسته فوق ، می بايست دو تغيير اساسی را در كد فوق اعمال نمود .
اولين تغيير  : بازيابی تمامی ركوردها با استفاده از  select query  ( عدم استفاده از SelectParameter  ) . كد زير نحوه انجام اين كار را نشان می دهد :

<asp:SqlDataSource ID=”sourceEmployees” runat=”server”
SelectCommand=”SELECT EmployeeID, FirstName, LastName, Title, City FROM Employees”
…>
</asp:SqlDataSource>

دومين تغيير :تعريف يك عبارت فيلترينگ . بدين منظور از بخش WHERE در query با اندك تفاوت هائی استفاده می گردد . در صورت دريافت مقدار فيلتر مورد نظر از يك منبع ديگر ( نظير يك كنترل ) ، می بايست  از يك و يا چندين placeholder استفاده نمود . بدين منظور از  گرامر {0}  برای اولين پارامتر و {1} برای دومين پارامتر و … استفاده می گردد . در ادامه  امكان استفاده از مقدار مختلف فيلترها  كه توسط بخش <FilterParameters> مشخص شده است ، فراهم می گردد .
كد زير نحوه تعريف كنترل منبع داده SqlDataSource را پس از اعمال دو تغيير فوق نشان می دهد .

<asp:SqlDataSource ID=”sourceEmployees” runat=”server”
ProviderName=”System.Data.SqlClient”
  EnableCaching=”True” CacheDuration=”600″
ConnectionString=”<%$ ConnectionStrings:Northwind %>”
SelectCommand=”SELECT EmployeeID, FirstName, LastName, Title, City FROM Employees”
FilterExpression=”City='{0}'”
EnableCaching=”True”>
     <FilterParameters>
<asp:ControlParameter ControlID=”lstCities” Name=”City” PropertyName=”SelectedValue” />
      </FilterParameters>

توجه داشته باشيد در صورت عدم استفاده از caching ، ضرورتی به فعال كردن فيلترينگ وجود ندارد . چراكه در صورت استفاده از فيلترينگ بدون caching  ، در واقع تمامی result set  بازيابی خواهد شد تا در ادامه بتوان بخشی از ركوردهای آن را بازيابی كرد . بدين ترتيب ، پس از هر  postback و بدون توجيه منطقی تمامی ركوردها ( بيش از آن چيزی كه مورد نياز است ) ، بازيابی می گردد .

دسته بندی : افزایش درآمد سایت