مفاهيم اوليه ADO.NET

ADO.NET ، نسل جديدی از ADO شرکت ماکروسافت است . نسخه ADO ، با استفاده از مجموعه ای اشياء ActiveX Data Object طراحی و پياده سازی شده بود. ADO.NET گرچه در سطح ارائه پتانسيل های لازم در برخی موارد دارای شباهت هائی با ADO است ولی از نظر مدل برنامه نويسی دارای ساختاری کاملا” متفاوت( نسبت به ADO ) است.

تعريف ADO.NET
ADO.NET، مجموعه ای از کلاس ها بمنظور کار با داده ها است.
بموازات رشد اينترنت ، طراحی و پياده سازی برنامه های مبتنی بر وب به امری متداول و نيازی همگانی مطرح شده است . در اين راستا برنامه های متعددی ، از XML بمنظور ارسال اطلاعات خود در شبکه استفاده کرده و هر روز به تعداد اين برنامه ها نيز اضافه می گردد. ADO.NET ، يک مدل برنامه نويسی مناسب بمنظور يکپارچگی بين ويژگی های XML و ADO.NET در فريمورک دات نت را ارائه می نمايد.

مزايای ADO.NET
تکنولوژی فوق نسبت به ADO دارای مزايای زير است :
• Interoperability . تکنولوژی ADO.NET از XML بعنوان فرمت ارسال اطلاعات از يک منبع داده به مقصد مورد نظر استفاده می نمايد ( داده های مستقرشده در حافظه محلی)
• Maintainability . بموازات افزايش کاربران يک برنامه ، ما شاهد بروز مسائلی در رابطه با منابع موجود در سيستم خواهيم بود. با استفاده از يک برنامه N-Tire ، می توان منطق برنامه را بين چندين Tire اضافی توزيع نمود. معماری ADO.NET ، از حافظه Cache بمنظور نگهداری نسخه هائی از داده استفاده و بدين ترتيب امکان بهره برداری از اطلاعات فوق برای ساير Tire های اضافی فراهم می گردد .
• Programmability . مدل برنامه نويسی ADO.NET کاملا” از Strongly typed data حمايت و باعث می گردد که که کدها مختصرتر و با شفافيت خاصی، بسادگی نوشته گردند .
• Performance . تکنولوژی ADO.NET اين امکان را فراهم می آورد تا عمليات مازاد در ارتباط با تبديل نوع داده ها ،حذف گردد( از Strongly typed data استفاده می گردد ) .
• Scalability . مدل برنامه نويسی ADO.NET باعث تشويق برنامه نويسان برای صرفه جوئی در منابع سيستم و ارائه آنان برای برنامه های در حال اجراء بر روی بستر وب می گردد. با توجه به اينکه داده در حافظه محلی Cache می گردد، ضرورتی به نگهداری بلاک هائی از بانک اطلاعاتی و يا نگهداری اتصالات فعال با بانک اطلاعاتی برای مقاطع زمانی بعد ، وجود نخواهد داشت .

Namespace های مرتبط با داده
فريمورک دات نت ، پتانسيل ها ی( عمليات ) خود را به چندين Namespace تقسيم و ADO.NET نيز از اين قاعده مستثنی نخواهد بود . ADO.NET عمدتا” در Namespace با نام System.Data ، پياده سازی شده است.Namespace فوق،بصورت فيزيکی در اسمبلی System.Data.dll قرار دارد. برخی از بخش های ADO.NET در Namespace با نام System.Xml قرار دارند ( مثلا” کلاس XmlDataDocument ) مشخصات هر يک از Namespace های مرتبط با داده ها بشرح زير می باشد :
• System.Data ، هسته ADO.NET بوده و شامل کلاس هائی است که بخش غيرمتصل معماری ADO.NET را شکل می دهد ( کلاس DataSet )
• System.Data.Common ، کلاس های کاربردی و اينترفيس مورد نياز برای NET Data Providres . را فراهم می نمايد.
• System.Data.sqlclient ، ارائه دهنده داده: SQL Server.Net Data Provider
• System.data.OleDB ، ارائه دهنده : OLEDB.NET Data Provider

