جستجو در محصولات

گالری پروژه های افتر افکت
گالری پروژه های PSD
جستجو در محصولات


تبلیغ بانک ها در صفحات
ربات ساز تلگرام در صفحات
ایمن نیوز در صفحات
.. سیستم ارسال پیامک ..
DataSet و يا DataReader ؟
-(4 Body) 
DataSet و يا DataReader ؟
Visitor 1960
Category: دنياي فن آوري
DataReader و DataSet دو شي ارائه شده در ADO.NET به منظور دستيابي به داده مي باشند . اشياء فوق امکانات متعددي براي دستيابي به داده در برنامه هاي دات نت را در اختيار پياده کنندگان قرار مي دهند . Scott Mitchell اخيرا" در مقاله اي جامع که بر روي سايت http://www.4guysfromrolla.com منشتر شده است به بررسي دو شي فوق پرداخته و آنان را از زواياي متفاوتي مقايسه و در نهايت به اين نتيجه رسيده است که استفاده از DataReader در برنامه هاي وب داراي مزاياي بمراتب بيشتري نسبت به DataSet است . براي آشنائي با دلايل وي براي رسيدن به نتيجه فوق ، خلاصه اي از مقاله وي را در ادامه با هم مطالعه مي کنيم .

مباني و اصول اوليه DataReader

DataReader و DataSet داراي وظايف متفاوتي بوده و با اهداف مختلفي طراحي و پياده سازي شده اند :
• DataSet : يک بانک اطلاعاتي کوچک در حافظه
• DataReader : ترابري داده بين لايه بانک اطلاعاتي و يک برنامه دات نت
در ADO.NET يک provider شامل تعدادي منبع است و کلاس هاي خاص مرتبط با هر provider به منظور کار با ارائه دهندگان مربوطه ارائه شده است . مثلا" کلاس هاي SqlConnection, SqlCommand, SqlDataAdapter و SqlDataReader جهت کار با SqlClient provider و کلاس هاي OleDbConnection, OleDbCommand, OleDbDataAdapterو OleDbDataReader جهت کار با OleDb provider ارائه شده اند.اشيائي که شامل يک پيشوند با نام يک provider مي باشند ( نظير Sql,OleDb,Oracle و ... ) ، اشياء مختص و وابسته به Provider بوده و به منظور کار با يک Provider خاص طراحي و پياده سازي شده اند.
DataReader يکي از اشياء فوق است ( SqlDataReader, OleDbDataReader ) .به منظور استفاده از شي فوق مي بايست در ابتدا يک connection به منبع داده ايجاد و query مورد نظر جهت اجراء مشخص گردد . در ادامه DataReader ايجاد و به عنوان يک پل ارتباطي بين برنامه دات نت و منبع ذخيره سازي داده ايفاي وظيفه مي نمايد . مثلا" مي توان از کد زير در اين رابطه استفاده نمود :

 ' Create command
Dim myCommand as New SqlCommand(myConnection, SQL query or stored procedure)

' Create a DataReader to ferry information back from the database
Dim myReader as SqlDataReader
myReader = myCommand.ExecuteReader()

'Iterate through the results
While myReader.Read()
'... Work with the current record ...
End While

' Close the connection (will automatically close the reader)
myConnection.Close()


DataReader در هر لحظه يک رکورد را از منبع ذخيره سازي داده load مي نمايد . هر مرتبه که متد Read شي DataReader فراخوانده گردد ، DataReader رکورد جاري را کنارگذاشته و با مراجعه به بانک اطلاعاتي ، رکورد بعدي را بازيابي مي نمايد .در صورتي که يک سطر از بانک اطلاعاتي load شده باشد ، متد Read مقدار True و اگر رکوردي برگردانده نشود ، مقدار False برگردانده خواهد شد .
DataReader ، يک شي داده Connected بوده و نيازمند وجود يک اتصال فعال با بانک اطلاعاتي است . بخاطر داشته باشيد که DataReader صرفا" مکاينزم لازم براي ترابري داده بين برنامه و بانک اطلاعاتي را ارائه نموده و پس از قطع connection ، امکان برگرداندن اطلاعات به بانک اطلاعاتي وجود نخواهد داشت . DataReader داراي ويژگي فقط خواندني و فقط به سمت جلو مي باشد . اين بدان معني است که اطلاعات بازيابي شده از بانک اطلاعاتي را نمي توان با استفاده از DataReader تغيير و يا اقدام به بازيابي رکوردها به صورت تصادفي نمود . DataReader محدود به دستيابي رکوردها به صورت ترتيبي ( از اولين رکورد به سمت آخرين رکورد ) است .

