بخشی از مقاله

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


ارتباط به منابع داده در 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 . را برعهده دارند .
• XxxConnection . کلاس فوق ، بمنظور ايجاد يک Connection به يک منبع داده خاص استفاده می گردد . مثلا" کلاس SqlConnection ، باعث اتصال به منابع داده SQL Server ، می گردد .
• XxxCommand . کلاس فوق ، بمنظور اجرای يک دستور از طريق يک منبع داده ، استفاده می گردد . مثلا" کلاس SqlCommand ، امکان اجرای Stored Procedure و عبارات SQL در رابطه با يک منبع داده SQL Server ، را فراهم می نمايد .
• XxxDataReader . از کلاس فوق ، بمنظور خواندن اطلاعات از يک منبع داده بصورت فقط خواندنی و Forward-only ، استفاده می گردد . مثلا" کلاس SqlDataReader ، امکان خواندن سطرهائی از جداول در رابطه با يک منبع داده SQL Server را فراهم می نمايد . کلاس فوق، بعنوان خروجی متد ExecuteReader از کلاس XxxCommand ، برگردانده می شود. ( اغلب بعنوان ماحصل اجرای يک عبارت SELECT SQL )


• XxxDataAdapter . کلاس فوق ، از اشياء XxxCommand استفاده تا يک DataSet را حاوی داده های مورد نظر نمايد. در اين راستا ، امکان بهنگام سازی اطلاعات نيز فراهم می گردد . مثلا" کلاس SqlDataAdapter ، امکان مديريت ارتباط بين يک Dataset و داده های ذيربط در يک منبع داده SQL Server را فراهم می نمايد.
نحوه انتخاب يک Data Provider
انتخاب يک NET Data Provider . مناسب برای يک برنامه، بستگی به نوع منبع داده ئی دارد که قصد ارتباط با آن وجود دارد.
نحوه مراجعه به يک NET Data Provider .
با استفاده از Solution Explorer در ويژوال استوديو دات نت ، می توان مديريت مراجعات به اسمبلی هائی که مسئوليت NET Data Provider . را بر عهده دارند ، انجام داد . اسمبلی System.Data.dll ( بصورت فيزيکی يک فايل DLL است ) مسئوليت پياده سازی SQL Server .NET Data Provider و OLE DB .NET Data Provider را از طريق Namespace های System.Data.SqlClient و System.Data.OleDb ، بر عهده داشته و اسمبلی System.Data.Odbc.dll چنين رسالتی را در رابطه با ODBC .NET Data Provider ، انجام خواهد داد . اسمبلی فوق ، در زمان نصب ويژوال استوديو دات نت ، نصب نخواهد شد . برای دريافت اسمبلی فوق ، می توان از طريق آدرس : http://msdn.microsoft.com/download ، اقدام و پس از کليک نمودن بر روی NET Framework .، گزينه ODBC .NET Data Provider را انتخاب کرد . بدين ترتيب، زمينه دريافت فايل فوق فراهم می گردد . پس از دريافت اسمبلی فوق ، می توان بصورت دستی (Manaually) در يک پروژه به آن مراجعه و از ODBC .NET Data Provider فوق ، استفاده کرد .


SQL Server .NET Data Provider
Provider فوق ، لايه ای نازک بين يک برنامه و SQL Server ايجاد می نمايد. با توجه به اينکه اين Provider ، از پروتکل اختصاصی خود ( TDS: Tabular Data Stream ) بمنظور ارتباط با يک سرويس دهنده SQL استفاده می نمايد ، حجم آن اندک و دستيابی به سرويس دهنده SQL مستقيما" و بدون استفاده از لايه های اضافه ديگر ، انجام می گيرد . بدين ترتيب کارائی و قابليت توسعه سيستم ، بهبود پيدا خواهد کرد .
OLE DB .NET Data Provider
Provider فوق ، بمنظور اتصال به يک منبع داده از OLE DB و COM بصورت ذاتی استفاده می نمايد . بنابراين می بايست از يک OLE DB Provider استفاده گردد که خود از OLE DB .NET Data Provider استفاده می نمايد . بمنظور استفاده از OLE DB .NET Data Provider ، می بايست نوع Provider بصورت يک رشته ، مشخص گردد . واژه Provider در رشته فوق بيانگر نوع OLE DB منبع داده ئی است که به آن متصل می گرديم .
مثلا" "Provider = MSDAORA" ، شما را به يک بانک اطلاعاتی اوراکل متصل می نمايد . در زمانيکه از SQL Server .NET Data Provider ، استفاده می شود ، نيازی به استفاده از واژه Provider نخواهد بود ( فرض می شود که SQL Server 7.0 و يا قبل از آن باشد) . جدول زير نمونه هائی در اين زمينه را نشان می دهد :
مثال منبع داده
Provider = SQLOLEDB;Data Source = Tehran ;Initial
Catalog = pubs;User ID = sa ; Password = 999; SQL Server 6.5
Provider = MSDAORA ; Data Source = ORACLE817 ; User
ID = OLEDB ; Password = OLEDB ; Oracle server


