برنامه نويسان پايگاه داده به خوبی با DataReader و قابليتهای بالای آن در كار با بانكهای اطلاعاتی آشنا هستند. کاربرد DataReader برای خواندن سريع تعدادی رکورد از بانک اطلاعاتی و احتمالا نمايش آنها بر روی صفحه است. خواندن رکوردها توسط DataReader همواره حرکتی رو به جلو (Forward-Only) بوده و نمی توان هنگام استفاده از DataReader به عقب برگشت و به رکوردهای قبلی دسترسی داشت. اين مقاله روشی را ارائه می کند که با استفاده از آن بتوان حرکت رو به عقب هنگام استفاده از DataReader را نيز به گونه ای فراهم آورد.


در اين روش ما موقعيت فعلی DataReader را ذخيره می كنيم و برای برگشت به ركورد قبلی از ابتدا تا يكی مانده به ركورد فعلی ركوردها را پيمايش می كنيم و در پايان آخرين ركورد پيمايش را به كاربر نشان می دهيم برای اين كار به صورت زير متغيرهايی عمومی تعريف می نماييم:


کد:
Dim Index as Integer
 Dim IndexTemp as Integer
 Dim Dr as OleDb.OleDbDataReader
منظور از متغير عمومی در عبارت بالا متغيری در محدوده يك فرم يا يك كلاس و... كه DataReader در آن استفاده می شود می باشد. سپس سه تابع يا سابروتين (بسته به نحوه استفاده) تعريف می نماييم:



کد:
Private Sub GetData()
 Dim Cmd as New OleDb.OleDbCommand("Select ID From TblSample")
 Dr=Cmd.ExecuteReader
 Index=0
 End Sub
سابروتين بالا برای خواندن ركورد از يك جدول فرضی می باشد.
کد:
 
 
  
Private Sub Next () Dr.Read Index+=1 IndexTemp=Index ShowData () End Sub


سابروتين بالا برای حركت به ركورد بعدی می باشد.



کد:
Private Sub Back()
 Dim I as Integer
 Me.GetData()
 For I=0 To IndexTemp-2
 Dr.Read
 Next
 Index=I
 IndexTemp=Index
 ShowData ()
 End Sub
سابروتين بالا برای حركت به ركورد قبلی می باشد. لازم به ذكر است كه كدهای بالا به صورت شبه كد می باشند و هدف فقط نشان دادن نحوه انجام كار می باشد. شايد برخی دوستان با ديدن اين مقاله به اين فكر بيفتند كه به جای اين كار ميتوان از DataSetاستفاده كرد كه لزومی به اين همه دردسر ندارد ولی بر حسب تجربه اعلام می كنم كه در برخی مواقع مجبور به استفاده از DataReader خواهيد شد، برای نمونه در يكی از برنامه هايی كه برای يكی از موسسات نوشته بودم قسمتی وجود داشت كه تصاوير مربوط به قسمتهای مختلف موسسه را در بانك ذخيره می كرد و در موقع لزوم تصاوير مورد نظر با توجه به نام قسمت مربوطه فرخوانی می شدند برای اين كار اگر از DataSet استفاده شود به دليل اينكه DataSet ركوردها را در حافظه نگهداری می كند و با توجه به حجم بالای حافظه مورد نياز برای نگهداری تصوير با بالا رفتن ركوردها حافظه بلافاصله پر می شود، ولی DataReader تك ركورد را در حافظه نگهداری می كند و با توجه به مديريت حافظه خودكار در .Net با حركت در بين تصاوير حافظه تخصيص داده شده به تصوير قبلی بازپس گرفته می شود.