مباني و اصول اوليه DataSet

DataSet يک شي بمراتب پيچيده تر و با ويژگي هاي بيشتر در مقايسه با DataReader است . در حالي که DataReader به سادگي عمليات برگرداندن داده از يک منبع داده را برعهده دارد ، DataSet را مي توان به منزله يک بانک اطلاعاتي مقيم در حافظه تصور نمود . DataSet همانند يک بانک اطلاعاتي از مجموعه اي جدول تشکيل شده است . يک DataSet از مجموعه اي شي DataTable تشکيل مي گردد . همانگونه که يک بانک اطلاعاتي مي تواند داراي ارتباطاتي بين جداول مربوطه به خود باشد ( به همراه محدوديت هاي متفاوتي در ارتباط با فيلدهاي تعريف شده در هر يک از جداول ) ، يک DataSet نيز مي تواند داراي ارتباطات مشخص بين اشياء DataTable مربوط به خود و محدوديت هاي لازم برروي فيلدهاي DataTable باشد .
برخلاف DataReader ، يک DataSet يک شي داده مستقل از Provider است و در اين رابطه اشيائي نظير SqlDataSet و يا OleDbDataSet وجود ندارد و اين مسئوليت شي DataAdapter مربوط به Provider است که داده مختص provider را درون يک DataSet مستقل ( نه يک provider خاص ) ترجمه نمايد . کد زير نحوه استفاده از DataSet را نشان مي دهد :

 '  Establish Connection
Dim myConnection as New SqlConnection(connection string)
myConnection.Open()

' Create command
Dim myCommand as New SqlCommand(SQL query or stored procedure, myConnection)

' Create the DataAdapter
Dim myDataAdapter as New SqlDataAdapter(myCommand)

' Create the DataSet
Dim myDataSet as New DataSet

' Fill the DataSet
myDataAdapter.Fill(myDataSet)

' Close the connection
myConnection.Close()

'... Work with the contents of the DataSet ...


همانگونه که در کد فوق مشاهده مي گردد ، متد Fill مربوط به شي DataAdapter مسئوليت پر نمودن DataSet را با توجه به query مورد نظر برعهده دارد . در پس پرده ، از يک DataReader به منظور خواندن نتايج اجراي query و پر نمودن DataSet استفاده مي گردد. DataSet يک شي داده disconnected است. اين بدان معني است که پس از استقرار داده در DataSet ، مي توان connection را غيرفعال ( close ) و همچنان بررسي و پردازش لازم بر روي داده هاي موجود در DataSet را انجام داد .
با توجه به اين که DataSet يک مجموعه از داده هاي غيرمتصل جداگانه را ارائه مي نمايد ، امکان ويرايش و دستيابي تصادفي به اطلاعات موجود در آن وجود خواهد داشت . دو ويژگي فوق در DataReader وجود ندارند . علاوه بر موارد فوق ، DataSet داراي پتانسيل هاي قدرتمندي به منظور کار با اسناد XML است . مثلا" مي توان با استفاده از متد WriteXml اطلاعات موجود در يک DataSet را درون يک فايل XML مستقر و يا مي توان اطلاعات موجود در يک فايل XML را با استفاده از متد ReadXml شي DataSet خواند و در يک DataSet مستقر نمود .

DataReader و يا DataSet