• System.Data.sqltypes ، کلاس ها و ساختارهای مورد نياز برای Native SQL Server Data Types را ارائه می نمايد.( يک جايگزين سريع و ايمن برای داده های نوع ديگر).
• System.Xml ، کلاس ها واينترفيس های لازم بمنظور حمايت استاندارد د از پردازش های مبتنی بر XML را ارائه می نمايد. ( مثلا” کلاس XmlDataDocument)
تغييرات ADO و ADO.NET
تغييرات متعددی در ADO.NET نسبت به ADO اعمال شده است . اغلب تغييرات فوق ، با توجه به مطالعات انجام شده در رابطه با موارد مثبت و منفی ADO صورت گرفته است . دستاورد اين تغييرات، قدرت و انعطاف مطلوب برای ADO.NET است .

با توجه به اينکه تمامی ارائه دهندگان داده دات نت، عمليات تراکنشی را ارائه نمی نمايند ، ADO.NET ، پتانسيل های خود را به کلاس های مجزائی تقسيم و در اختيار قرار می دهد، بدين ترتيب شی اتصال ADO.NET بمراتب کم حجم تر نسبت به شی اتصال ADO خواهد بود.
Recordset در ADO ، يک شی بسيار بزرگ است . شی فوق، امکان حمايت از چندين نوع Cursor را فراهم می نمايد ( از نوع سريع تا نوع سمت سرويس گيرنده غير متصل) . سفارشی نمودن تمام امکانات شی فوق، مشکل و در برخی موارد غيرممکن است. ADO.NET ، پتانسيل های Recordset مربوط به ADO را به چندين کلاس تفسيم کرده است .مثلا” DataReader معادل يک Cursor سريع ، DataSet يک مدل غيرمتصل Cache شده با امکان رديابی ، ثبت و کنترل نسبت دهی و DataAdapter قابليت سفارشی نمودن نحوه ذخيره سازی و بهنگام سازی داده ها و اعمال تغييرات در يک DataSet را دارا است .

مدل اشياء ADO.NET

مدل اشياء ADO.NET شامل دو بخش اصلی است :
• کلاس های DataSet .کلاس های فوق ، اين امکان را فراهم می نمايند که داده ها را در يک Cache غير متصل ، ذخيره و مديريت کرد. DataSet مستقل از هر نوع منبع داده بوده و بنابراين ويژگی های آن برای تمامی برنامه ها در دسترس و قابل استفاده خواهد بود ( صرفنظر از محلی که داده ها از آنجا سرچشمه می گيرند ) .
• کلاس های NET Data Provider . کلاس های فوق ، مختص يک منبع داده خاص می باشند. بنابراين NET Data Providers . ، می بايست برای يک منبع داده ئی خاص نوشته گردد و صرفا” با همان منبع داده ، کار نمايد . کلاس های فوق، قابليت اتصال به يک منبع داده ،بازيابی از منبع داده و بهنگام سازی داده های موجود در يک منبع داده را فراهم می نمايند .
مدل اشياء ADO.NET ، شامل کلاس های زير است :

• SQL Server .NET Data Provider
• OLE DB .NET Data Provider
• other .NET Data Providers
استفاده از کلاس های ADO.NET در مدل متصل

NET Data Provider . ، کلاس های مورد نياز ADO.NET را بمنظور استفاده در سناريوی متصل (Connected) ارائه می نمايد. NET data Provider. ها ، بگونه ای طراحی شده که کم حجم و حداقل لايه بين کد مربوطه و منبع داده ايجاد و بدين ترتيب کارائی سيستم افزايش خواهد يافت . فريمورک دات نت دارای دو Provider است :
• SQL Server .NET ، امکان دستيابی بهينه به بانک های اطلاعاتی SQL server 2000 و SQL Server 7 را فراهم می نمايد . بمنظور استفاده از Provider فوق، می بايست از Namespace با نام System.Data.sqlclient در برنامه مورد نظر استفاده گردد . استفاده از Provider فوق در مقايسه با OLE DB.NET دارای کارائی بمراتب بيشتری است (چون از طريق يک OLE DB و يا ODBC عبور داده نمی شود) .
• OLE DB.NET ، امکان دستيابی به SQL Server 6.5 و ساير بانک های اطلاعاتی نظير Oracle , Sybase , DB2/400 و Access را فراهم می نمايد . بمنظور استفاده از Provider فوق، می بايست از Namespace با نام System.Data.OleDb در برنامه مورد نظر استفاده گردد .

کلاس های هر يک از Data Provider ها، از مدل رايج اشياء ADO.NET تبعيت می نمايند . در SQL Server .NET Data Provider ، اسامی کلاس ها با پيشوند sql شروع می شود . مثلا” کلاس مربوطه به Connection دارای نام sqlConnection است . در OLE DB.NET Provider ، اسامی کلاس ها با پيشوند OleDb شروع می گردد . مثلا” کلاس Connection دارای نام OleDbConnection است .
در آينده NET Date Provider . ، بيشتر و با پيشوندهای ديگری ايجاد خواهند شد .
در فهرست زير پيشوندهای متفاوت بصورت Xxx نشان داده شده اند :