Provider = Microsoft.Jet.OLEDB.4.0;
Data Source = C:\Mydb\Firstdb.mdb ;
Microsoft Access database
ODBC .NET Data Provider
Provider فوق ، بمنظور اتصال به يک منبع داده از توابع A

PI مربوط به ODBC بصورت ذاتی استفاده می نمايد. اين Provider ، بصورت يک اسمبلی مجزاء و با نام System.Data.Odbc.dll ، پياده سازی شده و بصورت پيش فرض در تمپليت های پروژه در ويژوال استوديو دات نت ، انتخاب نشده و می بايست بصورت دستی به آن مراجعه گردد .
مثال Provider/Driver منبع داده
Driver ={Microsoft ODBC for Oracle };
Server = ORACLE817;UID=OLEDB;
PWD = OLEDB; ORA ODBC Oracle Server
Driver = {Microsoft Access Driver (*.mdb)};
DBQ = C:\Mydb\Firstdb.mdb ; Jet ODBC Microsoft Access database
خلاصه
برای انتخاب يک NET Data Provider . ، موارد زير پيشنهاد می گردد :
• اگر منبع داده از نوع SQL Server 7.0 و يا SQL Sever 2000 می باشد ، SQL Server .NET Data Provider انتخاب گردد .
• اگر منبع داده از نوع SQL Server 6.5 و قبل از آن باشد ، OLE DB .NET Data Provider انتخاب گردد .
• اگر منبع داده شامل هر نوع منبع داده نامتجانس باشد که امکان دستيابی به آن از طريق OLE DB Provider ، وجود داشته باشد ،
از OLE DB .NET Data Provider استفاده گردد .
• اگر منبع داده شامل هر نوع منبع داده نامتجانس باشد که امکان دستيابی به آن از طريق ODBC driver ، وجود داشته باشد ،
از ODBC .NET Data Provider استفاده گردد .
در بخش دوم اين مقاله به بررسی نحوه تعريف يک Connection خواهيم پرداخت .
________________________________________
ارتباط به منابع داده در ADO.NET ( بخش دوم )


در بخش اول اين مقاله به تشريح انواع Data Provider پرداخته و با نحوه انتخاب آنان بمنظور استفاده در برنامه ها ، آشنا شديم . در اين بخش به بررسی نحوه ايجاد يک Connection خواهيم پرداخت . Connection String ، بخشی ضروری بمنظور ارتباط با يک منبع داده است . خصلت ConnectionString مربوط به شی Connection ، اطلاعات لازم را در اختيار شی Connection قرار می دهد .
امنيت بانک اطلاعاتی ايجاد هر گونه ارتباط با بانک اطلاعاتی در اختيار وی گذاشته شوند ( ارسال اطلاعات اوليه بمنظور اطمينان از معتبر بودن کاربر ) .امنيت بانک اطلاعاتی ، بستگی به نوع بانک اطلاعاتی مربوطه خواهد داشت .
استفاده از امنيت سرويس دهنده SQL
سرويس دهنده SQL ، با استفاده از دو روش متفاوت اقدام به تائيد کاربر می نمايد : تائيد کاربران بر اساس سيستم امنيتی ويندوز ( Microsoft Windows Authentication ) و حالت ترکيبی ( Mixed Mode Authentication ) .
روش Windows Authentication
در مدل فوق ، اين امکان برای يک کاربر فراهم خواهد شد که با استفاده از يک Account ويندوز به بانک اطلاعاتی مرتبط گردد . خصلت امنيتی شبکه برای کاربر در زمان ورود به شبکه ايجاد می گردد . زمانيکه يک کاربر شبکه سعی در ارتباط با بانک اطلاعاتی سرويس دهنده SQL می نمايد ،عمليات تائيد وی آغاز و در ادامه بر اساس سياست های امنيتی ورود به شبکه که قبلا" برای وی تعريف و تنظيم شده است ، امکان دستيابی وی به بانک اطلاعاتی محقق و يا با درخواست وی بدلايل امنيتی مخالفت خواهد شد . در چنين حالتی ضرورتی به يک Login مجدد ( ورود نام و رمز عبور توسط کاربر) وجود نخواهد داشت . استفاده از روش فوق ، بمنظور ارتباط با بانک اطلاعاتی دارای مزايای زير است :
• متعبرسازی ايمن بهمراه رمزنگاری رمزهای عبور
• Auditing
• تاريخ سررسيد رمز عبور
• تعريف حداقل طول رمزعبور
• غير فعال شدن ( قفل نمودن ) رمز عبور پس از انجام چندين تلاش نافرجام جهت ورود به شبکه
نکته : با توجه به اينکه کاربران و گروههای ويندوز ، صرفا" توسط ويندوز نگهداری و پشتيبانی می گردند ، سرويس دهنده SQL اطلاعات مربوط به يک گروه کاربران را در زمان اتصال به بانک اطلاعاتی می خواند . در صورتيکه تغييراتی در رابطه با مجوزهای دستيابی برای يک کاربر متصل شده ايجاد گردد ، تغييرات ايجاد شده در زمان آتی که کاربر به سرويس دهنده SQL مرتبط می گردد ؛ در نظر گرفته شده و متناسب با تغييرات ايجاد شده با کاربر برخورد خواهد شد .
روش Mixed Mode Authentication
در روش فوق ، اين امکان برای کاربران فراهم می گردد که به يک