صرفنظر از اين که از DataSet و يا DataReader به منظور بازيابي داده هاي موجود در بانک اطلاعاتي استفاده مي گردد ، مي توان به منظور نمايش داده هاي مورد نظر از کنترل هاي DataList, DataGrid و يا Repeater با استفاده از يک کد مشابه استفاده نمود . بدين منظور لازم است که خصلت DataSource هر يک از کنترل هاي فوق به DataReader و يا DataSet نسبت داده شده و در ادامه متد DataBind مربوطه ( کنترل هاي DataList, DataGrid و يا Repeater ) فراخوانده گردد .
کار با داده ها در ASP.NET بسيار ساده است بگونه اي که معمولا" پياده کنندگان برنامه هاي وب ASP.NET هرگز اين موضوع را به ذهن خود خطور نخواهند داد که بهترين شي که مي توان از آن به منظور دستيابي به داده استفاده نمود ، چيست ؟ آنان بر اين عقيده هستند که همه چيز معادل هم بوده و خيلي مهم نخواهد بود که از کدام شي در اين رابطه استفاده مي گردد .
آيا واقعا" همه چيز يکسان و معادل مي باشد ؟ به وضوح مشخص است که بين ويژگي ها و پتانسيل هاي ارائه شده توسط هر يک از اشياء DataReader و DataSet تفاوت هاي عمده اي وجود دارد . DataSet ويژگي هاي بمراتب بيشتري را در اختيار پياده کنندگان قرار مي دهد و همين موضوع باعث شده است که کارآئي آن براي خواندن داده نسبت به DataReader کمتر گردد .
بر اساس مطالعه انجام شده در رابطه با سرعت بازيابي داده در ADO.NET ، سرعت و کارآئي DataReader سي مرتبه بيش از DataSet مي باشد . در بررسي انجام شده بر روي يکهزار رکورد بازيابي شده ، مشخص شده است که DataSet سي مرتبه کندتر از DataReader است ( 89 / 8 ثانيه در مقابل 29 /0 ثانيه ) .

موارد استفاده مفيد از DataSet

صرفنظر از محدوديت هاي DataSet از بعد کارآئي ، در مواردي لازم است که از اين شي استفاده گردد و گرنه شي فوق به عنوان يکي از عناصر کليدي در فريمورک دات نت محسوب نمي گرديد . استفاده از DataSet در يکي از دو مورد زير مي تواند مفيد واقع شود :
• برنامه هاي Desktop : فرض کنيد داراي يک برنامه ورود اطلاعات desktop-based باشيم . يک کاربر برنامه را اجراء ، داده هائي خاص را از برخي بانک هاي اطلاعاتي load و پس از اعمال تغييرات لازم آنان را در بانک اطلاعاتي ذخيره مي نمايد . وضعيت فوق يک حالت ايده آل براي DataSet است و امکان خواندن داده ها از درون يک DataSet مستقر در حافظه کامپيوتر سرويس گيرنده ، وجود خواهد داشت . بدين ترتيب کاربران مي توانند با داده ها بدون نياز به ارتباط مستمر با بانک اطلاعاتي کار کنند . پس از اتمام عمليات ويرايش داده ها ، به منظور اعمال تغييرات لازم مي توان از يک Batch update استفاده نمود . از آنجائيکه DataSet يک منبع ذخيره سازي داده disconnected است ، امکان دستيابي offline به داده ها وجود خواهد داشت .
چنين وضعيتي ممکن است در يک برنامه وب نيز محقق گردد و لازم باشد که کاربران با برنامه وب همانند آنچه اشاره گرديد ، ارتباط برقرار نمايند . آنان يک صفحه وب را مشاهده نموده و پس از اعمال تغييرات لازم ، صرفا" با فعال نمودن يک دکمه Update تغييرات را در بانک اطلاعاتي ثبت نمايند .بانک اطلاعاتي مورد نظر بهنگام نمي گردد تا زماني که دکمه Update فعال گردد . در چنين مواردي مي توان از يک Dataset مبتني بر Session استفاده نمود.
• ارسال و يا دريافت از راه دور اطلاعات از بانک اطلاعاتي به منظور برقراري ارتباط بين پلت فورم هاي متفاوت : با توجه به اين موضوع که يک DataSet مي تواند به سادگي درون يک فايل XML قرار داده شود و يا از آن خوانده شوند ، به عنوان اولين کانديد براي ارسال اطلاعات بين پلت فورم هاي متفاوت مطرح مي باشد .مثلا" در صورتي که قصد برگرداندن داده بانک اطلاعاتي را از طريق يک سرويس وب داشته باشيد ، يکي از روش هاي موجود در اين زمينه اين است که داده هاي بانک اطلاعاتي درون يک DataSet قرار داده شوند و در ادامه با استفاده از متد سرويس وب، DataSet برگردانده شود . در چنين حالتي DataSet به صورت اتوماتيک درون يک فايل XML قرار داده شده و ارسال مي گردد .