• XxxConnection ، باعث ايجاد يک اتصال( ارتباط) به منبع داده می شود . مثلا” کلاس sqlConnection ، باعث ايجاد يک اتصال به منبع داده ئی از نوع SQL Server می گردد .
• XxxCommand ، باعث اجرای يک دستور از منبع داده می گردد . مثلا” کلاس sqlCommand می تواند باعث اجرای يک Stored Procedure و يا يک عبارت SQL در منبع داده ئی از نوع SQL Server می گردد .
• XxxDataReader ، کلاس فوق، باعث خواندن مجموعه ای داده از يک منبع داده ، بصورت فقط خواندنی و صرفا” بسمت جلو می گردد .مثلا” کلاس sqlDataReader ، باعث خواندن سطرهائی از جداول يک منبع داده ئی از نوع SQL Server می گردد . کلاس فوق، توسط متد ExecuteReader مربوط به کلاس XxxCommand بعنوان نتيجه اجرای يک عبارت SELECT SQL برگردانده می گردد .
مثال : کلاس XxxDataReader ، امکان دستيابی فقط خواندنی و صرفا” بسمت جلو در ارتباط با داده های موجود در يک منبع داده را فراهم می نمايد. مثلا” برای استفاده از sqlDataReader برای خواندن داده از يک بانک اطلاعاتی SQL server ، می بايست مراحل زير را انجام داد.

• يک شی sqlConnection ، بمنظور اتصال ( ارتباط) به بانک اطلاعاتی SQL Server تعريف نمائيد.
• يک شی sqlCommand تعريف که شامل عبارت SQL SELECT برای پرس و جو(Query) در ارتباط با بانک اطلاعاتی باشد .
• يک شی sqlDataReader تعريف نمائيد.
• فعال نمودن (Open) شی sqlConnection
• اجرای شی sqlCommand با استفاده از متد ExecuteReader و نسبت دهی نتايج به شی sqlDataReader
• استفاده از متد Read مربوط به شی sqlDataReader برای حرکت بسمت جلو در طول داده ها و پردازش سطرهای مربوطه
• بستن sqlDataReader
• بستن sqlConnection

استفاده از ADO.NET در مدل غيرمتصل
کلاس های ADO.NET که در مدل غير متصل استفاده می گردد توسط NET Data Providers . ، ارائه و در Namespace با نام System.Data موجود می باشند. فهرست زير کلاس هائی استفاده شده در مدل غير متصل ، را نشان می دهد :
• XxxDataAdapter ، با استفاده از کلاس های Connection , DataReader و Coomand می توان يک DataSet را مديريت نمود.مثلا” کلاس sqlDataAdapter ، قادر به مديريت بين يک Dataset و يک بانک اطلاعاتی SQL Server 7 است .

• XxxConnection ، ارتباطی با يک منبع داده ئی خاص را ايجاد ( برقرار) می نمايد . مثلا” کلاس sqlConnection ،باعث برقراری يک اتصال با منبع داده ئی از نوع SQL Server می گردد .
• XxxCommand ، قادر به اجرای Stored Procedure و يا عبارات SQL در يک منبع داده ئی از نوع SQL Server می باشد .
• XxxDataReader ، کلاس فوق، باعث خواندن مجموعه ای داده از يک منبع داده ، بصورت فقط خواندنی و صرفا” بسمت جلو می گردد .مثلا” کلاس sqlDataReader ، باعث خواندن سطرهائی از جداول يک منبع داده ئی از نوع SQL Server می گردد . کلاس فوق، توسط متد ExecuteReader مربوط به کلاس XxxCommand بعنوان نتيجه اجرای يک عبارت SELECT SQL برگردانده می گردد .
مثال : مراحل زير نحوه کار در يک محيط غير متصل را نشان می دهد :

• باز نمودن يک اتصال
• پر نمودن DataSet با استفاده از متد Fill مربوط به DataAdapter
• بستن اتصال
• پردازش DataSet ( مرتب سازی ، فيلترسازی، خلاصه سازی، نمايش داده ها در کنترل های ويندوز و وب ) . DataSet بصورت خودکار هرگونه تغييرات را رديابی و ثبت خواهد کرد .
• باز نمودن اتصال .، می توان از همان اتصالی که قبلا” ايجاد شده بود استفاده گردد .
• بهنگام سازی منبع داده با در نظر گرفتن تغييراتی که در DataSet اعمال شده است ( از طريق متد Upadate مربوط به DataAdapter ).
• بستن اتصال