سرويس دهنده SQL بر اساس Windows Authentication و يا SQL Server Authentication متصل گردند . کاربرانی که از طريق ويندوز NT 4.0 و يا ويندوز 2000 به بانک اطلاعاتی مرتبط می گردند ، قادر به استفاده از ارتباطات trusted در Windows Authentication و يا Mixed Mode Authntication می باشند . زمانيکه کاربری با استفاده از يک نام و رمز عبور خاص و بکمک يک ارتباط non-trusted به بانک اطلاعاتی متصل می گردد ، سرويس دهنده SQL خود عمليات تائيد کاربر را بررسی می نمايد ( آيا يک account سرويس دهنده SQL پيکربندی و تنظيم شده است ؟) . در صورتيکه ماحصل بررسی فوق منفی باشد ، کاربر تائيد نشده و وی با يک پيام خطاء مواجه خواهد شد.
نکته : در صورتيکه کاربری سعی در ارتباط با يک سرويس دهنده SQL 7.0 ، ( مورد نظر سرويس دهنده SQL 2000 نمی باشد ) را داشته و يک نام خالی ( blank) را وارد نمايد ، سرويس دهنده SQL 7.0 ، از Windows Authentication استفاده می نمايد.علاوه بر اين ، در صورتيکه کاربری سعی در ارتباط با يک سرويس دهنده SQL 7.0 نمايد که برای Windows Auth

entication پيکربندی شده باشد ( استفاده از يک Login خاص ) ، login مورد نظر ناديده گرفته شده و از روش Windows Authentication استفاده خواهد شد .
روش SQL Server Authentication بمنظور سازگاری با نسخه های قبلی ارائه شده است . زيرا بر نامه های نوشته شده برای سرويس دهنده SQL 7.0 ، و يا قبل از آن می بايست از نام و رمز عبور سرويس دهنده SQL استفاده نمايند. علاوه بر اين ، زمانيکه يک نمونه از سرويس دهنده SQL تحت ويندوز 98 اجراء می گردد ، چون روش Windows Authentication در نسخه وينوز 98 حمايت نمی گردد ، مجددا" از روش SQL Server Authentication استفاده خواهد شد .بنابراين سرويس دهنده SQL از Mixed Mode در زمان اجراء ويندوز 98 استفاده می نمايد ( ولی صرفا" SQL Server Authentication حمايت می گردد ) .

Connection String چيست ؟
بمنظور انتقال اطلاعات بين يک منبع داده و برنامه ، می بايست در ابتدا دارای يک ارتباط ( اتصال ) با منبع داده باشيم . خصلت ConnectionString ، اطلاعات ضروری و مورد نياز در ارتباط با تعريف يک اتصال به منبع داده را از طريق يک رشته مشتمل بر مجموعه ای از پارامترها ، ارائه می