علل استفاده از DataSet و علل عدم استفاده از DataSet

در برنامه هاي وب به مواردي برخورد مي کنيم که شايد استفاده از DataSet تنها گزينه موجود در اين رابطه باشد . مثلا" فرض کنيد قصد داريم برخي اطلاعات موجود در بانک اطلاعاتي را Cache نموده تا از آنان در صفحات متعددي بر روي يک سايت استفاده گردد . اين نوع داده ها ممکن است وابسته به نوع کاربر بوده و در Session ذخيره شده باشند و يا ممکن است توسط تمامي کاربران استفاده گردند . در چنين مواردي مي بايست اطلاعات را در Data Cache ذخيره نمود .
DataReader با توجه به اين که يک شي disconnected است ، نمي تواند براي Cache کردن داده ها مورد استفاده قرار گيرد و در زمان استفاده از آن مي بايست اتصالات به بانک اطلاعاتي فعال و بسيار کوتاه باشند ( Short-Live ) . با توجه به موارد فوق در صورتي که قصد داريد داده هاي بانک هاي اطلاعاتي را Cache نمائيد ، استفاده از DataSet مي تواند يکي از گزينه هاي موجود در اين رابطه باشد .ولي آيا اين تنها گزينه موجود است ؟ در چنين مواردي مي توان يک کلاس را ايجاد که داراي خصلت هائي متناظر و مرتبط با فيلدهاي بانک اطلاعاتي است که قصد ذخيره آنان در يک DataSet را داريد . در زمان Cache نمودن داده مي توان از يک DataReader به منظور خواندن query از بانک اطلاعاتي ، بازيابي و حرکت بين رکوردهاي برگردانده شده استفاده نمود . در اين رابطه لازم است براي هر رکورد يک نمونه کلاس سفارشي شده ايجاد ، خصلت هاي آن را متناسب با مقادير موجود در query تنظيم و کلاس سفارشي را به يک ArrayList اضافه نمود . در ادامه مي توان اشياء سفارشي را Cache نمود . روش فوق علاوه بر افزايش کارآئي ، قابليت پشتيباني را نيز بهتر خواهد کرد . همچنين مي توان اين مجموعه از کلاس هاي سفارشي شده را به يک کنترل وب داده ASP.NET ( نظير DataList, DataGrid و يا Repeater ) نيز نسبت داد (مشابه استفاده از يک DataSet و يا DataReader ) .
يکي ديگر از مواردي که مي تواند دلايل استفاده از يک DataSet را در برنامه هاي وب توجيه نمايد ، زماني است که قصد دستيابي تصادفي به داده هائي خاص در بين تعدادي رکورد را داشته باشيم . چراکه رکوردهاي فوق ممکن است بدفعات استفاده گردند . مثلا" فرض کنيد قصد استفاده از يک master/detail DataGrid را داريم که در آن يک ستون از DataGrid شامل رکورد مادر و ساير ستون ها شامل DataGrid ديگر ( مرتبط با سطر فرزند) باشد . در چنين مواردي استفاده از يک DataSet به منظور جمع آوري تمامي رکوردهاي فرزند از بانک اطلاعاتي در مقابل اين روش که براي هر سطر DataGrid يک query را استفاده نمود ، ترجيح داده مي شود . کارآئي روش فوق به تعداد سطرهاي موجود در جدول مادر بستگي خواهد داشت . از آنجائيکه يک DataSet سي مرتبه کندتر از يک DataReader است ، اگر بيش از سي رکورد در جدول مادر وجود دارد که قصد نمايش آنان را داريم ، استفاده از يک DataSet مي تواند گزينه اي معقول تر در اين زمينه باشد تا اين که براي هر رکورد مادر يک query را اجراء نمود .
منبع: http://www.4guysfromrolla.com
Add Comments
Name:
Email:  
User Comments:
SecurityCode: Captcha ImageChange Image