DataSet و يا DataReader ؟
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 است ( ۸۹ / ۸ ثانيه در مقابل ۲۹ /۰ ثانيه ) .

موارد استفاده مفيد از 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 را اجراء نمود

ارتباط به منابع داده در ADO.NET ( بخش اول )
بمنظوراتصال به يک منبع داده ، می بايست در ابتدا يک Net Data Provider . ، انتخاب گردد . Data Provider ، کلاس های لازم بمنظور اتصال به يک منبع داده ، خواندن اطلاعات ، ويرايش ، بهنگام سازی و انجام عمليات متفاوت بر روی داده ها را ارائه می نمايد . در اين مقاله به تشريح انواع Data Provider پرداخته و با نحوه انتخاب مناسب آنان بمنظور استفاده در برنامه ها ، آشنا خواهيم شد .

NET Data Provider . چيست؟
NET Data Provider .، يک Component کليدی ارائه شده بهمراه معماری ADO.NET بوده که امکان ارتباط بين يک منبع داده و يک Component ، يک سرويس وب XML و يا يک برنامه را فراهم می نمايد. يک NET Data Provider .، امکان اتصال به منبع داده ، بازيابی داده ها ، انجام عمليات بر روی داده ها و بهنگام سازی منبع داده را فراهم می نمايد. بهمراه فريمورک دات نت ، Provider های زير ارائه شده است :
• SQL Server .NET Data Provider
• OLE DB .NET Data Provider

در آينده برای ساير منابع داده ، NET Data Provider . مربوطه ايجاد و در دسترس عموم برنامه نويسان قرار خواهد گرفت. هر Provider ، مسئوليت پياده سازی کلاس های عمومی ADO.NET را برعهده خواهد داشت . دستاورد رويکرد فوق ، ارتباط با منابع داده متفاوت با استفاده از يک روش يکسان از طريق محيط های برنامه نويسی خواهد بود .
کلاس های NET Data Provider .

ADO.NET ، از NET Data Provider . ، بمنظور ارتباط به منبع داده ، بازيابی ، عمليات برروی داده ها و بهنگام سازی منبع داده استفاده می نمايد . هر Provider ، بگونه ای طراحی می گردد که دارای حجم اندکی بوده و يک لايه حداقل بين کد های نوشته شده و منبع داده را ايجاد نمايند . ( افزايش کارائی بدون قربانی نمودن پتانسيل ها !)
فريمورک دات نت ، دارای دو Data Provider است :

• SQL Server .NET . امکان دستيابی بهينه به SQL Server 2000 و بانک های اطلاعاتی SQL Server 7.0 را فراهم می نمايد. بدين منظور می بايست از namespace با نام System.Data.Sqlclient بهمراه برنامه ها، استفاده گردد . Provider فوق، نسبت به OLE DB .NET Data Provider ، دارای کارآئی بمراتب بيشتری است (برای ارتباط با منبع داده از لايه های اضافه ديگر نظير: OLE DB و يا ODBC استفاده نمی گردد ).
• OLE DB .NET . امکان دستيابی به SQL Server 6.5 و يا نسخه های قبل از آن ، بانک های اطلاعاتی نظير اوراکل ، Sybase ، DB2/400 و اکسس ماکروسافت را فراهم می نمايد . بمنظور استفاده از Provider فوق ، می بايست از namespace با نام System.Data.OleDb بهمراه برنامه ها ، استفاده گردد .

علاوه بر موارد فوق ، ماکروسافت در صدد ارائه يک ODBC .NET Data Provider برای دستيابی به ساير منابع داده است .
ADO.NET ، از يک مدل شی گراء در رابطه با NET Data Providers . استفاده می نمايد . در SQL Server .NET Data Provider ، اسامی کلاس ها با پيشوند Sql آغاز می گردد . مثلا” کلاس Connection ، SqlConnection ناميده می شود. در OLE DB .NET Data Provider ، اسامی کلاس ها با پيشوند OleDb ، آغاز می گردد . مثلا” کلاس Connection دارای نام OleDbConnection ، می باشد. چهار کلاس اساسی زير، سهم عمده ای در شکل دهی يک NET Data Provider . را برعهده دارند .