نمايد. جدول زير چندين پارامتر متداول در رابطه با Connection string را نشان می دهد .
توضيحات پارامتر
از خصلت فوق بمنظور تنظيم و يا برگرداندن نام Provider مرتبط با Connection استفاده می گردد . امکان استفاده از خصلت فوق، صرفا" برای اشياء OleDbConnection وجود خواهد داشت . Provider
مدت زمان انتظار برحسب ثانيه بمنظور ارتباط با بانک اطلاعاتی را مشخص می نمايد. ( پيش فرض 15 ) . Connection TimeOut
or
Connect TimeOut
نام بانک اطلاعاتی Initial Catalog
نام سرويس دهنده SQL استفاده شده در زمانيکه يک Connection فعال شده باشد و يا نام فايل در رابطه با يک بانک اطلاعاتی Access را مشخص می نمايد . Data Source
رمز عبور برای SQL Server account Password
SQL Server Login account User ID
ايمن بودن ارتباط را مشخص می نمايد. مقادير مورد نظر می تواند True,False و SSPI باشد . ( SSPI معادل True است ) Integrated Security
or
Trusted Connection
زمانيکه مقدار آن False باشد ، اطلاعات حساس امنيتی نظير رمز عبور بعنوان بخشی از ارتباط (زمانيکه ارتباط فعال می گردد) ، برگردانده نخواهد شد. تنظيم خصلت فوق به True می تواند يک ريسک امنيتی باشد مقدار پارامتر فوق بصورت پيش فرض False است . Perisist Security Info
نحوه تنظيم يک Connection String


بمنظور ايجاد و مديريت يک Connection می بايست يکی از اشياء Connection مربوط به ADO.NET را استفاده نمود : شی SqlConnection و يا شی OleDbConnection . تنظيم خصلت ConnectionString صرفا" زمانی که Connection بسته می گردد، ميسر خواهد بود . بمنظور Reset نمودن يک Connection String می بايست Connection مورد نظر را بست و مجددا" آن را فعال نمود.

مثال
در اين بخش به بررسی چندين مثال بمنظور آشنائی با نحوه استفاده از Connection String بهمراه پارامترهای مربوطه ، خواهيم پرداخت . دقت داشته باشيد که تمامی Connection String ها ، دارای پارامترهای يکسان نمی باشند .
مثال 1 - نحوه اتصال به يک بانک اطلاعاتی SQL Server 2000 با استفاده از شی SqlConnection و VB.NET
پارامتر مقدار
Product SQL Server 2000
Server name Tehran
DatabaseName Northwind
Security Mixed mode
Username sa
Password 110
Timeout 1 minute
نحوه اتصال به بانک اطلاعاتی
Dim cnNorthwind as New _ system.Data.SqlClient.SqlConnection()
cnNorthwind.ConnectionString = _
"User ID = sa;" & _


"Password= 110;" & _
"Initial Catalog=Northwind;"&_
"Data Source =Tehran;" & _
"Connection TimeOut= 60;"
مثال 2 - نحوه اتصال به يک بانک اطلاعاتی Access با استفاده از يک OleDbConnection و ويژوال بيسيک
پارامتر مقدار
Product Microsoft Access 2000
Database location \Samples\Northwind.mdb
نحوه اتصال به بانک اطلاعاتی
Dim cnNorthwind as New _
system.Data.OleDb.OleDbConnection( )
cnNorthwind.ConnectionString = _
"Provider = Microsoft.Jet.OLED.4.0" & _
"Data Source= \Samples\Northwind.mdb;"
مثال 3 - نحوه اتصال به يک بانک اطلاعاتی SQL Server 6.5 با استفاده از شی OleDbConnection و #C
پارامتر مقدار
Product SQL Server 6.5
Server name Myserver
DatabaseName Pubs
Security Windows authentication
نحوه اتصال به بانک اطلاعاتی
System.Data.oleDb.OleDbConnection cnNorthwind = new
System.Data.OleDB.OleDbConnection ( );
cnNorthwind.ConnectionString =


"Provider = SQLOLEDB;" +
"Data Source =Myserver;" +
"Initial Catalog= Pubs;" +
"Integrated Security=SSPI;" ;
ساده ترين روش تنظيم يک Connection string استفاده ار ويژوال استوديو دات نت است :
• برنامه ويژوال استوديو را فعال نمائيد.
• يک ASP.NET Application و يا Windows Application را با استفاده از VB ، ايجاد نمائيد.
• کنترل SqlConnection را بر روی فرم مورد نظر قرار دهيد( Darg&Drop ) .
• در پنجره Properties ، خصلت ConnectionString را تنظيم نمائيد.

در متن اصلی مقاله به هم ریختگی وجود ندارد. برای مطالعه بیشتر مقاله آن را خریداری کنید