Rebecca M. Riordan

600
Microsoft ADO.NET 2.0 Rebecca M. Riordan : ) !" (

Transcript of Rebecca M. Riordan

باگا به گام مMicrosoft

ADO.NET 2.0 Rebecca M. Riordan

عبدالوهاب فخرياسري:ترجمه

شركت ناقوس انديشه) سهامي خاص(

فهرست

23....................................................................................................................مقدمه23.................................................................. نوشته شده است؟ي چه كسانيكتاب برا

24...............................................................................................ترتيب مطالب كتاب24.................................................. خود انتخاب كنيد؟ي شروع را براةچگونه بهترين نقط

و ويژگ 25......................................................................... كتابي قرارداديهايعالئم25................................................................................................سيستم مورد نياز

26.......................................................................................................... كدهاةنمون26................................................................................................. كدهاةنصب نمونAdoStepByStep......................................................................27 اطالعاتي الصاق بانك

27........................................................................................... كدهاةاستفاده از نمون27...................................................................................! بخوانيد- كدهاةحذف نمون

28.........................................................................................از انتشار افزار پيش نرم28..................................................................................صورت آنالينمطالب ديگر به28....................................................................................................پشتيبانان كتاب

و نقطه نظرات پرسش 29.........................................................................................ها31........................................................................................................................بخش اول

ADO.NET..................................................................................................31شروع كار با31........................................................................................................................فصل اول

ADO.NET..................................................................................................31شروع كار با32............................................................................ تمام اجزاي بنياديپيوند پيرامون هم

ADO.NET.............................................................................................32ءيشةنمون32.............................................................................................ها دادهيها بيننده تدارك

DataSet34..............................................................................................................هاDataTableCollection.........................................................................................34ءيشDataRelationCollection.....................................................................................35ءيش

35..............................................................................ها مقيد به دادهةايجاد يك فرم ساد36...............................................................................................ها منبع دادهيپيكربند

36............................................................................ كندة اضافةها به پروژ يك منبع دادهData Sources...................................................................................41استفاده از پنجره

41..................................................................................نمايش محتويات يك جدول پيش43............................................................................... ستونةگزيد تغيير نوع كنترل پيش

Microsoft ADO.NET 2.0 4گام به گام با

44.....................................................................ها به فرم افزودن كنترل مقيد شده به داده46..................................................................................................................خالصه

47.......................................................................................................................بخش دوم47.................................................................................................ها دادهةبينند اركتدءيااش

47........................................................................................................................فصل دوم47.............................................................................................................كاربرد اتصاالت

48.........................................................................................................درك اتصاالت48................................................................................................. هاConnectionايجاد48..........................................................................ي ها در زمان طراحConnectionايجاد

49............................................................................... ابزارة به جعبConnectionافزودن50................................................................................. به فرمConnectionاضافه كردن

52.............................................................................. ها در زمان اجراConnectionايجاد52.................................................ويژوال بيسيك: ايجاد كنيدConnectionبا نوشتن كد، يكسوي: ايجاد كنيدConnectionبا نوشتن كد، يك 53.............................................شارپيژوال

54...........................................................................................ها ConnectionيپيكربندConnectionString Property........................................................................................57

58...........................................................ويژوال بيسيك: ConnectionString Propertyتنظيمس: ConnectionString Propertyتنظيم 58......................................................شارپيويژوال

59.....................................ي كاربردة برناميند در فايل پيكربConnectionStringذخيره كردن59.....................................ي كاربردة برنامي در فايل پيكربندConnectionStringذخيره كردنConnection.........................................................................61يهاproperty كاربرد ديگر

62.............................................................................ويژوال بيسيك: ايجاد متغير واسطهس: ايجاد متغير واسطه 62........................................................................شارپيويژوال

63...................................................................... فرميها ها به كنترل propertyمقيد كردنpropertyيهاConnection63..........................ويژوال بيسيك: فرم مقيد سازيديها را به كنترلPropertyيهاConnectionمقيها به كنترل را س: يد سازيد فرم 65.....................شارپيويژوال66........................................................................................................ اتصاليمتدها

و بسته كردن اتصاالت 67........................................................................................باز67........................................................ويژوال بيسيك:و بسته كنيد را بازConnectionيكو بسته كنيدConnectionيك س: را باز 68....................................................شارپيويژوال

69........................................................................................ها اتصاليكنترل انبارسازConnection.............................................................................................71يرويدادهاStateChange............................................................................................71يرويدادها

5 فهرست

72................................................................ويژوال بيسيك: StateChangeپاسخ به رويدادس: StateChangeداد پاسخ به روي 73...........................................................شارپيويژوال

InfoMessage...........................................................................................74يرويدادها75..................................................................................................................خالصه

77......................................................................................................................فصل سومو Data Commandكاربرد 77........................................................................ هاDataReader ها

77............................................................................................ هاData Commandدرك79........................................................................................... هاData Commandايجاد79.....................................................................يها در زمان طراحData Command ايجاد79...................................................... ابزار اضافه كنيدةبه جعبي را در زمان طراحيفرمان80............................................. به فرم اضافه كنيدي از يك فرمان زمان طراحي جديدةنمون

81.....................................................................................اجراها در زمان ايجاد اتصال82.........................................................ويژوال بيسيك: را با نوشتن كد ايجاد كنيديفرمانس: را با نوشتن كد ايجاد كنيديفرمان 83.....................................................شارپيويژوال84................................................ويژوال بيسيك: بگيريدConnectionاز به فرمان،يارجاع85............................................شارپيسويژوال: بگيريدConnectionاز به فرمان،يارجاع86......................................................................................ها Data Commandيپيكربند89............................................................ي در زمان طراحCommandيها propertyتنظيم89........................................................ در ويژوال استوديوCommandيها propertyتنظيم92................................................................ در زمان اجراCommandيها propertyتنظيم92........................................ويژوال بيسيك: با استفاده از كدCommandيهاproperty تنظيمكد باCommandيها propertyتنظيم س: استفاده از 93....................................شارپيويژوال

93..................................................................................... پارامترهاةاستفاده از مجموع95...............................................................يرها در زمان طراح پارامتةوعممجيپيكربند96........................................................... پارامترها در ويژوال استوديوة مجموعيپيكربند

و پيكربند اجياضافه كردن 97...........................................................را پارامترها در زمانو پيكربنديبا نوشتن كد پارامتر 97...................................ويژوال بيسيك: نماييدي را اضافه

و پيكربنديپارامتركد نوشتن با س: نماييدي را اضافه 98...............................شارپيويژوال98.............................................................................................تنظيم مقادير پارامترها

98.........................................................ويژوال بيسيك: تنظيم مقادير پارامترها به كمك كدس: تنظيم مقادير پارامترها به كمك كد 99....................................................رپشايويژوال

Command...................................................................................................99يمتدها 101.......................................................................................................امينفرياجرا

Microsoft ADO.NET 2.0 6گام به گام با

كدياجرا 101.................................................................ويژوال بيسيك: فرمان با نوشتنكدياجرا س: فرمان با نوشتن 102.............................................................شارپيويژوال 104...............................................................................................ها DataReaderدرك 105..............................................................................................ها DataReaderايجاد 105............................................................................ها در زمان اجراDataReader ايجاد 105..................................................................ويژوال بيسيك: به كمكDataReaderايجادس: به كمكDataReaderايجاد 106.............................................................شارپيويژوال

propertyيهاDataReader........................................................................................107 DataReader.............................................................................108يها propertyيبازياب 108.............................................................ويژوال بيسيك: DataReader propertyيبازيابس: DataReader propertyيبازياب 109.........................................................شارپيويژوال DataReader...............................................................................................110يمتدها Read.............................................................................................................112متد

از دادهيبازياب 112...............................................ويژوال بيسيك: DataReaderها با استفادهاز دادهيبازياب س: DataReaderها با استفاده 114..........................................شارپيويژوال 117...................................................................................................................فصل چهارم 117.................................................................................................هاDataAdapter كاربرد

117..............................................................................................هاDataAdapter درك 118.......................................................................يها در زمان طراحDataAdapter ايجاد

118..............................................ي ابزار در زمان طراحة به جعبDataAdapterاضافه كردن 120................... به وجود آوريدDataAdapter، يك DataAdapterيبا استفاده از ويزارد پيكربند

DataAdapter124.......................................................... به وجود آوريديصورت دست را به 125.......................................................................... ها در زمان اجراDataAdapterايجاد 125.........................................................ويژوال بيسيك: در زمان اجراDataAdapterايجادس: در زمان اجراDataAdapterايجاد 126....................................................شارپيويژوال 129...................................................................................................نمايش نتايج پيشنت پيش DataAdapter..................................................................................129ايج نمايش

DataAdapter............................................................................................130يپيكربند DataAdapter...............................................................................................133فرامين 134............................ در ويژوال استوديوDataAdapter از يك CommandText propertyتنظيم 135...............ويژوال بيسيك: در زمان اجراDataAdapter از يك CommandText propertyتنظيمس: در زمان اجراDataAdapter از يك CommandText propertyتنظيم 136...........شارپيويژوال

DataTableMappingCollection..................................................................................137

7 فهرست

Table Mappings...................................137ي بااستفاده ازقاب گفتگوDataSetرنام ستون تغيي DataAdapter....................................................................................139ي متدهاكاربرد

Fill...............................................................................................................139متدDataSet به 140..............................................ويژوال بيسيك: را پر كنيدDataAdapter متعلقDataSet به س: را پر كنيدDataAdapter متعلق 142.........................................شارپيويژوال

Update...........................................................................................................143متد 144........................ويژوال بيسيك: روزآمدكنيدDataAdapterهايي را بااستفاده ازيك منبع دادهيك منبع داده 145................شارپيسويژوال: روزآمد كنيدDataAdapterهايي را با استفاده از

DataAdapter..............................................................................146يپاسخ به رويدادها RowUpdating.............................................................................................146رويداد

147............................................................ويژوال بيسيك: RowUpdatingپاسخ به رويدادس: RowUpdatingپاسخ به رويداد 148........................................................شارپيويژوال

RowUpdated..............................................................................................150رويداد 150................................................................................................................خالصه

151....................................................................................................................فصل پنجم ADO.NET.................................................................................151 در Transactionپردازش 151............................................................................................... هاTransactionدرك

152.............................................................................................هاTransactionكاربرد 152..............................................................................................هاTransaction ايجاد 153...........................................................................ا در زمان اجراه Transactionايجاد

153................................................................ويژوال بيسيك: جديدTransactionايجاد يكس: جديدTransactionايجاد يك 156............................................................شارپيويژوال

158....................................................................... تودرتويها Nested Transactionايجادو بازگرداندن 158.................................................................هاTransactionمتعهد شدن به

Transaction159..................................................................ويژوال بيسيك: را متعهد كنيد Transactionس: را متعهد كنيد 160..............................................................شارپيويژوالTransaction162..............................................................ويژوال بيسيك: را بازگشت دهيد Transactionس: را بازگشت دهيد 164.........................................................شارپيويژوال

166................................................................................................................خالصه 167....................................................................................................................بخش سوم

167...............................................................................................ها دادهةدبينن تداركءاشيا 167....................................................................................................................فصل ششم

از بانكيساز نمونه 167.........................................هاDataRelationهاوDataSet اطالعاتي بااستفاده

Microsoft ADO.NET 2.0 8گام به گام با

167....................................................................................................هاDataSet درك 169...................................................................................................ها DataSetايجاد 170..........................................................................................ها Typed DataSetايجاد

DataSet Designer...............................................170 با استفاده از Typed DataSetجاد يك اي 174....................................................... به وجود آوريدDataAdapter از Typed DataSetيك

176.......................................................................................هاUntyped DataSet ايجاد 177................................................................ در ويژوال استوديوUntyped DataSetايجاد 178.................................ويژوال بيسيك: در زمان اجرا به وجود آوريدUntyped DataSetيكبه درUntyped DataSetيك س: وجودآوريد زمان اجرا 179..............................شارپيويژوال 181..............................................................................................ها DataSetيكربندپي

DataSet.........................................................................................182مجموعه جداوليDataSet Designerبا استفاده از 183..................... اضافه كنيدTyped DataSet به DataTableك، DataSet..........................................................................................186يكاربرد متدها

DataSet...................................................................................................188كلونينگ 188..............................................................................ويژوال بيسيك: DataSet ينگكلونس: DataSet ينگكلون 189..........................................................................شارپيويژوال 191......................................................................................ها DataTableReaderايجاد

191................................................................ويژوال بيسيك: DataTableReaderايجاد يك 192............................................................شارپيسويژوال : DataTableReaderايجاد يك

194.............................................................................................ها DataRelationدرك DataRelation................................................................................................194ايجاد

DataSet Designer....................................194 با استفاده از DataSet به DataRelationافزودن 196.......................................................................................هاDataRelationيپيكربند 197................................................................................................................خالصه

199.....................................................................................................................فصل هفتم 199.................................................................................................... هاDataTableكاربرد

199................................................................................................. هاDataTableدرك 200................................................................................................هاDataTable ايجاد DataSet Designer......................................................200 ها با استفاده از DataTableايجاد

DataSet Designer...................................200از استفاده ،باTyped DataSet بهDataTableافزودن 203................................................................. مستقل در زمان اجراي هاDataTableايجاد

203..................................ويژوال بيسيك: مستقل به وجود آوريدDataTable كد، يك به كمك 204........................................شارپيس: وجود آوريد مستقل بهDataTableبه كمك كد، يك

9 فهرست

205...............................................................در زمان اجرا DataSetي هاDataTableايجاد 206........................ويژوال بيسيك: اضافه كنيدUntyped DataSet را به DataTableبه كمك كد،

206.................................شارپيس: اضافه كنيدUntyped DataSet رابهDataTableكمك كد، به DataAdapter.............................................................207ها با استفاده از DataTable ايجاد 207..........................................ويژوال بيسيك: DataAdapter با استفاده از DataTableايجاداز با استفاDataTableايجاد 208................................................شارپيس: DataAdapterده

209...........................................................................................هاDataTableيپيكربندPrimaryKey Constraint211....................................................................................... ها

211...........................................................ويژوال بيسيك : PrimaryKey Constraintنمايش 212..................................................................شارپيس: PrimaryKey Constraintنمايش 213............................................................................................. هاDataColumnايجاد DataSet Designer....................................................214ها با استفاده از DataColumn ايجاد 214..................................................وجود آوريد بهDataSet Designer در DataColumnيك

215..........................................................................ها در زمان اجراDataColumn ايجاد 216..............................................ويژوال بيسيك: به وجود آوريدDataColumnبه كمك كد، 216....................................................شارپيس: به وجود آوريدDataColumnبه كمك كد،

217........................................................................................ هاDataColumnيپيكربند 218................................................................................. محاسبه شدهيها ايجاد ستون

218.........................................................ويژوال بيسيك: محاسبه شدهDataColumnايجاد 220...............................................................شارپيس: محاسبه شدهDataColumnايجاد

221.............................................................................................ها Constraint افزودنForeignKeyConstraint 221........................................................................................ها

223.......................................... اضافه كنيدDataSet Designer به ForeignKeyConstraintيكUniqueConstraint 225..............................................................................................ها

226..........................................ويژوال بيسيك: اضافه كنيدرا UniqueConstraint كد، به كمكس: اضافه كنيدرا UniqueConstraint كد، به كمك 227.....................................شارپيويژوال 228.................................................................................................ها DataRowايجاد 228................................................................................ويژوال بيسيك: DataRowايجادس: DataRowايجاد 230...........................................................................شارپيويژوال

231............................................................................................ها DataRowيپيكربند DataTable.......................................................................................232ي متدهاكاربرد

Select............................................................................................................233متد 234..ويژوال بيسيك: به نمايش گذاريد Selectها را، بااستفاده از متد DataRowازيا زيرمجموعه

Microsoft ADO.NET 2.0 10گام به گام با

س: به نمايش گذاريدSelectها را، با استفاده از متد DataRowازيا زيرمجموعه شارپيويژوال.........................................................................................................................236

DataRow........................................................................................238يكاربرد متدها DataTable.........................................................................238يپاسخ دادن به رويدادها

239................................................................................................................صهخال 241...................................................................................................................فصل هشتم 241.................................................................................................هاTableAdapterكاربرد

241............................................................................................هاTableAdapter درك 243.............................................................................................هاTableAdapterايجاد

TableAdapter....................................................................................243يها ايجاد رده TableAdapter........................................243ي،با استفاده از ويزارد پيكربندTableAdapterايجاد

Server Explore.......................................................................247 از TableAdapterايجاد TableAdapter.......................................................................................249ايجاد اشياء

249.................................................................... در ويژوال استوديوTableAdapterايجاد 250...........................................................ويژوال بيسيك: به كمك كدTableAdapterايجاد 250.................................................................شارپيس: به كمك كدTableAdapterايجاد

252...................................................................................... هاTableAdapterيپيكربند TableAdapter...............................................................................252يها ردهيپيكربند

TableAdapter..............................................................................255 از Fillويرايش متد TableAdapter..............................................................................257افزودن استعالم به

TableAdapter..................................................................................260 اشياءيپيكربند TableAdapter..................................................................................261يكاربرد متدها

262........................................................................................... استعالمي متدهاياجرا 262............................................................ويژوال بيسيك: گزيده متد استعالم پيشياجراس: گزيده يك متد استعالم پيشياجرا 263...................................................شارپيويژوال 264........................................................ويژوال بيسيك: پارامتري متد استعالم داراياجراس: پارامتري متد استعالم داراياجرا 265...................................................شارپيويژوال

266................................................................................................................خالصه 267.......................................................................................................................فصل نهم 267.....................................................................................................هاDataView كاربرد

267.................................................................................................هاDataView درك 269................................................................................................ هاDataViewايجاد 269..........................................................................ي ها در زمان طراحDataViewايجاد

11 فهرست

269....................ها كنيد در ويژوال استوديو به وجود آورده، آن را مقيد به دادهDataViewيك 272.............................................................................. ها در زمان اجراDataViewايجاد

273..................................................ويژوال بيسيك: وجود آوريد بهDataViewبه كمك كد،س: به وجود آوريدDataViewبه كمك كد، 274.............................................شارپيويژوال

275........................................................................................... هاDataViewيپيكربند DataColumn..............................................................................................276عبارات Sort..........................................................................................................280عبارات

280.................................................ويژوال بيسيك: DataViewتغيير ترتيب در مرتب كردنس: DataViewتغيير ترتيب در مرتب كردن 281.............................................شارپيويژوال

RowState......................................................................................................282فيلتر 283...............................................ويژوال بيسيك: جديديها به نمايش درآوردن تنها رديفس: جديديها به نمايش درآوردن تنها رديف 284..........................................شارپيويژوال

DataView.......................................................................................285يكاربرد متدها Find..............................................................................................................285متد

286..............................................ويژوال بيسيك:آنة اولييافتن رديف براساس مقدار كليدس:آنةيافتن رديف براساس مقدار كليد اولي 287..........................................شارپيويژوال

288................................................................................................................خالصه 289..................................................................................................................بخش چهارم 289...............................................................................................................ها كار با داده 289......................................................................................................................فصل دهم

و روزآمدساز 289......................................................................................ها دادهيويرايشو روزآمدساز 290...............................................................ها دادهيدرك فرآيند ويرايش

و روايتDataRowState درك 291............................................................................ها هاRowState property.................................................................................................291

Row....................................................................................................292يها روايتو روايتDataRowStateكنكاش در DataRow.....................................................293يها ها

در ويرايش داده 294............................................................. تحت كنترل برنامهDataSetها DataRow..................................................................................................295افزودن

295...............................................................ويژوال بيسيك: DataTableبهيافزودن رديفس: DataTableبهيافزودن رديف 296...........................................................شارپيويژوال

DataRow.....................................................................................................297حذف 298......................................................ويژوال بيسيك: Delete به كمك متد DataRowحذفس: Delete به كمك متد DataRowحذف 299.................................................شارپيويژوال

Microsoft ADO.NET 2.0 12گام به گام با

DataRow.....................................................................................300تغيير دادن مقادير 300............................................................................ويژوال بيسيك: DataRowويرايشس: DataRowويرايش 301........................................................................شارپيويژوال

DataRow....................................................302به تعويق انداختن اعمال تغييرات در مقادير 303..............................ويژوال بيسيك: يرات به تعويق انداختن تغيي براBeginEditاستفاده ازس: به تعويق انداختن تغييراتي براBeginEditاستفاده از 304.........................شارپيويژوال

305................................................................................ هاData Sourceروزآمد ساختن Adapter.............................................................306 به كمك Data Sourceروزآمد ساختن

307.....................................ويژوال بيسيك: DataAdapterها به كمك روزآمد كردن منبع دادهس: DataAdapterها به كمك روزآمد كردن منبع داده 308.................................شارپيويژوال

Data Command...................................................309ها به كمك روزآمد كردن منبع داده 310.................................ويژوال بيسيك: Data Commandها به كمك آمد كردن منبع دادهروز

به روزآمدكردن منبع داده س:Data Command كمك ها 312...............................شارپيويژوال DataSet................................................................................315قبول يا رد تغييرات در

AcceptChanges................................................................................................315متد 315...................................................................ويژوال بيسيك: DataSetقبول تغييرات درس: DataSetقبول تغييرات در 319..............................................................شارپيويژوال

RejectChanges................................................................................................322متد 322...........................................................ويژوال بيسيك: DataRowرد كردن تغييرات درس: DataRowرد كردن تغييرات در 323.......................................................شارپيويژوال

325................................................................................................................خالصه 327.................................................................................................................ازدهميفصل

327............................................................................................ها به دادهي دستيمقيدساز 327............................................................. ويندوزيها ها در فرم به دادهيدرك مقيدساز

ADO.NET..........................................................329يها ها به منبع داده كنترليمقيدسازproperty330.............................................. استوديو كنترل در ويژوالة سادي مقيدسازيها Properties.......................................................330ة با استفاده از پنجرpropertyيمقيدساز Formatting and Advanced Binding..............332ي با استفاده از قاب گفتگوpropertyيمقيدساز 333...................................................... كنترل در زمان اجرايهاpropertyة ساديمقيدساز

336..........................................ويژوال بيسيك:ينويس به كمك برنامهpropertyمقيد ساختنس:ينويس به كمك برنامهpropertyمقيد ساختن 338......................................شارپيويژوال

property340........................................................................ مركب كنترلي مقيدسازيها Properties.............................................340ةها با استفاده از پنجر مركب به دادهيمقيدساز

13 فهرست

342.................ويژوال بيسيك:ينويس ها به كمك برنامه مركب به دادهياضافه كردن مقيدسازس:ينويس ها به كمك برنامه مركب به دادهياضافه كردن مقيدساز 343.............شارپيويژوال

ش BindingContext......................................................................................344ءيدركش CurrencyManager...................................................................................345ءيدرك

Position property...................................................................................................346 347.............................ويژوال بيسيك:ها پيمايش منبع دادهي براPosition propertyاستفاده ازس:ها پيمايش منبع دادهي براPosition propertyاستفاده از 348........................شارپيويژوال

CurrencyManager.......................................................................................349يمتدها CurrencyManager................................................................349يدادن به رويدادها پاسخ ItemChanged..............................................................................................350رويداد

350.............................................................ويژوال بيسيك: ItemChangedپاسخ به رويدادس: ItemChangedپاسخ به رويداد 351........................................................شارپيويژوال

ش Binding................................................................................................352ءيدرك Binding..........................................................................................352ءيشيپيكربند

BindingMemberInfo property..................................................................................354 354..................................................ويژوال بيسيك: BindingMemberInfo propertyيبررسس: BindingMemberInfo propertyيبررس 355..............................................شارپيويژوال

Binding..................................................................................356ءيشيكاربرد متدها Binding.....................................................................357ءيشيپاسخ دادن به رويدادها

357................................................................................................................خالصه 359................................................................................................................فصل دوازدهم

BindingSource...............................359 ويندوز با استفاده از جزءيها ها درفرم دادهبهيمقيدساز BindingSource..............................................................................................359درك

BindingSource.....................................................................................361يايجاد اجزا 361.............................................................ي در زمان طراح BindingSourceيايجاد اجزا

361.................................................................. در ويژوال استوديو BindingSourceايجاد 363.................................................................. در زمان اجراBindingSourceيايجاد اجزا 363..................................................ويژوال بيسيك: به كمك كد BindingSourceايجاد جزءس: به كمك كد BindingSourceايجاد جزء 364..............................................شارپيويژوال BindingSource...............................................................................365ي اجزايپيكربند

Propertyي هاDataSource وDataMember..................................................................367 368.....................................درويژوال استوديوDataSourceوDataMemberي هاpropertyتنظيم 370..........ويژوال بيسيك:ينويس به كمك برنامهDataSourceوDataMemberيهاpropertyتنظيم

Microsoft ADO.NET 2.0 14گام به گام با

س:ينويس بهكمك برنامهDataSourceوDataMemberي هاpropertyتنظيم 371......شارپيويژوالpropertyيهاSort وFilter.......................................................................................373 373..................................................................... در ويژوال استوديوSort propertyتنظيم 374.......................................................ويژوال بيسيك: با نوشتن كدFilter propertyتنظيمس: با نوشتن كدFilter propertyتنظيم 375...................................................شارپيويژوال

BindingSource.................................................................................376يكاربرد متدها Position....................................................................................................378يمتدها

378........................ويژوال بيسيك:ي تغيير دادن رديف جاري براPositionياستفاده از متدهاس:ي تغيير دادن رديف جاري براPositionياستفاده از متدها 379...................شارپيويژوال

AddNew.........................................................................................380و Addيمتدهابهيمورد 380................................ويژوال بيسيك: اضافه كنيدBindingSourceيك فهرست راس: اضافه كنيدBindingSource را به يك فهرستيمورد 381..........................شارپيويژوال

د BindingSource...................................................................382يادن به رويدادهاپاسخ PositionChanged.........................................................................................383رويداد

383.................................................ويژوال بيسيك: PositionChangedپاسخ دادن به رويدادس: PositionChangedپاسخ دادن به رويداد 384............................................شارپيويژوال

385................................................................................................................خالصهس 387................................................................................................................زدهميفصل 387............................................................................. ويندوزيها در فرمADO.NETكاربرد

387.............................................ها پيمايش از ميان دادهي براBindingNavigatorاستفاده از 387.................................................................... به فرم BindingNavigatorافزودن كنترل 390.......................................................................... ويندوزيها ها در كنترل نمايش داده

390...............................................................................................ها تسهيل ورود داده Boolean..............................390مقادير نمايش درآوردنبهي براCheckBoxكنترل استفاده از

391........................................................................... كاربرينمايش مقادير قابل فهم برا ComboBox....................................................................392 در كنترل Full Namesنمايش 394............................................................................................ هاDataRelationكار با

DataRelation...........................................................................394مقيد ساختن كنترل به 395................................................................................................ها فرمت كردن داده

395......................................................................................... فرمت دلخواهيرشته ها 397....................ويژوال بيسيك: FormatString propertyفرمت كردن مقدار تاريخ با استفاده ازس: FormatString propertyفرمت كردن مقدار تاريخ با استفاده از 398................شارپيويژوال

Parse......................................................................................399و Formatيرويدادها

15 فهرست

Format............................................................................................400د رويدادركارب 400......................................ويژوال بيسيك: Formatها با استفاده از رويداد تغيير فرمت دادهس: Formatها با استفاده از رويداد تغيير فرمت داده 401.................................شارپيويژوال Parse..............................................................................................402كاربرد رويداد

402.......................ويژوال بيسيك: Parseها با استفاده از رويداد دادهيبازگرداندن فرمت اصلس: Parseها با استفاده از رويداد دادهيبازگرداندن فرمت اصل 403...................شارپيويژوال

404.........................................................................................................ها يافتن داده Add Query.......................................................405يها با استفاده از قاب گفتگو يافتن داده 405.....................................................................به فرم ويندوز Search ToolStripافزودن

از يافتن داده BindingSource...................................................................407ها با استفادهازييافتن رديف 408.............................................ويژوال بيسيك: BindingSource با استفادهازييافتن رديف س: BindingSource با استفاده 409.........................................شارپيويژوال DataView.......................................................................................410درييافتن رديف 410.................................................................ويژوال بيسيك: DataViewدرييافتن رديفس: DataViewدرييافتن رديف 411.............................................................شارپيويژوال DataTable......................................................................................412درييافتن رديف

دريرديف 412......................................................ويژوال بيسيك:د را پيدا كنيDataTable رادريرديف س: را پيدا كنيدDataTable را 414.................................................شارپيويژوال

415...................................................................... ويندوزيها ها در فرم دادهياعتبارسنج 415..........................................................................................ها تغيير دادهيرويدادها 416.......................................................................................... تغيير ستونيرويدادها

416.......................................................ويژوال بيسيك: ColumnChangingپاسخ به رويدادس: ColumnChangingپاسخ به رويداد 417...................................................شارپيويژوال

418................................................................................. كنترلي اعتبارسنجيرويدادها ErrorProvider.......................................................................................419كاربرد جزء 419.................................................................... به كنترل فرمErrorProviderمقيد ساختن 419................................................ويژوال بيسيك: در كنترل فرمErrorProviderاستفاده ازس: در كنترل فرمErrorProviderاستفاده از 420............................................شارپيويژوال

421..................................................................ها به منبع دادهErrorProviderمقيد ساختن 421..................................................ويژوال بيسيك: DataColumn در ErrorProviderكاربردس: DataColumn در ErrorProviderكاربرد 422.............................................شارپيويژوال 423................................................................................................................خالصه 425...............................................................................................................فصل چهاردهم

Microsoft ADO.NET 2.0 16گام به گام با

425......................................................................وبيها ها در فرم به دادهيا پايهيمقيدساز 425..................................................................وبيها ها در فرم به دادهيدرك مقيدساز

در وب به منبع دادهيها كنترلة ساديمقيدساز ADO.NET........................................427ها 428............................................................................. كنترلي هاpropertyتنظيم صريح

428...................................................................ويژوال بيسيك: يك كنترلpropertyتنظيمس: يك كنترلpropertyتنظيم 430...............................................................شارپيويژوالازيهاproperty تنظيم DataBinder.Eval...............................................431 كنترل با استفاده 432....................................................................ويژوال بيسيك: DataBinder.Evalكاربردس: DataBinder.Evalكاربرد 433................................................................شارپيويژوال

Data-Binding...................................................................................434كاربرد عبارات 435...............................................................ويژوال بيسيك: Data-Bindingكاربرد عبارتس: Data-Bindingكاربرد عبارت 437..........................................................شارپيويژوال

439...............................................................................وبيها مركب كنترليمقيدساز 440..................................................ويژوال بيسيك: ListBoxمقيد ساختن مركب يك كنترلس: ListBox مقيد ساختن مركب يك كنترل 441.............................................شارپيويژوال

ش ADO.NET................................................................................443ءيحفظ وضعيت 444....................................................................دهنده در سرويسADO.NETحفظ اشياء

444.............................................ويژوال بيسيك: Session در وضعيت DataSetذخيره كردنس: Session در وضعيت DataSetذخيره كردن 445........................................شارپيويژوال 446....................................................................... صفحهي بر روADO.NETحفظ اشياء

447.........................................ويژوال بيسيك: ViewState property در DataSetذخيره كردنس: ViewState property در DataSetذخيره كردن 448.....................................شارپيويژوال

449...................................................................................................... پيمايشياجرا 449......................................................................................................ويژوال بيسيك

س 450.................................................................................................شارپيويژوال 450......................................................................................................ويژوال بيسيك

س 450.................................................................................................شارپيويژوال 451.............................................................ويژوال بيسيك: Move First Navigationياجراس: Move First Navigationياجرا 452.........................................................شارپيويژوال

453....................................................................... مربوطهيها روزآمد ساختن منبع دادهش Command..........................................................................................453ءيكاربرد

ش منبع دادهيروزآمد ساز 453.........................ويژوال بيسيك: Commandءيها با استفاده ازش منبع دادهيروزآمد ساز س: Commandءيها با استفاده از 455....................شارپيويژوال

17 فهرست

Adapter.....................................................................................................456كاربرداز روزآمد كردن منبع داده 456.............................ويژوال بيسيك: TableAdapterها با استفاده

از داده روزآمدكردن منبع س: TableAdapterها با استفاده 458..........................شارپيويژوال 459................................................................................................................خالصه 461................................................................................................................فصل پانزدهم 461.......................................ها وب با استفاده از جزء منبع دادهيها ها در فرم به دادهيمقيدساز

Data Source...........................................................................................461درك جزء Data Source........................................................................................463يايجاد اجزا 463..................................................................ي در زمان طراحData Sourceيايجاد اجزا Visual Web Designer...........................................................463 در Data Sourceايجاد يك 464..................................................................... در زمان اجراData Sourceيايجاد اجزا

464.............................................................ويژوال بيسيك: به كمك كدData Sourceايجادس: به كمك كدData Sourceايجاد 465.........................................................شارپيويژوال

Data Source..............................................................................466يها كنترليپيكربندProperty467.............................................................................................. اتصالي ها 467.................................................................ويژوال بيسيك: اتصالي هاpropertyتنظيمس: اتصالي هاpropertyتنظيم 468............................................................شارپيويژوال

property468................................................................................................ فرمانيها 471..........................................................ويژوال بيسيك: SelectCommand propertyتنظيمس: SelectCommand propertyتنظيم 471......................................................شارپيويژوال

472................................................................................................. فرمانيپارامترها 473..............................................................ويژوال بيسيك: Command Parameterافزودنس: Command Parameterافزودن 474.........................................................شارپيويژوال 475........................................ي در زمان طراحCommandو Connectionي هاpropertyتنظيم

Visual Web Designer...........................................................475 در Data SourceيپيكربندProperty478..........................................................................................ي پيكربندي ها propertyيهاcaching..............................................................................................479

480................................................................ويژوال بيسيك: سادهcachingفعال ساختنس: سادهcachingفعال ساختن 481............................................................شارپيويژوال Data Source....................................................................................482يكاربرد متدها

483..............................................ويژوال بيسيك: Selectها با استفاده از متد دادهيبارگذارس: Selectها با استفاده از متد دادهيبارگذار 484..........................................شارپيويژوال Data Source........................................................................485يرويدادهابهيده پاسخ

Microsoft ADO.NET 2.0 18گام به گام با

486...................................................................ويژوال بيسيك: Selectedپاسخ به رويدادس: Selectedپاسخ به رويداد 486...............................................................شارپيويژوال

488................................................................................................................خالصه 489...............................................................................................................فصل شانزدهم

و اعتبارسنج مقيد به دادهيها كنترل 489...........................................................................يها 489.................................................................................ها مقيد به دادهيها درك كنترل

property490.............................................................................ها به دادهيمقيدسازيها List...............................................................................................491يها درك كنترل List..............................................................................................491يها ايجاد كنترل 492............................................................... ابزارةها در جعب كنترلي جاگذارةتغيير گزين

Visual Web Designer........................................................493 در ListBoxايجاد يك كنترل List.........................................................................................493يها كنترليپيكربند Visual Web Designer................................................................495 در ListBoxيپيكربند

List.......................................................................................497 كنترليكاربرد متدهادريهاListItemيبازياب 497............................................ويژوال بيسيك: ListBox برگزيدهدريهاListItemيبازياب س: ListBox برگزيده 498........................................شارپيويژوال

List.........................................................................498 كنترليپاسخ دادن به رويدادها 499..................................................ويژوال بيسيك: SelecteIndexChangedپاسخ به رويداد 500.............................................شارپيسويژوال : SelecteIndexChangedپاسخ به رويداد

500.................................................................................. بر قالبي مبتنيها درك كنترل 501............................................................................................................انواع قالب

502.......................................................... بر قالبي مبتنيها ها به كنترل اضافه كردن قالب DataList...................................................................503 در كنترل ItemTemplate ويرايش

504...........................................................................مقيد كردن كنترل در داخل يك قالب 504........................................................................ها مقيد كردن كنترل قالب به منبع داده

505.......................................................................................ها DataControlFieldدرك 506.................................................................................ها DataControlFieldيپيكربند

CommadField DataControlField...............................................................................506 DatailsView..............................................................508اضافه كردن فيلد دكمه به كنترلTemplateField DataControlField...............................................................................509

DetailsView..............................................................510 به كنترل TemplateFieldافزودن 510...................................................................................ي اعتبارسنجيها درك كنترل

512.......................................................... به صفحهRequiredFieldValidatorافزودن كنترل

19 فهرست

513................................................................................................................خالصه 515....................................................................................................................بخش پنجم

ADO.NET515.......................................................................................هاو ديگر انواع داده 515..................................................................................................................فصل هفدهم

و نوشتن XML.................................................................................................515خواندن XML..............................................................................................516يها درك طرح

XML.........................................................................................517و ADO.NETدرك DataSet XML..................................................................................517يكاربرد متدها

GetXmlSchema...........................................................................518و GetXmlيمتدها 518...........................ويژوال بيسيك: GetXmlSchema با استفاده از DataSet Schemaيبازيابس: GetXmlSchema با استفاده از DataSet Schemaيبازياب 520.......................شارپيويژوال 523......................................ويژوال بيسيك: GetXml با استفاده از DataSetيها دادهيبازيابس: GetXml با استفاده از DataSetيها دادهيبازياب 524.................................شارپيويژوال ReadXmlSchema.............................................................................................525متد

525............................ويژوال بيسيك: ReadXmlSchema با استفاده از DataSet Schemaايجادس: ReadXmlSchema با استفاده از DataSet Schemaايجاد 527........................شارپيويژوال InferXmlSchema..............................................................................................528متد

530....................................................................ويژوال بيسيك: XMLاستنباط طرح سندس: XMLاستنباط طرح سند 531................................................................شارپيويژوال

534....................................ويژوال بيسيك: ReadXml با استفاده از XMLيها دادهيبارگذارس: ReadXml با استفاده از XMLيها دادهيبارگذار 535................................شارپيويژوال

WriteXmlSchema............................................................................................536متداز با اسXMLايجاد طرح 537....................................وال بيسيكويژ: WriteXmlSchemaتفادهس: WriteXmlSchema بااستفاده ازXMLايجاد طرح 538..................................شارپيويژوال

WriteXml.......................................................................................................540متد 541.............................................ويژوال بيسيك: XMLها در يك فايل به فرمت نوشتن دادهف نوشتن داده س: XMLرمت ها در يك فايل به 542.........................................شارپيويژوال

XML...............................................................................544كنترل چگونه نوشته شدنNested propertyبه متعلقDataRelation......................................................................544

544.......................................ويژوال بيسيك: DataRelationبه متعلقNested propertyكاربردس: DataRelation متعلق بهNested propertyكاربرد 546...................................شارپيويژوال

547..............................................................................................كنترل نگاشت ستون 548...................................................ويژوال بيسيك: ها همچون خصوصيات نوشتن ستون

Microsoft ADO.NET 2.0 20گام به گام با

س: ها همچون خصوصيات نوشتن ستون 549..............................................شارپيويژوال 551................................................................................................................خالصه 553.................................................................................................................فصل هجدهم

XmlDataDocument......................................................................................................553 XmlDataDocument.........................................................................................553درك 554....................................................................................ها XmlDataDocumentايجاد

يك همXMLيايجاد يك نما 555.....................................ويژوال بيسيك: DataSetگاه شده ازيك همXMLيايجاد يك نما س: DataSetگاه شده از 556................................شارپيويژوال

558...........................................ويژوال بيسيك: XMLيها براساس داده DataSetايجاد يكس: XMLياه براساس دادهDataSetايجاد يك 559........................................شارپيويژوال

XML.................................................................................................560پيمايش سند DOM..........................................................................561 با استفاده از DataSetپيمايش

562.............................................ويژوال بيسيك: XML DOM با استفاده از DataSetمايش پيس: XML DOM با استفاده از DataSetپيمايش 563........................................شارپيويژوال XPath.........................................................................565 با استفاده از DataSetپيمايشاز DataRowانتخاب 565..............................................ويژوال بيسيك: XPathها با استفادهاز DataRowانتخاب س: XPathها با استفاده 567..........................................شارپيويژوال

XmlDataDocument...........................................................................568يكاربرد متدها XML.............................................................................568ها به كمك DataRowكار با

569.............................................ويژوال بيسيك: XML با استفاده از Categoryاضافه كردنس: XML با استفاده از Categoryاضافه كردن يك 571...................................شارپيويژوالو عناصر DataRow هماهنگ ساختن XmlDataDocument............................................573ها

573............................................................ويژوال بيسيك: DataRow از يك Nodeيبازيابس: DataRow از يك Nodeيبازياب 574........................................................شارپيويژوال 575.......................................................ويژوال بيسيك: Node از يك DataRowيكيبازيابس: Node از يك DataRowيكيبازياب 576...................................................شارپيويژوال

577................................................................................................................خالصه 579.................................................................................................................فصل نوزدهم

NET Framework.....................................................................579. در ADOXو ADOكاربرد COM Interoperability......................................................................................579درك NET Framework...............................................................................581. در ADOدرك ADO.......................................................................................582بهي ارجاعيبرقرار

582............................ويژوال بيسيك: ADOXو ADOيها اضافه كردن ارجاعات به كتابخانه

21 فهرست

س: ADOXو ADOيها اضافه كردن ارجاعات به كتابخانه 584.......................شارپيويژوال ADO..................................................................................................586جاد اشياء اي ADO Connection...........................................................................................586ءيش

586................................................................ويژوال بيسيك: ADO Connectionايجاد يكس: ADO Connectionايجاد يك 587............................................................شارپيويژوال 587.......................................................................................هاADO Recordset كاربرد 588..................................................................................... هاADO Recordsetپركردنيك دادهيبازياب 588..................................................ويژوال بيسيك: ADO Recordsetها ازيك دادهيبازياب س: ADO Recordsetها از 589..............................................شارپيويژوال

590...........................................................................هاADO Recordset روزآمد ساختن 591..........................................................ويژوال بيسيك: ADO Recordsetروزآمدساختنس: ADO Recordsetروزآمدساختن 592......................................................شارپيويژوال

NET Framework............................................................................593. در ADOXدركاز ايجاد اشياء بانك ADOX..........................................................594 اطالعاتي با استفاده

از ايجاد بانك 594............................................ويژوال بيسيك: ADOX اطالعاتي با استفادهاز ايجاد بانك س: ADOX اطالعاتي با استفاده 595........................................شارپيويژوال

از افزودن يك جدول به بانك 596........................ويژوال بيسيك: ADOX اطالعاتي با استفادهاز افزودن يك جدول به بانك س: ADOX اطالعاتي با استفاده 598....................شارپيويژوال

600................................................................................................................خالصه

مقدمه

NET.نويسي بخشي از سكوي برنامهADO.NET. خوش آمديدADO.NET″2″به دنياي قدم به قدم با

Frameworkتمرينات اين كتاب، شما را با مدل شيء. هاست مايكروسافت، براي دسترسي به دادهADO.NETو چگونگي كاربرد اين مدل در ايجاد فرم و وب مقيد به داده، ) data-bound(ها هاي ويندوز Extensible(الام به تعامل با اكسADO.NETدر مباحث بعدي، خواهيم ديد كه چگونه. كند آشنا مي

Markup Language [XML] (و به چه ترتيب به روايت NET. از محيط ADOتر هاي قديمي پرداخته،.كند دسترسي پيدا مي

مي سروكار داشتن با حجم عظيمي از داده و وقت بسيار توانتواند ها نويسنده در گير باشد، لذا فرسامحاين كتاب لزوماً و بيش ژرفي از اشياةهدفم ارائ. دودي خواهد پرداخت به مباحث در دادهء درك كم ها

ADO.NET مي اين- است و چگونه با يكديگر كار را: پس يادتان باشد. كنند كه چه هستند، اين كتاب شما(كند نمي ADO.NETاستادكار با مي. !)اي بود خواست، كار ساده چقدر دلم

مي-اي از محيط كار دركي پايه- راهةاين كتاب تنها نقش مي را در اختيار شما آن گذارد، كه توانيد ازو استادي استفاده كنيدهمچون نردباني براي صعود به اوج خُ ياد خواهيد گرفت كه براي شروع. برگي

شروعي استةاز اين لحاظ، كتاب، تنها نقط. ها به چه چيزهايي نياز داريد كاربردي دادههاي ايجاد برنامهكنشهمء اشياة پيچيدةاگر كارم را به درستي انجام داده باشم، تصوير بزرگي از مجموع. براي آينده

)interactive (ج زئياتي كه در ذهنتان ايجاد خواهد شد؛ اين ديگر بسته به شماست، كه چگونه آن را با.براي كار خود نياز داريد، پر كنيد

؟ استكتاب براي چه كساني نوشته شده

را. آشنايي ندارندADO.NET كه هنوز با هستندنويساني مخاطب اين كتاب برنامه براي آنكه بتوانم كتابا NET Framework. با در ابعاد معقولي عرضه كنم، فرض من بر اين بود كه اساساً ستوديوو ويژوال

آشنا بوده، اين دو سهم درخور توجهي در زبان ) Microsoft Visual Studio 2005( مايكروسافت 2005در. دارند- مايكروسافت#Cويژوال بيسيك مايكروسافت يا ويژوال- شماةنويسي برگزيد برنامه اگربا د، با كتابخوةوارديد، بهتر است كار را، بسته به زبان برگزيد تازه كامالNETً.محيط هاي قدم به قدم

يا قدم به قدم) 2005انتشارات مايكروسافت،(Michael Halvorson مايكروسافت اثر 2005ويژوال بيسيك .آغاز كنيد) 2005انتشارات مايكروسافت،(John Sharp مايكروسافت اثر C# 2005با ويژوال

) relational databases(اي اطالعاتي رابطه هاي اي ازبانك ام كه دركي پايه فرض رانيز داشتهعالوه، اينبهو با نحو اگر. خود آشناييدة اطالعاتي برگزيد موتور بانكsyntax (SQL( نگارشةو ساختار آن داريد،

اطالعاتي اثر هاي بانك بر سيستماي كاريد، شايد بهتر باشد با مقدمه اطالعاتي تازه در كار طراحي بانك)Addison-Wesley ،2003 (م يا كتاب خود من با عنوان طراحي سيستم -Addison( اطالعاتي ثر بانكؤهاي

Wesley ،2005 (شروع كنيد.

Microsoft ADO.NET 2.0 24گام به گام با

ترتيب مطالب كتاب

ة در برنامADO.NET خاصي از كاربردةها به جنب كتاب به پنج بخش تقسيم شده، كه در هر كدام از آنبه2در بخش . ADO.NETط مرور كوتاهي است بر محي1شبخ.ام پرداخته NET Framework.كاربردي ،

و برنام ترين سطح ارتباط بين موتور داده ها، كه با پايين دادهةبينند تداركاشياء NET. كاربرديةها

Frameworkبه كنكاش در اشياء3بخش.ام خته سروكار دارند، پردا ،ADO.NETاي هاي رابطه، كه به دادهميكاةدر يك برنام مي ربردي شكل هاي فرم) binding(، فرايند مقيد سازي4در بخش. پردازد دهند،

و وب مورد توجه قرار گرفته است تعامل بينة شامل مطالبي دربار5و باالخره، بخش. ويندوزADO.NETب هاي دادهو ديگر محيط داي، و نيزامو اكسADO.NETهاي دادهةباررحثي كاربرد اشياءال،

. است NET Framework.هاي كاربردي از درون برنامهADOXو ADOة ارث رسيدبه

شروع را براي خود انتخاب كنيد؟ةچگونه بهترين نقط

و توسع در. هاي اساسي كمك كند ها در برخي حيطه مهارتةكتاب طوري تنظيم شده كه به ايجاد اگر، يا Sun Microsystems، جاواي ++C،Cديگري مانند نويسي كاريد يا از زبان برنامه نويسي تازه برنامه

مي مايكروسافت، به اين زبان روي آورده6ويژوال بيسيك از جدول. توانيد از اين كتاب استفاده كنيد ايد،.زير، براي پيدا كردن بهترين نقطه شروع، كمك بگيريد

به اين ترتيب عمل كنيد اگر

در نويسي بانك در برنامه NET. اطالعاتي

Framework كاريد تازه.كدهاي نمونه را، مطابق آنچه كه در بخش

.در اين مقدمه آمده، نصب كنيد“ كدهاي نمونه”

رامطالعه4 دربخش10و فصل3و1،2هاي بخش.كنيد

و عالق از خود، بخشةبسته به ميل هاي ديگري.كتاب را، نيز، مطالعه كنيد

دهاي نمونه را، مطابق آنچه كه در بخشك.آييد مي1ADO.NETاز روايت.در اين مقدمه آمده، نصب كنيد“ كدهاي نمونه”

وبه3تا1هاي از بخش طور سطحي گذشته،وءبراي آشنايي با اشيا هاي property، متدها،

. توجه بيشتري كنيد8جديد، به فصل

ها براي آگاهي از معماري جديد مقيدسازي داده. را مطالعه كنيد13و12در ويندوز، فصول

ها براي آگاهي از معماري جديد مقيدسازي داده. را مطالعه كنيد16و15هاي وب، فصول در فرم

25 مقدمه

به اين ترتيب عمل كنيد اگر

كدهاي”كدهاي نمونه را، مطابق آن چه در بخش.آييد ميADOاز.در اين مقدمه آمده، نصب كنيد“ نمونه

را به همين10و سپس فصل3تا1هاي بخش.ترتيب بخوانيد

و عالق درةبسته به ميل خود، فصول باقيمانده. را مطالعه كنيدNET.و4هاي بخش

و ويژگي هاي قراردادي كتاب عالئم

و و تداوم مطالب كتاب، از برخي عالئم :ايم هاي قراردادي استفاده كرده يژگيوبراي قابل استفاده بودنب براي برنامهاي تمرينات جداگانه� سينويسان ويژوال و ويژوال . اند شارپ ارائه گرديده يسيك

.آيد، رد شويد توانيد با خيال راحت از تمريناتي كه به كارتان نمي ميبه� و هر كار با صورت يك رشته گامهر تمرين عبارت است از يك رشته كار يا وظيفه، ذكر ها

و غيره1،2(شماره است كه تمرين تنها يك به اين معن)•( گرد درشتةنقط. ارائه گرديده است)،.مرحله دارد

هاي در داخل قاب قرار دارند، اطالعات اضافه يا روش“ تذكر”يا“ توصيه”عناصري كه با عناوين�مي ديگري را براي انجام موفقيت .گذارند آميز هر گام در اختيار

مي در داخل قاب قرار گرفته“ مهم”عناصري كه با عنوان� از اند، هشدار كار،ة ادامدهند كه پيش.ايد مورد بررسي قرار دهيد الزم است آن چه را تاكنون انجام داده

مي� .آيد متني كه قرار است تايپ كنيد، با حروف سياه درشتهم(+) عالمت� براي. زمان فشار دهيد بين اسامي دو كليد به اين معناست كه بايد هر دو كليد را

فشار Tabاين است كه الزم است وقتي كه روي كليد“ را فشار دهيدAlt+Tab”مثال، معني عبارت . را نيز پايين نگاه داريدAltدهيد، كليد مي

سيستم مورد نياز

و نرم براي انجام تمرينات كتاب، به سخت :افزارهاي زير نياز داريد افزارهابا ويندوز اكس� Service با 2003، ويندوز سرور مايكروسافت Service Pack 2پي مايكروسافت

Pack 1 با 2000، يا ويندوز مايكروسافت Service Pack 4..2005اي ويژوال استوديو، يا روايت حرفه2005روايت استاندارد ويژوال استوديو�

دي همراه كتاب، شامل نمونهسي.همراه نيست با اين كتاب 2005افزار ويژوال استوديو نرم: تذكر بايد جداگانه خريداري 2005افزار ويژوال استوديو نرم. كدهاي موردنياز براي انجام تمرينات است

.شود

Microsoft ADO.NET 2.0 26گام به گام با

سي(Microsoft SQL Server 2005روايت اكسپرس� به فروش 2005دي ويژوال استوديو با.)رسد مي

. هر پردازشگر با توانايي مشابهيا) يك گيگاهرتزترجيحاً( مگاهرتز 600پنتيوم�.) مگابايت256 ترجيحاً( مگابايت 192رم� 1024 ترجيحاً( رنگ 256اقلحدبا) يا بيشتر800 در 600با قدرت بزرگنمايي(نمايشگر ويديويي�

.)High Color 16-bit با 769درسي� دي درايو .دي راموي دي رام يا. مشابهگر هر ابزار اشارهياماوس مايكروسافت�

كدهاةنمون

شد در سي مياند، كه در انجام تمرينات موردهدي همراه كتاب نمونه كدهايي گنجانده . گيرند استفاده قرارشد تان صرف ايجاد فايل با استفاده از اين نمونه كدها، ديگر وقت ها فايل. هاي مربوط به تمرينات نخواهد

آمو دستورالعمل مؤ عمليهاي وزشهاي قدم به قدم در تمرينات، و و اند اين، روشي آسان ثر براي كسب.هاي جديد است يادگيري مهارت

و نمونه:مهم Microsoft SQL Serverگزيده روايت اكسپرس كدها براي استفاده با نصب پيش اين كتاب

شدة، كه نام نمون2005 و طراحي شدهSQLEXPRESSآن ) instance(ة ايجاد اگر. اند است، نوشتهازةخواهيد با نام نمون مي ، از اين كتاب استفاده كنيد، الزم است SQL Server ايجاد شده در روايت ديگري

و رشته .هاي اتصالي، نيز، به نحو مقتضي تغيير كنند مراحل تمرينات كتاب

كدهاةنصب نمون

آنةبراي نصب نمون و استفاده از ب، به اين ترتيب عمل ها در تمرينات كتا كدها بر روي كامپيوترتان،:كنيد

سيسي.1 .دي رام قرار دهيد دي را از پوشش آن خارج كرده، داخل درايو. كاربر نهايي را برروي نمايشگر خويش مشاهده خواهيد نمودنامة اجازة استفادة موافقت

يا منوي از دسكتاپرا My Computer كاربر نهايي ظاهر نشد،ة استفادة اجازةنام چنانچه موافقت: تذكر. دوبار كليك كنيدStartCD.exeو سپس روي،رام دوبار كليكدي شروع باز كرده، روي شمايل درايو سي

ةاگر شرايط را قبول داريد، گزين. كاربر نهايي بيندازيدة استفادة اجازةنام نظري به موافقت.2accept را انتخاب كرده، سپس روي Nextكليك كنيد .

ر منويي با گزينه.3 ميهايي .شود اجع به كتاب ظاهر. كليك كنيدInstall Code Samplesروي عبارت.4مي دستورالعمل.5 .شوند، دنبال كنيد هايي را كه ظاهر

27 مقدمه

مية كدها در پوشةنمون .\C:\Microsoft Press\ADO.NET 2.0 Step by Step: شوند زير نصب

AdoStepByStep اطالعاتي الصاق بانكدرةپس از نصب نمون را AdoStepByStep به نام SQL Serverكامپيوتر، الزم است بانك اطالعاني كدها.بدان الصاق نماييد

بايد روايت اكسپرس را الصاق كنيم، قبالAdoStepByStepًبراي آن كه بتوانيم بانك اطالعاني: مهمMicrosoft SQL Server 2005 و خودتان نيز از امتيازات مديريتي برخوردار ) administrative( نصب شده

.باشيد

. را باز كنيدC:\Microsoft Press\ADO.NET 2.0 Step by Step\SampleDBsةپوش.1. دوبار كليك كنيدConfigDB.exeروي.2. كليك كنيدAttachروي.3

كدهاةاستفاده از نمون

و چگونگي استفاده از نمون تمرينهمة در و دربارةهاي اين كتاب، زمان بة كدها شرح، هر طرز از كردنبهفا اند كه شبيه فصول در حول سناريوهايي شكل گرفته. طور جداگانه توضيح داده شده استيل

ايد، در آينده هايي را كه ياد گرفته اند، طوري كه به آساني بتوانيد مهارت نويسي برنامههاي واقعي پروژههايي ها در پوشهحل اين راه. حل است راهةپروژ داراي يك به عالوه، هر پروژه. كار بنديدنزد خود به.شان اضافه شده است به انتهاي اسامي“ Finish”ةشوند، كه واژ ذخيره مي

! بخوانيد- كدهاةحذف نمون

: كدها از كامپيوترتان به اين ترتيب عمل كنيدةبراي حذف نمون. را باز كنيدC:\Microsoft Press\ADO.NET 2.0 Step by Step\SampleDBsةپوش.12.ConfigDB.exeرا دوبار كليك كنيد .. كليك كنيدDetachروي.3

ميش پس از چند لحظه، قاب گفتگويي ظاهر مي .نظر صورت گرفته استكند انفصال مورد ود، كه اشاره. را باز كنيدAdd Or Remove Programsة، گزينControl Panelدر.1. را انتخاب كنيدCurrently Installed Programs ،Microsoft ADO.NET 2.0 Step by Stepدر فهرست.2. كليك كنيدRemoveروي.3مي كدها، دستورالعملةبراي حذف نمون.4 .شوند، دنبال كنيد هايي را كه ظاهر

Microsoft ADO.NET 2.0 28گام به گام با

از انتشار افزار پيش نرم

و آزمون 2005اين كتاب، در آگوست ويژوال ) Community Technical Preview)CTP، مورد بازبيني ماه آگوست، آخرين بازبيني پيش از انتشار نهايي ويژوال استوديو CTP. رار گرفتق2005استوديو

مي. بود2005 در. سازگار باشد كامال2005ًرود كه كتاب با انتشار نهايي ويژوال استوديو انتظارآنصورتي كه نياز به تغييرات يا اصالح اشتباها به تي باشد، همة و به صورت مقالهها گردآوري اي

شدپ از”براي اطالعات بيشتر، رجوع كنيد به بخش. ايگاه دانش مايكروسافت افزوده خواهند پشتيباني.در اين مقدمه“كتاب

بهمطال صورت آنالينب ديگر

و پيوندها در ارتباط با اين كتاب را مي وبةتوانيد در صفح مطالب سايت مربوطه، كه از سوي:مايكروسافت در آدرس

http://www,microsoft.com/mspress/companion/0-7356-2164-0/.شود، پيدا كنيد منتشر مي

با. روزآمدسازي فناوري انتشارات مايكروسافت استوبةاين صفحه شامل پيوندي به صفحروزآمدسازيوبةروزآمد شدن فناوري مربوط به اين كتاب، پيوندهايي براي اطالعات بيشتر به صفح

شدفناوري انتش و تحوالت ويژوال. ارات مايكروسافت افزوده خواهند براي آگاهي ازجديدترين تغييرات.طور مرتب از اين صفحه ديدن كنيدبه 2005استوديو

بهةنمون: تذكر سيبلصورت آنالين، كدهاي اين كتاب نه .اند دي همراه كتاب آمده كه در

پشتيبانان كتاب

د،نهايت تالش به عمل آمده سي تا از و مطالب موجود در و صحت كتاب دي همراه اطمينان حاصل قتاز. شود آن گردآوري تغييرات يا اصالحپس به اشتباهات احتمالي، همة اي به پايگاه صورت مقالهها

راة فهرستي از آخرين تصحيحات كتاب، مقالةبراي مشاهد. دانش مايكروسافت افزوده خواهند شد زير:بخوانيد

http://support.microsoft.com/kb/905037/

وب با انتشارات مايكروسافت در و موادي را در ارتباط و سايت زير، مطالب پشتيباني از كتابآ سي ميدي همراه :گذاردن در اختيار

http://www.microsoft.com/learning/support/books/

29 مقدمه

و نقطه نظرات پرسش ها

سياي نظر، پرسش يا انديشهاگر نقطه با دي همراه آن، يا پرسش در ارتباط با كتاب يا هايي داريد كهآن سايتةمشاهد ها را براي انتشارات مايكروسافت با پستآنيابيد، لطفاً ها را نمي هاي باال پاسخ

: يا از طريق پست معمولي به آدرس زير بفرستيد[email protected]الكترونيكي به آدرس Microsoft Press

Attn: Developer Step by Step Series Editor

One Microsoft Way

Redmond, WA 98052-6399

.گيرد هاي فوق صورت نمي افزار مايكروسافت از طريق آدرس توجه داشته باشيد كه پشتيباني از نرم

بخش اول

NET.ADOشروع كار با:در اين بخش

با:1 فصل ADO.NETشروع كار

فصل اول

ADO.NETشروع كار با:در پايان اين فصل، خواهيد توانست

و چگونگي تعامل آنADO.NETة سازندة اوليء اشيابا� . آشنا شويدها مايكروسافتداها با استفاده از ويزارد پيكربندي منبع داده� . ها ايجاد كنيدده، منبع. ها ايجاد كنيد، فرم مفيد به دادهها با استفاده از منبع داده�

ADO.NET همچون ديگر اجزاي ،.NET Frameworkءاي از اشيا، شامل مجموعه.NET،از است كهميأمت. هاي الزم برخوردارند قابليتهمة تواند موجب سرخوردگي در يادگيري طرز سفانه، اين تعامل

بديهي است كه پيش از آنكه بتوانيد دركي از آن داشته باشيد، الزم است-استفاده از مدل شيء گردد.همه چيز را ياد بگيريد

عبارت ديگر، پيش از آن كه سعي كنيد جزئياتيبه. ايجاد يك چارچوب مفهومي استحل مشكل،راهميكهرا درباره اين بي اين يا آن شيء چگونه عمل اموزيد، الزم است دركي كلي از آنچه هر شيء كند

و چگونگي تعامل اشيا انجام مي . با يكديگر داشته باشيدءدهد، اصليءكار را با نگاهي به اشيا. داريماين همان كاري است كه در اين فصل قصد انجامش را

ADO.NETد آوري داده ها در جمعو چگونگي همكاري آن و ادهها از يك مخزن فيزيكي ها براي كاربر.كنيم بالعكس شروع مي

Microsoft ADO.NET 2.0 32گام به گام با

بنيادي تمام اجزاپيوندي پيرامون هم

و 2005ويژوال استوديو را هاي مقيد به داده مايكروسافت، ايجاد فرمNET Framework. مايكروسافت هادا. اند بسيار آسان ساخته -هادهاكنون، ايجاد فرم ويندوز مايكروسافت كه قابليت اساسي كار كردن با

و ويرايش اقالم داده و حذف هاي يك جدول، افزودن رديف ها، حركت از ميان رديف نمايش هاي جديدمي-هاي موجود داده در. پذير است بدون نوشتن حتي يك سطر كد امكان. گذاردرا در اختيار در ادامه،

.همين فصل، مثالي از اين مورد را خواهيم ديد

اي(اي، يادداشت حاشيه يا متدي كه هنوز معرفي نشده، ارجاع property دربارةرا به بحث خواننده)نمثل.دهد مي

در واقع،. خواهيم پرداختADO.NETهاي در نمونه شيءءهاي آينده، به ترتيب به تمام اشيا در فصل. ممكن نيستء پيوندي اين چنين نزديك با يكديگر دارند، نگاه انتزاعي به اشياءبه خاطر آن كه اشيا

ي ناي اشاره كه هنوز propertyاهنگامي كه الزم است از متد هاي يادداشت استفاده كنيم، شدهبه آن. اي به رنگ خاكستري به محل بحث پيرامون آن اشاره خواهيم نمود حاشيه

ADO.NET شيءةنمون

البته،. دهد نشان ميADO.NET شيءة اوليه را در نموناي از اشياء شدهر زير نماي سادهتصوي، فعالً. ها خواهيم پرداخت به اين پيچيدگيتر از اين است، ولي بعداً ها در عمل بسي پيچيده ردهةكتابخان

بهكافي است بفهميم كه اشياء و مي اوليه كدامند .پردازند طور معمول چگونه به تعامل با يكديگر(Data Providers(ها هاي داده بيننده تدارك:دان به دو جزء تقسيم شدهADO.NETهاي رده كه گاهي،)مي]Managed Providers[شده هاي مديريت بيننده تدارك كه به ارتباط با مخزن فيزيكي) شوند، نيز، خواندهمي داده و هارسيدگي مي. هاي واقعي است دادهة، كه نمايندDataSetكنند، كنندگان توانند بامصرف هردوجزءو WebFormها مانند داده .ها ارتباط برقرار نمايندWinFormها

ها هاي داده بيننده تدارك

بيننده شامل چهار تداركNET Framework.. ها هستند منبع داده ختصمها، دادهةبينند اجزاي تدارك:هاست داده

ميةبينند يك تدارك.1 .برقرار نمايد ارتباط OLE DBهاي تواند با هر منبع داده ژنريك، كههاي پس از آن تنظيمو روايتMicrosoft SQL Server 7.0، كه براي SQL Serverةبينند يك تدارك.2

. استشده. است شدهODBCهاي، كه مناسب براي منابع دادهODBCةبينند يك تدارك.3. است شدهOracle اطالعاتي هاي، كه مناسب براي بانكOracleةبينند يك تدارك.4

با/ فصل اول ADO.NET 33شروع كار

( دلخواه خودتان را بنويسيدةبينند توانيد تدارك همچنين، مي ممكن است خوشحال شويد، اگر بگويم..)ها بپردازم دادهةدبينن كه به موضوع ايجاد تداركدر اين كتاب بناي آن را ندارم

در هاي داده بيننده تدارك هرنييكسا اند، داراي اشياء گنجانده شده NET Framework.ها كه هستند،و برخي از اتصال بانك SQL Serverبراي مثال، روايت. هاو متدهايشان متفاوتند propertyچند كه اسامي

. استOleDb Connection آن OLE DBخوانند، حال آن كه روايت ميSqlConnectionاطالعاتي را

. مورد بحث قرار خواهند گرفت2جزئيات اتصال در فصل

ها دادهةبيننند هاي آن، تداركproperty. هاست نمايانگر اتصال فيزيكي به منبع دادهConnectionء شيو بانك، منبع داده)OLE DB ،Data Providerدر مورد( و رشته ها اي اطالعاتي كه متصل بدان خواهد شد،)string (متدهاي آن نسبتاً. كنندمي را كه در طول اتصال مورد استفاده قرار خواهد گرفت، مشخص

و بسته كنيد، بانكمي: اند ساده و ستد، اطالعاتي را تغيير دهيد توانيد اتصال را باز ) transactions(هاو داد.را مديريت كنيد

. به بحث خواهيم پرداخت3 در فصل Command دربارة اشياء

ق يا روال ذخيره شدهSQLة گزارCommandشيء . ها اجرا شود در منبع دادهرار استاي است كهوConnection در برابر هر شيء توان مستقالً را ميCommandءاشيا و مورد به وجود آورد اجرا نمود،

ها،و منبع دادهDataSet، براي رسيدگي به ارتباطات بين TableAdapterو DataAdapterء اشياةاستفادگمي Commandءاشيا. هستند شدو روالSQLهاي زارهتوانند از يا يك singleاي كه مقاديرههاي ذخيره

مي يا چند رشته از رديف . پشتيباني كنند،دهند هيچ مقداري را بازپس نميدهند، يا اصوالً ها را بازپسDataReaderو كم از read-onlyو forward-onlyاي اي براي به دست آوردن رشته هزينه، شيء سريع

با نوشتن كد ايجاد نمود؛ تنها راه ايجاد توان مستقيماً را نميDataReader. هاست هاي هر منبع داده داده. استCommand شيء ExecuteReader متد ها، فراخواندن آن

DataReader است4 موضوع بحث فصل .

ADO.NET 1تنها يك نوع رابط )adapter(،DataAdapterآن، عرضه مي دوADO.NET 2 كه نمود، حالو يك شيء جديد، موسوم به DataAdapter. رابط دارد ، بدان TableAdapter همچنان مورد پشتيباني است،

.افزوده شده است

.ردك بحث خواهيم8و5ها در فصول رابطةدربار

DataAdapterپ دادهةبيننند ترين شيء در تدارك نظر كاركرد، پيچيده، از نقطه و لي است بين ها،ConnectionوDataSet .DataAdapterچهار Commandگيرد را دربرمي:SelectCommand ،UpdateCommand ،

InsertCommand و ،DeleteCommand .گونه كه البد انتظارش را هم داريد، همانDataAdapter از SelectCommand براي پركردن DataSet و از سه ،Commandجهت انتقال تغييرات ديگر، در صورت نياز ،

مي به منبع داده .كند ها استفاده

Microsoft ADO.NET 2.0 34گام به گام با

هاي با تايپ DataAdapterها را TableAdapterتوانيدمياماگرچه اين شايد تمثيل دور از ذهني باشد،بهمي.ي تصور كنيدقو با ها از هر جدول در بانك دست آوردن دادهتوانيد، براي اطالعاتي كه

Connectionشده، آن مشخص SelectCommand property در DataAdapter ،را در زمان اجرا تغيير دهيد .است DataSet typed در يك DataTable مختص يك TableAdapterولي هر

هاي propertyعنوان بهConnectionو DataAdapter شامل هردو شيء TableAdapterدر واقع،و برخي قابليت ني خصوصي است، ميها را و ها را ساده افزايد، طوري كه اتصال به منبع دادهز بدان تر

.سازد نيرومندتر مي

Microsoft Active Data Objects)ADO(در هاي قرينه معادل تقريباCommandًو Connectionءاز نقطه نظري كاركردي، اشيا هستند، ADOشان

مي مانند شلنگ آتشDataReaderحالي كه در هيچ DataSetو DataAdapter ،TableAdapter. كند نشاني عمل. ندارندADOمعادل واقعي در

DataSetها

DataSetو مجموعه آن ها . است8و7هاي ها موضوع بحث فصل هاي اجزاي

DataSetمي دادهة، نمايند ساختار آن در تصوير زير نشان داده شده. نشيند هاست كه در حافظهميرDataSet. است و نمونه توان، به نوعي، يك بانكا و مناسبات بينهااي از جدول اطالعاتي ساده شده،كه. ها تصور نمود آن قطع ارتباط درحالها همواره با منبع دادهDataSetليكن، مهم است كه درك كنيم

مي هايي كه در خود دارد، از كجا آمده داده“ داند نمي”-است و در واقع، هايي را از چنديند دادهتوان اند،.منبع در اختيار داشته باشد

DataSetاست ازدو شيء اوليه تشكيل شده :DataTableCollection كه از طريق ،Tables property دسترسي بدان ميسر Relations property، كه از طريق DataRelationCollectionو؛دسترسي بدان داريم

دارايدخوة است، كه اين يك نيز به نوبDataTable شامل صفر يا چند شيء DataTableCollection. استو DataColumnCollection ،DataRowCollection: سه مجموعه است ،ConstraintCollection.ةمجموع

DataRelationCollection شامل صفر يا چند شيء DataRelationاست .

DataTableCollectionشيء

شد7ها در فصل DataColumnةدربار . بحث خواهد

DataTableCollectionبه متعلقDataTableكه، ستون دهند، مشخص را تشكيل ميDataTableهايي رابر. كند مي از، ميDataTypeو ColumnNameهاي propertyعالوه براي DataColumn propertyتوانيد

) nulls( مواردي چون مقادير پوچةظر اجازندن چيزهايي مثل اين كه ستون موردمشخص كر

با/ فصل اول ADO.NET 35شروع كار

)AllowDBNull(حداكثر طول ،)MaxLength(و حتي عبارتي مقدار آن مورد استفادهةكه براي محاسبرا،.دهد يا خير، استفاده كنيدمي) Expression(گيرد قرار مي

DataRowCollection متعلق به DataTableًكه شامل داده، كه ممكن است خالي باشد، عمال هايي است،هر. شوند، محدود ميDataColumnCollection جدول، با مشخص ساختنةبه وسيل ، DataRowبراي

DataTableو پيشنهادي خويش را حفظ مي طور كه خواهيم ديد، بدين همان. كند مقادير اصلي، جاريو وظايف گوناگون برنامه را ترتيب، برخي كارها نويسي، مانند اين كه به كاربران اجازه دهيم تغييراتي

. به وجود آورده بازگردانند، بسيار آسان خواهد شدDataRowكه در

ADO DataTable در ADO.NET شبيه شيء Recordset در ADOت داردست، گرچه نقشي به كلي متفاو.

.شدد بحث خواه7ها در فصل Constraintةدربار

ConstantCollection نوعي ،DataTable شامل صفر يا چند Constraintاست .Constraint ها، درست مانندمي اي، براي حفظ يكپارچگي داده اطالعاتي رابطه بانك Constraint از دو نوع ADO.NET. روند ها به كار

كنند؛ ها، يكپارچگي در روابط را حفظ ميUnique .ForeignKeyConstraintو ForeignKey: كندميپشتيبانيميبدين در معنا كه تضمين ها UniqueConstraint. يتيم نشودDataTableكنند هيچ رديف فرزندي

مي يكپارچگي داده به ها را حفظ ميكنند؛ به كنند رديف عبارت ديگر، تضمين افزوده DataTableهاي مشابه(نشوند .PrimaryKey property در DataTableرود؛ منظور جهت تضمين يكپارچگي در هر مورد به كار مي

هماين كه، منحصربه مي رديفةفرد بودن را به .)كند ها تحميل

DataRelationCollectionشيء

. بحث خواهيم نمود7ها در فصل DataRelationةدربار

DataRelationCollection در DataSet شامل صفر يا چند DataRelationاست .DataRelation ها واسطدر اي را براي پيمايش از يك رديف اصلي در يك جدول به رديف نويسي ساده برنامه هاي مرتبط با آن

ازت باشد، ميOrder DataTable شامل يك DataSetبراي مثال، اگر. آورند يك جدول ديگر فراهم مي وانيدDataRelation از ها براي استخراج آسان رديف . استفاده نماييدOrderDetails DataTableهاي مرتبط با آن

از همانو،خودي خود كاري به يكپارچگي روابط ندارد بهDataRelationليكن، طور كه ديديم،ForeignKeyConstraintشود براي اين منظور استفاده مي.

ها مقيد به دادهةسادايجاد يك فرم

. خوانندمي) data binding(ها هاي روي يك فرم را مقيدسازي داده ها به كنترل فرآيند اتصال دادهمي مقيدسازي داده integrated(نويسي يكپارچه توان از طريق كد عملي ساخت، ولي محيط برنامه ها را

Microsoft ADO.NET 2.0 36گام به گام با

development environment ]IDE[(و شيء جديد ويژوال استوديو مايكر را،TableAdapterوسافت فرآيندو ويزاردهايي كه ويژوال استوديو در اختيار ) designer(در اين بخش، از طراحان. كنند بسيار تسهيل مي

مي دهد، براي ايجاد سريع يك فرم ويندوز مقيد به داده ما قرار مي .كنيم ها استفاده

در مقدمه مراجعه“ كدهاةنمون” پيش از هر اقدامي به بخش ايد، كدها را نصب نكردهة اگر هنوز نمون مهم.كنيد

ها پيكربندي منبع داده

استوديو، ويژوال. ها براي پروژه است ها به فرم، ايجاد منبع داده نخستين گام در مقيدسازي دادهمي ويزارد پيكربندي منبع داده مي ها را در اختيار .كند گذارد، كه كار را بسيار آسان

كندة اضافةها به پروژ يك منبع داده

. جديدي از ويژوال استوديو را شروع كنيدةنمون.1و در صورت لزوم، برروي. را باز كنيد1فصل.2 از(Employees.vb پروژه را شروع، #Cيا، اگر

.دوبار كليك كنيد، تا فرم باز شود) EmployeesForm.csكنيد، استفاده ميف ميويژوال استوديو باز شده، .گذارد رم را به نمايش

3.Add New Data Source را از منوي Dataانتخاب كنيد ..كندمي را باز)Data Source Configuration Wizard(ها ويژوال استوديو، ويزاردپيكربندي منبع داده

با/ فصل اول ADO.NET 37شروع كار

باز كردن براي. انتخاب كنيدData Sourceة را، نيز، از پنجرAdd New Data Sourceتوانيدمي:توصيه. باز كنيدData را از منوي Data Source ،Show Data Sourceةپنجر

به بانكةگزيد انتخاب پيش.4 كليك Nextها پذيرفته، سپس روي عنوان نوع منبع داده اطالعاتي را.كنيد

اي را به نمايش صفحه) Data Source Configuration Wizard(ها ويزارد پيكربندي منبع دادهميگذا مي .خواهد اتصالي را انتخاب كنيد رد، كه از شما

. كليك كنيدNew Connectionروي.5.شود ظاهر ميData Sourceقاب گفتگوي

Microsoft ADO.NET 2.0 38گام به گام با

Change كليك كنيد، تا قاب گفتگوي Change ظاهر شد، روي Add Connectionاگر قاب گفتگوي:توصيه

Data Sourceباز شود .

6.Microsoft SQL Serverاب نموده، عالمت قاب كنترل را انتخAlways Use This Selection را پاك و سپس روي . كليك كنيدContinueكرده،

.شود ظاهر ميAdd Connectionقاب گفتگوي

.SQLEXPRESS (local): تايپ كنيدServer Nameدر قاب.7وlocalبخش شة نام نمونSQLEXPRESS اشاره به كامپيوتر محلي داشته، SQL Serverةد ايجاد.است

با/ فصل اول ADO.NET 39شروع كار

و نمون:مهم Microsoft SQL Server 2005 Expressةگزيد كدهاي آن براي استفاده از نصب پيشة كتاب

Editionاش ايجاد شدهة، كه نام نمونSQLEXPRESSو طراحي شده مي. اند است، نوشته از اگر خواهيدشدةها با نام نمون آن ازة ايجاد تغييرات الزم را در مراحل انجام بايده كنيد، استفادSQL Server ديگري

و رشته به تمرين .وجود آوريدهاي اتصال

اطالعاتي، بانكdrop-down list (Select Or Enter A Database Name(در فهرست فروافتادني.8AdoStepByStepرا انتخاب كنيد .

هم را مشاهده نكرديدAdoStepByStep اطالعاتي اگر نام بانك:مهم هاي دستورالعملة، مطمئن شويد كه.ايد نصب مشروح در مقدمه را دنبال كرده

وOK روي Add Connectionقاب گفتگويدر.9 Data Source Configuration Wizardةسپس درصفح،. كليك كنيدNextروي

Data Source Configuration Wizardدر صفحه هادي براي ذخيره آورد، حاوي پيشنمي اي را به نمايش. است كاربردي اتصال در فايل برنامهةكردن رشت

Microsoft ADO.NET 2.0 40گام به گام با

Next را پاك كرده، سپس روي Yes, Save The Connection Asدقت كنيد كه عالمت قاب كنترل.10به را در بانكء اشياData Source Configuration Wizardپس از چند لحظه،. كليك كنيد اطالعاتي.گذارد نمايش مي

. را انتخاب كنيدEmployees را باز نموده، Tablesگره.11

. كليك كنيدFinishروي.12Data Source Configuration Wizardةها را به پنجر منبع جديد دادهData Sourcesكند اضافه مي.

با/ فصل اول ADO.NET 41شروع كار

ةجر انتخاب كنيد، تا پنData را از منوي Show Data Source باز نباشد، Data Sourcesة اگر پنجر:توصيهData Sourceباز شود .

Data Sourcesاستفاده از پنجره

و افزودن كنترل دادهة امكان مشاهدData Sourcesةها به وجود آمد، پنجر پس از آنكه منبع داده هاي هارا مقيد به داده توانيد، نوعمي. دهدمي) تنها با كشيدن جدول يا ستون به سطح طراحي فرم(ها به فرمر و انداختن فهرستي از انواع موجود كنترلكنترلي ايد، ايجاد كردها كه با انتخاب نام جدول يا ستون

.مشخص سازيد

نمايش محتويات يك جدول پيش

. دوبار كليك كنيدAdoStepByStepDataSet.xs، بر روي Solution Explorerدر.1.اردگذ به نمايش ميDataSet Designer را در DataSetويژوال استوديو،

Microsoft ADO.NET 2.0 42گام به گام با

. را از منوي زمينه انتخاب كنيدPreview Data را كليك كرده، Employeesجدول.2.گذارد را به نمايش ميPreview Dataويژوال استوديو قاب گفتگوي

. كليك كنيدPreviewةروي دكم.3.گذارد ويژوال استوديو، محتواي جدول را به نمايش مي

با/ فصل اول ADO.NET 43شروع كار

.قاب گفتگو را ببنديد.4

ك ستونةگزيد نترل پيشتغيير نوع

بر.1 شارپ استفاده، اگر ازسيEmployees.cs [Design]يا(Employees.vb [Design]با دوباركليك كردن.Employees، برگرديد به فرم)كنيد مي

و قاب پايينEmployeeID را باز، Employees، گره جدول Data Sourcesةدر پنجر.2 افتادني را انتخاب،)drop down box (باز كنيدرا .

Microsoft ADO.NET 2.0 44گام به گام با

. را انتخاب كنيدLabelدر اين فهرست،.3مي ويژوال استوديو نوع كنترل پيش .دهد گزيده را براي ستون تغيير

موجود Options خاص درقابةهاي يك نوع داد گزيده را، براي تمام ستون توانيد كنترل پيشمي:توصيه. ويژوال استوديو، تغيير دهيدToolsدر منوي

ها به فرم دن كنترل مقيد شده به دادهافزو

. سمت راست باالي فرم بكشيدة را به گوشEmployeeIDستون.1

. خواهيم پرداختBindingNavigatorة به بحث دربار13در فصل

و چندين جزء ديگر را به فرم BindingNavigatorويژوال استوديو يك كنترل برچسب، يك كنترل.2.افزايد مي

به را به روي فرم كشيده، آنNotesو Title ،First Name ،Last Name ،Hire Dateهاي ستون.3 ها را.ترتيبي كه در تصوير زير نشان داده شده، مرتب كنيد

با/ فصل اول ADO.NET 45شروع كار

و قاب كنترل Notes در قاب متن Smart Tag تصويريةروي نشان.4 در منوي زمينه MultiLine كليك،.را انتخاب كنيد

و بزرگ كنيدكنترل را مطابق تصوير زير.5 . حركت داده

Microsoft ADO.NET 2.0 46گام به گام با

. كليك كنيدF5 كاربردي، برروي كليدةبراي اجراي برنام.6 در Employeesها را در جدول، داده)compile(كاربردي را ترجمه كردهة ويژوال استوديو برنام

مي كنترل .گذارد هاي روي فرم به نمايش

بةهاي دكم براي حركت در جدول، از كنترل.7 در باالي فرم BindingNavigatorر روي كنترل پيمايش. كاربردي را ببنديدةپس از پايان كار، برنام. استفاده كنيد

خالصه

مايكروسافت، 2005ها، در ويژوال استوديو در اين فصل، ديديم ساختن فرم ويندوز ساده مقيد به دادهو نيز ردهADO.NETهاي ردههمةدر ادامه، به جزئيات. استآسانتا چه اندازه آن، ،ها هاي مرتبط با

NET. كاربردية، كه رسيدگي به ارتباط بين برنامConnection، كار را با شيء فعالً. خواهيم پرداخت

Frameworkميةها برعهدو منبع داده .كنيم آن است، شروع

دومبخش

ها دادهةبينند تداركءاشيا:در اين بخش

كاربرد اتصاالت:2فصل

و:3فصل ها هاي داده DataReaderكاربرد فرامين

هاDataAdapterكاربرد:4فصل

و ستد:5فصل در پردازش داد ADO.NETها

دومفصل

كاربرد اتصاالت:در پايان اين فصل، خواهيد توانست

شدةنمون� ازجدة ايجاد . را به فرم ويندوز اضافه كنيدConnectionيدي. ايجاد كنيدConnectionبا نوشتن كد، يك��Property هايConnectionكار ببريد را به.. استفاده كنيدConnectionاز يك متغير بينابيني براي اشاره به چندين نوع از��property هايConnectionهاي فرم مقيد سازيد را به كنترل.�Connection و ببنديد .ها را باز كنيد. پاسخ دهيدConnection.StateChangeبه رويداد�

ترين سطح مايكروسافت در نازلADO.NET شيءة فصل، بررسي مفصل خود را از نموندر اين.، آغاز خواهيم نمودConnectionخويش، يعني

Microsoft ADO.NET 2.0 48گام به گام با

درك اتصاالت

و برنام كي بين مخزن دادهاتصاالت، مسئوليت رسيدگي به ارتباطات فيزي NET. كاربرديةهاد و هر تدارك دادهةبينند بخشي از تداركConnectionشيء. ارند را برعهده اي به اجراي بيننده هاست،

را در OleConnectionة، ردOleDbهاي دادهةبينند براي مثال، تدارك. پردازد روايت خاص خويش ميSystem.Data.Odbe namespace،هاي دادهةبينندو تداركSQL Serverة، ردSqlConnection را در

System.Data.SqlClient namespaceكنند اجرا مي.

هاي ديگري دادهةبينند تداركة مورد استفادConnectionدرك اين نكته مهم است، كه اگر از شيء: تذكربpropertyاستفاده كنيد، ممكن است و رويدادها، ميها، متدها، تفاوت شود،ا آن چه در اينجا شرح داده

.داشته باشد

با”-،1طور كه در فصل همان مايكروسافت شيءADO.NET 2 ديديم،-“ADO.NETشروع كاربه-TableAdapter-جديدي مي را مي گيرد، كه فرآيند مقيدسازي داده كار . سازد ها به فرم را بسيار آسان

را، از نوعي مناسب منبع دادهConnectionكند، اين است كه شيء ميTableAdapterيكي از كارهايي كه ها،.گيرد به كار مي

TableAdapter شيء ،Connection خويش را از طريق Connection propertyدهد در دسترس قرار مي .ميهمان مستقلي به Connectionتوان طور كه در همين بخش خواهيم ديد، در زمان طراحي يا اجرا، نيز،

.وجود آورد

ها Connectionايجاد

بهADO.NET 2 در TableAdapterبا توجه به اينكه ءصورت صريح اشيا وجود ندارد، ديگر الزم نيستConnectionهايي وجود دارند، كه حضورشان سودمند است ولي، هنوز موقعيت. را به وجود آوريم-

TableAdapter نداردضرورت است، ولي حضورش هميشه شيء بسيار جالبي.

مقدمهدر“ كدهاةنمون” مطلب، بخشةايد، پيش از ادام نصب نكردهرا كدهاي كتابة اگر هنوز نمون:مهم.را مرور كنيد

ها در زمان طراحي Connectionايجاد

از.د نيست، ولي وجود دار2005گزيده در ويژوال استوديو صورت پيش ديگر بهConnectionشيء پس ابزار، اضافه كردن آن به فرم به سادگي كشيدن آن به سطح طراحية به جعبConnectionافزودن شيء

.فرم است

49 ربرد اتصاالتكا/ فصل دوم

ابزارة به جعبConnectionافزودن

و براي باز شدن فرم، درصورت Chapter 2 - Startپروژه.1 را در ويژوال استوديو شروع كنيد،مي، اگر از سيConnections.csيا(Connections.vbلزوم، برروي Solutionدر) كنيد شارپ استفاده

Explorerدوبار كليك كنيد .

. كليك راست كنيدDataة ابزار را باز كرده، روي زبانةجعب.2

Microsoft ADO.NET 2.0 50گام به گام با

3.Choose Itemsرا از منوي زمينه انتخاب كنيد .مي را به Choose Toolbox Itemsپس از چند لحظه، ويژوال استوديو قاب گفتگوي .گذارد نمايش

. را انتخاب كنيدSqlConnectionقاب كنترل.4

. كليك كنيدOKروي.5مية را به جعبSqlConnectionويژوال استوديو كنترل .افزايد ابزار

به فرمConnectionاضافه كردن

. را به سطح فرم بكشيدSqlConnection، كنترل Form Designerدر.1ميويژوال استوديو، كنترل موردن .كند ظر را به سيني اجزا اضافه

51 ربرد اتصاالتكا/ فصل دوم

. تغيير دهيدcnSql، نام شيء را به Propertiesةدر پنجر.2

ةو سپس روي پنجرViewشود، روي منوي به درستي نشان داده نميPropertiesةاگر پنجر: تذكرPropertiesكليك كنيد .

را كه در فصل گذشته Connection را باز كرده، ConnectionString Propertyعنوان تحتcomboقاب.3.ايد، انتخاب كنيد ايجاد كرده

Microsoft ADO.NET 2.0 52گام به گام با

ها در زمان اجرا Connectionايجاد

Connection براي ايجاد اشياءDesigner از كه به كار در ويژوال استوديو مشغوليد، معموالًهنگامييك استفاده مي در اين.، مفيد استنشدهق جديد كه هنوز به فرم الصاConnectionكنيد، ولي گاه ايجاد

.توانيد آن را با استفاده از كد در زمان اجرا ايجاد كنيد گونه مواقع، مي) constructor( ازسازنده overloaded داراي دوروايتConnection آمده، شيء2-1گونه كه درجدولهمان

ميدخو و يا اينConnectionStringدهد است، كه اجازه .ار را به بعد موكول نماييدك را مشخص كنيد، Connectionهاي سازنده1-2جدول

شرح متد

New() يكConnectionمي به كه وجود ConnectionString Propertyآورد،. خالي تنظيم شده استةآن روي يك رشت

New(connectionString) يكConnectionمي به كه وجود ConnectionString Propertyآورد،م .شخص استآن

ConnectionString Propertyها مورد آيد، براي اتصال به منبع داده طور كه از اسمش برمي، همانبه. گيرد قرارميConnectionاستفاده شيء .جزئيات اين موضوع خواهيم پرداختدر ادامه، درهمين فصل،

ويژوال بيسيك: ايجاد كنيدConnectionبا نوشتن كد، يك

. را به نمايش گذاريدConnections، فرم F7 دادن برروي كليد با فشار.1ردةگزيده درداخل گزار سطر زير را، كه با استفاده از مقادير پيش.2 Connection، يك شيءه اعالن

. اضافه كنيدNewآورد، پيش از روال جديد به وجود مي

Dim cnOleDb As OleDbConnection

:، در مكان مشخص شده اضافه كنيدNewةسطر زير را، در داخل سازند.3

cnOleDb = New OleDbConnection()

رد،حال : شما اين چنين باشدة بايد شروع فايل

Imports System.Data Imports System.Data.OleDb Imports System.Data.SqlClient Public Class Connections Dim cnOleDb As OleDbConnection

53 ربرد اتصاالتكا/ فصل دوم

Public Sub New()

' This call is required by the Windows Form Designer. InitializeComponent()

' Add exercise code here: cnOleDb = New OleDbConnection()

End Sub

سي: ايجاد كنيدConnectionبا نوشتن كد، يك شارپ ويژوال

. را به نمايش گذاريدConnections، فرم F7 دادن بر روي كليد با فشار.1ردةگزيده در داخل گزار سطر زير را، كه با استفاده از مقادير پيش.2 Connection يك شيءة اعالن

، اين هشدار را كه فعالً. اعالن رده اضافه كنيدةآورد، پس از پرانتز شروع كنند جديد به وجود ميا (ستفاده قرار نگرفته ناديده بگيريدمتغير هيچگاه مورد هاي propertyدر تمرينات آينده،.

Connectionرا تنظيم خواهيم نمود (.

private OleDbConnection cnOleDb;

: رده اضافه كنيدةسطر زير را، در مكان مشخص شده، به انتهاي سازند.3

cnOleDb = new OleDbConnection();

رد،حال : شما اين چنين باشدة بايد شروع فايل

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Data.OleDb; using System.Data.SqlClient; using System.Drawing; using System.Text; using System.Windows.Forms; namespace Chapter_02

Microsoft ADO.NET 2.0 54گام به گام با

{public partial class Connections : Form

{ private OleDbConnection cnOleDb;

public Connections() {

InitializeComponent();

//Add exercise code here: cnOleDb = new OleDbConnection();

ها Connectionپيكربندي

Propertyهاي مهم اشياء Connectionهاي بيننده داده، كه توسط تدارك.NET Framework مايكروسافت به .اند نشان داده شده2-5 الي2-2 هايآيند، در جدول اجرا درمي

OleDbConnectionهاي 2property-2جدول

Property گزيده پيش معنا

ConnectionString ك اي كه براي اتصال به منبع داده رشته ه متد ها، زمانيOpenميميا به اجر .گيرد آيد، مورداستفاده قرار

خالي

ConnectionTimeout حداكثر زماني كه شيءConnectionاز تالش مي كند، پيش، اتصال برقرار)throwing exception(اعالم هر گونه خطا

.نمايد

ثانيه15

Database ال كه قرار است پس از برقراري اتص، اطالعاتي نام بانك.باز شود

خالي

DataSource و فايل حاوي بانك خالي اطالعاتي محل

Provider هاي دادهةبينند نام تداركOLE DB خالي

ServerVersion هاي دادهةبينند دهنده، آن گونه كه تدارك روايت سرويسOLE DBكند اعالم مي.

خالي

State مقدارConnectionStateكنوني وضعيتةدهند، كه نشان Connectionاست .

بسته

55 ربرد اتصاالتكا/ فصل دوم

SqlConnectionهاي 2property-3جدول

Property گزيده پيش معنا

ConnectionString ها، زماني كه متد اي كه براي اتصال به منبع داده رشتهOpen .گيرد در حال اجراست، مورداستفاده قرار مي

خالي

ConnectionTimeout حداكثر زماني كه شيءConnectionاز تالش مي كند، پيش.اعالم خطا، اتصال برقرار سازد

ثانيه15

Database اطالعاتي كه قرار است، پس از برقراري اتصال باز نام بانك .شود

خالي

DataSource و فايل حاوي بانك خالي اطالعاتي محل

PacketSize با بزرگي بسته مورد SQL Serverهاي شبكه كه براي ارتباطميا .گيرند ستفاده قرار

بايت8192

ServerVersion روايت مورد استفادهSQL Server خالي

State مقدارConnectionStateوضعيت كنونيةدهند، كه نشان Connectionاست .

بسته

WorkStationID گيرنده اطالعاتي سرويس بانكةكنند اي كه مشخص رشته.workstationيا، اگر مشخص نشده، نام. است

خالي

OdbcConnectionهاي 2property-4جدول

Property گزيده پيش معنا

ConnectionString ها، زماني كه متد اي كه براي اتصال به منبع داده رشتهOpenگيرد در حال اجراست، مورد استفاده قرار مي.

خالي

ConnectionTimeout حداكثر زماني كه شيءConnection ازمي تالش كند، پيش. اعالم خطا، اتصال برقرار سازد

ثانيه15

Database اطالعاتي كه قرار است، پس از برقراري اتصال نام بانك .باز شود

خالي

DataSource و فايل حاوي بانك خالي اطالعاتي محل

Driver هاي دادهةبينند نام تداركODBC خالي

Microsoft ADO.NET 2.0 56گام به گام با

Property گزيده پيش معنا

ServerVersion هاي دادهةبينند آن گونه كه تداركدهنده، روايت سرويسODBCكند اعالم مي .

خالي

State مقدارConnectionStateوضعيت كنونيةدهند، كه نشان Connectionاست .

بسته

OracleConnectionهاي 2property-5جدول

Property گزيده پيش معنا

ConnectionString زماني كه متدها اي كه براي اتصال به منبع داده رشته ،Open .گيرد در حال اجراست، مورداستفاده قرار مي

خالي

ConnectionTimeout حداكثر زماني كه شيءConnectionاز تالش مي كند، پيش.اعالم خطا، اتصال برقرار سازد

ثانيه15

Database اطالعاتي كه قرار است، پس از برقراري اتصال باز نام بانك .شود

خالي

DataSource و فايل حاوي بانك خالي اطالعاتي محل

ServerVersion هاي دادهةبينند دهنده، آنگونه كه تدارك روايت سرويسOracleكند اعالم مي.

خالي

State مقدارConnectionStateوضعيت كنونيةدهند، كه نشان Connectionاست .

بسته

و بيش property، داراي Connectionمختلف شيء هاي كنيد، روايت همانگونه كه مشاهده مي هاي كم Connectionهاي propertyة از همOLEDBهايي دادهها بيننده عالوه، تمام تداركبه. متفاوتي هستندو اگر هم كه با تدارك پشتيباني نمي مي هاي شخصي شده دادهةبينند كنند، كنيد، ديگر حتي صحبت اي كار

.توان نمودياز چنين چيزهايي نمها بنويسيم، مگر مستقل از منبع دادهتوانيم كدي كامالً اين سخن در عمل بدين معناست، كه هنوز نمي

حال، بااين. ها محروم شويم دادهةبينند هاي ارائه شده از سوي اين يا آن تدارك سازي اين كه از بهينههايي را براي راهNET Framework.چرا كه نمايد، بد نيست، وضع آن قدرها هم كه در نظر اول مي

انتظارو در واقع، مشكل، به آن ميزان كه احتماالً. گذارد سازگاري پيكربندي در زمان اجرا در اختيار مي.آيدپيش نميداريم،

57 ربرد اتصاالتكا/ فصل دوم

ConnectionString Property ConnectionStringترين مهمproperty شيء Connectionدر واقع، ساير. استproperty ها جملگي read-

only بوده، توسط خود Connection و براساس مقادير ارائه شده از سويConnectionString تنظيم.شوند مي

ميةها از يك قالب پاي ConnectionStringتمام از قالب مذكور شامل رشته. كنند واحد پيروي ايا واژه كليد و مقادير است، كه با ويرگول نقطه يا. اندز يكديگر جدا شدهها كل رشته در داخل عالئم تكي

:گيرد دوتايي نقل قول قرار مي

“keyword = value ; keyword = value ; keyword = value”

ها، چنين هستند؛ ولي، مقادير ممكن است، بسته به منبع داده case-sensitive،ها هاي كليدواژه نام مي تكي يا دوتايي نقل قول از مقررات معمول رشتهاستفاده از عالئم. نباشند براي مثال،. كند ها تبعيت

به ConnectionString باشد، Becca’s Data اطالعاتي اگر نام بانك عالمت دوتايي نقل قولةوسيلبايد موجب اشتباه ’Database=Becca’s Data‘به كار بردن عبارت . ”Database=Becca’s Data“: محصور گردد

.خواهد شداستفاده خواهد ) instance( ايجاد شدهةاگر چندين بار از يك كليدواژه استفاده كنيد، از آخرين نمون

باشد، ”database=Becca’s data;database=Northwind“ صورت بهConnectionStringبراي مثال، اگر. شد ايجاد شده از يك كليدواژهةاز چندين نموناستفاده. خواهد بودNorthwind اطالعاتي اوليه نام بانك

.روي نخواهد داد) syntax(است، لذا عالم خطاي نگارش) كننده هر چند تاحدي گيج( مجاز كامالً محتويات آن است،ةگيري دربار تصميم. استتر كاربخش آسان ConnectionStringسفانه، قالب متأ

چهمي كه هاي كليدواژه. خواهند بودData Provider اختصاصي اره كامالً همو،تواند بسيار دشوار باشد،در دادهةبينند معتبر براي تدارك و يادتان باشد. اند ذكر شدهMSDN Help در اسناد NET Framework.ها

و سپس كپي كردن مقادير Connectionتوانيد با ايجاد كه هميشه مي .كلك بزنيد) قدري( در زمان طراحيConnectionStringكه را تنها زماني مي و هنگامي كه تنظيم. بسته باشدConnectionتوان تنظيم نمود،

و سپس باقي ) syntax( نگارش Connectionگيرد، شيء آن پايان مي ها را نيز propertyرشته را بررسي،كه( مي) هستندread-onlyكه خاطرتان هست موتConnectionStringولي،. كند تنظيم بهنها طور كامل قعي

اي نشده نامعتبريا پشتيبانيproperty بهConnectionچنانچه،. شود، كه اتصال برقرارباشد اعتبارسنجي مي مورد Connectionنوع اين خطا، بستگي به نوع شيء. خواهد كرد) exception(برخورد كند، اعالم خطا

.كند ميSqlDbException، اعالن SqlConnectionبراي مثال،. استفاده داردكرديم، را، كه در تمرين گذشته ايجادOleDbConnection مربوط به ConnectionStringدر اين تمرين،.تنظيم خواهيم نمود

Microsoft ADO.NET 2.0 58گام به گام با

ويژوال بيسيك : ConnectionString Propertyتنظيم

توجه داشته(د، پس از سطري كه در تمرين گذشته افزوديم، اضافه كنيNewسطر زير را به روال.1):. اتصال، در يك سطر آورده شودةباشيد كه تمام رشت

cnOleDb.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source='C:\Microsoft Press\ADO.NET 2.0 Step by Step\SampleDBs\AdoStepByStep.mdb'"

ر قرار دارد، الزم است تغييرات الزم را در مسير اطالعاتي اكسس شما در محل ديگ اگر بانك:توصيهData Sourceبدهيد .

: به اين صورت باشدNewاكنون، بايد روال

Public Sub New()

' This call is required by the Windows Form Designer. InitializeComponent()

' Add exercise code here: cnOleDb = New OleDbConnection() cnOleDb.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source='C:\Microsoft Press\ADO.NET 2.0 Step by Step\SampleDBs\AdoStepByStep.mdb'"

End Sub

سي: ConnectionString Propertyتنظيم شارپ ويژوال

توجه(، پس از سطري كه در تمرين گذشته افزوديم، اضافه كنيد Newسطور زير را به روال.1): اتصال، در يك سطر آورده شودةداشته باشيد كه تمام رشت

cnOleDb.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source='C:\\Microsoft Press\\ADO.NET 2.0 Step by Step\\SampleDBs\\AdoStepByStep.mdb'";

اطالعاتي اكسس شما در محل ديگر قرار دارد، الزم است تغييرات الزم را در مسير اگر بانك:توصيهData Sourceبدهيد .

59 ربرد اتصاالتكا/ فصل دوم

:شما بايد به اين صورت باشد) constructor(ةاكنون سازند

public Connections() {

InitializeComponent();

//Add exercise code here: cnOleDb = new OleDbConnection(); cnOleDb.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source='C:\\Microsoft Press\\ADO.NET 2.0 Step by Step\\ SampleDBs\\AdoStepByStep.mdb’”; }

كاربرديةندي برنام در فايل پيكربConnectionStringذخيره كردن

Property هايConnectionString اين، مشكل.و بالتغييرند، كه در تمرينات گذشته تنظيم كرديم، ثابت يقين داريم كه مكان هر آيد؛ ولي، در دنياي واقعي، تقريباً بزرگي در تمرينات كوچك ما به حساب نمي

دليلي است بر لزوم ذخيره شدن فايل پيكربندي همين، خود،. اطالعاتي همواره در تغيير است بانك.ConnectionStringاز سوي ) app.configطبق قرارداد با نام( كاربرديةبرنام

ة پروژPropertiesگذارد، كه از طريق قاب گفتگوي ويژوال استوديو، يك طراح تنظيمات در اختيار مي(قابل دسترسي است .<Poroject Name> Properties را از منويProjectو سپس روي زبان ة انتخاب،

Settingمي.) كليك كنيد رد همچنين، Settingsة در ويژوال بيسيك، يا ردMy.Settingةتوانيد با استفاده از براي Propertiesةدر اين بخش، از پنجر. شارپ، در زمان اجرا به اين فايل دسترسي داشته باشيدسيدر

مية در فايل پيكربندي برنام، مستقيماConnectionString propertyًذخيره كردن .كنيم كاربردي، استفاده

كاربردية در فايل پيكربندي برنامConnectionStringذخيره كردن

. انتخاب كنيدء را در سيني اجزاcnSql، كنترل Form Designerدر.1و در عين حال حفظ كرده، براي را انتخابProperties ،ConnectionString propertyةدر پنجر.2 حذف

propertyيبورد، روي كليدها در كليپCtrl+Xفشار دهيد .بر) Property Binding(را گشوده، روي ) ApplicationSettings(بخش.3 و سپس ... روي دكمه كليك،

.كليك كنيد) Property Binding(پس از .گذارد را به نمايش ميApplication Settingsويژوال استوديو قاب گفتگوي

Microsoft ADO.NET 2.0 60گام به گام با

و سپس روي ConnectionStringقاب فهرست.1 .كليك كنيد) …New( را به نمايش درآورده،.گذارد را به نمايش ميNew Application Settingويژوال استوديو قاب گفتگوي.2و سپس، براي الصاقDefaultValueةخان.3 هر، همConnectionString را انتخاب كرده، دو كليد زمان

Ctrl+Vرا فشار دهيد .و نام اين تنظيمات را Nameةخان.4 . قرار دهيدSqlConnectionString را انتخاب كرده،

و در قاب گفتگوي New Application Settingدر قاب گفتگوي.5 ،Application Settings روي ،OK كليك .كنيد

.گذارد به نمايش ميPropertiesة مقيد شده را در پنجرpropertyويژوال استوديو

61 ربرد اتصاالتكا/ فصل دوم

Connectionهاي property كاربرد ديگر

برروي Connectionهاي propertyتوانيم كدي را براي نمايش برجاست، ميConnectionحال كه شيءولي، نخست الزم است براي سازگار كردن دو نوع شيء، به نوعي تردستي. فرم نمونه اضافه كنيم

.شءگرايانه متوسل شويم:در ويژوال بيسيك، چنين كدي به اين صورت خواهد بود. يك روش اين است كه كد شرطي بنويسيم

If Me.rbOleChecked then Me.txtConnection.Text = Me.OleDbConnection1.ConnectionString Me.txtDatabase.Text = Me.OleDbConnection1.Database.String Me.txtTimeOut.Text = Me.OleDbConnection1.ConnectionTimeout

Else Me.txtConnectionString.Text = Me.SqlConnection1.ConnectionString Me.txtDatabase.Text = Me.SqlConnection1.ConnectionTimeout

End If

باز هم در ويژوال. مشروط كد استةبراي ترجم) compiler(هاي مترجم ديگر، استفاده از ثابتةگزين:بيسيك

#Const SqlVersion #If SqlVersion Then Me.txtConnectionString.Text = Me.SqlConnection1.ConnectionString Me.txtDatabase.Text = Me.SqlConnection1.Database.String Me.txtTimeOut.Text = Me.SqlConnection1.ConnectionTimeOut #Else Me.txtConnectionString.Text = Me.OleDbConnection1.ConnectionString Me.txtDatabase.Text = Me.OleDbConnection1.Database.String Me.txtTimeOut.Text = Me.OleDbConnection1.ConnectionTimeout

اي. كردن هستندهر دو روش مستلزم مقدار زيادي تايپ ميو بهن خود صورت يك كابوس تواندبه. مي درآيديدا و ConnectionString ،Databaseهاي propertyاگر الزم است كه فقط ،TimeOut دسترسي

.تري نيز وجود دارد، راه آسان)اند ترين رايجةها، از جملو اين(باشيد داشته، از Connectionهاي، از جمله ردهNET Framework.هاي دادهةبينند ها در تدارك ردهبيشتر

System.Data.Common namespaceهاي ترتيب، در واقع، در سلسله مراتب ردهو بدين. برند ارث مي.NET

Framework و برادرند . همچون خواهر

Microsoft ADO.NET 2.0 62گام به گام با

از، ميDbConnectionعنوان با اعالن متغيري به هاي propertyتوانيم براي دسترسي به بسياريبهشترك اشياءم .عنوان واسطه استفاده كنيم گوناگون اتصال، از آن

ويژوال بيسيك: ايجاد متغير واسطه

و پايين اعالن.1 كه Connectionبا اضافه كردن سطر زير در ويرايشگر كد، در ابتداي مدول رده:ايم، متغير را اعالن كنيد پيش از اين افزوده

Dim myConnection As Data.Common.DbConnection

:حال، بايد مدول رده به اين صورت باشد

Imports System.Data Imports System.Data.OleDb Imports System.Data.SqlClient Public Class Connections Dim cnOleDb As OleDbConnection Dim myConnection As Data.Common.DbConnection Public Sub New() …

: اضافه كنيدrbOleConnection_CheckedChanged انتسابي زير را به روالةگزار.2

myConnection = cnOleDb

: اضافه كنيدrbSQLConnection_CheckedChanged انتسابي زير را به روالةگزار.3

myConnection = cnSql

سي: ايجاد متغير واسطه شارپ ويژوال

كه پيش Connectionشگر كد، در ابتداي مدول رده، پايين اعالن با اضافه كردن سطر زير در ويراي.1:ايم، متغير را اعالن كنيد از اين افزوده

private System.Data.Common.DbConnection myConnection

:حال، بايد مدول رده به اين صورت باشد

using System;

63 ربرد اتصاالتكا/ فصل دوم

using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Data.OleDb; using System.Data.SqlClient; using System.Drawing; using System.Text; using System.Windows.Forms; namespace Chapter_02 {public partial class Connections : Form {private OleDbConnection cnOleDb; private System.Data.Common.DbConnection myConnection; public Connections() …

: اضافه كنيدrbOleConnection_CheckedChanged event handlerي زير را به انتسابةگزار.2

myConnection = cnOleDb;

: كنيد اضافهrbSQLConnection_CheckedChanged event handler انتسابي زير را به گزارة.3

myConnection = cnSql;

هاي فرم ها به كنترل propertyمقيد كردن

هاي propertyيا(Connectionهاي propertyتوانيم براي نمايش حال كه متغير واسطه وجود دارد، ميDbConnection(،كد . به كنترل فرم اضافه كنيمچند سطري

property هايConnectionويژوال: فرم مقيد سازيدهاي را به كنترل

بيسيك

:روال زير را به مدول رده بيفزاييد.1

Microsoft ADO.NET 2.0 64گام به گام با

Private Sub RefreshValues() txtConnectionString.Text = myConnection.ConnectionString txtDatabase.Text = myConnection.Database txtTimeOut.Text = myConnection.ConnectionTimeout End Sub

هر.2 . اضافه كنيدRefreshValues يك فراخوان روال CheckedChanged event handlerبه پايان:حال، بايد كد به اين صورت باشد

Private Sub rbOleDBConnection_CheckedChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles rbOleDBConnection.CheckedChanged myConnection = cnOleDb RefreshValues() End Sub Private Sub rbSQLConnection_CheckedChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles rbSQLConnection.CheckedChanged myConnection = cnSql RefreshValues() End Sub

. برنامه را اجرا كنيدF5ه نموده، با فشردن كليد كد را ذخير.3كه.4 هاي متن هاي راديويي اتصال در قاب هاي هر كدام از دكمه propertyبراي اطمينان از اين

آن مربوطه به نمايش درمي .ها را انتخاب كنيد آيند،

. كاربردي را ببنديدةبرنام.5

65 ربرد اتصاالتكا/ فصل دوم

Property هايConnectionمق را به كنترل ويژوال: يد سازيدهاي فرم

شارپ سي

:، به مدول رده بيفزاييدCheckedChanged event handlerروال زير را، در زير.1

private void RefreshValues() {

txtConnectionString.Text = myConnection.ConnectionString; txtDatabase.Text = myConnection.Database; txtTimeOut.Text = myConnection.ConnectionTimeout.ToString();

}

هر.2 . اضافه كنيدRefreshValues يك فراخوان روال CheckedChanged event handlerبه پايان:حال كد بايد به اين صورت باشد

void rbOleDBConnection_CheckedChanged(object sender, EventArgs e) {

myConnection = cnOleDb; RefreshValues(); }

void rbSQLConnection_CheckedChanged(object sender, EventArgs e) {

myConnection = cnSql; RefreshValues(); }

. برنامه را اجرا كنيدF5كد را ذخيره نموده، با فشردن كليد.3آيند،ب به نمايش درمي متن مناسهاي در قابConnectionهاي هر property براي اطمينان از اينكه.4

.ها را به نوبت انتخاب كنيدآنةهم

Microsoft ADO.NET 2.0 66گام به گام با

. كاربردي را ببنديدةبرنام.5

متدهاي اتصال

در تعريف شده، داراي مجموعه متدهاي مذكوData.Common namespace، كه در DbConnectionةرد ر قرار دارند، از اين Data Provider مربوطه، كه در اختيار Connection تمام اشياء. است2-6جدول

آن مجموعه پشتيباني مي .ها متدهاي ديگري را نيز در اختيار دارند كنند، هر چند كه برخي از DbConnection متدهاي2-6جدول

شرح متد

BeginTrnsaction و ستد مي بانك داد .كند اطالعاتي را شروع

ChangeDatabase يك بانك .دهد باز را تغيير ميConnection اطالعاتي جاري در

Close مي اتصال به منبع داده .بندد ها را

CreateCommand شيءCommand همراه Connectionدهد را ايجاد كرده، بازپس مي.

GetSchema مي طرح كلي اطالعات را از بانك .كند اطالعاتي بازيابي

Open مي اتصالي با منبع داده .نمايد ها برقرار

و ستدها به پردازش6ل در فص . خواهيم پرداخت داد

67 ربرد اتصاالتكا/ فصل دوم

، كه Closeو متد Openگيرند، عبارتند از متد، كه بيشتر مورداستفاده قرار ميConnectionمتدهايمي آيد، اتصال به منبع داده شان برمي ناماز طور كه همان و بسته BeginTrnsactionمتد. كنند ها را باز

.كند ميConnection برايو ستدشروع به پردازش داد

.ها خواهيم پرداختData Commandبه3در فصل

زد توان نوع وظيفه از اسامي متدهاي ديگر، نيز، مي با استفاده از متد. اي را كه برعهده دارند حدسChangeDatabaseري متصل اطالعاتي ديگ توانيم درهمان حال كه اتصالي برقرار است، به يك بانك، مي

. را ايجاد كنيمData Command ADO.NETتوانيم شيء، ميCreateCommandبا استفاده از متد. شويممي ساختار بانكة اطالعاتي دربارGetSchemaباالخره، متد .دهد اطالعاتي بازپس

و بسته كردن اتصاالت باز

كنند، مورد استفاده ميConnection، خود به خود از سوي سه شيء كه از يك Closeو Openمتدهايمي. Data Commandو DataAdapter ،TableAdapter: گيرند استفاده قرار مي توانيد در صورت نياز، نيز،

. با نوشتن كد فراخوانيدها را صريحاً آن

.خواهيم پرداخت TableAdapterبه8و در فصل DataAdapterبه4در فصل

يك Openاگر متد و مجدداً شدهبخوانيد، اتصال مزبور بسته باز است، فرا، كه فعالConnectionًرا درمي توسط يكي از اشياييConnection در يك Openاگر متد. باز خواهد شد كنند، مانند كه از آن استفاده

Data Command،مذكور اشياء، فراخوانده شود Connectionمي را به همان حال كه يافته . گذارند اند، باقي باز باشد، هنگامي كه عمليات Connection شود، فراخوانده ميDataAdapter.Fillمثال، اگر زماني كه متد

Fillاز سوي ديگر، اگر هنگامي كه متد. كامل شد، همچنان به حالت باز باقي خواهد ماندFill فراخوانده مي به محض پايان DataAdapter بسته باشد، Connectionشود، مي .بندد يافتن كار خود، آن را

حتي. ماند را فراخوانيم، اتصال تا زماني كه صريحا بسته نشده، باز باقي ميOpen متد اگر صريحاً(شود خارج شود، بازهم خود به خود بسته نمي) scope(ديد از Connectionاگر شيء ليكن، با فراخواندن.

خConnection شيء Disposeمتد مي، اتصال .)يابد اتمه

را صريحاCloseً بايد متد هميشه به پايان رسيد،Connection پس از آنكه استفاده از شيء:مهمبه) scalability(پذيري مقياس اقتضايفراخوانيد، و، به محض خاتمه عمليات بررويو اجرايي، الزم است

Connection متد ،Closeرا فراخوانيد .

ويژوال بيسيك:و بسته كنيد را بازConnectionيك

به.1 افزوده، وضعيت آن را در btnTest_Click event handlerبراي باز كردن اتصال، سطور زير راو سپس اتصال را ببنديد :يك قاب پيام نشان داده،

Microsoft ADO.NET 2.0 68گام به گام با

myConnection.Open() MessageBox.Show(myConnection.State.ToString()) myConnection.Close()

و اجراي برنام.1 . فشار دهيدF5 كاربردي روي كليدةبراي ذخيره2.Connection Typeو سپس روي دكم . كليك كنيدTestة را تغيير داده،.دهد را نشان ميConnection كاربردي وضعيتةبرنام

يادتان رفته پيش مواجه شديد، احتماالً“ NullReferenceException was unhandled”اگر با خطاي:توصيهبه همين دليل است، كه در دنياي واقعي، هميشه بايد.، اتصالي را انتخاب كنيدTestاز كليك كردن برروي

. قرار دهيدTry/Catch error handler را در داخل يك Connection.Openفراخوان

. كاربردي را ببنديدةبرنام.3

و بسته كنيدConnectionيك سي: را باز شارپ ويژوال

به.1 : اضافه كنيدbtnTest_Click event handlerكد زير را

myConnection.Open(); MessageBox.Show(myConnection.State.ToString()); myConnection.Close();

و اجراي برنام.2 . فشار دهيدF5 كاربردي روي كليدةبراي ذخيره3.Connection Type و سپس روي دكمه . كليك كنيدTest را تغيير داده،

69 ربرد اتصاالتكا/ فصل دوم

.دهد را نشان ميConnection كاربردي وضعيتةبرنام

يادتان رفته را دريافت كرديد، احتماالً“ NullReferenceException was unhandled”اگر خطاي:توصيهبه همين دليل است، كه در دنياي واقعي،. يك اتصال را انتخاب كنيدTestپيش از كليك كردن برروي

. قرار دهيدTry/Catch error handler را در داخل يك Connection.Openهميشه بايد يك فراخوان

. كاربردي را ببنديدةبرنام.4

ها كنترل انبارسازي اتصال

به، روالConnection متعلق به شيء Closeو Openيمتدها ميهاي گرانقيمتي گرچه شايد. روند شمارمي) discrete(اي اقدامات ناهمبستهCloseو Openتصور اين كه متدهاي NET.دهند، ولي عمالً را صورت

Framework گزيده به انبار كردن صورت پيش، براي بهبود كار خود، به)pooling (مي اتصال .پردازد هادر، چيزي نيست جز گروهي از اتصاالت كه در صورت نياز)connection pool(انبارة اتصالدر واقع،

كه. دسترس هر كدي قرار دارند هنوز در انباره وجود دارد، درخواست ديگري Connectionاگر، در مدتي انبارشده در اختيار Connection صورت گيرد، ConnectionString با همان Connectionبراي باز كردن

اتةبدين ترتيب، در هزين. گيرد روال فراخواننده قرار مي و باز كردن ها صال جديد به منبع داده ايجادشد صرفه .جويي خواهد

مذكور مجدداConnectionً)ها متفاوت است دادهو منبعData Providerبه كه بسته(معيني اگر ظرف مدتو شيء ) garbage collector(كن جمع در اختيار آشغالConnectionمورداستفاده قرار نگيرد، بسته شده

.قرار خواهد گرفتصورت همواره بهADO.NETم دهيد، چه براي فعال كردن انبارسازي اتصاالت الزم نيست كاري انجا

ميشپي ميبه. كند گزيده چنين كاري را چه ندرت الزم شود انبارسازي اتصاالت را غيرفعال سازيد،ام چنين كاري شد، آن در مقايسه با باز كردن مجدد اتصاالت ناچيز است؛ ولي، اگر الزم به انجةهزين

Microsoft ADO.NET 2.0 70گام به گام با

را. امكانش وجود دارد هاو منبع دادهData Providerچگونگي غيرفعال كردن انبارسازي اتصاالت.كنند مشخص مي

OLEDB Services=-4ة، كليد واژOleDbConnectionةبراي غيرفعال كردن انبارسازي اتصاالت در ردردانبارسازي اتصاال. اتصال اضافه كنيدة را به رشت كند، استفاده ميOleDbConnectionةتي را كه ازمي منبع داده رد. كند ها مشخص ةواژ از كليدSqlConnectionو OracleConnectionةاز سوي ديگر، هر دو

Poolingكنند، كه اگر استفاده ميfalseهاي رده عالوه،به. باشد، انبارسازي اتصاالت غيرفعال خواهد شد OracleConnection وSqlConnectionمي از كليدواژه به هاي ديگري، نيز، استفاده دركنند، كه ترتيب

.اند آمده2-8و2-7هاي جدولدرةهاي رشت كليدواژه2-7جدول SqlConnection اتصال در رابطه با انبارسازي

شرحگزيده پيش نام

Connection

Lifetime

ميسن0 تر د؛ اگر اتصال طوالنيكن اتصال انبارشده را مشخصباز بوده، ديگر انبار نخواهد) به ثانيه(از زمان مشخص شده

مي شد؛ مقدار پيش .برد گزيده صفر اين قابليت را از بين

Connection Reset True كند كه اتصال، پس از برداشته شدن از انباره، مشخص ميزم از نو شروع شود يا خير؛ شروع مجدد اتصال مستلمجدداً

و برگشت به سرويس دهنده است، ولي اتصال يك دور رفتمي“بدون مشكل” .كندي را تضمين

Enlist True مي كند كه اتصال، پس از برداشته شدن از انباره، مشخصو ستدةهمچنان در زمين مي داد ماند جاري در فهرست باقي

. يا خير

Load Balance

Timeout

پ0 ميحداقل زماني كه اتصال، تواند يش از آنكه از بين رود،.حيات داشته باشد

Max Pool Size 100 مي حداكثر تعداد اتصاالتي كه در انباره نگه .شوند داري

Min Pool Size 0مي حداقل تعداد اتصاالتي كه در انباره نگه .شوند داري

Pooling True مي مي مشخص جاري خارجةتوان اتصال را از انبار كند كهدfalseساخت يا خير؛ مقدار كه اتصال جديدي به ارد اقتضا

. وجود آيد

71 ربرد اتصاالتكا/ فصل دوم

درةهاي رشت كليدواژه2-8جدول OracleConnection اتصال در رابطه با انبارسازي

شرحگزيده پيش نام

Connection Lifetime 0تر طوالني كند؛ اگر اتصال سن اتصال انبارشده را مشخص ميباز بوده، ديگر انبار نخواهد) به ثانيه(از زمان مشخص شده

ميةگزيد شد؛ مقدار پيش .برد صفر اين قابليت را از بين

Enlist True مي كند كه اتصال، پس از برداشته شدن از انباره، مشخصمي بستان بدهةهمچنان در زمين يا جاري در فهرست باقي ماند

. خير

Max Pool Size 100 مي التي كه در انباره نگهحداكثر تعداد اتصا .شوند داري

Min Pool Size 0مي حداقل تعداد اتصاالتي كه در انباره نگه .شوند داري

Pooling True مي كه مشخص جاري خارجةتوان اتصال را از انبارمي،كند كه اتصال جديدي به ارددء اقتضاfalseساخت يا خير؛ مقدار

. وجود آيد

Connectionرويدادهاي

اتصالا در اختيار دارد، ولي همة اشياءر-StateChange- تنها يك رويداد DbConnectionشيء.NET Frameworkرويداد ديگري را، نيز، در اختيار دارند :InfoMessage.

StateChangeرويدادهاي

اين رويداد،. شود شروع ميStateChangeيابد، رويداد تغيير ميConnectionعجيب نيست كه هر گاه شيءدودخوةدهد، كه به نوب آن قرار ميhandler را در اختيار StateChangeEventArtsشيء property داراي2-9 در جدول CurrentStateو OriginalStateمقادير ممكن براي . CurrentStateو OriginalState: است.اند آمده

هاي اتصال وضعيت2-9جدول

معنا وضعيت

Broken و مجدداًمي. كند اتصال باز است، ولي كار نمي . باز نمودتوان آن را بست

Closed اتصال بسته است.

Connecting استانجام نداده اتصال درفرآيند عمل است، ولي هنوز كاري.

Microsoft ADO.NET 2.0 72گام به گام با

معنا وضعيت

Executing مي .كند اتصال فرماني را اجرا

Fetching مي اتصال داده .كند ها را بازيابي

Open صال باز استات.

ويژوال بيسيك : StateChangeپاسخ به رويداد

و در قاب فهرست اشياءcnSqlبا انتخاب.1 در قاب فهرست رويدادها، StateChange ويرايشگر كدStateChange event handlerرا اضافه كنيد .

و جاري حالتنبراي نشان داد.2 cnSql_StateChange event، كد زير را به Connectionهاي پيشين

handlerاضافه كنيد :

Dim theMessage As String theMessage = "The Connection has changed from " & _ e.OriginalState.ToString() & _ " to " & e.CurrentState.ToString() MessageBox.Show(theMessage))

73 ربرد اتصاالتكا/ فصل دوم

و اجراي برنام.3 . فشار دهيدF5ردي، روي كليد كاربةبراي ذخيره كردنو سپس روي دكمSQL Server راديوييةدكم.4 . كليك كنيدTestة را انتخاب،

و بسته ميConnectionهنگامي كه مي كاربردي قابةشود، برنام باز .گذارد هاي پيام را به نمايش

. كاربردي را ببنديدةبرنام.5

سي: StateChangeپاسخ به رويداد شارپ ويژوال

. انتخاب كنيدء را در سيني اجزاcnSql، كنترل Form Designerدر.1 كليك Propertiesة در پنجرEventsة، روي دكمcnSqlبراي به نمايش درآمدن رويدادها براي كنترل.2

.كنيد

و براي افزودن رويداد StateChangeرويداد.3 Enter روي كليد cnSql_StateChange را انتخاب كرده،و به نماي كد برويدفشار ده .يد،

Microsoft ADO.NET 2.0 74گام به گام با

و فعلي.4 اضافه cnSql_StateChange event handler به Connectionكد زير را براي نمايش حاالت قبلي:كنيد

string theMessage; theMessage = "The Connection State has changed from " + e.OriginalState.ToString() + " to " + e.CurrentState.ToString(); MessageBox.Show(theMessage);

و اجراي برنام.5 . فشار دهيدF5 كاربردي روي كليدةبراي ذخيرهو سپس دكمSQL Server راديوييةدكم.6 . را كليك كنيدTestة را انتخاب،

و بسته شدن مية، برنامConnectionبه محض باز .گذارد كاربردي دو قاب پيام را به نمايش

. كاربردي را ببنديدةامبرن.7

InfoMessageرويدادهايپس شود، كه منبع داده، زماني آغاز ميInfoMessageرويداد در. دهدمي ها هشدارهايي باز اطالعاتي كهدر.ها دادهةبينند گيرد، بستگي دارد به تدارك قرار ميevent handlerاختيار ، اين SQL Serverبراي مثال،اس پيام يا كمتر تنظيم10و سطح شدتي كه روي RAISERROR يا فرمان PRINTتفاده از فرمان ها با

مي شده، براي سرويس ة دربارMSDN Helpبراي جزئيات، نگاه كنيد به مبحث. شوند گيرنده ارسالمي بيننده داده تدارك .كنيد هايي كه از آن استفاده

75 ربرد اتصاالتكا/ فصل دوم

خالصه

و NET Framework. كاربرديةسيدگي به ارتباط بين برنامرة، كه وظيفConnectionدر اين فصل با شيءو Connection چگونگي ايجاد شيءةهمچنين، مطالبي دربار. ها را برعهده دارد، آشنا شديم منبع داده ،

و نيز نحو بستگي آن به تدارك و زمان اجرا، ازةبيننده در زمان طراحي براي dbConnection استفادهژ به. نريك خوانديمفراهم ساختن واسط كه(Connectionهاي propertyدر پايان، نظري انداختيم

هم) استConnectionStringشان ترين مهم رد روايتةو رويدادهايي كه از سوي مذكور عرضهةهاي.شوند مي

سومفصل

و Data Command كاربرد ها DataReaderها:در پايان اين فصل، خواهيد توانست

�Data Commandدر زمان اجرا به وجود آوريد ،.و در زمان اجرا، به پيكربندي� . بپردازيدData Commandدر ويژوال استوديو مايكروسافت،. پارامترها را در ويژوال استوديو پيكربندي كنيدةمجموع�و پيكربندي كنيد� .پارامتري را در زمان اجرا ايجاد.مقادير پارامترها را تنظيم كنيد�.، اجرا كنيدData Commandفرماني را، با استفاده از��DataReaderدر زمان اجرا به وجود آوريد ،.�property هايDataReaderرا بازيابي كنيد .. را اجرا كنيدDataReaderمتدهاي�اي است از اتصال، با آن آشنا شديم، جلوه“كاربرد اتصاالت”،2، كه در فصل Connectionءشي

و كانالي براي تبادل اطالعات بين برنام فيزيكي به منبع داده داةها و منبع در بازيابي.هاده كاربرديمي مايكروسافت عمالً NET Framework.ها، اشياء داده :كنند در ارتباط با يكديگر كار1.Data Commandة، كه، در زمين.NET Framework فرامين زبان ،SQLكه قرار است توسط، را

.كندمي) encapsulate(بندي اطالعاتي به اجرا درآيند، بسته بانكةدهند سرويس2.DataReader از، كه در بازيابي رديف مي هايي كه آنData Commandها دهند، كاربرد ها را بازپس

(دارند همكن، همانلي. .)دهند ها را بازپس نمي ها دادهData Commandةطور كه خواهيم ديد،در Data Command. هاي مستقل خواهيم انداختData Commandدر اين فصل، نظري به ايجاد ها

در هاي داده ديگر كنترل كه در فصل آينده بدان خواهيم( DataReader، مانند NET Framework.ها.، نيز، وجود دارند)تپرداخ

ها Data Commandدرك

يا ارجاعي به يك روال ذخيره SQLة، يك گزار، اساساADO.NETً در Data Commandبه زبان ساده،، اجراي Data Commandترين كاربرد معمول. شود اجرا ميConnectionشده است، كه در برابر شيء

بانك)]data manipulation language]DML(هاي خت داده از زبان پرداDELETE يا SELECTفراميني چون

Microsoft ADO.NET 2.0 78گام به گام با

بانكةدهند ولي، در واقع، هر فرماني را، كه مورد پشتيباني سرويس. دهنده است اطالعاتي سرويساز اطالعاتي است، مي . اجرا نمودData Commandتوان با استفاده

از عالوه بر زبان پرداخت داده در وان براي فراخواندن روالت ميData Commandها، هاي ذخيره شدهمي. اطالعاتي نيز استفاده نمود بانكةدهند سرويس از توان گزاره همچنين، را اجرا كرد، كه SQLهايي

data definition(هاي دهند؛ مانند فراميني كه بخشي از زبان تعريف داده هيچ رديفي را بازپس نمي

language]DDL[(را سرويس اطالعاتي بانك تشكيل) هاست كه كارش تغيير ساختار منبع داده(دهنده.دهند مي

Data Commandهاي دادههاي بيننده ها بخشي از تدارك .NET Framework و تدارك هاي بيننده هستند،ميهاي ها، روايت مختلف داده و بيش متفاوتي از آن را اجرا درOleDBCommandبراي مثال،. كنند كم

System.Data.OleDb namespace وSqlCommand در System.Data.SqlClient namespace . ولي، همانند آن يك System.Data.Common namespace در فصل گذشته مشاهده كرديم، Connectionچه در رابطه با شيء

مي-DbCommandشيء-) ژنريك(فرمان عام مي را اجرا د كند، كه از آن به سترسي راحتتوان براي تر.ها از چندين منبع استفاده نمود داده

هاي گوناگوني از زبان ها، از لهجه دادهمختلف هاي دهنده حال، مهم است كه بدانيد سرويس با اينSQLمي، كه تفاوت Data، از سودمنديو اين، عمالً. كنند هاي اندكي با يكديگر دارند، پشتيباني

Command با)يكژنر(هاي عام مي Connection، در مقايسه به ويژه، در ادامه در همين. كاهد هاي عام،در ميان ) query(براي مشخص كردن پارامترهاي استعالم ) syntax( نگارشةفصل خواهيم ديد، نحو

ها نياز در دنياي واقعي، بيشتر استعالم،هاي كاربردي در برنامه. تا حدي متفاوت استها دهنده سرويس. پارامتر دارندبه

هاي دادهةبينند اجرا شده توسط تداركCommand كه چنانچه از شيء،درك اين نكته مهم است:تذكرميتديگري اس و رويدادهاها propertyكنيد، ممكن است فاده آن،، متدها شد اندكي با چه در اين جا بيان

.متفاوت باشند

.ها خواهيم پرداختTableAdapterهب8و درفصل،هاDataAdapterبه4در فصل

Data Commandها هاي زبان پرداخت داده هايي كه گزاره)DML (مي كهآن-كنند را اجرا هاييو روزآمد هاي داده رديف از-كنندمي) update(ها را بازيابي در بيشتر موارد به عنوان بخشي

DataAdapterيا TableAdapterم كه نياز به انجام كاري داريدهمولي، زماني. گيرندي مورداستفاده قرارآن( فوق نيست Adapterكه مورد پشتيباني هيچ يك از دو شيء مي)ها ساده نيست يا كار با توانيد،

مي. ها را ايجاد كنيدData Command مستقالً را اجرا كنيد، SQLةخواهيد نوع ديگري از گزار هنگامي كهبتقريباً يك هميشه نياز . مستقل خواهيد داشتData Commandه

و Data Command كاربرد/ فصل سوم 79ها DataReaderها

ها Data Commandايجاد

Data Commandميه كه در سطح فرم وجود دارند، در زمان طراحي در توان، مانند بيشتر اشياييا را.ويژوال استوديو يا به كمك كد در زمان اجرا ايجاد نمود

ها در زمان طراحيData Command ايجاد

Data Command ،ءمانند اشياهاConnection به2 كه در فصل در صورت پيش مالحظه كرديم، گزيدهمي ابزار ويژوال استوديو گنجانده نشدهةجعب توانيد آن را با استفاده از قاب گفتگوي اند، ولي به آساني

Choose Toolbox Itemsاضافه كنيد .

درفرمان ابزار اضافه كنيدة زمان طراحي به جعبي را

و در صورت لزوم براي باز كردن فرم بر روي Chapter 3 - Start پروژة.1 را در ويژوال استوديو باز،CommandsAndReaders.vb)ياCommandsAndReaders.csمي، اگر از سي در) كنيد شارپ استفاده

Solution Explorerدوبار كليك كنيد .

. كنيد كليك راستDataة ابزار را باز كرده، برروي زبانةجعب.2. را انتخاب كنيدChoose Itemsاز منوي زمينه،.3

.گذارد را به نمايش ميChoose Toolbox Itemsپس از چند لحظه، ويژوال استوديو قاب گفتگوي. را انتخاب كنيدSqlCommandقاب كنترل.4

Microsoft ADO.NET 2.0 80گام به گام با

. كليك كنيدOKروي.5مية را به جعبSqlCommandويژوال استوديو كنترل .ندك ابزار اضافه

. جديدي از يك فرمان زمان طراحي به فرم اضافه كنيدةنمون

را به SqlCommand باز است، كنترل Form Designer در CommandsAndReadersدرحالي كه فرم.1.سطح فرم بكشيد

.كند ويژوال استوديو كنترل را به سيني اجزا اضافه مي

و Data Command كاربرد/ فصل سوم 81ها DataReaderها

. تغيير دهيدcmdGetEmployees به SqlCommand، نام فرمان را از Propertiesةدر پنجر.2

ها در زمان اجرا ايجاد اتصال

مي بستان كه از بدهData Commandة روايتي از سازندة، به بحث دربار7در فصل كند، ها پشتيباني.خواهيم پرداخت

Data Commandة چهار روايت از سازند)constructor ( يار، در اخت3-1خويش را، مطابق جدول. گزيده تنظيم مي كند را در مقادير پيشData Commandهاي property همة، ()Newةسازند. گذارد مي

مي ساير روايت و اجازه را كه ها اين امكان را در هنگام ايجاد تنظيم Data Commandهاي propertyدهندمي. كنيد مي البته، از هر روايتي كه استفاده را property، مقادير Data Commandد توانيد پس از ايجا كنيد،

.تنظيم كنيد يا تغيير دهيد

)scaffolding(درباره كد داربست

كدء ارتباط متقابل اشياةو نحوADO.NET شيءةبه دليل ماهيت نمون گوناگون در آن، بخشي ازو بيشتر تمرينات كتاب، فعالًةپروژ دركد مذكور، اساساً. موردنظر نيست اين تمرين، چهار گروه قرار،:گيرد مي

ميييكدي كه اشيا آن را به كار . استها نشده گيرد، كه هنوز صحبتي از. استكدي كه در فصول گذشته به آن اشاره شده. پردازد كدي كه به تكرار تمرينات همان فصل مي

اسة، كه خارج از حيط NET Framework. كد استاندارد .ت مطالب مطرح شده در اين كتابشدةدر دو گروه نخست، اشاراتي به فصول مربوط كد. كتاب خواهند در هر صورت، اجازه ندهيد

ناشي از اقتضاي عملي كار است، نه اين صرفاً. داربست، موجبات پريشان خاطري شما را فراهم آوردو آزار خواننده .اذيت

Data Command سازندگان3-1جدول

شرح متد

New() از گزيدهو پيش جديدةنمون .كند ايجاد ميData Commandاي

New(command) Data Commandكه جديدي ايجاد مي CommandText propertyكند،.شود اي تنظيم شده، كه توسط فرمان مشخصمي آن روي رشته

New(command, connection) Data Commandكه جديدي ايجاد مي CommandText propertyكند،ر مي وي رشتهآن و اي تنظيم شده كه توسط فرمان مشخص شود،

Connection property آن روي شيء Connection تنظيم شده كه

Microsoft ADO.NET 2.0 82گام به گام با

شرح متد

.شود توسط اتصال مشخص مي

New(command, connection,

transaction) Data Commandكه جديدي ايجاد مي آن CommandText propertyكند

مياي تنظيم شده كه توس روي رشته شود،ط فرمان مشخصConnection propertyآن روي شيء Connection تنظيم شده كه

و توسط اتصال مشخص مي آن روي Transaction propertyشود،و ستدTransactionشيء مشخص تنظيم شده كه توسط داد.شود مي

ويژوال بيسيك: فرماني را با نوشتن كد ايجاد كنيد

كدبراي به نمايش درآور.1 . فشار دهيدF7 روي كليد،دن ويرايشگر،dsAdoSbs است، در داخل اعالن رده، پس از اعالن Commandسطور زير را، كه اعالن دو متغير.2

:اضافه كنيد

Friend WithEvents cmdGetCustomers As SqlCommand Friend WithEvents cmdGetOrders As SqlCommand

پس.3 و پيش از فراخوان InitializeComponent از فراخوان در روال جديد، سطر زير راCreateScaffoldingاضافه كنيد :

cmdGetCustomers = New SqlCommand("SELECT * FROM Customers", cnAdoSbs)

ازة در اختيار سازنده، يك نمون Connectionو شيء CommandTextاين سطر، با قرار دادن جديدمي بهCommandءشي :حال، بايد شروع فايل رده به اين صورت باشد. آورد وجود

Imports System.Data Imports System.Data.SqlClient Public Class CommandsAndReaders Dim dsAdoSbs As AdoSbsDataSet Friend WithEvents cmdGetCustomers As SqlCommand Friend WithEvents cmdGetOrders As SqlCommand Dim drOrders As SqlDataReader

و Data Command كاربرد/ فصل سوم 83ها DataReaderها

Public Sub New()

' This call is required by the Windows Form Designer. InitializeComponent()

' Add exercise code here: cmdGetCustomers = New SqlCommand("SELECT * FROM Customers", cnAdoSbs) ' This call supports the exercise: CreateScaffolding() End Sub

سي: فرماني را با نوشتن كد ايجاد كنيد شارپ ويژوال

كد.1 . فشار دهيدF7 روي كليد،براي به نمايش درآوردن ويرايشگر dsAdoSbs است، در داخل اعالن رده، پس از اعالن Commandسطور زير را، كه اعالن دو متغير.2

:اضافه كنيد

internal SqlCommand cmdGetCustomers; internal SqlCommand cmdGetOrders;

اضافه CreateScaffoldingو پيش از فراخوان InitializeComponentسطر زير را پس از فراخوان.3:كنيد

cmdGetCustomers = new SqlCommand("SELECT * FROM Customers", cnAdoSbs);

شية به سازنده، يك نمونConnectionو شيء CommandTextاين سطر، با رد كردن ء جديد ازCommandحال، بايد شروع فايل رده به اين صورت باشد. آورد به وجود مي:

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Data.SqlClient;

Microsoft ADO.NET 2.0 84گام به گام با

using System.Drawing; using System.Text; using System.Windows.Forms; namespace Chapter_03 {

public partial class CommandsAndReaders : Form { AdoSbsDataSet dsAdoSbs; internal SqlCommand cmdGetCustomers; internal SqlCommand cmdGetOrders;

public CommandsAndReaders() {

InitializeComponent();

//Add exercise code here: cmdGetCustomers = new SqlCommand("SELECT * FROM Customers", cnAdoSbs);

//This call supports the exercise: CreateScaffolding(); }

ويژوال بيسيك: بگيريد Connectionاز ارجاعي به فرمان،

كه.1 ، پس از ايجاد New، به انتهاي روال گيرد مي Connectionاز شيء Data Commandسطر زير را،ازةنمون :، اضافه كنيدcmdGetCustomers جديدي

cmdGetOrders = cnAdoSbs.CreateCommand() ا،Newروال :ين صورت باشد اكنون بايد به

Public Sub New()

و Data Command كاربرد/ فصل سوم 85ها DataReaderها

' This call is required by the Windows Form Designer. InitializeComponent()

' Add exercise code here: cmdGetCustomers = New SqlCommand("SELECT * FROM Customers", cnAdoSbs) cmdGetOrders = cnAdoSbs.CreateCommand()

' This call supports the exercise: CreateScaffolding() End Sub

شارپسيويژوال:بگيريد Connectionاز ارجاعي به فرمان،

يك.1 مي به Connectionاز شيء Data Commandسطر زير را، كه ، Newآورد، به انتهاي روال دستازةپس از ايجاد نمون :، اضافه كنيدcmdGetCustomers جديدي

cmdGetOrders = cnAdoSbs.CreateCommand();

: اكنون بايد به اين صورت باشد،Newروال

public CommandsAndReaders() {

InitializeComponent();

//Add exercise code here: cmdGetCustomers = new SqlCommand("SELECT * FROM Customers", cnAdoSbs); cmdGetOrders = cnAdoSbs.CreateCommand();

//This call supports the exercise: CreateScaffolding(); }

Microsoft ADO.NET 2.0 86گام به گام با

ها Data Commandپيكربندي

Property هايي كه توسط شيءData Command مي اين.ندا نشان داده شده3-2، در جدول شوند عرضهproperty نگارشةها، تنها زماني از نقطه نظر نحو )syntax (مي گيرند، كه تنظيم شده مورد بررسي قرارمي. باشند كه اعتبارسنجي نهايي تنها زماني رخ .ها اجرا شود توسط يك منبع دادهData Commandدهد،

Data Commandهاي 3property-2جدول

Property شرح

CommandText ةگزارSQLكه قرار است اجرا شوداي روال ذخيره شده.

CommandTimeout ها انتظار دريافت پاسخ از منبع داده) برحسب ثانيه(زمان.

CommandType اشاره بدان دارد، كهCommandText property چگونه بايد تفسير شود؛ . هاي متن گزيده پيش

Connection شيءConnection است فرمان بر روي آن به اجرا درآيد كه قرار.

Parameters پارامترهاةمجموع

Transaction و ستدي كه فرمان در آن به اجرا درمي .آيد داد

UpdateRowSource كند، چگونه نتايج حاصل از كاربرد مشخص ميCommand توسط متد Updateمتعلق به DataAdapter يا TableAdapterدر ،DataRowا ستفاده مورد

.قرار گيرند

CommandText property رشتهازنوع، كه )string(يا متني است كه قرار است اجرا شود، يا عين است، Propertiesة را وارد پنجرSQLة گزاردر زمان اجرا، يا مستقيماً.ها در منبع دادهاي نام روال ذخيره شده

مي مي و يا . استفاده نماييدQuery Builder ازinteractiveةشيوبه)query(متوانيد براي طراحي استعال كنيد،

. خواهيم پرداختTransaction propertyة، به بحث دربار7در فصل

در Query Builder استفاده كرده باشيد، Microsoft SQL Server Enterprise Managerاگر تاكنون ازة براي ايجاد گزار، چندين مكانيسم،Query Builder. خواهد رسيداتان آشن به نظرويژوال استوديو بسيار

مي،SQLاستعالم در هاي كنترل كنار ستون نام قاب،توانيدمي. گذارد در اختيار را Diagram Paneهابهآن، خودQuery Builder؛انتخاب كنيد براي تنظيم معيارها. كند اضافه ميSQLةو گزارGrid Paneها را

ميو از مرتب كردن سفارشات، . تايپ كنيدSQL Pane در داخل استفاده يا مستقيماGrid Paneًتوانيد

و Data Command كاربرد/ فصل سوم 87ها DataReaderها

CommandTimeout propery زماني را كه Data Command كه، پيش از پيام خطايي را ايجاد كند، در آنمي انتظار دريافت پاسخ از سرويس ميمان دهنده باقي كه اين زمان،ته باشيدتوجه داش. كند د، مشخص

و نه زماني كه اجراي فرمان به درازا Data Commandانتظار پيش از شروع دريافت نتايج توسط است،را هاي يك جدول بزرگ چندين دقيقه از وقت منبع داده ممكن است بازپس گرفتن تمام رديف. كشد مي ها

دريافت شود، هيچ پيام CommandTimeoutبگيرد، ولي اگر نخستين رديف در زمان مشخص شده توسط را وارد كرديد، SQLةپس از آن كه با استفاده از تركيبي از اين متدها، گزار.خطايي ايجاد نخواهد شدو سرجاي خود نباشد، پيام( نتايج،Execute Queryةكليك كردن برروي دكم يا، اگر همه چيز درست

در) خطا .اشت به نمايش خواهد گذResults PaneراCommandType properyبه Data Commandكه محتويات،گويد مي CommandText property را چگونه

.اند ذكر شده3-3مقادير احتمالي در جدول. تفسير كند CommandType مقادير3-3جدول

شرح مقدار

StoredProcedure ب رCommandText propertyن دارد كه،آهاشاره وال حاوي نام.اي است، كه قرار است اجرا شود شده ذخيره

TableDirect ب حاوي نام جدولي CommandText propertyن دارد كه،آهاشارهو رديف ستونهمةاست، كه شد ها .هاي آن بازيابي خواهند

Text ب ة حاوي يك گزارCommandText propertyن دارد كه،آهاشارهSQLش .ود است، كه قرار است اجرا

Microsoft ADO.NET 2.0 88گام به گام با

Text،ةگزيد مقدار پيشCommandType properyو در ضمن بيشترين كاربرد را دارد توجه. است،.شود پشتيباني ميOLE DBهاي دادهةبينند تنها از سوي تداركTableDirectداشته باشيد كه

Connection property حاوي ارجاعي )reference ( به شيءConnection است، كه Data Command در Data باشد، كه namespace بايد متعلق به همان Connectionشيء. برابر آن به اجرا درخواهد آمد

Commandكه هست؛ بدين و SqlConnection بايد حاوي ارجاعي به SqlCommandمعنا ،OracleCommand . باشندOracleConnectionحاوي ارجاعي به

به5در فصل ،DataAdapterبه7و در فصل ،DataRowخواهيم پرداخت .

property Parameterاي از پارامترها براي فرمان، حاوي مجموعهSQLكه يا روال ذخيره شده اي است.در ادامه، در همين فصل، به اين مجموعه خواهيم پرداخت. اند مشخص شدهCommandType properyدر

Trasaction propertyجاعي به شيء حاوي ارTransaction و در خدمت ثبت نام ،Data Command در Transactionاست .

.7براي اطالعات بيشتر نگاه كنيد به فصل

UpdateSource propertyپس از اجراي،كند كه چگونه نتايج مشخص مي Data Command توسط متدUpdate متعلق به DataAdapter در ،DataRowمقادير احتمالي. شوند به كار گرفته ميUpdatedRowSource

property اند نشان داده شده3-4 در جدول. UpdatedRowSource مقادير3-4جدول

شرح مقدار

Both و نخستين رديف بازپس داده شده توسط پارامترهاي برون ، Commandداد.شوند هر دو، براي رديف تغييريافته طراحي مي

FirstReturnedRecordخستين رديف بازپس داده شده توسطنCommand براي رديف تغييريافته ،.شود طراحي مي

None مي پارامترها يا رديفةهم . شوند هاي بازپس داده شده، به دور انداخته

OutputParameter دادتنها پارامترهاي برونCommandشوند ،براي رديف تغييريافته طراحي مي.

UpdatedRowSourceةگزيد را ايجاد كند، مقدار پيشData Commandو خودبه خود اگر ويژوال استودي

property روي Noneاگر. شود تنظيم ميData Command در زمان اجرا به وجود آيد، يا كاربر آن را در . استBothگزيده زمان طراحي ايجاد كند، مقدار پيش

و Data Command كاربرد/ فصل سوم 89ها DataReaderها

در زمان طراحيCommandهاي propertyتنظيم

ميانهم ، كه توسط ويژوال استوديو Commandهاي شيء propertyداشت، را توان انتظارش طور كه، CommandText propertyساختن هنگام مشخص. شوند تنظيم ميPropertiesةايجادشده، بااستفاده ازپنجر

و يا براي ايجاد گزارتوانيد مقدار آن را مستقيماً مي از موردنظرSQLة تايپ كنيد، ،Query Builder استفاده Connection را تنظيم نماييد، CommandText propertyالزم است، پيش از آن كه سعي كنيد. نماييد

property در غير اين صورت، ويژوال استوديو پرچم خطا را باال خواهد برد. را مشخص سازيد.

در ويژوال استوديو Commandهاي propertyتنظيم

. را از سيني اجزا انتخاب كنيدForm Designer ،cmdGetEmployeesدر.1و روي پيكان رو به پايين كليك كنيد Properties ،Connectionةدر پنجر.2 سپس، گره. را انتخاب

Existing و روي . كليك كنيدcnAdoSbs در فهرست را باز،

3.CommandText propertyبر را انتخاب و سپس . روي دكمه، . .كليك كنيد.4.Query Builder و قاب گفتگوي .شود خود به خود ظاهر ميAdd Table باز،. كليك كنيدEmployeeListروي.5

Microsoft ADO.NET 2.0 90گام به گام با

. كليك كنيدCloseو سپس روي Add، روي Query Builder به EmployeeListبراي اضافه كردن.6.شود اضافه ميQuery Builder به EmployeeListجدول

: دارد، تايپ كنيدColumnدر ستوني كه برچسب، عبارت زير را Grid Paneدر.7

LastName + ‘ ’ + FirstName

و Data Command كاربرد/ فصل سوم 91ها DataReaderها

. فشار دهيدTabوي كليدر، برAliasبراي حركت به ستون.8

پيشوند. قول اضافه شود هاي نقل عالمت خود به خود به فضاي بين تكNممكن است، پيشوند:توصيهNاهميت) به جز انگليسي(ها استفاده از ساير زباندهد رشته يونيكد است، كه به ويژه هنگام نشان مي. يابد مي

.، تغيير دهيدFullName را به Expr 1 را، از Aliasنام ستون.9

. را انتخاب كنيدFirstNameو EmployeeID ،LastNameهاي كنترل، قابDiagram Paneدر.10

. كليك كنيدOKروي.11آ را بهSQLويژوال استوديو فرمان و وجود Propertiesة را در پنجرCommandText propertyورده،

.كند تنظيم مي

Microsoft ADO.NET 2.0 92گام به گام با

در زمان اجراCommandهاي propertyتنظيم

ساده، ) assignment(هاي انتساب توان، با استفاده از گزاره را ميCommandهاي شيء property بيشتركه كلي، مجموعه پارامترهاة در اين قاعدءيك استثنا. تنظيم نمود از) به دليل آن كه مجموعه است( است،

. پارامترها خواهيم پرداختة بعد، به مجموعهاي در بخش. كند استفاده ميAddمتد

ويژوال بيسيك: با استفاده از كدCommandهاي property تنظيم

از، پس از ايجاد نمونهNewدر ويرايشگر كد، سطر زير را به روال.1 cmdGetOrders Dataاي

Commandاضافه كنيد ،:

cmdGetOrders.CommandText = "SELECT * FROM OrderTotals WHERE " & _ "EmployeeID = @empID AND CustomerID = @custID"

استعالم پارامترداري، كه مقادير-كند اين سطر، فرماني را كه قرار است اجرا شود، مشخص ميEmployeeID وCustomerIDز مي در به اين Newحال، روال. شوند مان اجرا در اختيارش قرار داده

:صورت در خواهد آمد

Public Sub New()

' This call is required by the Windows Form Designer. InitializeComponent()

' Add exercise code here: cmdGetCustomers = New SqlCommand("SELECT * FROM Customers", cnAdoSbs) cmdGetOrders = cnAdoSbs.CreateCommand() cmdGetOrders.CommandText = "SELECT * FROM OrderTotals WHERE " & _ "EmployeeID = @empID AND CustomerID = @custID"

' This call supports the exercise: CreateScaffolding() End Sub

و Data Command كاربرد/ فصل سوم 93ها DataReaderها

سي: با استفاده از كدCommandهاي propertyتنظيم شارپ ويژوال

از تازهة رده، پس از ايجاد نمونةدر ويرايشگر كد، سطر زير را به دنبال سطر مربوط به سازند.1 ايcmdGetOrders Data Commandاضافه كنيد ،:

cmdGetOrders.CommandText = "SELECT * FROM OrderTotals WHERE " + "EmployeeID = @empID AND CustomerID = @custID";

استعالم پارامترداري، كه مقادير-كند اين سطر، فرماني را كه قرار است اجرا شود، مشخص ميEmployeeID وCustomerIDاكنون، روال سازنده به اين. شوند در زمان اجرا در اختيارش قرار داده مي

:صورت در خواهد آمد

public CommandsAndReaders() {

InitializeComponent();

//Add exercise code here: cmdGetCustomers = new SqlCommand("SELECT * FROM Customers", cnAdoSbs); cmdGetOrders = cnAdoSbs.CreateCommand(); cmdGetOrders.CommandText = "SELECT * FROM OrderTotals WHERE " + "EmployeeID = @empID AND CustomerID = @custID";

//This call supports the exercise: CreateScaffolding(); }

پارامترهاةاستفاده از مجموع

و روال استفاده از پارامترها در استعالم در ها ، در سه مرحله صورت Data Commandهاي ذخيره شده:گيرد مي

.پارامترها را، در متن استعالم يا روال ذخيره شده، مشخص كنيد.1.، اضافه كنيدData Command پارامترهايةپارامترها را، به مجموع.2پ.3 نمقادير .يدمايارامترها را تنظيم

Microsoft ADO.NET 2.0 94گام به گام با

براي مشخص كردن پارامترها، ) syntax( نگارشةكنيد، نحو اگر از روال ذخيره شده استفاده ميمي توسط منبع داده SQLاگر از پارامترهاي فرمان. شود ها، در زمان ايجاد روال ذخيره شده، تعيينةكنيد، شرايط نحو استفاده ميCommand متعلق به شيء CommandText propertyمشخص شده در.شود مشخص ميNET.هاي دادهةبينند تداركةنگارش به وسيل

هاي شوند، از نگارش پشتيباني ميNET Framework.ها كه از سوي دادههاي بيننده سفانه، تدارك متأبه از عالمت OleDBو ODBCهاي دادههاي بيننده تدارك. كنند مختلفي استفاده مي عنوان جانگهدار سوال

)placeholder (مي بايها بيننده از تداركSqlCommandشيء. كنند به جاي پارامتر استفاده با نام ذكريمي)@(پيشوندهاي داراي نويسه :كند استفاده

SELECT * FROM Customers WHERE CustomerID = @ID

بايها بيننده از تداركOracleCommandباالخره، شيء دونقطهةبا پيشوندهاي داراي نويسنام ذكريمي):( :كند استفاده

SELECT * FROM Customers WHERE CustomerID = :ID

، الزم است هر پارامتر SQLپس از استفاده از نگارش صحيح براي ايجاد روال ذخيره شده يا فرمان در اين جا، نيز، اگر از ويژوال استوديو استفاده. اضافه كنيدCommand پارامترهاي شيءةرا به مجموع

مي كنيد، نرم مي را در زمان Commandولي، اگر خود شيء. كند افزار خود مجموعه را برايتان پيكربنديو پيكربندي مي كنيد، الزم است براي ايجاد شيء پارامتر براي هر پارامتر در استعالم يا روال اجرا ايجاد

. پارامترها استفاده كنيدة متعلق به مجموعAddذخيره شده، از متد ميةمجموع مفيدترين. گذارد پارامترها، شماري متد براي پيكربندي مجموعه در زمان اجرا در اختيار

و OleDbهاي دادهةبينند توجه داشته باشيد كه، چون تدارك. اند ذكر شده3-5اين متدها، در جدول ODBCپارامترها يافتةكنند، پارامترها به ترتيبي كه در مجموع شده پشتيباني نمي از پارامترهاي ناميده

مي مي به همين دليل، بسيار مهم است كه اقالم مجموعه را به درستي پيكربندي. گردند شوند، جايگزين(نماييد مي. ، آري.ش بسيار دشوار باشدادرآيد كه رديابي] bug[تواند به صورت اشكالي پيكربندي غلط

.)اين را تجربه نشان داده است پارامترهاي متدهاي مجموعه3-5جدول

شرح متد

Add(parameter) كند پارامتر مشخص را به انتهاي مجموعه اضافه مي.

Add(name, type) ميپارامتر جديدي از نوعي مشخص به كه وجود آورد،راةداراي نام مشخصي در رشت و سپس پارامتر نام است،

ميبه ان .كند تهاي مجموعه اضافه

و Data Command كاربرد/ فصل سوم 95ها DataReaderها

شرح متد

Add(name, type, size, sourceColumn) و انداز مشخص به وجودةپارامتر جديدي از نوعرا. نام استةآورد، كه داراي نام مشخصي در رشت مي آن

و سپس براي ستون DataTableبه انتهاي مجموعه اضافه،.نمايد طراحي ميsourceColumnةمشخصي در رشت

AddWithValue(name, value) و انداز ميةپارامتر جديدي ازنوع آورد، مشخص به وجودو مقداري مشخصةكه داراي نام مشخصي در رشت نام

مي. است كند سپس، آن را به انتهاي مجموعه اضافه

Clear كند تمام پارامترها را از مجموعه حذف مي.

Insert(index, value) ميپارامتر جديدي به مقدار مشخصي آورد، كه داراي وجوداز. است ،)index)zero-indexسپس آن را،درمحل مشخصي

.كند به مجموعه اضافه مي

Insert(index, parameter) ازرا،درمحلپارامترمشخصي ،)index)zero-indexمشخصي.كند به مجموعه اضافه مي

Remove(value) مجموعهازرامشخصي است، كه داراي مقدارراپارامتري.كند حذف مي

Remove(Parameter) كند پارامتر مشخصي را از مجموعه حذف مي.

RemoveAt(index) در محل مشخصي از واقع پارامترindex)zero-index ( از را.كند مجموعه حذف مي

RemoveAt(name) كند پارامتر با نام مشخصي را از مجموعه حذف مي.

رها در زمان طراحي پارامتةپيكربندي مجموع

و تنظيم Commandءويژوال استوديو، پارامترهاي اشيا CommandText ايجاد شده را، در زمان طراحي

propertyبه: ليكن، توجه داشته باشيد كه عمليات متقابل است. كند، پيكربندي مي با افزودن پارامترCommandText property يك پارامتر به مجموعه پارامترهاي ،Data Commandشود، ولي اضافه ميCommandText property روزآمد )update (شود نمي.

. پارامترها، نيز، هستةبه عالوه، ويژوال استوديو داراي ويرايشگر مجموع

Microsoft ADO.NET 2.0 96گام به گام با

پارامترها در ويژوال استوديوةپيكربندي مجموع

.يد ابزار به فرم بكشة را از جعبSqlCommand، يك شيء Form Designerدر.1مي.2 .كند ويژوال استوديو، فرمان جديدي را به سيني اجزا اضافه. تغيير دهيدcmdCountOrders بهSqlCommand جديد را از Command، نام Propertiesةدر پنجر.3 را انتخاب، روي پيكان در جهت پايين كليك، گره Properties ،Connection propertyةدر پنجر.4

Existingو سپس روي در فهرست را با . كليك كنيدcnAdoSbsز،5.CommandText propertyرا مطابق كد زير تنظيم كنيد :

SELECT OrderCount FROM OrderCount WHERE (EmployeeID = @empID) AND (CustomerID = @custID)

. استفاده نماييدQuery Builder تايپ كنيد، يا از Propertiesة در پنجرتوانيد فرمان را مستقيماًمي:توصيه

و از شما.1 مي اگر قاب گفتگويي ظاهر شد و پرسيد كه خواهيد پيكربندي پارامتر جديد را اعمال كنيد. كليك كنيدYes پارامترها را از نو به وجود آوريد، رويةيا مجموع

و سپس روي دكمه Properties ،Parameters propertyةدر پنجر.2 . را انتخاب، . .كليك كنيد.كه. دهد را نشان ميSqlParameterةويژوال استوديو ويرايشگر مجموع Query Builderاز آنجا

توانيد در صورت لزوم پارامترها را براي ما ايجاد كرده، اين بار كاري نيست كه انجام دهيم، ولي مي.پارامترها را اضافه كنيد، تغيير دهيد، يا حذف نماييد

. كليك كنيدOKروي.3

و Data Command كاربرد/ فصل سوم 97ها DataReaderها

و پيكربندي پارامترها در زمان اجرا اضافه كردن

اند، ذكر شده3-5، كه پيش از اين در جدول Addتوان با استفاده از يكي از متدهاي در زمان اجرا، مي. افزودCommandپارامترهايي را به مجموعه پارامترهاي شيء

و پيكربندي نماييد ويژوال بيسيك: با نوشتن كد پارامتري را اضافه

اضافه New، به روال CreateScaffoldingدر ويرايشگر كد، سطور زير را، درست پيش از فراخوان.1:كنيد

cmdGetOrders.Parameters.Add("@empID", SqlDbType.Int) cmdGetOrders.Parameters.Add("@custID", SqlDbType.VarChar)

: به اين صورت باشدNewاكنون، بايد روال

Public Sub New()

' This call is required by the Windows Form Designer. InitializeComponent()

' Add exercise code here: cmdGetCustomers = New SqlCommand("SELECT * FROM Customers", cnAdoSbs) cmdGetOrders = cnAdoSbs.CreateCommand() cmdGetOrders.CommandText = "SELECT * FROM OrderTotals WHERE " & _

"EmployeeID = @empID AND CustomerID = @custID" cmdGetOrders.Parameters.Add("@empID", SqlDbType.Int) cmdGetOrders.Parameters.Add("@custID", SqlDbType.VarChar)

' This call supports the exercise: CreateScaffolding() End Sub

Microsoft ADO.NET 2.0 98گام به گام با

و پيكربندي نماييدبانوشتن سي: كدپارامتري را اضافه شارپ ويژوال

ة، به سازندCreateScaffoldingدر ويرايشگر كد، سطور زير را، درست پيش از فراخوان.1CommandsAndReadersك :نيد اضافه

cmdGetOrders.Parameters.Add("@empID", SqlDbType.Int); cmdGetOrders.Parameters.Add("@custID", SqlDbType.VarChar);

: به اين صورت باشدNewاكنون، بايد روال

public CommandsAndReaders() {

InitializeComponent();

//Add exercise code here: cmdGetCustomers = new SqlCommand("SELECT * FROM Customers", cnAdoSbs); cmdGetOrders = cnAdoSbs.CreateCommand(); cmdGetOrders.CommandText = "SELECT * FROM OrderTotals WHERE " + "EmployeeID = @empID AND CustomerID = @custID"; cmdGetOrders.Parameters.Add("@empID", SqlDbType.Int); cmdGetOrders.Parameters.Add("@custID", SqlDbType.VarChar);

//This call supports the exercise: CreateScaffolding(); }

تنظيم مقادير پارامترها

راو پيش از اجراي فرمان، الزم است مقاديرهر Parametersةپس از استقرار مجموع يك از پارامترهامي. تنظيم نماييد از همان گونه كه ديديم، اين كار را و يا با استفاده توان هنگام ايجاد پارامترها،

.هاي انتسابي ساده در زمان اجرا، صورت داد گزاره

ويژوال بيسيك: تنظيم مقادير پارامترها به كمك كد

به.1 :اضافه كنيد btnOrderCount_Click event handlerكد زير را

cmdCountOrders.Parameters(0).Value = 8 cmdCountOrders.Parameters(1).Value = "BONAP"

و Data Command كاربرد/ فصل سوم 99ها DataReaderها

ولي( معادل مقادير اختياري cmdCountOrders.Parametersةاين كد، مقدار هر پارامتر را درمجموعمي) معتبر .دهد قرار

سي: تنظيم مقادير پارامترها به كمك كد رپشا ويژوال

به.1 : اضافه كنيدbtnOrderCount_Click event handlerكد زير را

cmdCountOrders.Parameters(0).Value = 8 cmdCountOrders.Parameters(1).Value = "BONAP"

ولي( معادل مقادير اختياري cmdCountOrders.Parametersةاين كد، مقدار هر پارامتر را درمجموع مي) معتبر .دهد قرار

Commandمتدهاي

از تمام اين متدها،. اند ذكر شده3-6شوند، در جدول عرضه ميCommandمتدهايي كه توسط شيءو ExecuteNonQuery ،ExecuteReader ،ExecuteScalar: ترند مهمExecuteچهارمتد ،ExecuteXmlReader.

Data Command متدهاي3-6جدول

شرح متد

Cancel مياجراي فرم .سازد ان را ملغي

CreateParameter ميپارامتر جديدي به .آورد وجود

ExecuteNonQuery ت را اجرا كرده، تعداد رديففرمان مي ثيرپذيرفته را بازأهاي .دهد پس

ExecuteReader و يك .دهد بازپس ميDataReaderفرمان را اجرا،

ExecuteScalar س و نخستين راةتون نخستين رديف مجموعفرمان را اجرا كرده، حاصل.دهد بازپس مي

ExecuteXmlReader فرمان را اجرا كرده، يكXMLReaderسازد مي.

Prepare شد(ةشد روايت آماده ها به وجود فرمان را در منبع داده)ةترجمه.آورد مي

ResetCommandTimeoutCommandTimeout propertyًميگزيد روي مقدارپيش را مجددا .كنده تنظيم

Microsoft ADO.NET 2.0 100گام به گام با

اي كه قرار است شده يا روال ذخيرهSQLرود، كه فرمان زماني به كار ميExecuteNonQueryمتد به طور معمول هيچ رديفي را بازپسDDLبراي مثال، فرامين. دهند شود، هيچ رديفي را بازپس نمياجرااز نمي و لذا با استفاده .آيند درمي به اجرا ExecuteNonQueryدهند،

به4در فصل ،DataReaderبه18و در فصل ها ،XMLReaderخواهيم پرداختها .

ExecuteScalar براي فرمان SQLبه شده يا روال ذخيره مياي رود، كه يك مقدار واحد بازپس كارميها ترين مثال اين نوع فرمان، آن است كه شمارشي از رديف رايج. دهند مي :دده را بازپس

SELEDT COUNT (*) FROM Customers

و روال براي فرمانExecuteXmlReaderو ExecuteReaderمتدهاي به شده هاي ذخيره ها كار ايمي مي .دهند روند، كه چندين رديف را بازپس

اجراي توان بدون هيچ پارامتري اجرا نمود، يا، براي كنترل دقيق چگونگي را ميExecuteReaderمتد نشان داده3-7 در جدول CommandBehaviorمقادير. به آن دادCommandBehaviorفرمان، يك مقدار

.اند شده CommandBehavior مقادير3-7جدول

شرح مقدار

CloseConnection اتصالي را كهConnection propertyشدن هنگام بسته، بهDataReader بدان ،مي ارجاع مي .بندددهد،

KeyInfo و اطالعات كليدي اوليه را بازپس مي .دهد اشاره بدان دارد كه استعالم، ستون

SchemaOnly ب تنها، طرح بانك ها در منبعر هيچ يك از رديف اطالعاتي را، بدون آن كهمي داده .دهد ها اثر گذارد، بازپس

SequnetialAccess مينتايج هر ستون از هر رديف به صورت متوالي در دس .گيرند ترس قرار

SingleResult دهد تنها يك مقدار را بازپس مي.

SingleRow دهد تنها يك رديف را بازپس مي.

اگر نتوانيد، پيش از زمان اجرا، ساختار. اند به قدر كافي روشنCommandBehaviorبيشتر مقادير.يد خواهند بود مفSchemaOnlyو KeyInfo فرمان را مشخص كنيد،ة نتيجةمجموع

مية به برنامSequnetialAccessرفتار را با استفاده binaryدهد مقادير بزرگ ستون كاربردي اجازه SingleRowو SingleResultحال،رفتارهاي درعين. بخواندDataReader درGetChars يا GetBytesازمتدهاي

.ها بهينه شوند توانند توسط منبع داده مي

و Data Command كاربرد/ فصل سوم 101ها DataReaderها

اميناجراي فر

كه فراخواناي اند، ولي بايد احتياط كنيد، كه مقدار بازپس داده شده سرراستCommandمتدهاي شيءمي) assign(متد را منتسب . مطابقت داشته باشدCommandBehavior propertyكنيد، با تنظيمات بدان

ويژوال بيسيك: اجراي فرمان با نوشتن كد

: اضافه كنيدbtnOrderCount_Clickسطور زير را به انتهاي روال.1

Dim cnt As Int16 Dim strMsg As String cnAdoSbs.Open() cnt = cmdCountOrders.ExecuteScalar() strMsg = "Employee 8 has " & cnt & " orders." MessageBox.Show(strMsg) cnAdoSbs.Close()

. گشايد را ميcnAdoSbsر را اعالن نموده، سپس، نخست يك جفت متغي)snippet(اين قطعه از كد integer كه از نوع cnt را فراخوانده، نتيجه را در متغير cmdCountOrders از ExecuteScalarسپس، متد

ميةباقيماند. نمايد است، ذخيره مي . بندد كد به نمايش نتيجه در يك قاب پيام پرداخته، سپس اتصال را:آيد اين صورت درمي به event handlerحال،

Private Sub btnOrderCount_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnOrderCount.Click

cmdCountOrders.Parameters(0).Value = 8 cmdCountOrders.Parameters(1).Value = "BONAP"

Dim cnt As Int16 Dim strMsg As String

cnAdoSbs.Open()

cnt = cmdCountOrders.ExecuteScalar() strMsg = "Employee 8 has " & cnt & " orders."

Microsoft ADO.NET 2.0 102گام به گام با

MessageBox.Show(strMsg)

cnAdoSbs.Close() End Sub

. كليك كنيدShow Order Countة را فشار داده، بر روي دكمF5 كاربردي، كليدةبراي اجراي برنام.2تأ) orders(هاي گذارد، كه تعداد رسته ويژوال استوديو يك قاب پيام به نمايش مي مين شده پارامترهاي

.دهد را نشان مي

. كاربردي را ببنديدةبرنام.3

سي: اجراي فرمان با نوشتن كد شارپ ويژوال

: اضافه كنيدbtnOrderCount_Clickسطور زير را به انتهاي روال.1

int cnt; string strMsg; cnAdoSbs.Open(); cnt = (int)cmdCountOrders.ExecuteScalar();

و Data Command كاربرد/ فصل سوم 103ها DataReaderها

strMsg = "Employee 8 has " + cnt.ToString() + " orders."; MessageBox.Show(strMsg); cnAdoSbs.Close();

ا)snippet(اين قطعه از كد . گشايد را ميcnAdoSbsعالن نموده، سپس، نخست يك جفت متغير را integer كه از نوع cnt را فراخوانده، نتيجه را در متغير cmdCountOrders از ExecuteScalarسپس، متد

ميةباقيماند. نمايد است، ذخيره مي . بندد كد به نمايش نتيجه در يك قاب پيام پرداخته، سپس اتصال را:آيد رت درمي به اين صوevent handlerحال،

private void btnOrderCount_Click(object sender, EventArgs e) {

cmdCountOrders.Parameters[0].Value = 8; cmdCountOrders.Parameters[1].Value = "BONAP";

int cnt; string strMsg;

cnAdoSbs.Open();

cnt = (int)cmdCountOrders.ExecuteScalar(); strMsg = "Employee 8 has " + cnt.ToString() + " orders."; MessageBox.Show(strMsg);

cnAdoSbs.Close(); }

. كليك كنيدShow Order Countة را فشار داده، برروي دكمF5 كاربردي، كليدةبراي اجراي برنام.2مي پياويژوال استوديو يك قاب رسم به نمايش ت) orders(هايتهگذارد، كه تعداد مين شدهأپارامترهاي

.دهد را نشان مي

Microsoft ADO.NET 2.0 104گام به گام با

. كاربردي را ببنديدةبرنام.3

ها DataReaderدرك

از از دادهforward-onlyو read-only جرياني،DataReaderشيء . دهد را بازپس ميData Commandهامي نماي شلنگ آتش عاتي سنتي اين شيء را مكان اطال هاي طراحان بانك و،خوانند نشاني جوي باريكشل سريعي از داده مي نگ آتشها، درست مثل آبي كه از سر آن. شود نشاني خارج جا كه در هر لحظه، از

آنة كه كل مجموعDataSetبرخالف(ها در حافظه وجود دارد تنها يك رديف از داده در نتايج را، چنان كهاز اي از يك بانك ايجاد نمونه”،6فصل و DataSet اطالعاتي با استفاده ، خواهيم ديد“هاDataRelation ها

با. داشته باشد) overhead( مقدار بسيار ناچيزي باالسري DataReader، الزم است)كند ذخيره مي حتيهمADO.NET 2 در DataSetهاي سازي بهينه تر است، ان درخور توجهي سريعميز بهDataReader، هنوز

و سپس آن را حذف نماييد .مشروط بر اين كه يكبار از يك رديف استفاده كردهو متدهاي براي بازيابي يك رديف استفاده ميDataReader در Readاز متد در(<Get<Typeشود، كه

از براي GetStringهاي يك سيستم، مثل عبارت است از نوع دادهTypeآن، بازپس دادن يك رشتهمي جداگانه در داخل رديف جاري موردهاي براي بازپس دادن ستون)ها داده .گيرد استفاده قرار

DataReader ها، همچونData Connection و ها دادهةبينند ها، بخشي از تداركData Commandهاد و هم از اين رو مختص منبع مي ادههستند، ديگري كه تاكنون مورد بررسي در اشياء. روند ها به شمار

شي قرار داده ، مثالً- هاي مورد استفاده دادهةبينند تداركnamespace خاص DataReaderءايم، عمالSqlDataReader-گ يك System.Data.Common namespace ديگر، ليكن، همانند همة اشياء. ايم رفتهرا به كار

و Data Command كاربرد/ فصل سوم 105ها DataReaderها

مي-DbDataReader-) ژنريك(شيء عام از در اختيار گذارد كه، در موارد نادري كه به كد مستقلمي دادهةبينند تدارك .توان از آن استفاده نمود ها نياز است،

به6در فصل ،DataSetها خواهيم پرداخت .

DataReaderًهميشه به همراه تقريبا Data Commandهمانءتنها استثنا. گيرد مورد استفاده قرار مي ،-از گونه- TableReade خواهيم ديد، شيء6 كه در فصل طور با- DataReaderاي مورد DataSet است كه

. گيرد استفاده قرار مي. اند مناسبها كامالDataReaderً ها نيست، به دادهcachedهاي هرگاه نيازي به دسترسي داده

DataReaderًولي گيرند، روسافت مورداستفاده قرار نميهاي كاربردي ويندوز مايك در برنامهها غالبا به هرگاه به پردازش رديف آنها و سپس به دور انداختن مي صورت جدا جدا براي. پردازيد، مفيدند ها

از مثال، گزارش .ها را مفيد بدانندDataReaderسازان ممكن است استفاده

ها DataReaderايجاد

مADO.NET ديگر برخالف اشياء ها تنها در زمان اجرا DataReaderورد بررسي قرار داديم،، كه تاكنون ابزار ندارد، كه بتوانيد در زمان طراحي با آن كارة ويژوال استوديو كنترلي در جعب-شوند ايجاد مي

.كنيد

ها در زمان اجراDataReader ايجاد

هايي كه DataReader است، ولي ) constructor( داراي سازنده DbDataReader) ژنريك( عامةگرچه رددهيم، كه در اين فصل مورد استفاده قرار ميSqlDataReaderهاي ديگر، چون دادهةبينند توسط تداركو ايرادي در طراحي به حساب نمي. شوند، چنين نيستند عرضه مي DataReader تنها هدف-آيد اين عيب

به بازيابي رديف دData Commandةوسيلهايي است كه به بازپس دست آوردن ارجاعي اده شده، لذا براي. استفاده كنيدData Command در ExecuteReaderتوانيد از متد ميDataReaderبه

ويژوال بيسيك: به كمكDataReaderايجاد

:، اضافه كنيدcmdGetOrdersتر از اعالن سطر زير را به ابتداي اعالن رده، پايين.1

Dim drOrders As SqlDataReader

: اضافه كنيدbtnShowOrders_Click event handlerسطور زير را، هر كجا كه الزم است، به انتهاي.2

cnAdoSbs.Open() drOrders = cmdGetOrders.ExecuteReader()

Microsoft ADO.NET 2.0 106گام به گام با

drOrders.Close() cnAdoSbs.Close()

و سطر دوم Connectionنخستين سطر، شيء ميوج را بهDataReader را باز كرده، دو. آورد ود(بندد سطر آخر هر دو شيء را مي در دو تمرين آينده DataReaderدر واقع، اين كد را براي استفاده.

.)كنيم اضافه مي: به اين صورت درآمده استevent handlerاكنون،

Private Sub btnShowOrders_Click(ByVal sender As System.Object,_ ByVal e As System.EventArgs) Handles btnShowOrders.Click Dim dr As DataRow cmdGetOrders.Parameters(0).Value = lbEmployees.SelectedItem(0) cmdGetOrders.Parameters(1).Value = lbCustomers.SelectedItem(0) dsAdoSbs.OrderTotals.Clear()

'Insert exercise code here: cnAdoSbs.Open() drOrders = cmdGetOrders.ExecuteReader()

drOrders.Close() cnAdoSbs.Close() End Sub

سي: به كمكDataReaderايجاد شارپ ويژوال

:، اضافه كنيدcmdGetOrdersتر از اعالن سطر زير را به ابتداي اعالن رده، پايين.1

SqlDataReader drOrders;

: اضافه كنيدbtnShowOrders_Click event handlerسطور زير را، هر كجا كه الزم است، به انتهاي.2

cnAdoSbs.Open(); drOrders = cmdGetOrders.ExecuteReader(); drOrders.Close();

و Data Command كاربرد/ فصل سوم 107ها DataReaderها

cnAdoSbs.Close();

و سطر دوم Connectionسطر نخست شيء مي را بهDataReader را باز كرده، دو سطر. آورد وجود(بندد آخر هر دو شيء را مي در دو تمرين آينده اضافه DataReaderدر واقع، اين كد را براي استفاده.

.)كنيم مي: به اين صورت درآمدهevent handlerاكنون،

private void btnShowOrders_Click(object sender, EventArgs e) {

DataRow dr; cmdGetOrders.Parameters[0].Value = ((DataRowView)lbEmployees.SelectedItem)[0]; cmdGetOrders.Parameters[1].Value = ((DataRowView)lbCustomers.SelectedItem)[0]; dsAdoSbs.OrderTotals.Clear();

//Insert exercise code here: cnAdoSbs.Open(); drOrders = cmdGetOrders.ExecuteReader(); drOrders.Close(); cnAdoSbs.Close(); }

property هايDataReader

Property هايDataReader اند نشان داده شده3-8 در جدول. DataReaderهاي 3property-8جدول

Property شرح

Depth گزيني عمق النه)nesting (رد يف جاري در مجموعه نتايج براي.دهد هميشه صفر را بازپس ميSQL Server. مراتبي سلسله

FieldCount ها در رديف جاري شمار ستون

HasRows مقداريك Booleanمي باز پس مي DataReaderكند دهد، كه اشاره

Microsoft ADO.NET 2.0 108گام به گام با

Property شرح

.هاست يا خير هاي داده داراي رديف

IsClosed كند اشاره ميDataReaderت يا خير بسته اس.

Item مقدار يك ستون

RecordsAffected هاي تغييريافته، حذف يا درج شده شمار رديف.

:كند از دو روايت مختلف پشتيباني ميItem property. ها، نياز به توضيح ندارندproperty بيشتر�Item(name)را، كه رشته مياي بهة كه مشخص كنندكند، قبول .پارامتر استيك عنوان نام ستون�Item(index) كه يك ،Int32مي ستونة مجموعة را به عنوان نماي همچون تمام. كند ها قبول

در مجموعه مية، نمايNET Framework.ها .شود مجموعه از صفر آغاز

DataReaderهاي propertyبازيابي

property هايDataReader جملگي read-onlyآن. هستند ADO.NET مثل هر شيء ديگر ها، دسترسي به.است

ويژوال بيسيك: DataReader propertyبازيابي

، btnShowOrders_Click event handler، در Closeو ExecuteReaderهاي سطور پايين را بين گزاره.1:اضافه كنيد

With drOrders If .HasRows Then Else MessageBox.Show("This employee placed no orders for this customer.") End If End With

در دو قاب فهرست فرم وجود نداشته باشد، اين Customersو Employeesاگر هيچ دستوري برايمي) snippet(كدةقطع (گذارد يك قاب پيام را به نمايش كه. را Command Parametersپيش از اين كدي،

.)ند، افزوده شده استك روي اين مقادير تنظيم مي: بايد به اين صورت باشدevent handlerحال،

Private Sub btnShowOrders_Click(ByVal sender As System.Object,_

و Data Command كاربرد/ فصل سوم 109ها DataReaderها

ByVal e As System.EventArgs) Handles btnShowOrders.Click Dim dr As DataRow cmdGetOrders.Parameters(0).Value = lbEmployees.SelectedItem(0) cmdGetOrders.Parameters(1).Value = lbCustomers.SelectedItem(0) dsAdoSbs.OrderTotals.Clear()

'Insert exercise code here: cnAdoSbs.Open() drOrders = cmdGetOrders.ExecuteReader() With drOrders If .HasRows Then Else MessageBox.Show("This employee placed no orders for this customer.") End If

End With

drOrders.Close() cnAdoSbs.Close() End Sub

سي: DataReader propertyبازيابي شارپ ويژوال btnShowOrders_Click event handler در Closeو ExecuteReaderهاي سطور پايين را بين گزاره.1

:اضافه كنيد

if (drOrders.HasRows) {}else {

MessageBox.Show("This employee placed no orders for this customer."); };

Microsoft ADO.NET 2.0 110گام به گام با

اين در دو قاب فهرست فرم وجود نداشته باشد، Customersو Employeesاگر هيچ دستوري برايمي) snippet(قطعه كد (گذارد يك قاب پيام را به نمايش كه. را Command Parametersپيش از اين كدي

.)كند، افزوده شده است روي اين مقادير تنظيم مي: بايد به اين صورت باشدevent handlerحال،

private void btnShowOrders_Click(object sender, EventArgs e) {

DataRow dr; cmdGetOrders.Parameters[0].Value = ((DataRowView)lbEmployees.SelectedItem)[0]; cmdGetOrders.Parameters[1].Value = ((DataRowView)lbCustomers.SelectedItem)[0]; dsAdoSbs.OrderTotals.Clear();

//Insert exercise code here: cnAdoSbs.Open(); drOrders = cmdGetOrders.ExecuteReader(); if (drOrders.HasRows) {

}else

{MessageBox.Show("This employee placed no orders for this

customer."); };

drOrders.Close(); cnAdoSbs.Close(); }

DataReaderمتدهاي

.ايم ذكر كرده3-9را در جدول DataReaderمتدهاي

و Data Command كاربرد/ فصل سوم 111ها DataReaderها

DataReader متدهاي3-9جدول

تعريف متد

Close DataReader بندد را مي .

Get<Type> بهصورتمقدارستون مشخصي رابه مينوع مشخصي آورد، دست. نام نوع سيستم است<Type>)3-10مطابق جدول(كه در آن

GetDataTypeName را نام نوع منبع داده ميبهها .آورد دست

GetFieldType مي نوع سيستم ستون مشخصي .دهد را بازپس

GetName مي نام ستون مشخصي .دهد را بازپس

GetOrdinal به اي ستون مشخصي موقعيت رتبه مي را .آورد دست

GetProviderSpecialFieldType مي هاي ستون مشخصي نوع داده .دهد را بازپس

GetSchemaTable DataTable را، كه به شرح ساختار DataReader پردازد، بازپس مي.دهد مي

GetValue به مقدار ستون مشخصي بهرا ميصورت نوع بومي آن .آورد دست

GetValues مي تمام ستون .آورد ها در رديف جاري را به دست

IsDbNull كند ستون حاوي مقدار ناموجودي هست يا خير اشاره مي.

NextResult DataReader دهد را به نتيجه بعد سوق مي.

Read DataReader دهد را به رديف بعد سوق مي.

Connection مشخص شده باشد، شيء CloseConnection را بسته، و، اگررفتار Close،DataReaderمتد

.بندد همراه آن را نيز ميو GetDataTypeName ،GetFieldType ،GetName ،GetOrdinalبا استفاده از متدهاي ،IsDbNull ،

كه. هاي ستون مشخصي را در زمان اجرا مشخص نمود propertyتوان مي IsDbNullتوجه داشته باشيد. استNullهاي خود فاقد نوع دادهNET Framework. است، چه Nullتنها راه چك كردن مقدار

رااي يا روال ذخيره شدهSQLرود، كه فرمان زماني به كار ميNextResultمتد چند مجموعه نتيجهبار ديگر،. دهد را در آغاز مجموعه نتيجه بعدي قرار مي DataReaderمتد مذكور،. دهد بازپس مي

DataReader به پيش از نخستين رديف، نه در نخستين رديف، قرار مي و الزم است پيش از رسيدن گيرد،.را فراخوانيد Readاي هر نتيجهبه، تمام ستونGetValuesمتد از صورت آرايههاي رديف جاري را ميء اشيااي حال آنكه. دهد بازپس

ليكن، اگر از پيش. دهد بازپس ميNET Framework.صورت يكي از انواع، تنها مقداري را بهGetValueمتد مي نوع داده از مقداري را كه قرار است بازپس داده شود، دانيد، بسيار كارآمدتر خواهد بود كه از يكي. ذكر شده، استفاده كنيد3-10، كه در جدول <Get<Typeمتدهاي

Microsoft ADO.NET 2.0 112گام به گام با

استفاده System.Dat.SqlType ديگري براي مقادير <Get<Type از متدهاي SqlDataReaderشيء:مهمدر. كند مي . آمده استMSDN Helpجزئيات امر

GetType متدهاي3-10جدول

GetBoolean GetDaeTime GetInt16

GetByte GetDecimal GetInt32

GetByte GetDouble GetInt64

GetChar GetFloat GetString

GetChars GetGuid

Readمتد

مية رديف بعدي مجموعReadمتد. استDataReader ،Readترين متد مهم هنگامي. كند نتيجه را بازيابيو نه در نخستين باز مي DataReaderكه نخستين بار شود، در ابتداي فايل، پيش از نخستين رديف،. نتيجه بازپس داده شود، فراخوانيدة را پيش از آن كه مجموعReadالزم است. گيرد رديف، قرار مي

از بازيابي داده ويژوال بيسيك : DataReaderها با استفاده

btnShowOrders_Click event، به If .HasRowsة در گزارTrueبا افزودن سطور زير به داخل بخش.1

handlerخاتمه دهيد :

While .Read dr = dsAdoSbs.OrderTotals.NewRow dr("EmployeeID") = .GetInt32(0) dr("CustomerID") = .GetString(1) dr("OrderID") = .GetInt32(2) dr("Total") = .GetDecimal(3) dsAdoSbs.OrderTotals.AddOrderTotalsRow(dr) End While

: به اين صورت استhandlerحال، شكل كامل

Dim dr As DataRow cmdGetOrders.Parameters(0).Value = lbEmployees.SelectedItem(0) cmdGetOrders.Parameters(1).Value = lbCustomers.SelectedItem(0)

و Data Command كاربرد/ فصل سوم 113ها DataReaderها

dsAdoSbs.OrderTotals.Clear() 'Insert exercise code here: cnAdoSbs.Open() drOrders = cmdGetOrders.ExecuteReader() With drOrders If .HasRows Then While .Read dr = dsAdoSbs.OrderTotals.NewRow dr("EmployeeID") = .GetInt32(0) dr("CustomerID") = .GetString(1) dr("OrderID") = .GetInt32(2) dr("Total") = .GetDecimal(3) dsAdoSbs.OrderTotals.AddOrderTotalsRow(dr) End While Else

MessageBox.Show("This employee placed no orders for this customer.") End If End With drOrders.Close() cnAdoSbs.Close()

. فشار دهيدF5 كاربردي، بر روي كليدةبراي اجراي برنام.2و سپس را در قابCustomerو Employee كليك، يك Listboxesةروي دكم.3 هاي فهرست انتخاب،

. كليك كنيدShow Ordersةبرروي دكماگ در پايين فرم نشان ميDataGridViewويژوال استوديو سفارشات را در ر هيچ سفارشي دهد، يا،

.گذارد وجود نداشته باشد، قاب پيامي را به نمايش مي

Microsoft ADO.NET 2.0 114گام به گام با

. كاربردي را ببنديدةبرنام.4

از بازيابي داده سي: DataReaderها با استفاده شارپ ويژوال

if (drOrders.HasRows) ،btnShowOrders_Click گزاره trueبا افزودن سطور زير در داخل بخش.1

event handlerيان دهيد را پا:

while (drOrders.Read()) {

dr = dsAdoSbs.OrderTotals.NewRow(); dr["EmployeeID"] = drOrders.GetInt32(0); dr["CustomerID"] = drOrders.GetString(1); dr["OrderID"] = drOrders.GetInt32(2); dr["Total"] = drOrders.GetDecimal(3); dsAdoSbs.OrderTotals.AddOrderTotalsRow((AdoSbsDataSet.OrderTotalsRow)dr); }

:به اين صورت است handlerاكنون، شكل كامل

private void btnShowOrders_Click(object sender, EventArgs e) {

و Data Command كاربرد/ فصل سوم 115ها DataReaderها

DataRow dr; cmdGetOrders.Parameters[0].Value = ((DataRowView)lbEmployees.SelectedItem)[0]; cmdGetOrders.Parameters[1].Value = ((DataRowView)lbCustomers.SelectedItem)[0]; dsAdoSbs.OrderTotals.Clear();

//Insert exercise code here: cnAdoSbs.Open(); drOrders = cmdGetOrders.ExecuteReader(); if (drOrders.HasRows) {

while (drOrders.Read()) {

dr = dsAdoSbs.OrderTotals.NewRow(); dr["EmployeeID"] = drOrders.GetInt32(0); dr["CustomerID"] = drOrders.GetString(1); dr["OrderID"] = drOrders.GetInt32(2); dr["Total"] = drOrders.GetDecimal(3); dsAdoSbs.OrderTotals.AddOrderTotalsRow((AdoSbsDataSet.OrderTotalsRow)dr); }

else {

MessageBox.Show("This employee placed no orders for this customer."); };

drOrders.Close(); cnAdoSbs.Close(); }

Microsoft ADO.NET 2.0 116گام به گام با

. فشار دهيدF5 كاربردي، روي كليدةمبراي اجراي برنا.2و سپس را در قابCustomerو Employee كليك، يك Listboxesةروي دكم.3 هاي فهرست انتخاب،

. كليك كنيدShow Ordersةبرروي دكمدهد، يا، اگر هيچ سفارشي در پايين فرم نشان ميDataGridViewويژوال استوديو سفارشات را در

ميوجود ندارد، .گذارد يك قاب پيام را به نمايش

. كاربردي را ببنديدةبرنام.4

خالصهو شيءData Commandدر اين فصل، با ها، نمايندگان فرامين Data Command. آشنا شديم DataReaderها

SQLدهنده اجرا شوند ها هستند، كه قرار است توسط سرويس دادهةبينندو اختصاصي تدارك .DataReader آنه يك ها هستند، داده دادهةبينند ها نيز اختصاصي تدارك ا، كه و ستون را در هاي رديف

مي مي. دهند زمان بازپس به ها را در زمانData Commandتوان ديديم كه چگونه و اجرا هاي طراحيو Data Commandبه متعلقExecuteReaderو با استفاده از متد ها را مستقالًَ DataReaderوجود آورد،

آنةهايي از ايجاد پارامترهاي فرمان، نحو همچنين، مثال. ايجاد نمود و تنظيم مقادير ها در زمان اجرا،. را مشاهده كرديم DataReader با استفاده از Data Commandباالخره چگونگي بازپس دادن نتايج از

فصل چهارم

هاDataAdapter كاربرد:در پايان اين فصل، خواهيد توانست

. ايجاد كنيدDataAdapterيك. نمايش دهيد را پيشDataAdapterنتايج

. استفاده كنيدTable Mappingsاز قاب گفتگوي. استفاده كنيدDataAdapterاز متدهاي

. پاسخ دهيدDataAdapterبه رويدادهاي مايكروسافت، كه بين ADO.NET شيء-پردازيم ميDataAdapterن فصل، به بررسياي در

Connection)با آن آشنا شديم“ كاربرد اتصاالت”،2كه در فصل (وDataSet)،كاربرد”كه در فصل شيء DataTable نشيندمي) بدان خواهيم پرداخت“ها .

هاDataAdapter درك

DataAdapterاء، نيز، همچون اشيConnection وCommandهر. است دادهةبينند، بخشي از تدارك برايو نيز يك روايتايي يك روايت دادهةبينند تدارك در)ژنريك(عامخاص، ،System.Data.Common namespace

.وجود دارد

. خواهيم پرداختDataSetبه، مفصال6ًدر فصل

DataAdapter د“ چسب”ها، نقش و شيء ادهبين منبع هنوز به جزئيات. را برعهده دارندDataSetهاDataSetكافي است بدانيد ايم، فعالً ها نپرداخته DataSetنهانية نوعي حافظ )cache (كه براي داده هاست،

و ستون با جداول، رديف) relational database(اي اطالعاتي رابطه شباهت به يك بانك .هاي آن دارد هاز DataSet دريافت كرده، آن را در اختيار Connection ها را از اشياء دادهDataAdapterبان انتزاعي، بهاز ها در منبع داده همچنين، براي روزآمدكردن داده. دهد قرار مي ها Connection به DataSetها، تغييرات را(گرداند بازمي مي يادتان باشد، كه منبع داده. دا ها و نه لزوماًيهادهتواند هر نوع يك بانك ساختارمندي،

.)اطالعاتي، باشد

به8در فصل ،DataAdapterها خواهيم پرداخت .

Microsoft ADO.NET 2.0 118گام به گام با

-براي هر اقدام احتمالي يكي- Data Commandها چهار DataAdapterها، براي روزآمد كردن منبع دادهدر. بندي دارد در بسته ، SelectCommand ،UpdateCommandهاي propertyاين چهار فرمان،

InsertCommand و ،DeleteCommand شيء DataAdapterشوندميگر جلوه.ADO.NET ،عنوان شيء جديدي، تحت مايكروسافتTableAdapterكه، به اين چهارتا اضافه مي كند،هبااين. هاي ديگر به آن استو افزودن برخي قابليتDataAdapterبندي كارش بسته نگامي كه نيازي حال،

غيرضروري، ) overhead(به اين قابليت اضافي نيست، ممكن است بهتر باشد، براي پرهيز از سرباري DataAdapterطور مستقل مورد استفاده قرار دهيد را به .

ها DataAdapterايجاددر اختياراه DataAdapter براي ايجاد interactive مايكروسافت چندين روش 2005ويژوال استوديو

آنگذارد، كه در اين مي مي جا به دو تا از ميدر صورت لزومالبته،. كنيم ها اشاره را DataAdapterتوانيد،و با نوشتن كد به وجود آوريدبه .در اين بخش، به اين روش نيز خواهيم پرداخت. صورت دستي

ها در زمان طراحيDataAdapter ايجاد

. استگزيده درآمده پيشAdapterصورت شيء بهTableAdapterوديو، در بخش بزرگي از ويژوال است بكشيد، اكنون ويژوال Data Sourcesةاي را از پنجر شده براي مثال، اگر جدول، استعالم يا روال ذخيره

مي اضافTableAdapter يك DataAdapterاستوديو به جاي ابزار ويژوال ولي، اگر آن را به جعبة. كندهمياستوديو ( را در زمان طراحي به وجود آوريدDataAdapterتوانيد اضافه كنيد، هنوز .DataAdapter ،ها

.) ابزار وجود ندارندةگزيده در جعب صورت پيش، ديگر بهADO.NETاي پايهمانند ساير اشياءمية را از جعبDataAdapterكه هنگامي يو ويزارد كشيد، ويژوال استود ابزار به سطح طراحي فرم را به صورت دستي پيكربندي كنيد، DataAdapterاگر بخواهيد. كند را آغاز ميDataAdapterپيكربندي

Propertiesة را به صورت كد يا در پنجرDataAdapterهاي propertyكافي است ويزارد را لغو كرده،به. بنويسيد آنو چگوDataAdapterهاي propertyدر ادامه، در همين فصل، ها خواهيم نگي تنظيم دستي.پرداخت

ابزار در زمان طراحية به جعبDataAdapterاضافه كردن

و در صورت Chapter 04 - Startة جديدي از ويژوال استوديو را شروع كرده، پروژةنمون.1 را باز،ا، اگر از سيDataAdapters.csيا(DataAdapters.vbلزوم، براي باز كردن فرم، روي ستفاده شارپ

. دوبار كليك كنيدSolution Explorerدر) كنيد مي. كليك راست كنيدDataة ابزار را باز كرده، روي زبانةجعب.2

119 هاDataAdapter كاربرد/ فصل چهارم

3.Choose Itemsرا در منوي زمينه انتخاب كنيد ..كند را انتخاب ميChoose Toolbox Itemsويژوال استوديو، پس از چند لحظه، قاب گفتگوي

پ.4 . را انتخاب كنيدSqlDataAdapterيمايش نموده، قاب كنترل به سمت پايين

Microsoft ADO.NET 2.0 120گام به گام با

. كليك كنيدOKروي.5مية در جعبData را به بخش SqlDataAdapterويژوال استوديو كنترل .كند ابزار اضافه

به DataAdapter، يك DataAdapterبا استفاده از ويزارد پيكربندي

.وجود آوريد

. ابزار به سطح طراحي فرم بكشيدة جعب، ازSqlDataAdapterيك كنترل.1.كند را آغاز ميDataAdapterويژوال استوديو، ويزارد پيكربندي

121 هاDataAdapter كاربرد/ فصل چهارم

ايم، پيشنهاد اطالعاتي نمونه را كه مورداستفاده قرار داده هاي، محل بانكويژوال استوديو، احتماالً.2 Addوجه كنيد كه در قاب گفتگويت. كليك كنيدNew Connectionاگر چنين كاري نكرد، روي. كند مي

Connectionها روي، منبع دادهMicrosoft SQL Server در قاب. تنظيم شده باشدServer Name تايپ ، Use Windows Authenticationة، گزينLog On To The Serverدر بخش . SQLEXPRESS\(local)كنيد

گConnect To A Databaseدر بخش. را انتخاب كنيد را Select Or Enter A Database Nameةزين،. را انتخاب كنيدAdoStepByStep اطالعاتي روي پيكان رو به پايين كليك كرده، بانك. انتخاب كنيد

. كليك كنيدOKوقتي كارتان پايان يافت، روي

كليكNext نشان داده شد، روي Choose Your Data Connectionةوقتي كه مكان صحيح در صفح.3.كنيد

.گذارد را به نمايش ميChoose A Command Typeةويژوال استوديو صفح

Microsoft ADO.NET 2.0 122گام به گام با

. كليك كنيدNext را انتخاب كرده، سپس روي Use SQL Statementsةگزيد پيش.4.گذارد را به نمايش ميGenerate The SQL Statementsةويژوال استوديو صفح

. كليك كنيدQuery Builderةروي دكم.5.گذارد را به نمايش ميAdd Tableو قاب گفتگوي Query Builderژوال استوديو،وي.6و سپس روي Add را انتخاب، روي Categoriesجدول.7 . كليك كنيدClose كليك،

.كند اضافه ميQuery Builderويژوال استوديو جدول را به*، روي قاب كنترل Grid Paneدر.8 (All Columns)كليك كنيد .

Query Builderة گزارSQLآورد را به وجود مي.

123 هاDataAdapter كاربرد/ فصل چهارم

و سپس روي Query Builder در OKروي.9 ،Finishدر Generate The SQL Statements pageكليك كنيد ..افزايد به سيني اجزاي فرم مي Connectionو يك DataAdapterويژوال استوديو، يك

10 .SqlDataAdapter1و سپس در پنجر را در سيني اجزا انتخا به نام كنترل راPropertiesةب كرده،daCategoriesتغيير دهيد .

11 .SqlConnectionو سپس در پنجر نام كنترل را به Propertiesة را در سيني اجزا انتخاب كرده،cnAdoSbsتغيير دهيد .

Microsoft ADO.NET 2.0 124گام به گام با

DataAdapterصورت دستي به وجود آوريد را به .

اSqlDataAdapterيك.1 . ابزار به سطح طراحي فرم بكشيدةز جعب را.كند را آغاز ميDataAdapterويژوال استوديو، ويزارد پيكربندي.2. كليك كنيدCancelروي.3

.كند را به سيني اجزاي فرم اضافه ميDataAdapterويژوال استوديو ويزارد را بسته،4.DataAdapterو سپس در پنجر تغييرdaProducts نام آن را به Propertiesة جديد را انتخاب كرده،

.دهيد

125 هاDataAdapter كاربرد/ فصل چهارم

ها در زمان اجرا DataAdapterايجاد

آن را ايجاد ميADO.NET در فصول گذشته، وقتي اشياء نموده، ) declare( را اعالنها كرديم، نخستآن) initialize(سپس يك مقدار اوليه مي به هم، اساساDataAdapterًفرآيند ايجاد. داديم ها ان صورت به

كه: است، با يك تغيير كوچك دهد، الزم است ارجاع ميCommand به چهار شيء DataAdapterاز آنجاآن اوليهةها را اعالن كرده، نمون نخست هر كدام از فرمان به اي از هاي propertyوجود آورده، سپس ها

DataAdapter Commandها تنظيم نماييم را براي ارجاع به آن.

ويژوال بيسيك: در زمان اجراDataAdapterايجاد

. فشار دهيدF7 در ويرايشگر كد، روي كليد DataAdapterبراي نشان دادن كد در فرم.1: اضافه كنيدdsAdoSbsسطور زير را در داخل اعالن رده، پس از اعالن.2

Friend WithEvents cmdSelectSuppliers As New SqlCommand() Friend WithEvents cmdInsertSuppliers As New SqlCommand() Friend WithEvents cmdUpdateSuppliers As New SqlCommand() Friend WithEvents cmdDeleteSuppliers As New SqlCommand() Friend WithEvents daSuppliers As New SqlDataAdapter()

به متData Command، چهار)snippet(اين قطعه از كد به را اعالن كرده، آنDataAdapterعلق ها را.آورد وجود مي

:حال، شروع فايل كد به اين صورت بايد باشد

Imports System.Data Imports System.Data.SqlClient Public Class DataAdapters Dim dsAdoSbs As AdoSbsDataSet Friend WithEvents cmdSelectSuppliers As New SqlCommand() Friend WithEvents cmdInsertSuppliers As New SqlCommand() Friend WithEvents cmdUpdateSuppliers As New SqlCommand() Friend WithEvents cmdDeleteSuppliers As New SqlCommand() Friend WithEvents daSuppliers As New SqlDataAdapter()

Public Sub New() ...

Microsoft ADO.NET 2.0 126گام به گام با

، در Newدهد، به روال نسبت ميDataAdapter را به Data Commandسطور زير را، كه چهار شيء.3:، اضافه كنيدInitializeComponentشده پس از فراخوان جاي مشخص

daSuppliers.SelectCommand = cmdSelectSuppliers daSuppliers.InsertCommand = cmdInsertSuppliers daSuppliers.UpdateCommand = cmdUpdateSuppliers daSuppliers.DeleteCommand = cmdDeleteSuppliers

:آيد حال، روال به اين صورت درمي

Public Sub New()

' This call is required by the Windows Form Designer. InitializeComponent()

' Add exercise code here: daSuppliers.SelectCommand = cmdSelectSuppliers daSuppliers.InsertCommand = cmdInsertSuppliers daSuppliers.UpdateCommand = cmdUpdateSuppliers daSuppliers.DeleteCommand = cmdDeleteSuppliers

' This call supports the exercise: CreateScaffolding() End Sub

سي: در زمان اجراDataAdapterايجاد شارپ ويژوال

. فشار دهيدF7 در ويرايشگر كد، روي كليد DataAdapterبراي نشان دادن كد در فرم.1: اضافه كنيدdsAdoSbsسطور زير را در داخل اعالن رده، پس از اعالن.2

SqlCommand cmdSelectSuppliers; SqlCommand cmdInsertSuppliers; SqlCommand cmdUpdateSuppliers; SqlCommand cmdDeleteSuppliers; SqlDataAdapter daSuppliers;

127 هاDataAdapter كاربرد/ فصل چهارم

:حال، شروع فايل كد به اين صورت بايد باشد

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Data.SqlClient; using System.Drawing; using System.Text; using System.Windows.Forms; namespace Chapter_04 {

public partial class DataAdapters : Form { AdoSbsDataSet dsAdoSbs; SqlCommand cmdSelectSuppliers; SqlCommand cmdInsertSuppliers; SqlCommand cmdUpdateSuppliers; SqlCommand cmdDeleteSuppliers; SqlDataAdapter daSuppliers;

public DataAdapters() {...

ز.3 بهة اعالن شده در مرحلاي از اشياء ير را، كه نمونة تازهسطور مي پيش آورد، در جاي وجود: رده اضافه كنيدة، به سازندInitializeComponentمشخص شده پس از فراخوان

mdSelectSuppliers = new SqlCommand(); cmdInsertSuppliers = new SqlCommand(); cmdUpdateSuppliers = new SqlCommand(); cmdDeleteSuppliers = new SqlCommand(); daSuppliers = new SqlDataAdapter();

Microsoft ADO.NET 2.0 128گام به گام با

:آيد حال، سازنده به اين صورت درمي

public DataAdapters() {

InitializeComponent();

//Insert exercise code here: cmdSelectSuppliers = new SqlCommand(); cmdInsertSuppliers = new SqlCommand(); cmdUpdateSuppliers = new SqlCommand(); cmdDeleteSuppliers = new SqlCommand(); daSuppliers = new SqlDataAdapter(); //This call supports the exercise: CreateScaffolding(); }

ب.4 را به Data Command هايي را كه اشياء فه كرديم، فرماناال اضااكنون در پايين كدي كه درDataAdapterمي نسبت داده :كنيم اند، اضافه

daSuppliers.SelectCommand = cmdSelectSuppliers; daSuppliers.InsertCommand = cmdInsertSuppliers; daSuppliers.UpdateCommand = cmdUpdateSuppliers; daSuppliers.DeleteCommand = cmdDeleteSuppliers;

:حال، بايد سازنده به اين صورت باشد

public DataAdapters() {

InitializeComponent(); //Insert exercise code here: cmdSelectSuppliers = new SqlCommand(); cmdInsertSuppliers = new SqlCommand(); cmdUpdateSuppliers = new SqlCommand(); cmdDeleteSuppliers = new SqlCommand();

129 هاDataAdapter كاربرد/ فصل چهارم

daSuppliers = new SqlDataAdapter(); daSuppliers.SelectCommand = cmdSelectSuppliers; daSuppliers.InsertCommand = cmdInsertSuppliers; daSuppliers.UpdateCommand = cmdUpdateSuppliers; daSuppliers.DeleteCommand = cmdDeleteSuppliers;

//This call supports the exercise: CreateScaffolding(); }

نمايش نتايج پيش

در زمان طراحي هستيد، بد نيست نگاه سريعي به پيكربندي DataAdapterهنگامي كه مشغول ايجادو آساني براي بررسي پيكربندي. حاصله بيندازيد در سطح DataAdapterويژوال استوديو روش سريع

ويژوال استوديو، دسترسي DataAdapter Preview .Form Designerقاب گفتگوي: گذارد فرم در اختيار ميبه(Smart Tag را، از طريق DataAdapter Previewبه قاب گفتگوي كه پس از انتخاب كنترل در سيني اجزامي امكان) آيد نمايش درمي .سازد پذير

DataAdapterنمايش نتايج پيش

. فشار دهيدF7، روي كليد Form Designerبراي نمايش.1. را انتخاب كنيدdaCategoriesدر سيني اجزا،.2و باالي كنترل قرارة، روي پيكان كوچكي كه در گوشsmart tagبراي نمايش منوي.3 سمت راست

.دارد، كليك كنيد

. كليك كنيدPreview Dataروي.4.گذارد را به نمايش ميPreview Dataويژوال استوديو، قاب گفتگوي

. كليك كنيد Previewروي.5.گذارد را به نمايش ميDataAdapterهاي بازيابي شده از سوي، دادهويژوال استوديو

Microsoft ADO.NET 2.0 130گام به گام با

. را ببنديدPreview Dataقاب گفتگوي.6

DataAdapterپيكربندي

property هاي عرضه شده از سويDataAdapter بيشتر. اند نشان داده شده4-1، در جدولproperty هايدري به داده، چگونگي رسيدگDataAdapterعرضه شده از سوي را كنترل DataSetهاي روزآمد شده

آن. كنند مي آنبهها در اين جا، صرفاً ذكر و تا چند فصل آينده به ها منظور كامل بودن جدول است،.نخواهيم پرداخت

DataAdapterهاي 4property-1جدول

Property شرح

AcceptChangesDuringFillكه مشخص مي به،AcceptChangesكند پس از اضافه شدنDataTable به ،DataRowشود يا خير فراخوانده مي.

AcceptChangesDuringUpdateكند مشخص ميAcceptChanges پس از روزآمد شدن، به ،DataRowشود يا خير فراخوانده مي.

ContinueUpdateOnErrorكند مشخص ميDataAdapter پس از برخورد با يك خطا در ،ع يامي) exception(مليات روزآمد شدن، اعالم خطا جريان كند

.خير

DeleteCommandData Commandها ها درمنبع داده حذف رديف مورد استفاده براي.

FillLoadOptionدر كند، چگونه اطالعات راجع به روايت نرم مشخص مي افزارDataSetگيرد مورد رسيدگي قرار مي.

131 هاDataAdapter كاربرد/ فصل چهارم

Property شرح

InserCommandData Commandها ها در منبع داده مورداستفاده جهت درج رديف.

MissingMappingActionيا اقدام الزم را، پس از آن كه داده هاي وارده را نتوان با جدول.كند ستون موجود مطابقت داد، مشخص مي

MissingSchemaActionهاي وارده با طرح اقدام الزم را، هنگامي كه داده)schema (DataSet كند موجود مطابقت ندارد، مشخصمي.

SelectCommandData Commandها از منبع مورد استفاده براي بازيابي رديف.ها داده

TableMappingsء اشياةمجموعDataTableMappingsهاي، كه مناسبات بين ستونDataSetكنند ها را مشخصميو منبع داده.

UpdateBatchSizeپشتيباني ازbatch processingو تعداد فراميني را كه مي در، توان. سازد اجرا نمود، مشخص ميbatchيك

UpdateCommandData Commandدر مورد استفاده براي روزآمد كردن رديف ها.ها منبع داده

به10در فصل ،AcceptChangeخواهيم پرداخت .

Property هاي AcceptChangesDuringFill وAcceptChangesDuringUpdateكنند متد، مشخص مي AcceptChanges توسط ،DataAdapter براي هر رديفي از ،DataSetروزآمد كه به ترتيب افزوده يا

. استTrueگزيده مقدار پيش. شوند، فراخوانده شود مي

به7در فصل ،DataRow و در فصل به10ها، ،RowError propertyخواهيم پرداخت .

ContinueUpdateOnError propery رفتار ،DataAdapter را، در صورت مواجه شدن با خطا به هنگام كند اعالم خطا ميDataAdapter تنظيم شده باشد، True روي propertyاگر. كند روزآمد شدن، مشخص مي

)exceptionمي) فرستد مي شده باشد، از روزآمد تنظيم Falseاگر روي. سازدو روزآمد شدن را متوقفدر صرفDataRowنمودن و پردازش از رديف بعد RowErrer propertyنظر كرده، خطا را قرار داده،.يابد ادامه ميو DeleteCommand ،InserCommand ،SelectCommand- فرمان propertyچهار ،UpdateCommand-

مي را در يك بستهData Commandءاشيا .دهند قرار

Microsoft ADO.NET 2.0 132گام به گام با

FillLoadOptionافزار در جريان روزآمدسازي كند كه چگونه اطالعات راجع به روايت نرم مشخص ميگزيده، مقدار پيش. اند نشان داده شده4-2مقادير احتمالي در جدول. گيرد مورد رسيدگي قرار مي

OverwriteChangeاست . enumeration(LoadOption( برشماري4-2جدول

شرح مقدار

OverwriteChanges و روايت هاي مقدار مقادير وارده براي اين رديف، در مقدار جاريمي اصلي داده .شوند ها براي هر ستون نوشته

PreserveChange هر مقادير وارده براي اين رديف، در روايت مقدار اصلي داده هاي شوند ستون نوشته مي

Upsert ها براي هر ستون جاري داده اين رديف، در روايت مقدارةمقادير واردو مقادير اصلي حفظ مي .شوند نوشته،

MissingMappingAction propertyكند، اگر مشخص ميSelectCommandدر ستون ها يا جداولي را، كهDataSetنشان4-3مقادير احتمالي، در جدول. دهد، واكنش سيستم چگونه باشد شوند، بازپس يافت نمي . استPassthroughگزيده مقدار پيش. اند داده شده

enumeration(MissingMappingAction( برشماري4-3جدول

شرح مقدار

Error يكSystemExceptionكند صادر مي.

Ignore در .انگارد وجود ندارد، ناديده ميDataSetستون يا جدولي را كه

Passthroughبه از نام آن در مبنع دادهنياز، با استفاد ستون يا جدول مورد ها،DataSetشود اضافه مي.

در مشخص ميMissingSchemaAction propertyطور، همين نداشته،وجود DataSetكند، اگر ستونيبه. پاسخ سيستم چه باشد كه ارجاع خواهد شد،MissingSchemaAction propertyتنها زماني

MissingMappingAction propertyآن، يعنيةگزيد وي مقدار پيشر Passthroughمقادير.، تنظيم شده باشد. استAddةگزيد پيش. اند نشان داده شده4-4 در جدول MissingSchemaActionاحتمالي

MissingSchemaAction برشماري4-4جدول

شرح مقدار

Add به ستون .كند اضافه ميDataSetهاي الزم را

AddWithKey و قيودها ستون .كند را اضافه ميconstraints (PrimaryKey(و جداول الزم،

133 هاDataAdapter كاربرد/ فصل چهارم

شرح مقدار

Error خطايSystemExceptionكند اعالم مي.

Ignore مي ستون .گيرد هاي اضافي را ناديده

TableMappings property به ها درمنبع داده وستونها جدول،كندميمقرر هاو ستونهاجدولصورتهااز،در ادامه.نديآ درDataSetدر . آشنا خواهيم شدTableMappings در همين فصل، با جزئيات بيشتري

به propertyرفتار دقيق اين. كند را كنترل ميbatch پردازش UpdateBatchSize propertyباالخره،در دادهةبينند تداركةوسيل و جزئيات آن . آمده استMSDN Helpها مشخص شده،

مي ويژوال استوديو كار ميForm Designerهنگامي كه در توانيد ويزارد كنيد، هر وقت كه بخواهيد Propertiesة را در پنجرproperty راه اندازيد، يا اين يا آن smart tag را از منوي DataAdapterپيكربندي .تنظيم كنيد

ر DataAdapterهاي propertyتوانيد همچنين، مي و به كمك تكنيكها هايي كه در مورد ا، با نوشتن كد. كافي است مقدار جديدي را به آن نسبت دهيد.گيريد، تنظيم نماييد ديگري به كار ميpropertyهر

DataAdapterفرامين

ها است، كه هر يك از آنCommand حاوي ارجاعاتي به چهار شيء DataAdapterطور كه ديديم، هر همان.، كه قرار است به اجرا درآيندSQLهاي واقعي است، شامل گزارهCommandText propertyداراي يك

وجود آوريد، ويژوال استوديو سعي بهDataAdapter ،DataAdapterاگر با استفاده از ويزارد پيكربنديمي. به وجود آوردCommand را براي هر CommandText propertyخواهد كرد خود ةتوانيد گزار همچنين،

SQLة را در پنجرProperties تنظيم كنيد، هر چند كه الزم است نخست Command با يك شيء Connection

( همراه شود هاي مستقل، نيز، وضع بدين منوال Data Commandشايد خاطرتان هست، كه در مورد..)بود

Connectionر موارد، از يك بيشتدر. همراه است Connection با يك DataAdapter Commandهر:توصيهمي Commandةواحد براي هم مي. كنيم، ولي اين الزامي نيست ها استفاده هر در صورت لزوم، توان

Command را با Connection منحصر به خود همراه نمود .

مشخص كنيم، ولي در صورت SelectCommand را براي شيء CommandText propertyالزم استها نيز Data Commandةتواند، در حين پيشرفت كار، براي بقي مايكروسافت مي NET Framework.لزوم

CommandTextايجاد كند . جهت ايجاد CommandBuilder، از شيء Commandاز لحاظ داخلي، ويژوال استوديو براي هر

وجود بهCommandBuilderاي از شيء تازهةوان، با نوشتن كد، نمونتمي. كند استفاده ميSQLهاي گزارهو در صورت لزوم از آن براي ايجاد هاي ها استفاده نمود، ولي بايد از محدوديت Commandآورد،

CommandBuilderبراي مثال،. نيز آگاه بودCommandBuilderشده داراي هاي ذخيره تواند با روال نمي

Microsoft ADO.NET 2.0 134گام به گام با

اي موارد بسيار نادر سودمند است، ولي معموالً در پارهCommandBuilderگرچه، تكنيك.دپارامتر كار كن CommandTextها نياز داريد، بهتر است كنترل به دادهread-onlyاگر به چيزي بيشتر از دسترسي

propertyاشياء Commandًدر دست خود گيريد را مستقيما .

در ويژوال DataAdapter از يك CommandText propertyتنظيم

استوديو

و سپس درپنجرForm Designer ،daProducts DataAdapterدر.1 Properties ،SelectCommandة راانتخاب،

propertyرا باز كنيد .2.Connection property را انتخاب، روي پيكان رو به پايين كليك، گره Existing و در فهرست را باز،

.ك كنيد كليcnAdoSbsسپس بر روي

3.CommandText propertyو سپس روي دكم .ة را انتخاب، . .كليك كنيد..گذارد را به نمايش ميAdd Table را باز كرده، قاب گفتگوي Query Builderويژوال استوديو

و سپس بر روي Add را انتخاب، برروي Productsجدول.4 ،Closeكليك كنيد ..كند اضافه ميQuery Builder را باز كرده، جدول را به Add Tableي ويژوال استوديو، قاب گفتگو

*با انتخاب قاب كنترل.5 (All Columns) در Grid Paneها را به جدول اضافه كنيد، تمام ستون.

135 هاDataAdapter كاربرد/ فصل چهارم

. كليك كنيدOKروي.6مي را بهCommandText propertyويژوال استوديو، .آورد وجود

: در زمان اجراDataAdapter از يك CommandText propertyتنظيم

ويژوال بيسيك

.فشار دهيد F7براي به نمايش درآوردن ويرايشگر كد، روي.1:، اضافه كنيد()CreateScaffolding، پيش از Newسطور زير را به روال.2

cmdSelectSuppliers.CommandText = "SELECT * FROM Suppliers" cmdSelectSuppliers.Connection = cnAdoSbs

: به اين صورت باشدNewحال، بايد روال

Public Sub New()

' This call is required by the Windows Form Designer. InitializeComponent()

' Add exercise code here: daSuppliers.SelectCommand = cmdSelectSuppliers daSuppliers.InsertCommand = cmdInsertSuppliers daSuppliers.UpdateCommand = cmdUpdateSuppliers

Microsoft ADO.NET 2.0 136گام به گام با

daSuppliers.DeleteCommand = cmdDeleteSuppliers cmdSelectSuppliers.CommandText = "SELECT * FROM Suppliers" cmdSelectSuppliers.Connection = cnAdoSbs

' This call supports the exercise: CreateScaffolding() End Sub

: در زمان اجراDataAdapter از يك CommandText propertyتنظيم

شارپ ويژوال سي

.فشار دهيد F7براي به نمايش درآوردن ويرايشگر كد، روي.1:، اضافه كنيد()CreateScaffolding، پيش از Newسطور زير را به روال.2

cmdSelectSuppliers.CommandText = "SELECT * FROM Suppliers"; cmdSelectSuppliers.Connection = cnAdoSbs;

:به اين صورت باشد) constructor(حال بايد سازنده

public DataAdapters() {

InitializeComponent();

//Insert exercise code here: cmdSelectSuppliers = new SqlCommand(); cmdInsertSuppliers = new SqlCommand(); cmdUpdateSuppliers = new SqlCommand(); cmdDeleteSuppliers = new SqlCommand(); daSuppliers = new SqlDataAdapter(); daSuppliers.SelectCommand = cmdSelectSuppliers; daSuppliers.InsertCommand = cmdInsertSuppliers; daSuppliers.UpdateCommand = cmdUpdateSuppliers; daSuppliers.DeleteCommand = cmdDeleteSuppliers; cmdSelectSuppliers.CommandText = "SELECT * FROM Suppliers";

137 هاDataAdapter كاربرد/ فصل چهارم

cmdSelectSuppliers.Connection = cnAdoSbs;

//This call supports the exercise: CreateScaffolding();

}

DataTableMappingCollection DataSet خو منشاء دادهازهيچ اطالعي ودهاي سر نمي Connection ندارد، كه داده داند كه چه بر هايي

وDataAdapterنقش اصلي. كند، خواهد آمد بازيابي مي اين كار را به كمك حفظ پيوند بين اين دو است،DataTableMappingCollectionدهد انجام مي .

در باالترين سطح،. است، در تصوير زير، نشان داده شدهDataTableMappingCollectionساختارDataTableMappingCollection حاوي يكي يا چند شيء ،DataTableMappingطور معمول،به.، قرار دارد

ها تنها يك مجموعه ركورد DataAdapterشتر وجود دارد، چرا كه بيDataTableMappingتنها يك شيء يك. دهند بازپس مي از چندين مجموعه ركورد را مديريت كند، براي هر كدام DataAdapterليكن، اگر

. وجود خواهد داشتDataTableMappingها يك شيء آنهر.DataColumnMappingاي است، شامل يك يا چند شيء خود مجموعهDataTableMappingشيء

ستون در case-insensitive، كه نام DataSetColumn: استproperty داراي دو DataColumnMappingشيءDataSet و هر. هاي اصلي است ستون در منبع دادهcase-sensitive، كه نام SourceColumn است، براي

. وجود داردDataColumnMappingشود، يك شيء اداره ميDataAdapterستون، كه از سوي .NET Frameworkيك صورت پيش، به كند، كه نام ايجاد ميDataTableMappingCollectionگزيده،

DataSetColumn هر ستون در DataSet براساس نام SourceColumnليكن، مواقعي نيز. تنظيم شده استبخواهيد براي راحتي كار براي مثال، ممكن است. وجود دارند، كه چنين ترتيبي دلخواه شما نيست

هاي مواقعي كه فضاهاي خالي در اسامي ستونمثالً(را تغيير دهيد ) mapping(ها نويسي نگاشت برنامهآن كنيد، كه اسامي ستون از پيش موجودي كار ميDataSet، يا بر روي)ها وجود دارند منبع داده با هاي

مي هاي منبع داده اسامي ستون .كنند ها فرق

Table Mappings بااستفاده ازقاب گفتگوي DataSetرنام ستون تغيي. فشار دهيدF7، روي كليد Form Designerةبراي مشاهد.1. را انتخاب كنيدdaCategories DataAdapterدر سيني اجزا،.2. را انتخاب كنيدProperties ،TableMappings propertyةدر پنجر.3

Microsoft ADO.NET 2.0 138گام به گام با

. روي دكمه.4 . .كليك كنيد..گذارد را به نمايش ميTableMappingsال استوديو، قاب گفتگوي ويژو

. را انتخاب كنيدUse A DataSet To Suggest Table And Column Namesقاب كنترل.5و ويژوال استوديو، اسامي ستون .دهد را به هم ربط ميDataSetهاي جدول منبع

139 هاDataAdapter كاربرد/ فصل چهارم

. كليك كنيدOKبراي بسته شدن قاب گفتگو روي

DataAdapter متدهاي كاربرد

DataAdapterكند از دو متد مهم پشتيباني مي :Fillبه ها را از منبع داده، كه داده بارگذاري DataSetهاو مي از، كه دادهUpdateكند؛ مي به منبع دادهDataSetها را در جهت مقابل، در اين رشته. كند ها، منتقل

. پرداختها، به هر دو متد خواهيم تمرين

Fillمتددر، دادهFillمتد مربوط به SelectCommand موجود در CommandTextها را، با استفاده از فرماني كه

DataAdapterيك مشخص شده، از منبع داده . كند بارگذاري ميDataSetها به يك يا چند جدول متعلق بهها از آن به ارث رسيده، از چندين دادهةبينند هاي خاص تداركDataAdapter، كه DbDataAdapterشيء

.اند ذكر شده4-5 كاربرد را دارند، در جدولينمتدهايي كه بيشتر. كند پشتيباني ميFillشكل متد

مي ها، از روايت دادهةبينند مختص تداركDataAdapterچندين:توصيه . كنند هاي ديگري نيز پشتيباني. ببينيدMSDN Helpجزئيات را در

Microsoft ADO.NET 2.0 140گام به گام با

DbDataAdapter در Fill متدهاي4-5دولج

شرح متد

Fill(dataSet) يكDataTable به نام Tableبا ايجاد كرده، رديف هايش رامي چه از منبع دادهآن .كند ها بازپس داده شده، پر

Fill(dataTable) DataTableها هايي كه از منبع داده شده را، با رديف مشخص.كندميبازپس گرفته شده، پر

Fill(dataSet, tableName) DataTableة نام برده شده در رشتTableName از ،DataSet ها بازپس گرفته هايي كه از منبع داده مشخص، را با رديف

.كند شده، پر مي

Fill(dataTable, dataReader) DataTable مشخص را، با استفاده از DataReader مشخص، پر .كند مي

Fill(dataTable, cammand,

commandBehavior) DataTableة مشخص را، با استفاده از رشتSQL وارد شده در

و .كند مشخص، پر ميCommandBehaviorپارامتر فرمان

Fill(dataTable, startRecord,

maxRecords, tableName) DataTableةشده در رشت مشخصTableName در DataSet

و ادامه تا StartRecord مشخص را، با شروع از بامبناي صفرmaxRecordsمية يا تا پايان مجموع .كند نتيجه، پر

Fill(dataTable, tableName,

dataReader, startRecord,

maxRecords)

DataTableةشده در رشت مشخصTableName در DataSet و ادامه تا StartRecordمشخص را، با شروع از بامبناي صفر

maxRecordsازة يا تا پايان مجموع نتيجه، با استفادهDataReaderكند مشخص، پر مي.

Fill(dataSet, startRecord,

maxRecords, tableName,

command, commandBehavior)

DataTableةشده در رشت مشخصTableName در DataSet و ادامه تا StartRecordمشخص را، با شروع از بامبناي صفر

maxRecordsنتيجه، با استفاده از متنة يا تا پايان مجموع SQL مشخص، CommandBehaviorو Commandموجود در پارامتر

.كند پر مي

DataSet به ويژوال بيسيك: را پر كنيدDataAdapter متعلق

. فشار دهيدF7براي به نمايش درآوردن ويرايشگر كد، روي كليد.1: اضافه كنيدbtnFill_Click event handlerسطور زير را به انتهاي.2

141 هاDataAdapter كاربرد/ فصل چهارم

daCategories.Fill(dsAdoSbs.Categories) daProducts.Fill(dsAdoSbs.Products) daSuppliers.Fill(dsAdoSbs.Suppliers)

: بايد به اين صورت باشدevent handlerحال، بايد

Private Sub btnFill_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnFill.Click 'The following lines clear the dataset dsAdoSbs.Categories.Clear() dsAdoSbs.Products.Clear() dsAdoSbs.Suppliers.Clear()

'Add exercise code here: daCategories.Fill(dsAdoSbs.Categories) daProducts.Fill(dsAdoSbs.Products) daSuppliers.Fill(dsAdoSbs.Suppliers) End Sub

. كليك كنيدFill فشار داده، سپس روي F5 كاربردي، روي كليدةبراي اجراي برنام.3

Microsoft ADO.NET 2.0 142گام به گام با

و سپس برنام ها به درستي پر شده data gridكنيد دقت.4 . كاربردي را ببنديدةاند يا خير،

DataSet به سي: را پر كنيدDataAdapter متعلق شارپ ويژوال

. فشار دهيدF7براي به نمايش درآوردن ويرايشگر كد، روي كليد.1: اضافه كنيدbtnFill_Click event handlerسطور زير را به انتهاي.2

daCategories.Fill(dsAdoSbs.Categories); daProducts.Fill(dsAdoSbs.Products); daSuppliers.Fill(dsAdoSbs.Suppliers);

: به اين صورت باشدevent handlerحال، بايد

void btnFill_Click(object sender, EventArgs e) {

//The following lines clear the dataset dsAdoSbs.Categories.Clear(); dsAdoSbs.Products.Clear(); dsAdoSbs.Suppliers.Clear();

//Add exercise code here: daCategories.Fill(dsAdoSbs.Categories); daProducts.Fill(dsAdoSbs.Products); daSuppliers.Fill(dsAdoSbs.Suppliers); }

. كليك كنيدFill فشار داده، سپس روي F5 كاربردي، روي كليدةبراي اجراي برنام.3

143 هاDataAdapter كاربرد/ فصل چهارم

و سپس برنام پر شدهها به درستي data gridكنيد دقت.4 . كاربردي را ببنديدةاند يا خير،

Updateمتد

در خود نگاه) هايي كه در آن وجود دارند از منشا داده( هيچ اطالعاتي را DataSetبه خاطر آوريد كهو چون نمي در از معماري غيرمتصل استفاده ميADO.NETدارد؛ كند، خود به خود تغييراتي را كه

مي بهDataSetهاي رديف براي اين كار، بايد از متد. گرداند ها بازپس نمي آوريد، به منبع داده وجودUpdate در DataAdapterمتد. استفاده كنيدUpdate براي هر رديفي كه در ،DataSet ،دچار تغيير شده

InsertCommand ،DeleteCommand يا ،UpdateCommandخواند را، بسته به مناسبت، فرامي.هاي DataAdapter. اند ذكر شده4-6 چندين روايت مختلف وجود دارد، كه در جدول Updateبراي متد

مي ها از تمام اين روايت دادهةبينند عرضه شده از سوي هر تدارك و هيچ تدارك ها پشتيباني ةبينند كنند،در داده .د وجود ندارد كه روايت ديگري را عرضه كن NET Frameworkهايي

DataAdapter در Update متدهاي4-6جدول

شرح متد

Update(dataSet) هاي منبع دادهDataTableدر نام مشخص را DataSetبرده شده.سازد روزآمد مي

Upadate(dataRows) ازةها آراي منبع داده .سازد را روزآمد ميDataRows مشخصي

Update(dataTable) هاي منبع دادهDataTableسازد مشخصي را روزآمد مي.

Microsoft ADO.NET 2.0 144گام به گام با

شرح متد

Update(dataRows,

dataTableMapping) ازةها آراي منبع داده را، با استفاده از DataRows مشخصي

DataTableMappingسازد مشخص، روزآمد مي.

Update(dataSet, sourceTable) هاي منبع دادهDataTableةشده در رشت مشخصsourceTable در DataSetمي مشخ .سازدص را روزآمد

ويژوال بيسيك: روزآمدكنيدDataAdapterهايي را بااستفاده ازيك منبع داده

به.1 : اضافه كنيدbtnUpdate_Click event hadlerدر ويرايشگر كد، كد زير را

daCategories.Update(dsAdoSbs.Categories) daProducts.Update(dsAdoSbs.Products) daSuppliers.Update(dsAdoSbs.Suppliers)

.كند، روزآمد ميdsAdoSbs درDataTableهاي مربوطه را، باتغييرات ايجاد شده درهر اين كد، منبع داده . فشار دهيدF5 كاربردي، روي كليدةبراي اجراي برنام.2. كليك كنيدFillةروي دكم.3.كند ها را پر ميdata grid كاربرديةبرنام.4 Old Beverages بهBeverages، در نخستين رديف كليك كرده، مقدار آن را ازCategory Nameدرسلول.5

.تغيير دهيد

145 هاDataAdapter كاربرد/ فصل چهارم

. كليك كنيدUpdateروي.6مي كاربردي منبع دادهةبرنام.7 .سازد ها را روزآمد. كليك كنيدFillها منتقل شده، روي براي آن كه اطمينان حاصل كنيد، تغييرات به منبع داده.8. را ببنديد كاربرديةبرنام.9

يك منبع داده : روزآمد كنيدDataAdapterهايي را با استفاده از

شارپسيويژوال

به.1 : اضافه كنيدbtnUpdate_Click event hadlerدر ويرايشگر كد، كد زير را

daCategories.Update(dsAdoSbs.Categories); daProducts.Update(dsAdoSbs.Products); daSuppliers.Update(dsAdoSbs.Suppliers); }

هر اين كد، منبع داده .كند، روزآمد ميdsAdoSbs در DataTableهاي مربوطه را، با تغييرات ايجاد شده در. فشار دهيدF5 كاربردي، روي كليدةبراي اجراي برنام.2. كليك كنيدFillةروي دكم.3.كند ها را پر ميdata grid كاربردي برنامة.4 Old به Beverages، در نخستين رديف كليك كرده، مقدار آن را از Category Nameدر سلول.5

Beveragesتغيير دهيد .

Microsoft ADO.NET 2.0 146گام به گام با

. كليك كنيدUpdateروي.6مي كاربردي منبع دادهةبرنام.7 .سازد ها را روزآمد. كليك كنيدFillها منتقل شده، روي براي آن اطمينان حاصل كنيد، تغييرات به منبع داده.8. را ببنديد كاربرديةبرنام.9

DataAdapterپاسخ به رويدادهاي

ميةعالوه بر رويدادهايي كه در نتيج دو رويداد ديگر را نيز عرضه DataAdapterآيند، ارتكاب خطا پيش روزآمد شود، عمالDataSetً، پيش از آن كه RowUpdatingرويداد . RowUpdatedو RowUpdating: كند مي

آن روي مي و امكان كنترل ظريف جزئيات فرآيند RowUpdatedداد كه، رويدهد؛ حال پس از آن روي داده،مي را به برنامه .دهد نويس

RowUpdatingرويداد

Update، پس از تنظيم مقادير پارامتري فرماني كه قرار است اجرا شود، توسط متد RowUpdatingرويدادآن( مي) ولي پيش از اجراي .شود شروع

event handler اين رويداد يك argumentكه دريافت مي ةهاي آن اطالعات الزم را، دربارpropertyكند،ها است، ولي دادهةبينند مختص تداركargumentاين. گذارند فرماني كه در شرف اجراست، در اختيار مي

بيشترين كاربرد را هايي كه property. كنند ها را عرضه ميpropertyها همين دادههاي بيننده تمام تدارك.اند ذكر شده4-7دارند، در جدول

RowUpdatedو RowUpdating در argumentهاي 4property-7جدول

Property شرح

Command ارجاع بهData Commandكه قرار است اجرا شود ،.

Row ارجاع بهDataReader كه درحال روزآمد شدن است ،.

StatementType ةنوع گزارSQLكه قرار است اجرا شود ،.

TableMapping DataTableMappingاستفاده براي روزآمد كردن مورد.

Command property در ،argument رويداد، حاوي ارجاعي به Data Command واقعي است، كه براي مي روزآمد كردن منبع داده م. گيرد ها مورد استفاده قرار توانيدميثالًبا استفاده از اين ارجاع،

CommandText propertyة فرمان را مورد بررسي قرار دهيد، تا مشخص شود گزارSQL اجرا خواهد شد ).و در صورت لزوم آن را تغيير دهيد(يا خير

147 هاDataAdapter كاربرد/ فصل چهارم

StatementType propertyاين. كند، اقدامي را كه قرار است صورت گيرد، مشخص ميproperty نوعي و Select ،Insert ،Updateشامل اعضاي ) enumeration(برشماري ،Deleteاست .StatementTypeصورت بهread-onlyتوان از آن براي تغيير نوع اقدامي كه قرار است صورت گيرد، استفاده نمود است، لذا نمي.

Row property حاوي ارجاعي read-only به DataReader منتقلها است، كه قرار است به منبع داده است، كه براي روزآمد DataTableMapping حاوي ارجاعي به TableMappings propertyكه، شود؛ در حالي

.گيرد كردن مورد استفاده قرار مي

ويژوال بيسيك : RowUpdatingپاسخ به رويداد

ا، در فهرست رويدادهRowUpdatingوء در فهرست اشياdaCategoriesدر ويرايشگر كد، با انتخاب.1 اضافه DataAdapter متعلق به daCategories مربوط به RowUpdating به رويداد event handlerيك.كنيد

به.2 : اضافه كنيدdaCategories_RowUpdating event handlerكد زير را

txtMessages.Text &= vbCrLf & "Beginning Update..." txtMessages.Text &= vbCrLf & "Executing a command of type " & _ e.StatementType.ToString()

و سپس براي پر كردن F5 كاربردي روي كليدةبراي اجراي برنام.3 Fillها روي data grid فشار داده،.كليك كنيد

4.Category Name براي CategoryID 1به راBeverage دبرگرداني.را.5 .، تغيير داده بوديمOld Beveragesبه به خاطر آوريد كه در تمرين گذشته، اين نام. كليك كنيدUpdateروي.6

و متن داخل قاب متن در پايين پنجر كاربردي، منبع دادهةبرنام .كند را روزآمد ميDataAdaptersةها

Microsoft ADO.NET 2.0 148گام به گام با

. كاربردي را ببنديدةبرنام.7

سي: RowUpdatingپاسخ به رويداد شارپ ويژوال

در.1 .آوريدفرم را در نماي طراحي به نمايش. را انتخاب كنيدdaCategories DataAdapterدر سيني اجزا،.2. كليك كنيدEventsة، روي دكمPropertiesةدر پنجر.3

149 هاDataAdapter كاربرد/ فصل چهارم

4.RowUpdating property را انتخاب نموده، برروي كليد Enterفشار دهيد .دdaCategories_RowUpdating event handlerويژوال استوديو،.5 ر ويرايشگر را اضافه نموده، آن را

.آورد كد به نمايش در ميبه.6 : اضافه كنيدdaCategories_RowUpdating event handlerكد زير را

txtMessages.Text += "\r\nBeginning Update..."; txtMessages.Text += "\r\nExecuting a command of type " & _

e.StatementType.ToString();

و سپس براي پر كردن F5اربردي روي كليدكةبراي اجراي برنام.7 ها روي data grid فشار داده،Fillكليك كنيد .

8.Category Name را براي CategoryID 1 به Beveragesبازگردانيد .به.9 . تغيير داده بوديمOld Beveragesبه خاطر آوريد كه در تمرين گذشته، اين نام را

. كليك كنيدUpdateروي. 10مي كاربردي منبع دادهةبرنام. 11 و متن موجود در قاب پيام را روزآمد .كند ها

. كاربردي را ببنديدةبرنام. 12

Microsoft ADO.NET 2.0 150گام به گام با

RowUpdatedرويداد

ها اجرا فرمان مناسب را در برابر منبع داده Updateشود، كه متد پس از آن آغاز ميRowUpdatedرويداديك اين رويداevent handler. كند مي مي دادهةبينند تداركargumentد، در گيرد، كه داراي همان ها قرار

property هاي رويدادRowUpdating است نشان داده شده4-7كه در جدول( است .(argument رويداد RowUpdated داراي ،property ديگري، به نام RecordsEffected نيز هست، كه داراي يك مقدار ،read-only

و تغيير يافته، درج شده يا حذف SQL فرمان به اجرا درآمدهةهايي را كه به وسيل تعداد رديفاستمي گرديده .دهد اند، نشان

خالصه

بر عهده دارد، آشنا DataSetو Connection، كه نقش واسطه را بين DataAdapterدر اين فصل، با شيءكه به كنترل چگونگي انتخاب، درج، روزآمد- راData Command، يك يا چند شيء DataAdapter. شديم

مي شدن يا حذف داده مي-پردازند ها .كند يك جا جمع

پنجمفصل

ADO.NET در Transactionپردازش:در پايان اين فصل، خواهيد توانست

�Transactionايجاد كنيد .�Nested Transactionايجاد كنيد .. شويدTransactionمتعهد به��Transactionرا بازگردانيد .

در فرآيند،ADO.NETهاي دادهةبينند تداركءگذشته، با چگونگي تعامل بين اشيادر چند فصلو روزآمدسازي داده ، بررسي Transactionدر اين فصل، با كنكاشي در پردازش. آشنا شديم،ها ويرايش

.كنيم تكميل ميADO.NETهاي هاي داده بيننده خود را از تدارك

ها Transactionدرك

و ستد آن) transaction( داد صورت يك واحد مجزايهبها عبارت است از يك رشته اقدامات كه بايد باهم- نگريستيكار ميآنة يا و يا به شكست ها به موفقيت ، انتقال transactionمثال كالسيك. انجامند

دالر، اين مبلغ از يك 100 براي انتقال مقداري وجه، مثالً. وجه از يك حساب بانكي به حساب ديگر استو به حساب ديگر گذاشته مي تواگ. شود حساب برداشته درأر برداشت وجه با موفقيت م باشد، ولي

يك. گذاشتن آن به حساب ديگر موفق نشويم، پول در فضاي مجازي گم خواهد شد اگر برداشت وجه ازحساب ناموفق ولي گذاشتن آن به حساب ديگر با موفقيت همراه باشد، مثل اين است كه پولي جعل شده

آنروشن است، كه شكست در هر يك از اين. باشد ها دو اقدام، به معناي شكست در انجام هردوي.ستا

ADO.NETو ستدها را با استفاده از نمون طور همان. دهد انجام ميTransaction شيءة اين گونه دادمي BeginTransaction،Connection با استفاده از متد،هاTransactionكه خواهيم ديد، . كنند ايجاد

آ Connectionوها Transactionسرنوشت ؛ هر چندستا خوردهبه يكديگر گره ها،آن توسطهمد به وجودكه. توان آن را تغيير داد نمي، وليوجود دارد Connection propertyكه يك بخشي از Commandبراي آن

و ستد باشد و ستد قرار گيرد] enrolled[“ در فهرست”(داد متعلق property Transaction، الزم است)داد. تنظيم شودTransactionروي شيءبرآن به

مي الوقوع است، تنها فراميني را كه در فهرست آن آمده قريبTransactionزماني كه انجام:تذكر توان اند،هر. اجرا نمود .را باال خواهد برد خطا پرچم فرمان ديگريو انجام

Microsoft ADO.NET 2.0 152گام به گام با

داأمت و ستد سفانه، فرامين خود به خود در فهرست ، Transaction الزم است براي ارجاع به آيند؛ نميدproperty Transaction به متعلقData Commandًو پس از آن كه متعهد به اما،. تنظيم شود صريحا دادبه)تغييرات را به دور انداختيم(يا آن را بازگردانيم) تغييرات ذخيره شدند( شديم ستدي ، ارجاع

Transaction در هر Data Command بار ديگر روي ارجاع nullاز تنظيم مي و الزم نيست اين بخش شود،.صورت دستي انجام دهيمكار را به

هاTransactionكاربرد

و روايت ها به اجرا درمي دادهةبينند صورت بخشي از تدارك بهTransactionشيء هر آيد، هايي از آن درData Provider namespaceو در، .، وجود دارندSystem.Data.Common namespace نيز

و منبع داده NET Framework. واسطي است بين كد Transactionشيء هاي مايكروسافتاز. نويس برنامهةمورداستفاد BEGINهاي ها براي اجراي گزارهData Command گرچه، استفاده

TRANSACTION SQL تواندمياقداميپذير است، ولي چنين امكان) از لحاظ نظريالاقل(ها منبع دادهدرو ستدهاي برنام نيزبا خطراتي و موتور بانكة همراه باشد، چه داد مي كاربردي به اطالعاتي توانند

.آساني از هماهنگي خارج شوندو ستد، پس از آن كه ايجاد شد، در سه مرحله صورت مي به مقاديري ت، نخس. گيرد استفاده از داد

بهسپس، فرامين.دنشو فراميني كه در آن مشاركت دارند، نسبت داده مي مي اجرا مذكور و. آيند درو ستد با تعهد بدان يا بازگرداندن آن خاتمه مي .يابد باالخره، داد

هاTransaction ايجاد

Transactionها با فراخواندن متدBeginTransaction به ، كه ارجاعي به شيء جديد Connectionشيء متعلقTransactionدهد بازپس مي)returns(مي معنا كه، است؛ بدينBeginTransaction ،overload. شوند، ايجادكه. به دلخواه مشخص شودIsolationLevel)5-1مطابق جدول(دهد اجازه مي BeginTransactionهنگامي

و باز باشدمعتب بايد Connectionشود، فراخوانده مي .ر Connection از BeginTransaction متدهاي5-1جدول

شرح متد

BeginTransaction() و ستدي مي داد .كند را آغاز

BeginTransaction(isolationLevel)در دادوستدي .كند مشخص، آغاز ميIsolationLevel را،

ميبرده نام ازدادوستدهاي SQL Server 2005جاكه ازآن SqlClientهاي دادهةبينند كند،تدارك پشتيبانيميرا BeginTransactionدو روايت ديگر از .اند نشان داده شده5-2كند، كه در جدول نيز عرضه

ADO.NET 153 در Transactionپردازش/ فصل پنجم

SqlClient از BeginTransaction متدهاي ديگر5-2جدول

شرح متد

BeginTransaction(transactionName)و ستدي را، با نام transactoinName در رشته،مشخصداد.كند آغاز مي

BeginTransaction(isolationLevel,

transactionName) و نام مشخصIsolationLevelدادوستدي را، درسطح مشخص

.كند، آغاز ميtransactoinNameشده در رشته

به IsolationLevelپارامتر دلخواه قفل كردن امر در Connectionتار، رفBeginTransaction متد متعلقاگر پارامتر. اند نشان داده شده5-3 در جدول IsolationLevelمقادير احتمالي. سازد را مشخص مي

. استReadCommitedآنةگزيد مشخص نشده باشد، مقدار پيش enumeration(IsolationLevel( برشماري5-3جدول

شرح مقدار

Chaos و ستد در سطح باالتر،درالوقوع تغييرات قريبجايچيز ديگري، به داد.توان نوشت نمي

ReadCommitted مي كه داده حاليدر پيش از اماهاي مشتركي وجود دارند، شوند، قفل ها خواندهو ستد مي .ها را تغيير داد توان داده پايان گرفتن داد

ReadUncommitted ن هيچ قفل مشتركي صادر نمي و هيچ وع قفل انحصاري به رسميت شود،.شود شناخته نمي

RepeatableRead ميهاي مورد دادههمةانحصاري براي هاي قفل .گيرند استفاده دراستعالم قرار

Serializable يك رشته قفل بر رويDataSetگيرند قرار مي.

Unspecified توان مشخص كرد سطح كنوني جداسازي را نمي.

ا در زمان اجراه Transactionايجاد

Data Commandبهمتعلق BeginTransactionتوان با فراخواندن متد را تنها ميTransactionاز آنجا كه. با نوشتن كد آن را به وجود آوردالزم استايجاد نمود،

ويژوال بيسيك: جديدTransactionايجاد يك

و در صورت لزوم، براي را در ويژوال استوديو مايكروChapter 05 - Startةپروژ.1 سافت باز كرده،درةمشاهد . دوبار كليك كنيدSolution Explorer در Transactions.vb، روي Form Designer فرم

Microsoft ADO.NET 2.0 154گام به گام با

. فشار دهيدF7 ويرايشگر كد روي كليدةبراي مشاهد.2: اضافه كنيدbtnCreate_Clickسطور زير را به رويداد.3

Dim strMsg As String Dim trnNew As SqlTransaction cnAdoSbs.Open() trnNew = cnAdoSbs.BeginTransaction() strMsg = " Isolation Level: " strMsg &= trnNew.IsolationLevel.ToString() MessageBox.Show(strMsg) cnAdoSbs.Close()

و گزيد پيشة جديدي را با استفاده از سازندTransactionاين قطعه از كد، آن را IsolationLevelه ايجاد.دهد در يك قاب پيام نشان مي

بر كاربرديةبراي اجراي برنام.4 . فشار دهيدF5روي كليد،. كليك كنيدLoad Dataروي.5

ADO.NET 155 در Transactionپردازش/ فصل پنجم

و مقادير DataSet كاربرديةبرنام Ordersو Customersهاي فهرست را در قابDataRow را پر كرده،.گذارد به نمايش مي

. كليك كنيدCreateرويرب.6و ستد را در يك قاب پيام به نمايش ميIsolationLevel كاربردي،ةبرنام .گذارد داد

و سپس برنامOKروي.7 . كاربردي را ببنديدة در قاب پيام كليك كرده،

Microsoft ADO.NET 2.0 156گام به گام با

سي: جديدTransactionايجاد يك شارپ ويژوال

و در صورت لزوم، براي را در ويژوال استوديوChapter 05 - Startةپروژ.1 مايكروسافت باز كرده،درةمشاهد . دوبار كليك كنيدSolution Explorer در Transactions.cs، روي Form Designer فرم

كدةبراي مشاهد.2 بر ويرايشگر . فشار دهيدF7 روي كليد،: اضافه كنيدbtnCreate_Clickسطور زير را به رويداد.3

string strMsg; SqlTransaction trnNew; cnAdoSbs.Open(); trnNew = cnAdoSbs.BeginTransaction(); strMsg = " Isolation Level: " ; strMsg += trnNew.IsolationLevel.ToString(); MessageBox.Show(strMsg); cnAdoSbs.Close();

و پيشة جديدي را با استفاده از سازندTransactionاين قطعه از كد، آن را IsolationLevelگزيده ايجاد.دهد در يك قاب پيام نشان مي

ADO.NET 157 در Transactionپردازش/ فصل پنجم

. فشار دهيدF5 كاربردي روي كليدةبراي اجراي برنام.4. كليك كنيدLoad Dataروي.5

و مقادير DataSet كاربردي برنامه Ordersو Customersهاي فهرست را در قابDataRow را پر كرده،.گذارد به نمايش مي

. كليك كنيدCreateروي.6و ستد را در يك قاب پيام به نمايش ميIsolationLevel كاربردي،ةبرنام .گذارد داد

و سپس برنامOKروي.7 . كاربردي را ببنديدة در قاب پيام كليك كرده،

Microsoft ADO.NET 2.0 158گام به گام با

ي تودرتوها Nested Transactionايجاد

و ستد به يك فرمان امكان و OleDbTransactionر نيست، ولي شيء پذي اگرچه نسبت دادن دو داد از داد(كند ستدهاي تو در تو پشتيباني مي و هنگام پشتيباني نمي SQL Serverاين ويژگي از سوي. شود،

.) در دسترس نيستSqlTransactionاستفاده از

ADO و ستدهاي متعدد در يك ديگر از سوي بود،ADO، كه پيش از اين مورد پشتيباني واحد Connectionداد

ADO.NETشود پشتيباني نمي.

تو) syntax(نگارش و ستد تو در و ستد در سطوح،براي ايجاد داد شبيه نگارش براي ايجاد يك دادو ستد تو در تو با فراخواندن متد. باالست Transaction خود شيء Beginتفاوت در اين است، كه داد. Connection در BeginTransactionشود، نه متد ايجاد مي

و بازگرداندن هاTransactionمتعهد شدن به

Dataيك يا چند به متعلق Transaction property، قدم بعد نسبت دادن آن به Transactionپس از ايجاد شيء

Commandو سپس اجراي آن صورت NET Framework. انتسابةاين كار با استفاده از يك گزار. هاست،:دگير مي

:ويژوال بيسيك

myCommand.Transacation = myTransaction

:شارپسي

myComman.Transaction = myTransaction;

و ستد، به آخرين مرحله در پردازش داد تغييراتي است كه از سوي-يا بازگرداندن- عبارت از تعهدData Command و ستد صورت متعهد شود، تمام Transactionاگر. اند گرفتههاي شركت كننده در داد

مي تغييرات در منبع داده و Transactionاگر. شوند ها پذيرفته بازگشت داده شود، تمام تغييرات رد شده،مي منبع داده و ستد باز .گردد ها به وضعيت پيش از شروع داد

ADO ADO.NET برخالف ،ADO متدهاي ،Commit وRollback شيء را برايTransaction و نه شيء ،Commandكند، عرضه مي.

و با Commitها با استفاده از متد Transaction، آيد از نام متدها نيز برميطور كه همان متعهد شده،دو.شوند خود بازگشت داده ميRollbackاستفاده از متد .پذيرند نميي پارامتر متد، هيچ يك از اين

ADO.NET 159 در Transactionپردازش/ فصل پنجم

ك بهمعمول است دره فراميني را كه در داخل دادوستد Try…Catch…Finallyآيند، در ساختارمي اجرامي به آنTryةها موفق شدند، قطع Commandاگر. بگنجانند شود؛ ولي، اگر شكست بخورند، ها متعهد

مي آنCatchةقطع .بندد را مي Finally ،Connectionةدر هر دو حال، قطع. دهد ها را بازگشت

Transactionويژوال بيسيك: را متعهد كنيد

به.1 : اضافه كنيدbtnCommit even handlerدر ويرايشگر كد، سطور زير را

Dim trnNew As SqlTransaction AddRows("AAA" & Convert.ToString(System.DateTime.Now.Second)) cnAdoSbs.Open() trnNew = cnAdoSbs.BeginTransaction() daCustomers.InsertCommand.Transaction = trnNew daOrders.InsertCommand.Transaction = trnNew Try daCustomers.Update(dsAdoSbs.Customers) daOrders.Update(dsAdoSbs.Orders) trnNew.Commit() MessageBox.Show("Transaction Committed") Catch ex As SqlException trnNew.Rollback() MessageBox.Show(ex.Message.ToString()) Finally cnAdoSbs.Close() End Try

و سپس DataSet، يك رديف به scaffolding در AddRowsاين قطعه كد، با استفاده از روال افزوده،Connection ،را بازكرده Transaction ،را كند منبع دادهمي سعييتنهادر ايجاد كرده Updateهاي مربوطه

.اند قرار داده شدهTry Catch در داخل يك قطعه Updateها براي متد توجه كنيد، كه فراخوان. كند. فشار دهيدF5روي كليدبر كاربردي،ةبراي اجراي برنام.2. كليك كنيدLoad Dataروي.3. فشار دهيدCommitروي.4

پةبرنام مي كاربردي قاب ت گذارد، كه روزآمد شدن يامي را به نمايش ميأها را مورد .دهد ييد قرار

Microsoft ADO.NET 2.0 160گام به گام با

. كليك كنيدOKدر قاب پيام روي.5. بودند، پيدا كنيد را كه اضافه شدهAAAxxمحل مشتري.6

. كاربردي را ببنديدةبرنام.7

Transactionسي: را متعهد كنيد شارپ ويژوال

ب.1 : اضافه كنيدbtnCommit even handlerه در ويرايشگر كد، سطور زير را

SqlTransaction trnNew;

ADO.NET 161 در Transactionپردازش/ فصل پنجم

AddRows("AAA" + Convert.ToString(System.DateTime.Now.Second)); cnAdoSbs.Open(); trnNew = cnAdoSbs.BeginTransaction(); daCustomers.InsertCommand.Transaction = trnNew; daOrders.InsertCommand.Transaction = trnNew; try {

daCustomers.Update(dsAdoSbs.Customers); daOrders.Update(dsAdoSbs.Orders); trnNew.Commit(); MessageBox.Show("Transaction Committed"); }catch (SqlException ex) {

trnNew.Rollback(); MessageBox.Show(ex.Message.ToString()); }finally {

cnAdoSbs.Close(); }

و سپس DataSet، يك رديف به scaffolding در AddRowsاين قطعه كد، با استفاده از روال افزوده،Connection ،را بازكرده Transaction ،مي نهايتدر ايجاد كرده را كند منبع داده سعي Updateهاي مربوطه

.اند قرار داده شدهTry Catch در داخل يك قطعه Updateها براي متدانتوجه كنيد، كه فراخو. كند. فشار دهيدF5 كاربردي، روي كليد براي اجراي برنامه.2. كليك كنيدLoad Dataرويبر.3. فشار دهيدCommitرويبر.4

ميةبرنام ت گذارد، كه روزآمد شدن كاربردي قاب پيامي را به نمايش .دهدميييد قرارأها را مورد

Microsoft ADO.NET 2.0 162گام به گام با

. كليك كنيدOKدر قاب پيام روي.5. بودند، پيدا كنيد را كه اضافه شدهAAAxxمحل مشتري.6

. كاربردي را ببنديدةبرنام.7

Transactionويژوال بيسيك: را بازگشت دهيد

به.1 : اضافه كنيدbtnRollback_Click event handlerسطور پايين را

Dim trnNew As SqlTransaction AddRows("AAA" & Convert.ToString(System.DateTime.Now.Second)) cnAdoSbs.Open() trnNew = cnAdoSbs.BeginTransaction()

ADO.NET 163 در Transactionپردازش/ فصل پنجم

daCustomers.InsertCommand.Transaction = trnNew daOrders.InsertCommand.Transaction = trnNew Try daOrders.Update(dsAdoSbs.Orders) daCustomers.Update(dsAdoSbs.Customers) trnNew.Commit() MessageBox.Show("Transaction Committed") Catch ex As SqlException trnNew.Rollback() MessageBox.Show(ex.Message.ToString()) Finally cnAdoSbs.Close() End Try

ها معكوس Update، چون ترتيب اما. استه در تمرين گذشتCommit مشابه روال اين روال تقريباً به Updateشود، نخستين روزآمد ميCustomers DataTable پيش از Orders DataTableشده طوري كه

. خطا را به نمايش خواهد گذاشت وقوع پيام،و يك قاب،شكست خواهد انجاميد.كنيد كليك F5روي كليدبر كاربردي،ةبراي اجراي برنام.2. كليك كنيدLoad Dataرويبر.3. كليك كنيدRollbackرويبر.4

مي، كاربرديةبرنام مي قاب پيامي را به نمايش .پردازد گذارد، كه به شرح خطا

. كليك كنيدOKبراي بسته شدن قاب پيام، برروي.5

Microsoft ADO.NET 2.0 164گام به گام با

و آن را انتخاب نماييد.6 . محل رديف جديدي را كه سعي كرديد اضافه كنيد، يافته

.گذارد، كه حاكي از وقوع خطاست شمايلي از عالمت تعجب را به نمايش ميOrdersفهرست

. آن را شروع كنيد كاربردي را بسته، و، براي تاييد افزوده شدن رديف، مجدداًةبرنام.7. كاربردي را ببنديدةبرنام.8

Transactionسي: را بازگشت دهيد شارپ ويژوال

به.1 : اضافه كنيدbtnRollback_Click event handler سطور پايين را

SqlTransaction trnNew; AddRows("AAA" + Convert.ToString(System.DateTime.Now.Second)); cnAdoSbs.Open(); trnNew = cnAdoSbs.BeginTransaction(); daCustomers.InsertCommand.Transaction = trnNew; daOrders.InsertCommand.Transaction = trnNew; try {

daOrders.Update(dsAdoSbs.Orders); daCustomers.Update(dsAdoSbs.Customers);

ADO.NET 165 در Transactionپردازش/ فصل پنجم

trnNew.Commit(); MessageBox.Show("Transaction Committed"); }catch (SqlException ex) {

trnNew.Rollback(); MessageBox.Show(ex.Message.ToString()); }finally {

cnAdoSbs.Close(); }

ها معكوس Update، چون ترتيب اما. استه در تمرين گذشتCommit مشابه روال اين روال تقريباً به Updateشود، نخستين روزآمد ميCustomers DataTable پيش از Orders DataTableشده طوري كه

. خطا را به نمايش خواهد گذاشت وقوعپيام،و يك قاب،شكست خواهد انجاميد. كليك كنيدF5 كاربردي، روي كليدةبراي اجراي برنام.2. كليك كنيدLoad Dataرويبر.3. كليك كنيدRollbackرويبر.4

ميةبرنام مي كاربردي قاب پيامي را به نمايش .پردازد گذارد، كه به شرح خطا

Microsoft ADO.NET 2.0 166گام به گام با

. كليك كنيدOKبراي بسته شدن قاب پيام، بر روي.5و آن را انتخاب نماييد.6 . محل رديف جديدي را كه سعي كرديد اضافه كنيد، يافته

.گذارد، كه حاكي از وقوع خطاست شمايلي از عالمت تعجب را به نمايش ميOrdersفهرست

. آن را شروع كنيد كاربردي را بسته، و، براي تاييد افزوده شدن رديف، مجدداًةبرنام.7. كاربردي را ببنديدةمبرنا.8

خالصه

و در منبع دادهبه وقوع پيوسته گنجاندن تغييراتة فرآيند بسيار سادبادر اين فصل، ها در داخل دادها، با استفاده Transactionنخست،.، آشنا شديم NET Framework Transaction. با استفاده از شيء،ستد

و ستدهاي تو در تو،و.كنندمي ايجاد Connectionيك،BeginTransactionاز متد يا، در مورد خاص دادمي Transaction يك Beginمتد با را. آورند به وجود و ستد موردنظر به وجود آمد، آن پس از آن كه دادمي هايي كه در آن مشاركت ميData Command در Transaction propertyبه پس از آنكه. دهند كنند، نسبت

و ستدتوانميله كامل شد، اين مرح به Rollbackو Commit متدهاي را به كمكداد Transaction متعلق.دنموكنترل

سومبخش

ها دادهةبينند تداركءاشيا:در اين بخش

از سازي بانك نمونه: ششمفصل و DataSet اطالعاتي با استفاده ها DataRelationهاها DataTableكاربرد: هفتمفصل هاDataAdapter كاربرد: هشتمفصلها DataViewكاربرد: نهمفصل

ششمفصل هاDataRelationهاوDataSetاز اده اطالعاتي بااستف سازي بانك نمونه

:در پايان اين فصل، خواهيد توانست

�DataSet هايTyped وUntypedايجاد كنيد .�DataTable ها را بهDataSet ها اضافه كنيد .�DataRelation ها را بهDataSet ها اضافه كنيد.�DataSet و كپي كنيد .ها را تكثير

به مايكروسافت فاصله ميADO.NETهاي دادهةينندب از اين فصل، قدري از تدارك بررسي گيريم، تامي ها در برنامه بپردازيم، كه از كار با دادهيياشيا - DataSetبا را كار. كنند هاي كاربردي شما پشتيباني

.كنيمميآغاز-اي است هاي رابطه اي از دادهو جلوهد،نشين كه ساختاري است كه در حافظه مي

هاDataSet درك

DataSetدر ،.NET Framework نهانگاهي)catch (طور همان.ها داده نگاهداري موقت براي،است در حافظه.اي است اطالعاتي رابطه همان صورت بانكبه اساساDataSetًكه درتصوير زيرنشان داده شده، ساختار

ADO.NET از دو نوع مشخص DataSetكند پشتيباني مي :Typed وUntyped . ،از نقطه نظر ساختاريUntyped DataSetجديدية عبارت از ايجاد نمون )instantiation ( از شيءSystem.Dat.DataSet است، در

Microsoft ADO.NET 2.0 168گام به گام با

از جديدي از ردهة عبارت است از ايجاد نمونTyped DataSetحالي كه ارث System.Dat.DataSetاي كه.برد مي

مي) schema( طرح Typed DataSetاز نقطه نظر كاركردي، و خاصي را تعريف كند، كه جداول،آن ستون با. را دارندهاي شيء property، نقشهاي ةنظر نحو از نقطهDataSetبدين ترتيب، كار كردنچ بسي آسان) syntax(نگارش كهتر خواهد بود، بهو ستونها با ذكر نام جدولتوانيد مستقيماًميرا ها

.دها ارجاع دهي آن

و DataRowها، DataTable، به جزئيات در فصل هفتم .ها خواهيم پرداخت DataColumnها،

يك(dsOrders به نام Typed DataSetبراي مثال، اگر فرض كنيم به نام DataTableكه شاملOrderHeadersمي) است : ارجاع دهيدOrderIDتوانيد به مقدار ستون باشد، به اين ترتيب

dsOrders.OrderHeaders(x).OrderID

و كار داريد با همين ساختار Untyped DataSet، اگر با اما. استDataRow همانxكه در آن، ، سرو Table ،Rowsهاي propertyالزم است با استفاده از ،Itemهاي به ترتيب به ستونOrderHeaders ،

DataTable و ،OrderIDرت ارجاع دهيد، به اين صو:

dsOrders.Tables(“OrderHeader”).Rows(x).Item(“OrderID”)

با كد كار ميMicrosoft SQL Server 2005اگر از(كنيد، ويرايشگر و)IntelleSenseبا استفاده از جداولمي كند، كه ارجاع را حتي از اين هم ساده پشتيباني ميTyped DataSetهاي ستون (سازد تر د، يادتان باش.

.) كه دچار خطاي تايپي شويدپيش خواهد آمد،كنيد، فرصت ديگري كه هر بار چيزي تايپ ميTyped DataSet و يك ها را در زمان ترجمه بررسي مقادير دادهةاجاز: مهم ديگر نيز داردكاربرد مفيد

)compile (براي مثال، اگر فرض كنيم. دهدميOrderTotal مترجم زاراف نرمعددي است، يك مقدار)compiler(خواهد كرد برخورد با سطر زير، اعالم خطا، به محض:

dsOrders.OrderHeader.Rows(0).OrderTotal = “Hello, World!”

يك شد كار ميUntyped DataSetولي اگر با :كنيد، سطر زير بدون اعالم خطا ترجمه خواهد

dsOrders.Tables(“OrderHeader”).Rows(0).Item(“OrderTotal”) = “Hello, World!”

از. خواهيد داشتUntyped DataSet كه نياز به نيز وجود دارند، مواقعي Typed DataSetعليرغم فوايد كه،مثالً( نداريد DataSet كه تا زمان اجرا، اطالعي از ساختار در مواردي،جمله را از يك DataSet زماني

مي مياني يا يك سرويسةجزء رد را schema (DataSet(يا، ممكن است الزم شود، طرح.)كنيد وب دريافت

از سازي بانك نمونه/ فصل ششم و DataSet اطالعاتي با استفاده 169ها DataRelationها

كاري دوبارهTyped DataSet مجدد پيكربندي كنيد، كه در اين صورت ايجاد در زمان اجرا مجدداً.غيرالزمي خواهد بود

موردنظر DataSetكه( اطالعاتي شود، كه بخشي از بانك زماني الزم ميTyped DataSet مجددايجادمي)مبتني بدان است و دستخوش تغيير است، اطالعاتي شما كالً اگر طرح بانك. شود دچار تغيير فرار

ازةشايد بهتر باشد دربار . بيشتر فكر كنيدTyped DataSet استفادهاز برخالف جريان داده به داده) cache( نوعي نهانگاه DataSetآيند، مي DataReaderها كه ها در حافظه

در هاي داده تمام رديف. رود شمار مي .اند، در تمام اوقات، در دسترسDataSetها

ADO DataSet ADO.NET برخالف ،DataSet ADOمي اي از رديف هايش را به صورت آرايه، داده كند، ها عرضه

.مفهومي ندارد“ رديف جاري”و در اينجا

ميها در حافظه جا كه دادهاز آن بيشتر نسبت به ) overhead( داراي سرباري DataSetشوند، ذخيرهDataReader و تنها هايي است كه ويرايش خوا است، ولي متد بسيار كارآمدتري براي كار با داده هند شد،

و امكان پيمايش در رديفؤمةوسيل مي هاي داده ثري است كه به كاربر اجازه .دهد ها راميافت مايكروسADO.NET 2.0 در ، كه شيء CreateDataReaderتوانيد با استفاده از متد،

DataTableReaderبا بازپس مي در ادامه، در همين. رفتار كنيد DataReader همچون يك DataSetدهد،. خواهيم پرداختDataTableReaderفصل، به شيء

ها DataSetايجاد

DataSetديگرء، نيز، مانند بيشتر اشيا را ADO.NETو در واقع بيشتر اشيا توان، ميNET Framework.ء،و هم در زمان اجرا ايجاد نمود و ويرايش. در زمان طراحي ، با DataSetپشتيباني زمان طراحي از ايجاد

.گيرد، صورت ميDataSet Designerاستفاده از ابزار خاصي در ويژوال استوديو، به نام

.ها خواهيم پرداختTableAdapter، به جزئيات8در فصل

به ميADO.NETهاي شيء جديدي را وارد مدل داده2005ويژوال استوديو سازد، موسومTableAdapter .TableAdapterباةها رابط به شمار مستقليء دارند، ولي اشياTyped DataSet نزديكي

ازبه،ءاين اشيا. روند مي و روزآمد شده، DataSet Designer در Typed DataSetعنوان بخشي و ايجادبه در ويژوال استوديو ميDataSetصورت تعاملي مبادرت به ايجاد زماني كه به گزيده صورت پيشكنيد،آنبهتر است، فعالً. آيند به وجود مي .ها فكر كنيدTyped DataAdapterها همچون به

Microsoft ADO.NET 2.0 170گام به گام با

ها Typed DataSetايجاد

با”،1در فصل Typed اقدام به ايجاد،ها ويزارد پيكربندي منبع دادهاز با استفاده،“ADO.NETشروع كار

DataSetميةها را به يك پروژ هر كجا كه منبع داده. نموديم كنيد، ويزارد ويژوال استوديو اضافهيك پيكربندي منبع داده .كند ايجاد ميDataSetها خود به خود

DataSetايجاد: ها خواهيم انداختTyped DataSetي ايجاد در اين فصل، نگاهي به دو متد ديگر براو ويرايش DataAdapterاز و ايجاد ،Typed DataSet ها درDataSet Designer.

كاري است پذير است، ولي با نوشتن كد امكانTyped DataSetگرچه از لحاظ نظري، ايجاد:تذكركهد الزم است چنين كنياگر به دليلي. اندازه دشوار بي Typed به يك فايل كد نظري، پيشنهاد من اين است

DataSet )به در ويژوال. بيندازيد)اي از ساختار توسط ويژوال استوديو ايجاد شده عنوان نمونهكه DataSetName>.Designer.cs> يا DataSetName>.Designer.vb>هاي نام،ها، اين گونه فايل2005استوديو

.را بر خود دارند

DataSet Designer با استفاده از Typed DataSetجاد يك اي

و در صورت لزوم، روي Chapter 06 - Startةپروژ.1 DataSets.vb را در ويژوال استوديو شروع كرده،سي( مي يا، اگر از دوبار كليك كنيد، تا فرم در Solution Explorerدر ) DataSets.csكند، شارپ استفاده

Form Designer شود باز.

از سازي بانك نمونه/ فصل ششم و DataSet اطالعاتي با استفاده 171ها DataRelationها

2.Add New Item را از منوي Projectانتخاب كنيد ..گذارد را به نمايش ميAdd New Itemويژوال استوديو، قاب گفتگوي

3.DataSet را از فهرست انتخاب كرده، نام آن را به TypedDataSet.xsdتغيير دهيد .

. كليك كنيدAddروي.4.كند را باز ميDataSet Designer، افزودهة جديد به پروژDataSetويژوال استوديو يك

Microsoft ADO.NET 2.0 172گام به گام با

. بكشيدDataSet Designer سطحبه، ابزارة در جعبDataSetة از زبان، راDataTableكنترل.5

. تغيير دهيدfirstDataTable را به DataTable، نام Propertiesةدر پنجر.6

مي:توصيه تغيير DataTable عنوانةيلمكردن بررويكليك را با دوبارDataTableتوانيد نام همچنينكافي. در ويرايشگر كد باز خواهد شدTyped DataSetاگر در خود سطح طراحي دوبار كليك كنيد،. دهيد

. بازگرديدDataSet Designer است، بدون ذخيره كردن آن را ببنديد، تا به

را Column سپسوAdd دوبار كليك كرده، DataSet Designer در DataTable عنوانةبرروي ميل.7.انتخاب كنيد

DataSet Designer يك DataColumn به DataTableكند اضافه مي.

از سازي بانك نمونه/ فصل ششم و DataSet اطالعاتي با استفاده 173ها DataRelationها

RowID را به DataColumn، نام Propertiesةيا در پنجر) cell(با تايپ كردن مقدار جديد در خانه.8.تغيير دهيد

. اضافه كنيدDataTableبه راDescription، به نام DataColumn را تكرار كرده، دومين8و7مراحل.9

10 .DataSet ،را ذخيره كرده DataSet Designerرا ببنديد .كد. 11 . فشار دهيدF7 روي كليد،)DataSets.csيا(DataSets.vbبراي نشان دادن ويرايشگر فراخواني فاً را، كه صرbtnDsTyped_Click evrnt handlerمربوط به ) comment(يادداشت عالمت. 12

.، پاك كنيدscaffoldingاست به روال. فشار دهيدF5 بر روي كليد، كاربرديةبراي اجراي برنام. 13

. كليك كنيدShow dsTypedةبرروي دكم. 14.گذارد فرم به نمايش ميpanel جديد در DataSetة را دربار، كاربردي اطالعاتيةبرنام

Microsoft ADO.NET 2.0 174گام به گام با

. كاربردي را ببنديدةبرنام. 15

. به وجود آوريدDataAdapter از Typed DataSetيك

. را در سيني اجزا انتخاب كنيدForm Designer ،daCustomersدر.1

2.Generate Dataset را از منوي Dataانتخاب كنيد ..گذارد را به نمايش ميGenerate Datasetويژوال استوديو قاب گفتگوي

.پذير است جزء مذكور، نيز، امكانSmart Tag از منوي Generate Datasetسترسي به فرماند:وصيهت

. بگذاريدMasterDataSet را DataSet را انتخاب كرده، نام Newةگزين.3. را پاك كنيدAdd This Dataset To The Designerقاب كنترل.4

از سازي بانك نمونه/ فصل ششم و DataSet اطالعاتي با استفاده 175ها DataRelationها

. كليك كنيدOKروي.5.كند جديد را به پروژه اضافه ميDataSet،ويژوال استوديو

. فشار دهيدF7براي نمايش ويرايشگر كد روي كليد.6 شامل فراخوان روالي را، كه صرفاbtnDsMaster_Click event handlerًيادداشت كد مربوط به عالمت.7

. است، پاك كنيدscaffoldingدر تمرينبر كاربرديةبراي اجراي برنام.8 كليك Show dsMasterة، سپس برروي دكم فشار دادهF5دروي كلي،

.كنيد.گذارد را برروي فرم به نمايش ميDataSetهاي property كاربردي،ةبرنام

Microsoft ADO.NET 2.0 176گام به گام با

. كاربردي را ببنديدةبرنام.9. كليك كنيدMasterDataSet.xsd برروي Solution Explorerدر. 10

.كندمي بازDataSet Designer را در DataSetويژوال استوديو

11 .DataSet Designerرا ببنديد .

هاUntyped DataSet ايجاد

.وجود آوريدبهنويسيكديا تعامليةبه هردو شيوتوانيد ها را ميUntyped DataSetدر ويژوال استوديو، رايج، از سه روايتنويسيكده كمكبUntyped DataSet براي ايجاد،)6-1طبق جدول( DataSetشيءهاي نخست در برنامه) constuctor(ةبه طور معمول، تنها دو سازند، اما. كند پشتيباني ميNewةزندسا

.گيرند كاربردي مورد استفاده قرار مي DataSetهاي سازنده6-1جدول

شرح متد

New() يكUntyped DataSet،ةگزيد با نام پيشNewDataSetمي به .آورد وجود

New(dsName) يكUntyped DataSet،ة با نامي كه در رشتdsName مشخص شده، به .آورد وجود مي

New(serializationInfo,

streamingContext) NET Framework.كاربرد داخلي براي

از سازي بانك نمونه/ فصل ششم و DataSet اطالعاتي با استفاده 177ها DataRelationها

در ويژوال استوديو Untyped DataSetايجاد

دا،ابزارة جعبDataة از زبان، راDataSet، يك كنترل Form Designerدر.1 .خل سيني اجزا بكشيد به.گذارد را به نمايش ميAdd Datasetويژوال استوديو قاب گفتگوي

و سپس بر روي Untyped DataSetنخست بر روي.2 ،OKكليك كنيد ..كند به سيني اجزا اضافه ميUntyped DataSetيك،ويژوال استوديو

.يد بگذارdsUntyped را DataSet، نام Propertiesةدر پنجر.3. فشار دهيدF7براي نشان دادن ويرايشگر كد، بر روي كليد.4 براي است فراخواني را، كه صرفاbtnUntyped_Click event handlerًيادداشت مربوط به كد عالمت.5

.، پاك كنيدscaffolding در ShowDataSetروال. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.6

Microsoft ADO.NET 2.0 178گام به گام با

. فشار دهيدShow dsUntypedةروي دكم.7و بدون رابطه(Untyped DataSetهاي property، كاربرديةبرنام.8 مي) بدون جدول .گذارد را به نمايش

. كاربردي را ببنديدةبرنام.9

ويژوال بيسيك: در زمان اجرا به وجود آوريدUntyped DataSetيك

: كنيد، اضافهdsAdoSbsسطر زير را به اعالن رده، در زير اعالن.1

Dim dsEmployees As DataSet

: اضافه كنيدCreateScaffoling، سطر زير را به باالي فراخوان Newدر روال.2

dsEmployees = New DataSet("dsEmployees")

:حال، بايد شروع فايل رده به اين صورت باشد

Imports System.Data Imports System.Data.SqlClient Public Class DataSets Dim dsAdoSbs As AdoSbsDataSet Dim dsEmployees As DataSet Public Sub New() ' This call is required by the Windows Form Designer. InitializeComponent()

'Add exercise code here: dsEmployees = New DataSet("dsEmployees")

از سازي بانك نمونه/ فصل ششم و DataSet اطالعاتي با استفاده 179ها DataRelationها

' This call supports the exercise CreateScaffolding() End Sub

در ShowDataSet را، كه فراخواني است براي روال btnEmployees_Click event handlerيادداشت.3scaffoldingپاك كنيد ،.

. فشار دهيدF5 بر روي كليد، كاربرديةبراي اجراي برنام.4. كليك كنيدdsEmployeesةبرروي دكم.5

.اردگذ را به نمايش ميDataSetهاي property كاربردي،ةبرنام

. كاربردي را ببنديدةبرنام.6

سي: وجودآوريد درزمان اجرا بهUntyped DataSetيك شارپ ويژوال

:، اضافه كنيدdsAdoSbsسطر زير را به اعالن رده، در زير اعالن.1

DataSet dsEmployees;

و پيش از فراخوان InitializeComponentها، پس از DataSetةسطر زير را در سازند.2CreateScaffoldingاضافه كنيد ،:

dsEmployees = new DataSet("dsEmployees");

رد شدةحال، فايل : ما اين چنين شروع خواهد

using System; using System.Collections.Generic; using System.ComponentModel;

Microsoft ADO.NET 2.0 180گام به گام با

using System.Data; using System.Data.SqlClient; using System.Drawing; using System.Text; using System.Windows.Forms; namespace Chapter_06 {

public partial class DataSets : Form {

AdoSbsDataSet dsAdoSbs; DataSet dsEmployees;

public DataSets() {

InitializeComponent();

//Add exercise code here: dsEmployees = new DataSet("dsEmployees");

//This call supports the exercise: CreateScaffolding(); }

كد.3 . را پاك كنيدbtnEmployees_Click event handlerيادداشت مربوط بهبر كاربرديةبراي به اجرا درآوردن برنام.4 . فشار دهيدF5روي كليد،. كليك كنيدShow dsEmployeesةروي دكم.5.گذارد را به نمايش ميDataSetهاي property كاربرديةبرنام.6

از سازي بانك نمونه/ فصل ششم و DataSet اطالعاتي با استفاده 181ها DataRelationها

. كاربردي را ببنديدةبرنام.7

ها DataSetكربندي پي

property هاي عرضه شده از سويDataSet اند نشان داده شده6-2 در جدول.

DataSetهاي 6property-2جدول

Property مقدار

CaseSensitive ها كند مقايسه مشخص ميcase-sensitiveهستند يا خير .

DataSetName نامي كه براي ارجاع بهDataSetمي در كد مورداستفاد .گيرده قرار

DefaultViewManager و مرتب را برايگزيده پيشمقادير تعريف DataSetكردن فيلترگذاري.كند مي

EnforceConstraints شود كند در طول تغييرات از قواعد محدود كننده تبعيت مشخص مي.يا خير

ExtendedProperties كاربر دلخواهاطالعات .

HasErrors هدد نشان ميDataRelation بهها داراي خطاDataSetي متعلق. يا خيرندسته

IsInitialized دهد نشان ميDataSetتعيين مقدار اوليه شده يا خير .

Locale ها مورداستفاده اطالعات محل كه قرار است هنگام مقايسه رشته.قرار گيرند

Namespace namespaceتن سند مورد استفاده هنگام خواندن يا نوشXML.

Prefix پيشوندXMLعنوان نام جايگزين كه به)alias ( برايnamespace

Microsoft ADO.NET 2.0 182گام به گام با

Property مقدار

.گيرد مورداستفاده قرار مي

Relations ءاي از اشيا مجموعهDataRelation كه مناسبات ،DataTable در ها.دنكن را مشخص ميDataSetداخل

RemotingFormat فرمتserialization را براي DataSetميم .كند شخص

SchemaSerializationModeكند طرح مشخص ميDataSet در serializationگنجانده شده يا خير .

Tables مجموعهDataTable هاي داخلDataSet.

. خواهيم پرداختDataSet در XML، به بررسي متدهاي مرتبط با نوزدهمدر فصل

بDataSet هايي كه مورد پشتيباني propertyبيشتر باه هستند، دو. شوندميمربوط XML تعامل آنو معرف Relationsو Tablesهاي، عبارتند از مجموعهXMLهاي غير propertyتا از مهمترين ، كه حاوي

. قرار دارندDataSetهايي هستند كه در داخل داده

DataSetمجموعه جداول

بهجدةها، محتويات مجموعTyped DataSet در مورد مي تعريف ميDataSet طرحةوسيلاول توان شود، كهو ستونUntyped DataSetدرولي،. ويرايش نمودDataSet Designerآن را در مي، جداول توانيد هايشان را

. ايجاد كنيدكدننوشتبا يا DataSet Designerبا استفاده از

. خواهيم افزودUntyped DataSetبه هفتمها را در فصل DataTable:تذكر

اضافه كنيدTyped DataSet به يك DataTableدر ويژوال استوديو، يك

. را در سيني اجزا انتخاب كنيدForm Designer ،daEmployeesدر.12.Generate Dataset را در منوي Dataانتخاب كنيد .

.گذارد را به نمايش ميGenerate Datasetويژوال استوديو قاب گفتگوي3.Chapter 06_ MasterDataSetعنوان را بهDataSetخواهيد جدول را به آن اضافه كنيد، انتخاب كه مي

و قاب كنترل . را پاك كنيدAdd This Dataset To The Designerكرده

از سازي بانك نمونه/ فصل ششم و DataSet اطالعاتي با استفاده 183ها DataRelationها

. كليك كنيدOKروي.4.افزايد ميDataSet را به DataTableويژوال استوديو

يDataSet Designerبا استفاده از Typed DataSet به DataTableك،

. اضافه كنيد

. دوبار كليك كنيدMasterDataSet.xsd، روي Solution Explorerدر.1.كند باز ميDataSet Designer را در DataSet،ويژوال استوديو

Microsoft ADO.NET 2.0 184گام به گام با

به نمايش AdoStepByStep اطالعاتي را باز كرده، ببينيد اتصال به بانكServer Explorerةپنجر.2 Connect To ابزارة ميلةشود، روي دكم ديده نميAdoStepByStep اطالعاتي اگر بانك. يا خيردرآمده

Databaseهاي كليك كرده، ارتباطي را به يك منبع دادهSQL Server مشخص كنيد .Server Name را (local)\SQLEXPRESS ،گذاشته Use Windows Authenticationًاتياطالع بانك، ونهايتاAdoStepByStep

.را انتخاب نماييد

. را باز كنيدTables را انتخاب كرده، گره AdoStepByStep اطالعاتي، بانكServer Explorerدر پنجره.3

از سازي بانك نمونه/ فصل ششم و DataSet اطالعاتي با استفاده 185ها DataRelationها

. بكشيدDataSet Designer را به Ordersجدول.4DataSet Designer،جدول Orders را به DataSetدكن اضافه مي.

Microsoft ADO.NET 2.0 186گام به گام با

5.DataSetكرده، را ذخيره DataSet Designerرا ببنديد .. فشار دهيدF5روي كليدبر، كاربرديةبراي اجراي برنام.6. كليك كنيدShow dsMasterةبرروي دكم.7

مي property، كاربرديةبرنام .دهد هاي اصالح شده را نشان

. كاربردي را ببنديدةبرنام.8

DataSetكاربرد متدهاي

.اند فهرست شده6-3 در جدول DataSetيباني شيء مورد پشتهمتدهاي اولي DataSet متدهاي6-3جدول

شرح متد

AcceptChanges تمام تغييرات درDataSetكند را تعهد مي.

Clear درهاتمام جدولDataSetكند را خالي مي.

Clone ساختارDataSetكند را كپي مي.

Copy و محتواي .كند را كپي ميDataSetساختار

CreateDataReader يكDataTableReader را از DataSetدهد بازپس مي.

GetChanges يكDataSet شامل تنها آن ،DataRowاند، بازپس هايي كه تغيير پيدا كرده.دهد مي

GetObjectData شيءSerializationInfo شامل اطالعات الزم براي سريالي كردن ،DataSet ،مرا .گذارديدر اختيار

GetXml ةارائXML از DataSet ميرا .دهد بازپس

از سازي بانك نمونه/ فصل ششم و DataSet اطالعاتي با استفاده 187ها DataRelationها

شرح متد

GetXmlSchema ةارائXSD از طرح DataSet ميرا .دهد بازپس

HasChanges يك مقدارBooleanكهدهد، بازپس مي تغييرات DataSet حاكي از اين.الوقوعي را در پيش دارد يا خير قريب

InferXmlSchema طرحي ازTextReader يا فايلXMLدهد را نتيجه مي.

Merge دوDataSetكند را باهم تركيب مي.

ReasXml و داده .خواند ميDataSet را در يك XMLهاي طرح

ReadXmlSchema طرحXML را در يك DataSetخواند مي.

RejectChanges در تمام تغييرات قريب .گرداند را بازميDataSetالوقوع

Reset DataSetگرداند بازميدخوة را به وضعيت اولي.

WriteXml و داده .نويسد ميDataSet را از XMLهاي طرح

WriteXmlSchema ساختارDataSetصورت طرح را بهXMLنويسد مي.

،5، كه در بخشXMLهاي آن، مربوطند به تعامالتش با property، همانند DataSetبيشتر متدهاي”ADO.NET وXML“آن .ها خواهيم پرداخت، به

. ها خواهيم پرداخت، به متدهاي مورد استفاده براي روزآمد كردن داده دهمدر فصل

روزآمد كردن براي، Mergeو HasChanges ،GetChanges ،AcceptChanges ،RejectChangesمتدهاي.گيرند مورد استفاده قرار ميDataSet هاي جدولةمجموع از آن استفادهDataSetكه هنگام سريالي كردن- را SerializationInfo، شيء GetObjectDataمتد

، امكان SchemaSerializationModeو RemotingFormatهاي propertyاين متد، به همراه. كند پرمي-شود ميو ذخيره كردن داده (دنآور را فراهم ميDataSetهاي انتقال و Serializationةدرباربراي جزئيات بيشتر.RemotingFormat property رجوع كنيد به ،Helpآنالين ويژوال استوديو (.

CreateDataReader يك ،DataTableReader از DataSetو بدين بازپس مي ترتيب امكان دسترسي دهد،read-only وforward-onlyمي به داده اDataTableReader. آورد ها را فراهم كاركردي، مشابه نظرز نقطه،

DataReader است . DataSet، كه يك كپي خالي از Cloneكند؛ را خالي ميDataSet، كه Clearسه متد باقيمانده عبارتند از

ميبه و وجود ميو دادهDataSet، كه كپي كاملي از Copyآورد؛ .كند هاي آن ايجاد

Microsoft ADO.NET 2.0 188گام به گام با

DataSetكلونينگ

ازوه مشابة نسخCloneمتد وDataRelationها، DataTableشامل- DataSet دقيقي به-هاConstraint ها.آورد وجود مي

ويژوال بيسيك : DataSet ينگكلون

. فشار دهيدF7براي به نمايش درآوردن ويرايشگر كد، روي كليد.1: اضافه كنيد،dsEmployeesسطر زير را به اعالن رده، در زير اعالن.2

Dim dsClone As DataSet

: اضافه كنيد،CreateScaffolding، پيش از فراخوان Newسطر پايين را به روال.3

dsClone = dsEmployees.Clone()

: شما به صورت زير خواهد بودةدربدين ترتيب، شروع

Imports System.Data Imports System.Data.SqlClient Public Class DataSets Dim dsAdoSbs As AdoSbsDataSet Dim dsEmployees As DataSet Dim dsClone As DataSet Public Sub New()

' This call is required by the Windows Form Designer. InitializeComponent()

'Add exercise code here: dsEmployees = New DataSet("dsEmployees") dsClone = dsEmployees.Clone()

' This call supports the exercise

از سازي بانك نمونه/ فصل ششم و DataSet اطالعاتي با استفاده 189ها DataRelationها

CreateScaffolding() End Sub

scaffolding تمرين ShowDataSet را، كه btnClone_Click event handlerيادداشت كد مربوط به عالمت.4.خواند، پاك كنيد را فرامي

بر كاربرديةبراي اجراي برنام.5 .د فشار دهيF5 روي كليد،. كليك كنيدShow dsCloneةروي دكمبر.6

.گذارد را به نمايش ميDataSetهاي property، كاربرديةبرنام

. كاربردي را ببنديدةبرنام.7

سي: DataSet ينگكلون شارپ ويژوال

. فشار دهيدF7روي كليد بر براي به نمايش درآوردن ويرايشگر كد،.1: اضافه كنيد،dsEmployees اعالن سطر زير را به اعالن رده، در زير.2

DataSet dsClone;

ر.3 : اضافه كنيد،CreateScaffolding، پيش از فراخوان New به روالاسطر پايين

dsClone = dsEmployees.Clone();

ت ردبدين بهةرتيب، شروع :صورت زير خواهد بود شما

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data;

Microsoft ADO.NET 2.0 190گام به گام با

using System.Data.SqlClient; using System.Drawing; using System.Text; using System.Windows.Forms; namespace Chapter_06 {

public partial class DataSets : Form { AdoSbsDataSet dsAdoSbs; DataSet dsEmployees; DataSet dsClone;

public DataSets() {

InitializeComponent();

//Add exercise code here: dsEmployees = new DataSet("dsEmployees"); dsClone = dsEmployees.Clone();

//This call supports the exercise: CreateScaffolding(); }

به.4 .پاك كنيد راbtnClone_Click event handlerيادداشت كد مربوطبر كاربرديةبراي اجراي برنام.5 . فشار دهيدF5 روي كليد،. كليك كنيدShow dsCloneةبرروي دكم.6

.گذارد را به نمايش ميDataSetهاي property كاربرديةبرنام

از سازي بانك نمونه/ فصل ششم و DataSet اطالعاتي با استفاده 191ها DataRelationها

. كاربردي را ببنديدةبرنام.7

ها DataTableReaderايجاد

از. دهد بازپس ميDataTableReader، يك DataSet از CreateDataReaderمتد CreateDataReaderدو روايت با چندين DataTableReaderيك،DataSet در DataTable، كه براي هر ()CreateDataReader: وجود دارد

و مجموعه نتايج بازپس مي از، كه آرايهCreateDataReader(DataTable())دهد؛ عنوان ها را بهDataTableاي.دهد ها مشخص شده بازپس ميDataTable هاي نتايج را تنها براي مجموعهوپذيرد، پارامتر مي

مي: توصيه يك دادهDataTableReaderخواهيد اگر توانيد از متد تنها را بازپس دهد، ميDataTableهاي

CreateDataReader مربوط به DataTable و نه ،DataSetاستفاده كنيد ،.

هاي نتايج به همان ترتيب، مجموعهDataSet.CreateDataReaderدر هر دو شكل فراخوان متدDataTable ةها كه در مجموعTablesمي اعالن شده ةهاي داخل هر مجموع ستون. شوند اند، بازپس داده

.اند مربوطهDataTableهاي DataColumnنتيجه، به همان ترتيبDataTableReaderًهمان، دقيقا property و متدهاي از را عرضه ميDataReaderها كند، ولي جزئي

كه. آيد ها به حساب نمي دادهةبينند تدارك همچون بخشي از DataTableReaderاين بدان معناستSystem.Data.namespaceت و نيازي نيست، بسته به هاي هاي خود، با روايت دادهةبينند دارك تعريف شده،

ازمختلف ) unconnected(هاي غيرمتصل ها با داده DataTableReaderتر آن كه، مهمةنكت. شيء كار كنيديبا-كنند كار مي ها را باز نگاه به منبع داده DataTableReader ،Connection الزم نيست، هنگام كار كردن.داريد

ويژوال بيسيك : DataTableReaderايجاد يك

، در مكان مشخص شده، btnReader_Click event handlerدر ويرايشگر كد، سطور پايين را به انتهاي.1:اضافه كنيد

dr = dsAdoSbs.CreateDataReader(dsAdoSbs.Employees) MessageBox.Show("The DataTableReader has " & dr.FieldCount.ToString() & _

" rows")

Microsoft ADO.NET 2.0 192گام به گام با

:حال، روال بايد به اين صورت باشد

Private Sub btnReader_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnReader.Click Dim dr As DataTableReader dsAdoSbs = New AdoSbsDataSet daEmployees.Fill(dsAdoSbs, "Employees")

'Add exercise code here dr = dsAdoSbs.CreateDataReader(dsAdoSbs.Employees) MessageBox.Show("The DataTableReader has " & dr.FieldCount.ToString() & _ " rows") End Sub

. فشار دهيدF5روي كليدبر كاربردي،ةبراي اجراي برنام.2. كليك كنيدCreate Readerةبرروي دكم.3

در كاربردي تعداد رديفةبرنام .گذارد را به نمايش ميDataTableها

. كاربردي را ببنديدةبرنام.4

شارپسيويژوال : DataTableReaderايجاد يك

:، اضافه كنيدbtnReader_Click event handlerدر ويرايشگر كد، سطور پايين را به انتهاي.1

dr = dsAdoSbs.CreateDataReader(dsAdoSbs.Employees);

از سازي بانك نمونه/ فصل ششم و DataSet اطالعاتي با استفاده 193ها DataRelationها

MessageBox.Show("The DataTableReader has " + dr.FieldCount.ToString() +

" rows");

:حال، روال بايد به اين صورت باشد

private void btnReader_Click(object sender, EventArgs e) {

DataTableReader dr; dsAdoSbs = new AdoSbsDataSet(); daEmployees.Fill(dsAdoSbs, "Employees");

//Add exercise code here: dr = dsAdoSbs.CreateDataReader(dsAdoSbs.Employees); MessageBox.Show("The DataTableReader has " + dr.FieldCount.ToString() + " rows"); }

. فشار دهيدF5روي كليدبر كاربردي،ةاي برنامبراي اجر.2. كليك كنيدCreate Readerةروي دكمبر.3

در كاربردي تعداد رديفةبرنام .گذارد را به نمايش ميDataTableها

. كاربردي را ببنديدةبرنام.4

Microsoft ADO.NET 2.0 194گام به گام با

ها DataRelationدرك

ةمجموعو، DataSet شده در هاي ذخيره ساختار دادهةكنند مشخص،DataSet در TablesةمجموعRelations،مناسبات بينةكنند مشخص DataTableةمجموع. هستندRelations شيء چند شامل صفر يا

DataRelationو هر يك نمايانگر رابط . است، بين دو جدولة، خود، ParentKeyConstraintو ChildKeyConstraintهاي propertyها، از طريق DataRelation، عالوهبه

مي مكانيسمي را براي اعمال يكپارچگي رابطه ليكن، درك اين نكته بسيار مهم است. گذارند اي در اختيارمي) constraints(كه قيود كه تنها زماني اعمال True روي DataSet در EnforceConstraints propertyشوند،

. آن استةگزيد پيششكل خود البتهتنظيم شده باشد، كههاي والد امكان حركت آسان بين رديفDataRelationطور كه در فصل آينده خواهيم ديد، شيء همان

.سازدو فرزند را فراهم مي

DataRelationايجاد

DataRelation ها را، نيز، مانند ديگر اجزايDataSetبه كمكتوان، مي DataSet Designer يا با نوشتن كد .د آورددر زمان اجرا به وجو

DataSet Designer با استفاده از DataSet به DataRelationافزودن

. دو بار كليك كنيدrelationsDataSet.xsd، روي Solution Explorerدر.1.كند باز ميDataSet Designer را در DataSetويژوال استوديو

از سازي بانك نمونه/ فصل ششم و DataSet اطالعاتي با استفاده 195ها DataRelationها

ج، ابزارة جعبDataSetة از زبان، راRelationيك كنترل.2 . بكشيدCategoriesدول به داخل3.DataSet Designer،قاب گفتگوي Relationآورد را به نمايش درمي. را Products ،Child Table را روي Parent Table تغيير داده،Product_Categories را به Relationنام.4

و CategoryID را روي Categories ،Columnsروي ،Foreign Key Columns را روي CategoryID تنظيم .كنيد

. كليك كنيدOKرويبر.5DataSet Designer ،DataRelation را به DataSetكند اضافه مي.

Microsoft ADO.NET 2.0 196گام به گام با

بر، ميDataSet Designerدر:توصيه Showو انتخاب Relationروي سطر توانيد به كمك كليك راست

Relation Labels ،نام Relation درآوريد مذكور را به نمايش.

6.DataSet ،را ذخيره كردهDataSet Designerرا ببنديد .برةبراي اجراي برنام.7 . فشار دهيدF5روي كليد كاربردي،. كليك كنيدShow dsRelationsةبرروي دكم.8.گذارد را به نمايش ميDataSetهاي property كاربردي،ةبرنام

. كاربردي را ببنديدةبرنام.9

هاDataRelation پيكربندي

Property هايDataRelation،اند ذكر شده6-4 در جدول. DataRelationهاي 6property-4جدول

Property شرح

ChildColumns از آرايه هاي روابط را مشخص ها را، كه بسياري از طرفDataColumn ايمي مي .دهد كنند، بازپس

ChildKeyConstraint ForeignKeyConstraintكه، راDataRelation ميجاري كند، بازپس را كنترل.دهد مي

ChildTable ارجاعي بهDataTableمي، از بسياري از طرف .دهد هاي رابطه، بازپس

DataSet ارجاعي بهDataSet كه ،DataRelation كنوني بخشي از آن است، بازپس .دهد مي

ExtendedPorperties از مجموعه .هاي سفارشيproperty اي

Nested كند، مشخص ميDataRelation اي سلسله مراتبي را تعريف رابطهفعلي.كند يا خير مي

ParentColumns از آرايه مياهDataColumnاي د، بازپسنكن، كه يك طرف رابطه را مشخص.دهد مي

از سازي بانك نمونه/ فصل ششم و DataSet اطالعاتي با استفاده 197ها DataRelationها

Property شرح

ParentKeyConstraint UniqueConstraint را، كه اين DataRelationمي را كنترل مي .دده كند، بازپس

ParentTable ارجاعي به اينDataTableدهد، از يك طرف رابطه، بازپس مي.

RelationName نامDataRelationكند را مشخص مي.

و زماني كه read-onlyها property بيشتر اين مي بهDataRelation هستند، مي وجود . شوند آيد، تنظيمدر ليكن، مي آورد، را در زمينه به وجود ميDataRelation، كه مجدداDataSet Designerًتوانيد مقادير را.تغيير دهيد

آن، كه هر وقت كه بخواهيم ميRelationName عبارتند از read-onlyسه استثناء بر اين قاعده توانيممي، كه با دادهNested propertyرا تغيير دهيم؛ و گيرد هاي سلسله مراتبي مورد استفاده قرا ؛

ExtendedProperties property كه براي مشخص كردن ،propertyميهايي به ةرود، كه اختصاصي برنام كار(اند كاربردي .) بحث نخواهيم كرد extendedهاي propertyةدر اين كتاب، دربار.

. خواهيم پرداختXML، به بحث پيرامون19و18هاي در فصل

Nested propertyةگزيد ورت پيشص، كه بهFalseت ، كه همواره مانند DataSetثيري بر ساختارأ است،مي اطالعاتي رابطه يك بانك به نوشتن دادهة بر نحوpropertyبا اين حال، اين. كند، ندارد اي عمل ها

كه،گذارد اثر ميXMLDataDocumentبا ) synchronized( يا همگاه شده XMLهاي صورت داده هنگاميpropertyصورت بهTrueمي هاي فرزند در داخل رديف است، رديف .گيرند هاي والد جاي

خالصه

و اطالعاتي رابطه اي است از ساختار يك بانك، كه نمونهDataSet شيءبادر اين فصل ، DataRelationاي،و-Untypedو DataSet -Typed، دو نوع سپس. آشنا شديمها، DataTable بينةاي است از رابط كه نمونه

به. ها را مورد توجه قرار داديم چگونگي ايجاد هر يك از آن DataSetهاي propertyنگاه مختصري Typed DataSet به يك DataTable توجه خويش را معطوف به چگونگي اضافه نمودن آنگاهانداخته،را DataTableReaderو ايجاد DataSet پرداخته، مثالي از كلونينگ DataSet، به متدهاي در پايان.نموديم

.مشاهده نموديمتكراهاDataRelation پس از آن، يكبه، كه نمونه اي از روابط و ها DataTableبسيار بينبه تك

ميبه ميقرار داديم،توجه مورد روند، شمار آنو ديديم كه چگونه ازراها توان DataSetبا استفاده

Designerآو به ها پرداختيم، ولي بحث مفصل DataRelationهاي propertyسرانجام، به بررسي.ردوجود. موكول نموديم19و18ها را به فصولآنةدربار

هفتمفصل

ها DataTable كاربرد:در پايان اين فصل، خواهيد توانست

�DataTable ها را، با استفاده ازDataSet Designerوجود آوريد، به.�DataTable به . وجود آوريدها را، در زمان اجرا�DataTable ،به،در زمان اجراراDataSetاضافه كنيد .�DataTableپيكربندي كنيدار ها .�DataColumn پيكربندي كنيدوها را افزوده .�Constraint برايييها DataTable وجود آوريدبه.�DataRowو پيكربندي كنيد .ها را ايجاد.كار بريدبه DataRowو DataTableمتدهاي�

بهدر چند با فصل گذشته، آنولي نگاهيها پرداختيم، DataTableكار حال،.يمنينداختها از نزديك بهآن property جزئيات ساختار،بادر اين فصل، و متدهاي .شدخواهيم آشناها ها

ها DataTableدرك

از سازي بانك نمونه”،6در فصل و DataSet اطالعاتي با استفاده را همچون DataSet،“ها DataRelationهادر ها، حاوي داده DataTable. اي در حافظه تعريف كرديم هاي رابطه دادهازيا يا جلوهارائه هاي واقعيميآن-ها نيستند DataSet ها فقط در داخل DataTableبا اين حال،. هستندDataSet درون به ها - توانند

.طور مستقل، نيز، وجود داشته باشندو قبل از هر چيز همproperty داراي DataTableطور كه خواهيم ديد، همان چون هاي خاص خود است،

:كند ظرفي براي سه مجموعه عمل مي�Columns propertyءاي است از اشيا، مجموعهDataColumn كه طرح ،)schema ( بترتي-جدول

آن ستون و ساختار .دساز را مشخصمي-ها ها�Rows propertyءاي است از اشيا، مجموعهDataRow -در داده حفظ DataTableهاي واقعي كه

.شوند مي�Constraint propertyءاي است از اشيا، مجموعهConstraint كه همراه با ،PrimaryKey property از

DataTableمي يكپارچگي را بر دادهو مقررات، قواعد .كنند ها تحميل

Microsoft ADO.NET 2.0 200گام به گام با

بهةها در وهلDataSet طور كه در فصل گذشته ديديم، همان ها DataTable عنوان ظرفي براي نخستك عمل مي به ظروف داده) هاRowةاز طريق مجموع(خوده كنند، ميهاي واقعي .روند شمار

به DataTableليكن، گرچه ميكاربرد دارند DataSetعنوان بخشي از ها بيشتر آن، ولي را توان هايك دادهة، براي ارائي مستقلDataTable بخواهيم ممكن استبراي مثال،. ايجاد نمودهم مستقالً ها به

، DataSet پيش از افزوده شدن به DataTable فراهم ساختن امكان پيكربندي يا صرفاً) bound(نترل مقيدك.وجود آوريمبه

هاDataTable ايجاد

DataTable ءها را، همانند بيشتر اشياADO.NETطراحي يا اجرا به هاي توان در زمان مايكروسافت، مي آنمي. وجود آورد به توان با استفاده از ويزارد پيكربندي منبع،Typed DataSetن بخشي از عنواها را

از؛ ايجاد نمود،ها داده يك،DataSet Designer با استفاده به؛ جديد يا موجود افزودDataSet به طورو يابه- constructor (DataTable(با استفاده از سازنده-صريح ا-طور ضمني در زمان اجرا، يا ز با استفادهبه Fillمتد . به وجود آورد-DataAdapter متعلق

از DataTableايجاد DataSet Designerها با استفاده

. خواهيم پرداختXML، به بحث پيرامون19و18هاي در فصل

DataSet Designer،ايجادة مكانيسم اولي Typed DataSet به 2005ها در ويژوال استوديو مايكروسافتم بههمان. روديشمار و با استفاده از طور كه در فصل گذشته ديديم، هنگامي كه طور غيرمستقيم

يك ميTyped DataSetها اقدام به ايجاد ويزارد پيكربندي منبع داده كنيد، ويژوال استوديو در واقعTableAdapterمي به كه وجود مةدر وهل(اي معينيو قابليت پايهDataTableآورد، و Fillتدهاي نخست

Update (يك ميرا در پاسخگوي نيازهاي ما هست، ولي با TableAdapterدر بيشتر موارد،. كند جا جمعDataSet Designerتوان، نيز ميDataTableًو بيش(ولي، البته، اين بار بدون قابليت اضافي- ها را مستقيما

. به وجود آورد-دده در اختيار ما قرار ميTableAdapterكه) از حد نياز

DataSet Designerاز،بااستفادهTyped DataSet بهDataTableافزودن

و در صورت لزوم در Chapter 07 - Startةپروژ Solution Explorer را در ويژوال استوديو باز كرده،مي، اگر با سيDataTables.csيا(DataTables.vbروي تا) كنيد شارپ كار Form فرم در دوبار كليك كنيد،

Designerبه نمايش درآيد .

201ها DataTable كاربرد/ فصل هفتم

. دوبار كليك كنيدSolution Explorer در AdoSbsDataSet.xsdروي.1توجه داشته باشيد كه چون. كند باز ميDataSet Designer را در DataSet،ويژوال استوديو.2

DataSet هاي ها به وجود آمده، جدول استفاده از ويزارد پيكربندي منبع داده با Orders وEmployeesتوسطها در منبع داده TableAdapter نه،ها مي،ها DataTableو (شوند ارائه قابليت.

TableAdapterدر پايين شيء جدول نشان داده شده است (.

Microsoft ADO.NET 2.0 202گام به گام با

بهة را از جعبDataTableكنترل.3 . بكشيدDataSet Designer ابزار.كندمي اضافه DataSetويژوال استوديو جدول را به

و در پنجرDataTable، بر روي DataSet Designerدر.4 DataTable نام Propertiesة جديد كليك كرده،. تغيير دهيدCustomersرا به

5.DataSet ده، نمو را ذخيرهDataSet Designerرا ببنديد .كد.6 بربراي نمايش ويرايشگر . فشار دهيدF7روي كليد،درعالمت.7 . را پاك كنيدbtnCustomers_Click event handler ياداشت كد نوشته شده. فشار دهيدF5 كاربردي، روي كليدةبراي به اجرا درآوردن برنام.8. كليك كنيدShow Customersةروي دكمبر.9.گذارد را به نمايش ميDataTable كاربردي جزئياتةبرنام

. كاربردي را ببنديدة برنام.10

203ها DataTable كاربرد/ فصل هفتم

قل در زمان اجراهاي مست DataTableايجاد

DataTable با استفاده از نگارش،هاي مستقل )syntax (استاندارد.NET Framework مايكروسافت به وجود .اند ذكر شده7-1ها در جدول DataTable براي Newةچهار روايت از سازند. آيند مي

DataTableهاي سازنده7-1جدول

شرح متد

New() يكDataTableدساز جديد مي.

New(tableName) يكDataTableة جديد، با نامي كه در رشتTableNameشده، مشخص.سازد مي

New(tableName,

namespace) و متعلق TableNameة جديد، با نامي مشخص در رشتDataTableيك.سازد مشخص، ميXMLnamespaceبه

New(serializableInfo,

streamingContext) . داخلي داردة، استفادNET Framework. براي

يكه كمكب ويژوال بيسيك: به وجود آوريد مستقل DataTable كد،

به.1 : اضافه كنيدbtnAddTable_Click event handlerدر ويرايشگر كد، سطور زير را

Dim dtNew As DataTable dtNew = New DataTable("New Table") ShowDetails(dtNew)

را بهDataTableيك، فوقسطور بهمتعلق ShowDetailsبا استفاده از روال(وجود آورده، جزئيات آنscaffolding(مية برروي فرم برنام .گذارد كاربردي به نمايش

. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.2. كليك كنيدIndependent Tableبرروي.3

مي كاربردي جزئياتةبرنام .گذارد جدول جديد را به نمايش

Microsoft ADO.NET 2.0 204گام به گام با

. كاربردي را ببنديدةبرنام.4

يكه كمكب شارپسي: وجود آوريدبه مستقل DataTable كد،

به.1 : اضافه كنيدbtnAddTable_Click event handlerدر ويرايشگر كد، سطور زير را

DataTable dtNew; dtNew = new DataTable("New Table"); ShowDetails(dtNew);

را بهDataTableيك فوق،سطور بهمتعلق ShowDetailsبا استفاده از روال(وجود آورده، جزئيات آنscaffolding(مية برروي فرم برنام .گذارد كاربردي به نمايش

برةبراي اجراي برنام.2 . فشار دهيدF5روي كليد كاربردي،. كليك كنيدIndependent Tableبرروي.3

ميةبرنام .گذارد كاربردي جزئيات جدول جديد را به نمايش

. كاربردي را ببنديدةبرنام.4

205ها DataTable كاربرد/ فصل هفتم

در زمان اجراDataSetهاي DataTableايجاد

آن چهار متد، كه مي استفاده DataSet هاي جدولة به مجموعDataTableها براي افزودن صريح توان ازميةباشيد كه اين متدها درمجموعداشته توجه. اند ذكر شده7-2نمود، درجدول شوند، جداول فراخوانده

نه را فرامي()myDataSet.Tables.Addبراي مثال، . DataSetنه در خود و . را()myDataSet.Addخوانيم،به Add Table متدهاي7-2جدول DataSet متعلق

شرح متد

Add() يكDataTable جديد با نام TableNمي به كه در آورد، وجود.DataSet در اي متوالي عبارت است از شمارهNآن

Add(tableName) DataTableة جديد، با نام مشخص در رشتtableName به ،.آورد وجود مي

Add(tableName,

tableNamespace) و tableNameةدر رشت جديد، با نام مشخصDataTableيك.آورد مشخص، به وجود ميnamespaceدر

Add(dataTable) DataTable مشخص را به DataSetافزايد مي.

AddRange(tableArray) DataTable هاي موجود درtableArray را به DataSetافزايد مي.

مي بهTableN به نام DataTableيك،Addنخستين روايت متد كه وجود آنآورد، اي شمارهN در در اختيار نام جدول قرار دادن بدون DataTableه اين رفتار با ايجادك،توجه داشته باشيد. استمتوالي. خالي استاي رشتهTableName propertyدر مورد اخير،. متفاوت استسازنده

آن TableName propertyوجود آورده،بهي جديدAdd ،Add(tableName) ،DataTableروايت دوم متدميي مشخصةروي رشتبررا را جديدDataTable، نيز، Addسومين روايت متد. كند تنظيم وجودبهي

كهمياجازه،هآورد ( براي جدول مشخص كنيمnamespaceدهد .namespaceبندي منطقي گروهنوعي،، به.)اقالم است زمان مستقلي را كه درDataTable سازنده،بهمتعلق Add(dataTable)توانيم، با استفاده از روايت ميبه آورده وجوداجرا به مي. اضافه كنيمDataSetايم، كردن توانيم ازاين روايت، براي اضافه همچنين،

DataTableيك متعلق . ديگر استفاده كنيمDataSetبهمي،AddRangeروايت از دهد كه آرايه اين امكان را اين روايت، كاربرد. ها را اضافه كنيمDataTableاي

. استآسان، بسيارمكني به ديگري حركت ميDataSetهاي يك DataTableه زماني كه از به ويژ

Microsoft ADO.NET 2.0 206گام به گام با

ويژوال: اضافه كنيدUntyped DataSet را به DataTable كد، به كمك

بيسيك

به.1 : اضافه كنيدbtnDataSet_Click event handlerدر ويرايشگر كد، كد پايين را

Dim ds As DataSet Dim dt As DataTable ds = New DataSet() dt = ds.Tables.Add("DataSet Table") ShowDetails(dt)

را جديدDataSetاين كد، يكي را در آن بهDataTable با از(وجود آورده، جزئيات آن با استفادهبه ShowDetailsروال مية برروي فرم برنام)scaffolding متعلق .گذارد كاربردي به نمايش. فشار دهيدF5 كاربردي، بر روي كليدةاي اجراي برنامبر.2. كليك كنيدDataSet Tableةروي دكمبر.3.گذارد جديد را به نمايش ميDataTableو DataSet جزئيات، كاربرديمةبرنا.4

كبرنام.5 .اربردي را ببنديدة

شارپسي: اضافه كنيدUntyped DataSet رابهDataTable كد،كمكبه

: اضافه كنيدbtnDataSet_Click event handlerشگر كد، كد پايين را به در ويراي.1

DataSet ds; DataTable dt;

207ها DataTable كاربرد/ فصل هفتم

ds = new DataSet(); dt = ds.Tables.Add("DataSet Table"); ShowDetails(dt);

را جديدDataSetاين كد، يكي اده از با استف( در آن به وجود آورده، جزئيات آن را DataTable بامية برروي فرم برنام)scaffoldingبهمتعلق ShowDetailsروال .گذارد كاربردي به نمايش. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.2. كليك كنيدDataSet Tableةروي دكمبر.3.گذارد جديد را به نمايش ميDataTableو DataSet جزئيات، كاربرديةبرنام.4

. كاربردي را ببنديدةامبرن.5

DataAdapterها با استفاده از DataTable ايجاد

كه. آشنا شديم DataAdapter با شيء،“هاDataAdapter كاربرد”،4در فصل -دو متد شيء مذكور ديديممي- FillSchemaو Fillهاي به نام مي عرضه آن كند، كه ها دادهها از منبع ها براي بارگذاري داده توان از

واندن متد وجود نداشته اگر در زمان فراخ(هايي را DataTable از اين دو متد،يكهر. استفاده نمود.آوردميعنوان محصولي جنبي به وجودبه) باشند

ويژوال بيسيك : DataAdapter با استفاده از DataTableايجاد

به.1 : اضافه كنيدbtnDataAdapter_Click event handlerدر ويرايشگر كد، سطور زير را

Dim ds As DataSet ds = New DataSet("DataAdapter DataSet")

Microsoft ADO.NET 2.0 208گام به گام با

daCategories.FillSchema(ds, SchemaType.Source) ShowDetails(ds.Tables(0))

و سپس با استفاده از ايجاد كرده DataSetيك،اين سطور ،DataAdapter وجود جدول جديدي را به.آورد مي

. فشار دهيدF5 كاربردي، برروي كليدمةبراي اجراي برنا.2. كليك كنيد DataAdapter Tableةبرروي دكم.3

ميةبرنام .گذارد كاربردي، جزئيات جدول جديد را به نمايش

. كاربردي را ببنديدةبرنام.4

شارپسي: DataAdapter با استفاده از DataTableايجاد

: اضافه كنيدbtnDataAdapter_Click event handlerسطور زير را به در ويرايشگر كد،.1

DataSet ds; ds = new DataSet(); daCategories.FillSchema(ds, SchemaType.Source); ShowDetails(ds.Tables[0]);

ازايجاد كرده DataSetيك،اين سطور مي جدول جديدي رابهDataAdapter، وسپس بااستفاده .آورد وجود. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.2. كليك كنيدDataAdapter Tableةبرروي دكم.3ميةبرنام .گذارد كاربردي، جزئيات جدول جديد را به نمايش

209ها DataTable كاربرد/ فصل هفتم

. كاربردي را ببنديدةبرنام.4

هاDataTable پيكربندي

property هاي اوليهDataTable،شد7-3 در جدول آن مهم. انده ذكر سه ترين هستند، كه propertyهاDataColumn ،هاDataRow و مي Constraintها هر. كنند ها را كنترل آنيكدر ادامه، به جزئيات ها از

.خواهيم پرداخت DataTableهاي 7property-3جدول

Property شرح

CaseSensitive ميراها هاي رشته مقايسهگيچگون .كند مشخص

ChildRelation ءاي از اشيا مجموعهDataRelation كه ،DataTable فعلي جدول والد .هاست آن

Columns ةمجموعDataColumn ها، كه طرحDataTableدنساز را مشخص مي.

Constraints ةمجموعConstraint ها، كه توسطDataTableدنشو نگهداري مي.

DataSet DataSet،كهDataTableي عضوي از آن است فعل.

DefaultView DataView كه ،DataTableدهد را ارائه مي.

DisplayExpression ي نام جدول در واسط كاربر مورداستفاده قرار عبارتي كه براي ارائه.گيرد مي

ExtendedProperties از مجموعه .هاي سفارشي propertyاي

HasErrors به از رديفدهد، خطاهايي در هريك نشان مي DataTableهاي متعلق.وجود دارند يا خير

Microsoft ADO.NET 2.0 210گام به گام با

Property شرح

IsInitialized دهد نشان مي،DataTableمقداردهي اوليه شده يا خير .

MinimumCapacity اوليهةشمار DataRow به اختصاص يافته، مشخص DataTableها را، كه.سازد مي

Namespace XML namespace مربوط به DataTable.

ParentRelationships اي از اشياي مجموعهDataRelation كه ،DataTable فعلي جدول فرزند آن .است

Prefix پيشوند XML namespace مربوط به DataTable.

PrimaryKey ةها، كه به عنوان كليد اولي اي از ستون آرايهDataTableكنند عمل مي.

RemotingFormat SerializationFormatفاده مورد استDataTable.

Rows ةمجموعDataRow در ها، كه حاوي داده . هستندDataTableهاي موجود

TableName نامي كه در كد با آن نام بهDataTableشود ارجاع مي.

DataTableة، عالوه بر مجموعpropertyها، داراي تعداد ديگريpropertyظريف رفتارشاتبراي تنظيم . ند، ولي چندتايي نيز نياز به توضيح بيشتر دارندآشكارها propertyبيشتر اين دهاي كاركر. نيز هست گزيده روي مقدار تعريف طور پيش بهCaseSensitive property باشد، DataSetبه متعلقDataTableاگر

ميشودمي تنظيم DataSetشده براي بر، ولي در مورد. نمودoverride جدول به جدولة پايتوان آن راDataTableاينةگزيد مستقل، مقدار پيش property ،Falseاست .

و ChildRelationهاي مجموعه به،هاParentRelationها DataSetيهاDataRelation حاوي ارجاعاتيو والد به هستند، كه به ترتيب به ي هاDataTable در بيشتر. دهند ارجاع ميDataTableعنوان فرزند

تئوري با خود رابطه دارد، از لحاظ DataTable اگر مثالً، ولياست؛ Nullها اين مجموعهمقدار مستقل،. ها اضافه نمود صورت دستي به يكي از اين مجموعه را بهDataRelationتوان مي

.ها خواهيم پرداختDataview، به بحث پيرامون9در فصل

DefaultView property،و مرتبمي اجازه تعريف DataTableگزيده را براي سازي پيش دهد فيلترينگ. جديد است2 مايكروسافت ADO.NET، در propertyاين. كنيم

DisplayExpression property،مي مي مشخص . آيد كند كه نام جدول چگونه براي كاربر به نمايش درDisplayExpressionميسب ازعبارتي كه در زمان اجرا محا ميه آن. كند شود، استفاده propertyجا كه اين از

ميةجاي رشتبه نمايش نام شيوةةتوانيد از آن براي محاسبميكند، مثالً ساده از يك عبارت استفاده.جدول بر اساس محتويات آن استفاده كنيد

211ها DataTable كاربرد/ فصل هفتم

MinimumCapacity property)در ، integerنوعاز است، مقداري) جديد استADO.NET 2كهكه، ميزان حافظهpropertyاين. است50آنةگزيد مقدار پيش.ها تعداد رديفةدهند نشان از هماناي را

مييافته اختصاص DataTableابتدا به و هنگام بارگذاري داده تعيين مي كند، )از لحاظ اجرايي(تواند ها. بسيار مفيد باشد

property هايDataTableمانند propertyبا انتساب-شوند هاي هر شيء ديگر تنظيم مي )assignment (. مجموعهAddن متدند خود يك مجموعه است، با فراخواpropertyساده، يا، اگر

PrimaryKey Constraint ها

ك: استintegrity constraint،entity integrityترين نوع اي، مهم اطالعاتي رابطه در تئوري بانك ه هر اينو قابل به زبان. بايد منحصر به فرد باشد) اي، هر جزء از رابطه يا به زبان رابطه(رديف جدول عادي

ها وجود داشته باشند، كه منحصر به فرد اي از ستون ستون يك مجموعه بايدلزوماً، اين يعني فهم. باشند

روي يك آرايه يا يك يا چند برPrimaryKey property، با تنظيم NET Framework. اين اصل اساسي، درDataColumnمياي اعمال منحصر به فرد بودن مورد، كه بر . شود استفاده قرار خواهند گرفت، عملي

PrimaryKey property،كند را تحميل نميNET Framework ،entity integrity.ليكن، توجه داشته باشيد كهدرفتواند خالي باشد، در اين صورت، ردي مي . بودند خواه مجازDataTableهاي تكراري

ويژوال بيسيك: PrimaryKey Constraintنمايش

به.1 : اضافه كنيدbtnPrimaryKey_Click event handlerدر ويرايشگر كد، كد زير را

Dim ca As Data.DataColumn() Dim str As String Dim x As Integer ca = dsAdoSbs.Employees.PrimaryKey Select Case ca.Length Case 0 str = "There is no primary key set" Case 1 str = "The primary key is " & ca(0).ColumnName.ToString() Case Else str = "The primary key columns are " For x = 1 To ca.Length

Microsoft ADO.NET 2.0 212گام به گام با

str &= ca(x).ColumnName.ToString & " " Next End Select MessageBox.Show(str)

.گذارد را در يك قاب پيام به نمايش ميPrimaryKey propertyاين كد، . فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.2. كليك كنيدPrimary Keyةبرروي دكم.3

ميةبرنام .دهد كاربردي، كليد اوليه را در يك قاب پيام نمايش

. كاربردي، را ببنديدةبرنام.4

شارپسي: PrimaryKey Constraintنمايش

به.1 : اضافه كنيدbtnPrimaryKey_Click event handlerدر ويرايشگر كد، كد زير را

DataColumn[] ca; string str; ca = dsAdoSbs.Employees.PrimaryKey; switch (ca.Length) {

case 0: str = "There is no primary key set"; break;

213ها DataTable كاربرد/ فصل هفتم

case 1: str = "The primary key is " + ca[0].ColumnName.ToString(); break; default: str = "The primary key columns are "; for (int x = 1; x < ca.Length; x++) str += ca[x].ColumnName.ToString() + " "; break; }MessageBox.Show(str);

.گذارد را در يك قاب پيام به نمايش ميPrimaryKey propertyاين كد، . فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.2. كليك كنيدPrimary Keyةبرروي دكم.3

ميةبرنام .دهد كاربردي، كليد اوليه را در يك قاب پيام نمايش

. كاربردي، را ببنديدةبرنام.4

ها DataColumnايجاد

است، كه ساختار جدول را DataColumn، حاوي صفر يا چند شيء DataTableهاي ستونةمجموع FillSchema يا Fill هايها يا متد با استفاده از ويزارد پيكربندي منبع دادهDataTableاگر. كنند مشخص ميمي DataColumnايجاد شود، مي. آيند ها خود به خود به وجود آن همچنين، به توانيد صورت تعاملي ها را

. ايجاد كنيدDataSet Designerدر

Microsoft ADO.NET 2.0 214گام به گام با

DataSet Designerها با استفاده از DataColumn ايجاد

هر به آساني مي در، كه بهDataTableتوان به ، يا ويژوال شده ايجاد DataSet Designerصورت صريحبا خوداستوديو .نمود اضافه DataColumnوجود آورده، به DataAdapter آن را

وجود آوريد بهDataSet Designer در DataColumnيك

. دوبار كليك كنيدAdoSbsDataSet.xsd، بر روي Solution Explorerدر.1. كند باز ميDataSet Designer را در DataSetويژوال استوديو،

روي سپس بر ايد، كليك راست،ه، كه خود پيش از اين به آن اضافه كردCustomersDataTableروي.2Add و . را انتخاب كنيدColumn آنگاه كليك،

DataSet Designer،يكDataColumn به DataTableكند اضافه مي.

. تغيير دهيدfirstColumn را به DataColumnنام.34.DataSet Designerرا ذخيره كرده، ببنديد .كه روال( راbtnNewColumn_Click event handlerهمربوطيادداشت عالمت در ويرايشگر كد،.5

ShowDetails به . پاك كنيد)خواند را فراميscaffolding متعلق

215ها DataTable كاربرد/ فصل هفتم

. فشار دهيدF5 كاربردي، بر روي كليدةبراي اجراي برنام.6. كليك كنيدDSD Columnةبرروي دكم.7

.گذارد را به نمايش ميDataTable كاربردي، جزئياتةبرنام

. كاربردي را ببنديدةبرنام.8

ها در زمان اجراDataColumn ايجاد

بهمياگر ميوجود آوريدبه DataColumnكد كمك خواهيد كه درجدول( Newهاي توانيد از يكي ازسازنده،. استفاده كنيد)اند نشان داده شده4-7

DataColumnهاي سازنده7-4جدول

شرح متد

New() DataColumnمي، بدون نام يا عنوان ستون،ي جديد .آورد به وجود

New(columnName) DataColumnباي، جديدcolumnNameميبه، مشخص .آورد وجود

New(columnName,

dataType) DataColumnباي جديدcolumnNameبه مشخصةو نوع داد شده

ميبه،dataType پارامترةوسيل .آورد وجود

New(columnName,

dataType, expression) DataColumnباي، جديدcolumnName وdataTypeوجود مشخص به

مييآورد، كه با استفاده از عبارت مشخص مي .شود محاسبه

New(columnName,

dataType, expression,

mappingType)

DataColumnباي، جديدcolumnName وdataTypeوجود مشخص به MappingType محاسبه،ياده از عبارت مشخصآورد، كه با استف مي

مييستون مشخص .شود طراحي

Microsoft ADO.NET 2.0 216گام به گام با

ويژوال بيسيك: به وجود آوريدDataColumn كد، به كمك

به.1 : اضافه كنيدbtnRuntimeColumn_Click event handlerدر ويرايشگر كد، سطور زير را

dsAdoSbs.Customers.Columns.Add("Second Column", _ System.Type.GetType("System.String")) ShowDetails(dsAdoSbs.Customers)

را جديدDataColumn باال، سطور به نمايشآن را در DataTableسپس جزئياتو وجود آورده،بهي.گذارد مي

. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.2دكبر.3 . كليك كنيدRuntime Columnمةروي

.گذارد به نمايش ميColumns ستون جديد را در قاب فهرست، كاربرديمةبرنا

. كاربردي را ببنديدةبرنام.4

شارپسي: به وجود آوريدDataColumn كد، به كمك

به.1 : اضافه كنيدbtnRuntimeColumn_Click event handlerدر ويرايشگر كد، سطور زير را

dsAdoSbs.Customers.Columns.Add("SecondColumn", System.Type.GetType("System.String")); ShowDetails(dsAdoSbs.Customers);

را جديدDataColumn باال، سطور به نمايشآن را در DataTableسپس جزئياتو به وجود آورده،ي.گذارد مي

. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.2

217ها DataTable كاربرد/ فصل هفتم

دك.3 . كليك كنيدRuntime Columnةمبرروي.گذارد به نمايش ميColumns ستون جديد را در قاب فهرست، كاربرديةبرنام

. كاربردي را ببنديدةبرنام.4

ها DataColumnپيكربندي

Property ةهاي اوليDataColumn،شبيهبسياركه،اند شدهذكر7-5 در جدول property هاي هاي ستون.ندهستاي اطالعاتي رابطه در بيشتر بانكها داده

DataColumnهاي 7property-5جدول

Property شرح

AllowDbNull مي مشخص مي را خالي باقي گذاشت يا DataColumnتوان كند.خير

AutoIncrement كند سيستم خود، پس از اضافه شدن مشخص مي DataRow ها بهDataTable مقدار ،DataColumn New مي را .كند يا خير اضافه

AutoIncrementSeed مقدار شروعAutoIncrement در DataColumn.

AutoIncrementStep افزايشربا مقدار هر AutoIncrement در DataColumn.

Caption شود نام ستون كه در واسط كاربر نشان داده مي.

ColumnMapping MappingType مربوط به DataColumn.

ColumnName برايكدة مورد اشارنام DataColumn.

DataType ةنوع داد.NET Framework مربوط به DataColumn.

DateTimeMode كند كه مقادير مشخص ميDateTimeچگونه تفسير شوند .

Microsoft ADO.NET 2.0 218گام به گام با

Property شرح

DefaultValue مقدارDataColumnآندر( كه سيستم صورتي كه مقدار ديگر به.دهدميبدان) داده نشده باشد

Expression مقدارةعبارت مورداستفاده براي محاسب DataColumn .

ExtendedProperties ةمجموعproperty هاي سفارشي.

MaxLength حداكثر طول ستون متني.

Namespace XML namespaceبه مربوطDataColumn.

Ordinal موقعيتDataColumnها ستونة در مجموع.

Prefix د پيشونXML متعلق به DataColumn.

ReadOnly ش مشخص مي DataColumnحاوي DataRowدنكند، پس از افزوده.را تغيير داد يا خيرآن توان مقدار، ميDataTableبه

Table DataTable كه DataColumnتعلق بدان دارد .

Unique كند مشخص ميDataRow در مورد نظرDataTable بايد حاوي ،. باشد يا خيرDataColumnر منحصر به فردي براي اين مقادي

هاي محاسبه شده ايجاد ستون

Expression property در DataColumn،و براساس نگارش امكان ايجاد مقادير ستون را در زمان اجرابه ساده مياي از عبارت مي. آورد وجود ها در همان DataColumn براساس ديگر،توان مقادير را

DataTable يا DataTable در . محاسبه نمود،DataSetهاي ديگر

ويژوال بيسيك: محاسبه شدهDataColumnايجاد

: اضافه كنيدbtnCalculated_Click event handlerدر ويرايشگر كد، سطور زير را به انتهاي.1

col = dsAdoSbs.Employees.Columns.Add("FullName", _ System.Type.GetType("System.String")) col.Expression = "FirstName + ' ' + LastName" MessageBox.Show(dsAdoSbs.Employees.Rows(0).Item("FullName")

219ها DataTable كاربرد/ فصل هفتم

به،سطور فوق و سپس مقدارآن را در قاب پيام يك ستون محاسبه شده به نمايشيوجود آورده،.باشددرآمدهت به اين صورevent handlerبايد، حال. گذارد مي

Private Sub btnCalculated_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCalculated.Click Dim ta As AdoSbsDataSetTableAdapters.EmployeesTableAdapter ta = New AdoSbsDataSetTableAdapters.EmployeesTableAdapter() ta.Fill(dsAdoSbs.Employees)

'Put exercise code here Dim col As DataColumn col = dsAdoSbs.Employees.Columns.Add("FullName", _ System.Type.GetType("System.String")) col.Expression = "FirstName + ' ' + LastName"

MessageBox.Show(dsAdoSbs.Employees.Rows(0).Item("FullName")) End Sub

برة برنامبراي اجراي.2 . فشار دهيدF5روي كليد كاربردي،. فشار دهيدCalculatedةروي دكمبر.3

ميةبرنام .گذارد كاربردي، نام كامل نخستين كارمند را به نمايش

. كاربردي را ببنديدةبرنام.4

Microsoft ADO.NET 2.0 220گام به گام با

شارپسي: محاسبه شدهDataColumnايجاد

: اضافه كنيدbtnCalculated_Click event handlerي در ويرايشگر كد، سطور زير را به انتها.1

DataColumn col; col = dsAdoSbs.Employees.Columns.Add("FullName", System.Type.GetType("System.String")); col.Expression = "FirstName + ' ' + LastName"; MessageBox.Show(dsAdoSbs.Employees.Rows[0]["FullName"].ToString());

به،سطور فوق و سپس مقدارآن را در قاب پيام يك ستون محاسبه شده به نمايشيوجود آورده،.باشددرآمده به اين صورت event handlerبايد، حال. گذارد مي

private void btnCalculated_Click(object sender, EventArgs e) {

AdoSbsDataSetTableAdapters.EmployeesTableAdapter ta; ta = new AdoSbsDataSetTableAdapters.EmployeesTableAdapter(); ta.Fill(dsAdoSbs.Employees);

//Put exercise code here: DataColumn col; col = dsAdoSbs.Employees.Columns.Add("FullName", System.Type.GetType("System.String")); col.Expression = "FirstName + ' ' + LastName";

MessageBox.Show(dsAdoSbs.Employees.Rows[0]["FullName"].ToString()); }

. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.2. فشار دهيدCalculatedةبر روي دكم.3

ميةبرنام .گذارد كاربردي، نام كامل نخستين كارمند را به نمايش

221ها DataTable كاربرد/ فصل هفتم

. كاربردي را ببنديدةبرنام.4

ها Constraint افزودن

هاي حفظ يكپارچگي داده،DataTable به متعلق PrimaryKey property در كنار، Constraintsةمجموعنقشمي به Constraint، خود، چندين نوع ADO.NET. است DataTableداخل عنوان مثال، هنگاميبه. آورد وجود

مي DataRelationكه وجود مربوط به آن را به ForeignKey Constraint، خود،ADO.NET، كنيد ايجادكه؛آورد مي ADO.NET Uniqueكنيد، تنظيم ميTrueرويبرراي ستونUnique propertyو وقتي

Constraint ميرا .آورد به وجود.اند نشان داده شده7-6 است، كه در جدول property داراي سه System.Data.Constraintشيء

Constraintهاي 7property-6جدول

Property شرح

ConstraintName نامConstraint

ExtendedProperties از مجموعه هاي سفارشي propertyاي

Table DataTable كه Constraint تعلق بدان دارد .

و ظرفي،، روشن است، كه شيء در. چنداني نداردةدر اعمال يكپارچگي فايدخود كه تنها نامي استكهي جديدي ازيكي اشياة واقعي، نمون كاربردي هاي برنامه به ارث ميConstraintازي : آوريم وجودميبرند،

ForeignKeyConstraint يا UniqueConstraint .

ForeignKeyConstraint ها

ForeignKeyConstraint،دو هاي مختلف يك جدول رابطه بين رديف)در موارد نادر( يا DataTable بينكه، اين است كه هر مقد آن، اساساً حسابحرف. كند برقرار مي ازهاي مشخص ستوندر اري جدولي

.وجود داشته باشدنيز شود، بايد در جدول والد فرزند يافت مي

Microsoft ADO.NET 2.0 222گام به گام با

Property هاي شيءForeignKeyConstraint ،اين. اند نشان داده شده7-7 در جدولConstraint بيانگر ي يا رديفهافرزندي بين جدول- والدةقواعدي است كه زماني كه رابط ك جدول وجود دارد، اعمال هاي

.شوند مي ForeignKeyConstraintهاي 7property-7جدول

Property شرح

AcceptRejectRule هاي كه پس از فراخواندن متد،دكن اقدامي را مشخص مي AcceptChanges .گيرد صورت ميDataTableبهمتعلق RejectChangesيا

Columns هاي فرزند براي ستونةمجموعConstraint .

DelteRule گيرد اقدامي كه پس از حذف رديف صورت مي.

ExtendedProperties ةمجموعpropertyهاي سفارشي.

RelatedColumns بر ستونةمجموع . Constraintياهاي والد

RelatedTable DataTable والد براي Constraint .

Table براي بازپس دادنDataTableفرزند براي Constraint ،Constraint.Table را overrideكند مي.

UpdateRule گيرد، مشخص اقدامي را كه پس از روزآمد شدن رديف صورت مي.سازد مي

سهن صورت گير Constraintاقداماتي كه قرار است از سوي : شوند مشخص ميpropertyد، باAcceptRejectRule ،DelteRule،وUpdateRule. UpdateRuleو DelteRuleهاي None .property يا Cascade عبارتند ازAcceptRejectRuleمقادير احتمالي

ب را مي هرةگزيد مقدار پيش. اند، تنظيم نمود نشان داده شده7-8 تمام مقاديري كه در جدول رويرتوان.Cascade عبارت است از propertyدو

عملة مقادير قاعد7-8جدول

شرحارمقد

Cascade مي رديف .كند هاي مربوطه را حذف يا روزآمد

None آورد هيچ اقدامي برروي رديف مربوطه به عمل نمي.

SetDefault ةگزيد هاي مربوطه برروي مقادير پيش مقادير را در رديفمي آن .كند ها تنظيم

SetNull بر مقادير را در رديف .كند تنظيم ميNullروي هاي مربوطه

ForeignKeyConstraint به ها رامي ، DataSet Designerدر. طورصريح ايجاد نمودتوان تنها درزمان اجراForeignKeyConstraint به مي بهDataRelationصورت محصوالت فرعي ايجاد ها .آيند وجود

223ها DataTable كاربرد/ فصل هفتم

اند، نشان داده شده7-9، كه در جدول Newةهاي سازند توان از يكي از روايت در زمان اجرا، مي(استفاده نمود ..NET Frameworkآن دو روايت ديگر از سازنده عرضه مي براي ها صرفاً كند، ولي

.) داخلي ويژوال استوديو هستندةاستفاد ForeignKeyConstraint سازندگان7-9جدول

شرح متد

New(parentColumn,

childColumn) و فرزند DataColumnبا، جديد ForeignKeyConstraintيك هاي والد

مي،مشخص .كند ايجاد

New(parentColumn[],

childColumn[]) و DataColumnهاي با آرايه، جديد ForeignKeyConstraintيك والد

مي،فرزند مشخص .كند ايجاد

New(name,

parentColumn,

childColumn)

و، جديد ForeignKeyConstraintيك و DataColumn با نام هاي والدمي،فرزند مشخص .كند ايجاد

New(name,

parentColumn[],

childColumn[])

و آرايه، جديد ForeignKeyConstraintيك والد DataColumnهاي با ناممي،و فرزند مشخص .كند ايجاد

. اضافه كنيدDataSet Designer به ForeignKeyConstraintيك

. دوبار كليك كنيد ConstraintDataSet.xsd برروي،Solution Explorerدر.1.كند باز ميDataSet Designer را در DataSetويژوال استوديو

Microsoft ADO.NET 2.0 224گام به گام با

بهة را از جعبRelationكنترل.2 . بكشيدOrderDetails موسوم به TableAdapter ابزارDataSet Designer يك قاب گفتگوي Relationكند باز مي.

. را انتخاب كنيدBoth Relation And Foreign Key Constraintةينگز.3

و Update Rule ،Delete Ruleگزيده را براي مقادير پيش.4 ،Accept/Reject Rule و سپس پذيرفته،. كليك كنيدOKبرروي

DataSet Designer ،ForeignKeyConstraint وDataRelationمي را به .آورد وجود5.DataSet ،را ذخيره كرده DataSet Designerرا ببنديد .. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.6. كليك كنيدForeign Keyةبرروي دكم.7

.گذارد جديد را به نمايش مي constraint كاربردي،ةبرنام

. كاربردي را ببنديدةبرنام.8

225ها DataTable كاربرد/ فصل هفتم

UniqueConstraint ها

UniqueConstraint مي ها، همان طور كه از اسم هر شان پيداست، تضمين DataTable در DataRowكنند كهيكيحاوي مقدار منحصر به فرد PrimaryKey property. باشد مشخص DataColumn يا چند براي

مي بهUniqueConstraint، كه پيش از اين با آن آشنا شديم، نوع خاصي از DataTableبه متعلق د، آور وجود.داد قرار Findتوان در اختيار متد را ميPrimaryKey) هاي( ستونبار اينبا اين تفاوت كه

property هايUniqueConstraint اند شدهذكر7-10 در جدول. UniqueConstraintهاي 7property-10جدول

Property شرح

Columns ةآرايDataColumnهاي مورد استفاده.

ConstraintName نامUniqueConstraint.

ExtendedProperties ةمجموعproperty هاي سفارشي.

IsPrimaryKey دهد نشان ميConstraint ،primary keyيا جدول را مشخص مي كند.خير

Table DataTable كه Constraint تعلق بدان دارد .

UniqueConstraintتوان، همچون را ميForeignKeyConstraint در ،DataSet Designer يا در زمان اجرا تك UniqueConstraintتوانميفقط، DataSet Designerدر. ايجاد نمود به هاي و اين ستوني وجود آورد،

. ميسر استDataTable به متعلق UniqueConstraint تنها با تنظيم نيزكار نشان7-11 كه در جدول،UniqueConstraintةدهاي سازن توان از يكي از روايت در زمان اجرا، مي

.اند، استفاده نمود داده شده UniqueConstraintهاي سازنده7-11جدول

شرح متد

New(column) يكUniqueConstraint جديد، در DataColumnمي، مشخص .كند ايجاد

New(column[]) يكUniqueConstraintة جديد، در آرايDataColumnمي، مشخص .كند ايجاد

New(column,

isPrimaryKey) مي مشخصDataColumnة جديد در آرايUniqueConstraintيك و ايجاد كند،

. هست يا خيرprimary key ستون مزبور نمايد اشاره مي

New(column[],

isPrimaryKey) و مشخص ايجاد ميDataColumnة جديد در آرايUniqueConstraintيك كند،مياش . هست يا خيرprimary key ستون مزبورة آراينمايد اره

Microsoft ADO.NET 2.0 226گام به گام با

شرح متد

New(name, column) يكUniqueConstraintايجاد،و با نام مشخص جديد، در ستون مشخص .كند مي

New(name,

column[]) ،و با نام مشخص ستون مشخصة جديد، در آرايUniqueConstraintيك

.كند ايجاد مي

New(name, column,

isPrimaryKey) و با نام مشخص ايجاد جديد در ستون مشخصUniqueConstraintيكمي مي و نشان . هست يا خيرprimary keyدهد ستون مزبور كند،

New(name,

column[],

isPrimaryKey)

و با نام مشخص ايجاد جديد در ستون مشخصUniqueConstraintيكمي مي و نشان . هست يا خيرprimary keyن مزبور ستوةدهد آراي كند،

ويژوال بيسيك: اضافه كنيدرا UniqueConstraint كد، به كمك

به.1 : اضافه كنيدbtnUnique_Click event handlerدر ويرايشگر كد، سطور زير را

Dim ucNew As UniqueConstraint ucNew = New UniqueConstraint("MasterValue", dsAdoSbs.Orders.ShipNameColumn) dsAdoSbs.Orders.Constraints.Add(ucNew) ShowDetails(dsAdoSbs.Orders)

آوبهي جديدUniqueConstraint،اين سطور .كند اضافه ميOrders، آن را به جدولدهروجود. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.2. كليك كنيدUniqueةبرروي دكم.3

كهةبرنام مي جديد را نشان مي Constraint كاربردي، جزئيات جدول را، .گذارد دهد، به نمايش

227ها DataTable كاربرد/ فصل هفتم

. كاربردي را ببنديدةبرنام.4

سي: اضافه كنيدرا UniqueConstraint كد، به كمك شارپ ويژوال

به.1 : اضافه كنيدbtnUnique_Click event handlerدر ويرايشگر كد، سطور زير را

UniqueConstraint ucNew; ucNew = new UniqueConstraint("MasterValue", dsAdoSbs.Orders.ShipNameColumn); dsAdoSbs.Orders.Constraints.Add(ucNew); ShowDetails(dsAdoSbs.Orders);

آوبهي جديدUniqueConstraint،اين سطور .كند اضافه ميOrders، آن را به جدولدهروجود. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.2. كليك كنيدUniqueةبرروي دكم.3

كهةبرنام مي جديد را نشان مي Constraint كاربردي، جزئيات جدول را، .گذارد دهد، به نمايش

. كاربردي را ببنديدةبرنام.4

Microsoft ADO.NET 2.0 228گام به گام با

ها DataRowايجاد

به DataRow. استDataTable در جودموهاي واقعي دادهبيانگر،DataRowشيء ها تنها در زمان اجرادر(عنوان بخشي از يك مجموعه، قبل از هر چيز بهDataTableها، همچون خود DataRow. آيند وجود مي

مي) DataTableهاي رديفازاين مورد خاص، بخشي آن مفيدند، ولي به توان و پيش از ها را طور مستقلو پيكربندي نمودنيز DataTableاضافه شدن به .ايجاد

و ژنريك به وجود آوردDataRow شيءتوان نمي تنها با فراخواندن يكي از متدهايء اين اشيا- كليNew<rowType> از شيء DataTableدر مورد. آيند به وجود ميUntyped DataSet تنها يك روايت از اين ،كه-New<Type>Row-كنند ها روايت ديگري بدان اضافه ميNewRow .Typed DataSet:متد وجود دارد

از كه نمونهDataTableبراي مثال، . DataSetة در ردDataTable عبارت است از نام <Type>در آن اي را NewEmployeeRowدهد، متدي به نام را ارائه ميAdoStepByStep اطالعاتي از بانكEmployeesجدول

.كند عرضه ميمييدو روايت متد كه نتايج اندك متفاوت با( ژنريك DataRowكه،NewRowمتد: دهند بازپس هر چند

مي) DataTableطرح در مثال ما،. دهد بازپس ميtyped DataRowكه،New<Type>Rowو متد؛دهد بازپسNewEmployeeRow يك EmployeesRowدهد بازپس مي.

به Rows propertyاز آنجا كه ميصورتبه،DataRow متعلق با توان داده مجموعه است، هاي جديد را. اضافه نمود)اند نشان داده شده7-12كه در جدول( Addاستفاده از يكي از دو شكل متد

Rows.Add متدهاي7-12جدول

شرح متد

Add(DataRow) DataRowبهي مشخص .كند اضافه ميDataTable را

Add(dataValues[]) DataRowبر به جدولي جديد و مقادير اقالم آن را روي مقادير اضافه،.كند تنظيم ميdataValues در آرايه مشخص

ويژوال بيسيك : DataRowايجاد

دو.1 و به برنامDataRowدر ويرايشگر كد، سطور زير را، كه كاربردي اضافهة را به وجود آوردهدر كند، در جاي مشخص مي : اضافه كنيدbtnNewRow_Click event handlerةميانشده

dr = dsAdoSbs.Employees.NewRow() dsAdoSbs.Employees.Rows.Add(dr) dEr = dsAdoSbs.Employees.NewEmployeesRow() dsAdoSbs.Employees.Rows.Add(dEr)

229ها DataTable كاربرد/ فصل هفتم

:ر، اكنون بايد به اين صورت باشدظنروال مورد

Private Sub btnNewRow_Click(ByVal sender As System.Object,_ ByVal e As System.EventArgs) Handles btnNewRow.Click Dim dr As Data.DataRow Dim dEr As AdoSbsDataSet.EmployeesRow

Dim str As String str = "The Employees table has " str &= dsAdoSbs.Employees.Rows.Count str &= " rows." MessageBox.Show(str)

'Add exercise code here: dr = dsAdoSbs.Employees.NewRow() dsAdoSbs.Employees.Rows.Add(dr) dEr = dsAdoSbs.Employees.NewEmployeesRow() dsAdoSbs.Employees.Rows.Add(dEr)

str = "Now the Employees table has " str &= dsAdoSbs.Employees.Rows.Count str &= " rows." MessageBox.Show(str) End Sub

. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.2. كليك كنيدNew Rowةبرروي دكم.3

رايها كاربردي تعداد رديفةبرنام و بعد ازدورديفي به، قبل مي زگي افزوده شدهتا كه .دهد اند، نشان

Microsoft ADO.NET 2.0 230گام به گام با

. كاربردي را ببنديدةبرنام.4

سي: DataRowايجاد شارپ ويژوال

دو.1 و به برنام را بهDataRowدر ويرايشگر كد، سطور زير را، كه كاربردي اضافهةوجود آوردهدر كند، در جاي مشخص مي :اضافه كنيدbtnNewRow_Click event handlerةميانشده

dr = dsAdoSbs.Employees.NewRow(); dsAdoSbs.Employees.Rows.Add(dr); dEr = dsAdoSbs.Employees.NewEmployeesRow(); dsAdoSbs.Employees.Rows.Add(dEr);

:ر، اكنون بايد به اين صورت باشدظنروال مورد

private void btnNewRow_Click(object sender, EventArgs e) {

DataRow dr; AdoSbsDataSet.EmployeesRow dEr;

string str; str = "The Employees table has "; str += dsAdoSbs.Employees.Rows.Count.ToString(); str += " rows."; MessageBox.Show(str);

//Add exercise code here:

231ها DataTable كاربرد/ فصل هفتم

dr = dsAdoSbs.Employees.NewRow(); dsAdoSbs.Employees.Rows.Add(dr);

dEr = dsAdoSbs.Employees.NewEmployeesRow(); dsAdoSbs.Employees.Rows.Add(dEr);

str = "Now the Employees table has "; str += dsAdoSbs.Employees.Rows.Count.ToString(); str += " rows."; MessageBox.Show(str);

}

. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.2. كليك كنيدNew Rowةروي دكمبر.3

رايها كاربردي تعداد رديفةبرنام و بعد ازدورديفي به، قبل مي تازگي افزوده شده كه .دهد اند، نشان

. كاربردي را ببنديدةبرنام.4

ها DataRowپيكربندي

به10در فصل . خواهيم پرداختRowState property، به طور مفصل

Property هايDataRow بيشتر اين كاركرد. اند ذكر شده7-13 در جدول propertyهايشان از نام،هاو در فصل جا مختصراً است، كه در اينRowStateتنها استثناء. پيداست ،10 به آن خواهيم پرداخت،

و روزآمدسازيو” به“ها دادهيرايش .طور مفصل آن را شرح خواهيم داد،

Microsoft ADO.NET 2.0 232گام به گام با

DataRowهاي 7property-13جدول

Property شرح

HasErrors در نشان مي . وجود دارندDataRowدهد، كه خطاهايي

Item مقدارDataColumn در DataRow.

ItemArray مقادير تمامDataColumn ها درDataRowاند داده شدهصورت يك آرايه نشان، كه به.

RowError شرح خطاي سفارشي براي يكDataRow.

RowState DataRowState از يك DataRow.

Table DataTable كه DataRowتعلق بدان دارد .

DataTable متدهاي كاربرد

آن. اند ذكر شده7-14 در جدول DataTable مورد پشتيبانيةمتدهاي اولي كه10ها در فصل به بيشتر ،و روزآمدسازي داده .ها، خواهيم پرداخت نگاهي است به ويرايش

DataTable متدهاي7-14جدول

شرح متد

AcceptChanges الوقوع در تمام تغييرات قريبDataRowكند ها را تعهد مي.

BeginInit دادن مقادير اوليه بهDataTable ميرا . كند آغاز

BeginLoadData است، بارگذاريها در حال دادهدر حالي كه حجمي از notification ،هاindex

maintenance وconstraint enforcementمتدهايباسازد؛ همراه را غيرفعال مي LoadDataRow وEndLoadDataگيرد مورداستفاده قرار مي.

Clear مةهDataRow از .كند پاك ميDataTableها را

Clone ساختارDataTableكندمي را كپي.

Compute انباشتهمياقدام)aggregate(برروي DataTable دهدميصورت .

Copy و داده .DataTableهاي ساختار

CreateDataReader DataTableReader مربوط به DataRow در .دهد را بازپس ميDataTableها

EndInit ةمقداردهي اوليDataTableدهد را خاتمه مي.

EndLoadData ها، پس از انجام بارگذاري حجمي از دادهnotification ،هاindex maintenance .گيرد را از سر ميconstraint enforcementو

233ها DataTable كاربرد/ فصل هفتم

شرح متد

GetChanges يك نسخه ازDataTable،همة حاوي DataRowدهد هاي تغيير يافته، بازپس مي.

GetErrors از آرايه ميهاي حاوي خطا بهDataRow اي .وردآ دست

GetObjectData شيءSerializationInfo با اطالعات الزم براي سريالي كردن ،DataTable،را.دهد بازپس مي

ImportRow از يكDataRow،يك و وضعيت رديف، در داخل حاوي تمام مقادير رديفDataTableكند كپي مي.

Load DataTable را، با DataRowميهاي مشخص، ها از منبع داده .كند پر

LoadDataRow در جريان روزآمدسازي انبوهDataTable براي روزآمدسازي يا افزودن ،DataRowگيرد جديد، مورداستفاده قرار مي.

Merge دوDataTableكند را در هم ادغام مي.

NewRow DataRowميبهي جديد . همخواني داردDataTableآورد، كه با طرح وجود

NewRowArray از آرايه همخواني دارند، DataTableهاي جديد را، كه با طرح DataRowاي.دهد بازپس مي

ReadXml طرحXMLدرو داده .خواند را ميDataTableها

ReadXmlSchema طرحXML در DataTableخواند را مي.

RejectChanges در تمام تغييرات قريب .گرداند را باز ميDataTableالوقوع

Reset DataTableًمي در وضعيت اصلي را مجددا .كند اش تنظيم

Select ءاي از اشيا آرايهDataRowآورد را به دست مي.

WriteXml DataTable را در قالب XMLكند سريالي مي.

WriteXmlSchema طرحDataTable را در قالب XMLكند سريالي مي.

Select متد

به،Selectاز متد . شود استفاده ميDataTableدري موجودها اي از داده دست آوردن زيرمجموعه براياز بلكه آرايه،ثيري بر محتويات جدول نداردأتSelectمتد دهد، كه با معياري ها را بازپس ميDataRowاي

.كه مشخص شده مطابقت دارند

Microsoft ADO.NET 2.0 234گام به گام با

به“هاDataView كاربرد”، نهمكه در فصل، نيز،DataViewتذكر و، آن خواهيم پرداخت، امكان فيلترمي DataRowمرتب كردن .دهد ها را

كه امكان مشخص كردن-را7-15هاي مذكور در جدول روايتو، است Select ،overloadمتدو نظم مي هاي بازDataRowي براي مرتب كردن معيناختياري معيارهاي گزينش -دهند پس داده شده را

را مشخصsortOrderةهايي از اين متد، كه رشتيتروا.دنكن عرضه مي را DataRow، كنند عرضه نميي ،هاكه- مشخص نشدهDataTable متعلق به PrimaryKey propertyاگر- يا primary key به ترتيب به ترتيبيDataRow به مي افزوده شدهDataTableها .دهند اند، بازپس

Select متدهاي7-15جدول

رحش متد

Select() اي از تمام آرايهDataRow در .دهد را بازپس ميDataTableهاي موجود

Select(filterString) از آرايه را كه، با معيارهاي DataTableهاي موجود در DataRow اي.دهد سازگارند، بازپس ميfilterStringشده مشخص

Select(filterString,

sortOrder) از آرايه در DataRowاي را كه، با معيارهاي DataTableهاي موجود

sortOrder سازگارند، به ترتيبي كه توسط filterStringشده مشخصمي مشخص .دهد شده، بازپس

Select(filterString,

sortOrder,

dataViewRowState)

از آرايه را كه، با معيارهاي DataTableهاي موجود در DataRow اي sortOrder سازگارند،با DataViewRowStringوfilterStringشده مشخص

.دهد مشخص، بازپس مي

از زيرمجموعه به نمايش Selectها را، بااستفاده از متد DataRowاي

ويژوال بيسيك: گذاريد

اضافه btnSelect_Click event handlerدر ويرايشگر كد، كد زير را در محل مشخص شده به انتهاي.1:كنيد

Dim drFound() As AdoSbsDataSet.EmployeesRow drFound = dsAdoSbs.Employees.Select("LastName LIKE 'D*'") str = "There are "

235ها DataTable كاربرد/ فصل هفتم

str &= drFound.Length.ToString() str &= " Employees whose surname begins with 'D'" MessageBox.Show(str)

كد آن،اين ر Employee تنها شوند، انتخاب شروع ميDشان با حرف هاي خانوادگيا كه نامهامحال،. كند مي :نظر به اين صورت باشدوردبايد روال

Private Sub btnSelect_Click(ByVal sender As System.Object,_ ByVal e As System.EventArgs) Handles btnSelect.Click 'Fill the table Dim ta As AdoSbsDataSetTableAdapters.EmployeesTableAdapter ta = New AdoSbsDataSetTableAdapters.EmployeesTableAdapter() ta.Fill(dsAdoSbs.Employees)

'Display the number of rows Dim str As String str = "The Employees DataTable has " str &= dsAdoSbs.Employees.Rows.Count.ToString() str &= " rows." MessageBox.Show(str)

'Place exercise code here: Dim drFound() As AdoSbsDataSet.EmployeesRow drFound = dsAdoSbs.Employees.Select("LastName LIKE 'D*'") str = "There are " str &= drFound.Length.ToString() str &= " Employees whose surname begins with 'D'" MessageBox.Show(str)

End Sub

. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.2. فشار دهيدSelectةروي دكمبر.3

Microsoft ADO.NET 2.0 236گام به گام با

و سپس تعداد رديف DataRow كاربردي، شمار كليةبرنام شدهي انتخابها هاي موجود در جدول. گذارد را، به نمايش مي

. كاربردي را ببنديدةبرنام.4

از زيرمجموعه به نمايش Selectها را، با استفاده از متد DataRowاي

سي: گذاريد شارپ ويژوال

اضافه btnSelect_Click event handlerدر ويرايشگر كد، كد زير را در محل مشخص شده به انتهاي.1:كنيد

DataRow[] drFound; drFound = dsAdoSbs.Employees.Select("LastName LIKE 'D*'"); str = "There are "; str += drFound.Length.ToString(); str += " Employees whose surname begins with 'D'"; MessageBox.Show(str);

كد آن،اين شوند، انتخاب شروع ميDشان با حرف هاي خانوادگي ها را كه نام Employee تنها:بايد روال موردنظر به اين صورت باشدحال،. كند مي

private void btnSelect_Click(object sender, EventArgs e) {

//Fill the table AdoSbsDataSetTableAdapters.EmployeesTableAdapter ta;

237ها DataTable كاربرد/ فصل هفتم

ta = new AdoSbsDataSetTableAdapters.EmployeesTableAdapter(); ta.Fill(dsAdoSbs.Employees);

//Display the number of rows string str; str = "The Employees table has "; str += dsAdoSbs.Employees.Rows.Count.ToString(); str += " rows."; MessageBox.Show(str);

//Place exercise code here: DataRow[] drFound; drFound = dsAdoSbs.Employees.Select("LastName LIKE 'D*'");

str = "There are "; str += drFound.Length.ToString(); str += " Employees whose surname begins with 'D'"; MessageBox.Show(str); }

بر.2 . فشار دهيدF5 كاربردي، برروي كليدةنامبراي اجراي. فشار دهيدSelectةبرروي دكم.3

و سپس تعداد رديفDataRow كاربردي، شمار كليةبرنام شده هاي انتخاب هاي موجود در جدول. گذارد را، به نمايش مي

. كاربردي را ببنديدةبرنام.4

Microsoft ADO.NET 2.0 238گام به گام با

DataRowكاربرد متدهاي

اينبيشتر. اند نشان داده شده7-16شوند، در جدول پشتيباني ميDataRow متدهايي كه از سوي شيءميها مورد هنگام ويرايش داده،متدها و درفصل استفاده قرار آن مفصال10ًگيرند، .ها خواهيم پرداخت به

DataRow متدهاي7-16جدول

شرح متد

AcceptChanges در تغييرات قريبهمة مي را تعهDataRowالوقوع .كندد

BeginEdit مي .كند اقدام به ويرايش را آغاز

CancelEdit مي .كند اقدام به ويرايش را ملغي

ClearErrors مي .كند تمام خطاهاي وارده به رديف را پاك

Delete مي .كند رديف را حذف

EndEdit مي .دهد اقدام به ويرايش را خاتمه

GetChildRows هاي فرزند رديف همةDataRowمي را به .آورد دست

GetColumnError بهيشرح خطاي ستون مشخص مي را .آورد دست

GetColumnsInError ميراها هاي حاوي خطا اي از ستون آرايه .دهد بازپس

GetParentRow رديف والدDataRow را، براساس DataRelationآورد، به دست مي.

GetParentRows هاي والد رديفDataRow را، براساس DataRelationآورد، به دست مي.

HasVersion مي از نشان . وجود دارد يا خيرDataRowدهد روايت خاصي

InNull مي .دهد ستون خاصي خالي است يا خير نشان

RejectChanges در تغييرات قريبهمة .گرداند را بازميDataRowالوقوع

SetAdded RowState مربوط به DataRow را، به Addedدهد تغيير مي.

SetColumnError مي .كند شرح خطاي ستون را تنظيم

SetModified RowState مربوط به DataRow را، به Modifiedدهد تغيير مي.

SetParentRow رديف والدDataRowكند را تنظيم مي.

DataTableپاسخ دادن به رويدادهاي

هر. اند ذكر شده7-17 هستند، در جدول DataTable رويدادهايي كه مورد پشتيباني اين رويدادها، قبل ازو اعتباربخشي به دادهبه،چيز و در فصول عنوان بخشي از فرآيند ويرايش به14و10ها مفيدند،

.ها خواهيم پرداخت جزئيات آن

239ها DataTable كاربرد/ فصل هفتم

DataTable رويدادهاي7-17جدول

شرح رويداد

ColumnChanged فتن پس از تغيير ياDataColumnشود مطرح مي.

ColumnChanging پيش از تغيير يافتنDataColumnشود مطرح مي.

Intialized پس از تعيين مقدار اوليه شدنDataTableشود، مطرح مي.

RowChanged پس از تغيير يافتنDataRowشود مطرح مي.

RowChanging پيش از تغيير يافتنDataRowشود مطرح مي.

RowDeleted پس از حذفDataRowشود مطرح مي.

RowDeleting پيش از حذفDataRowشود مطرح مي.

TableCleared پس از پاك شدنDataRowشود مطرح مي.

TableClearing پيش از پاك شدنDataRowشود مطرح مي.

TableNewRow هنگام افزوده شدنDataRow به DataTableشود مطرح مي.

صهخال

از، كه نمونهDataTableبادر اين فصل، . آشنا شديماي است، اطالعاتي رابطه بانكيك جدول در يك ايبه ها را درزمانDataTable توان ديديم كه چگونه مي و يكچههاي اجرا وطراحي ايجاد، DataTableترتيبي

. اضافه نمودDataSetمستقل را بهو سپس توجه خويش را به DataSetهاي propertyنخست به ازاي هاي مجموعهproperty پرداختيم،

و Columnها، Constraint-آن هاي ها حاوي نمونه Constraintةمجموع. معطوف داشتيم-ها Rowهامي، كه يكپارچگي دادهاست foreign keyفردو هاي منحصربه Constraintةاولي ة مجموع.دسازن ها را عملي

Column ها، طرحDataTableو مجموع . استهاي واقعي حاوي داده،ها DataRowة را مشخص ساخته،و اضافه نمودن اقالم به هر يك از اين مجموعه نمونهدر ادامه، .ها را مشاهده نموديم هايي از ايجاد

،و نظري؛شوند، پرداختيم عرضه ميDataRowو DataTableسرانجام، به بررسي متدهايي كه توسطآن14و10، كه در فصول DataTable به رويدادهاي،نيز .ها خواهيم پرداخت، انداختيم به جزئيات

ل هشتمفص

هاTableAdapter كاربرد:در پايان اين فصل، خواهيد توانست

. وجود آوريد بهServer Explorer ،TableAdapterو TableAdapterبا استفاده از ويزارد پيكربندي�و در زمان اجرا، شيء� .وجود آوريد بهTableAdapterدر ويژوال استوديو.زيد بپرداTableAdapterةبه پيكربندي رد�. اضافه كنيدTableAdapterاستعالم را به�. را پيكربندي كنيدTableAdapterشيء�. را به اجرا درآوريدTableAdapterمتدهاي استعالم��DataRow و پيكربندي كنيد .ها را ايجاد. استفاده كنيدDataRowو DataTableاز متدهاي�

به TableAdapterدر فصول گذشته، ديديم كه به كمك ويزارد پيكربندي منبع دادهها ميها . آيند وجودبا تا اندازههاي پيش مالحظه كرده باشيد، حتي را در برخي از تمرينscaffoldingكد، تاكنون،اگر ايآنة ايجاد نمونةنحو و استفاده از به. ايد آشنا شده جديد رددر اين فصل، ازةطور مفصل به اين جديدپرءاشيا .داختخواهيم

هاTableAdapter درك

TableAdapterدرء ها اشيا يا(2 مايكروسافت ADO.NETجديدي بگوييم،تر دقيق، اگر خواسته باشيمومي)2005ويژوال استوديو رد، زيرا.آيند به حساب ADO.NET جزئي از TableAdapterة از نقطه نظر فني

وال ها، توسط ويژTableAdapterهاي بلكه، رده.روند شمار نمي مايكروسافت بهNET Framework.ياو به ميها، بهTypedDataSetعنوان بخشي از استوديو، در زمان طراحي .آيند وجود

TableAdapterءها قابليت اشياCommand وDataAdapter و پيوندي بين اين را با يكديگر تركيب،: طور كه خواهيم ديد، اين پيوند دو طرفه است همان.كند برقرار ميTypedDataSetو ساختارها قابليت

تغيير-كند را تعريف ميTableAdapter به متعلق Fillكه متد- را query (SQL(هنگامي كه استعالمو بالعكسخواهد داد را تغيير TableAdapter تعريف DataSet Designerدهيم، مي ،.

مي بهTypedDataSetال استوديو براي هايي كه توسط ويژو فايلةبراي مشاهد:توصيه آيند، وجود. كليك كنيد،Solution Explorer در نوار ابزار،Show All Filesةبرروي دكم

Microsoft ADO.NET 2.0 242گام به گام با

در داده) synchronize(، همگاه كردن DataAdapter، همچون TableAdapterنخستين هدف هاي موجودDataSetهاست هاي مبنع داده با داده .TableAdapter يك يا چند متد براي پر كردن ،DataSetها از منبع داده

درو روزآمد كردن منبع داده مي، DataSetها با تغييرات ايجاد شده .كند عرضهآن تعريف ميDataSetName>.Designer.vb>رده در داخل فايل <DataSetName>شود، كه البته در

بهها، در پايان فاTableAdapter. استTypedDataSetهمان نام DataSet>TableAdapter>صورت يل،

namespaceشوند تعريف مي.

NET Framework 2.0.، كه به تازگي وارد)partial class declarations(ها هاي ناقص رده اعالنويژگي:تذكرتقةترين نتيج فوري. تقسيم كنيم دهد تعريف رده را به چندين فايلمياجازهشده، امكان جدا سيم، اين

.است كد ايجاد شده توسط ويژوال استوديو از كد نوشته شده توسط كاربر ساختن

تعريف TableAdapters namespace ناقص جدا در داخلة به صورت يك ردTableAdapterهرمي) partial declaration(اعالن ناقص. شود مي را بدين معناست كه به آساني در يك توان تعريف رده

و بدين ترتيب اين توسعه . به دور نگاه داشتDataSet Designerها را از اقدامات فايل كد جدا توسعه داد،مي در ساده به ترين سطح، چونو. هاي پيچيده نگريست DataAdapterةها به ديدTableAdapterتوان

س)encapsulate(كنندميبندي را بسته Connectionشيء جديد مواردطري در كد نويسي براي ايجاد، چند)instantiate (و بسته كردن شيء مذكور صرفه مي باز آن نيز ) syntax( طرز نگارش،عالوهبه.شود جويي

.، اين فقط آغاز كار استاما. تر است سادهو Select ،Update ،Insert- تنها چهار فرمانTableAdapterطور كه ديديم، همان ،Delete - را عرضه

هر مي يكيك مطابقكند، كه از با رد. است SQL هاي فرماني - در زمان طراحي بهTableAdapterةو چونمي وجود مي ميةكه هر يك در يك فراخوان ساد- SQLةتواند از هر تعداد گزار آيد، -شود متد عرضه

ها در زمان طراحي افزودن استعالم يك واسط تعاملي براي DataSet Designerعالوه،به. پشتيباني كند.كند عرضه مي

رد عالوه بر اين، از آنجا كه مي خواهيمب را توسعه داد، هر قابليتي را كه TableAdapterةتوان تعريفبه،هاTableAdapter در واقع،. توانيم بدان اضافه كنيم مي به شيء كاملي DataSet تبديل سوي گام نخست

ميها است كه داده .آميزدو قابليت را درهمبه) OOP(نويسي شيءگرا متدولوژي دقيق برنامه صورت يك موجود واحد اقتضا دارد كه هر شيء

ةرابطحال، با اين. گنجد در اين تعريف نمي كامالDataSet/ TableAdapterًتعريف شود، طوري كه تركيب آن دو نوع شيء به مراتب نزديكبين اين درتاستر از خاطربه. معمول است NET Framework.، كه

و را روزآمد ميTableAdapterبه متعلق Fill، متد DataSetآوريد، كه تغييرات صورت گرفته در كند.بالعكس

243 هاTableAdapter كاربرد/ فصل هشتم

هاTableAdapterايجاد

ميمرحلهدوطي TableAdapter ايجاد يا، بيشتر(نخست، الزم است خود رده تعريف شود: گيرد صورتمياوقا در؛)كند ت، ويژوال استوديو خود اين كار را NET.و سپس بايد، همچون هر شيء ديگري

Framework به، نمونه ).instatiate(وجود آورد اي از آن را

TableAdapterهاي ايجاد رده

TableAdapterهاي، ردهكنيمها استفاده از ويزارد پيكربندي منبع داده،Typed DataSet براي تعريف اگر،مي صورت پيشبه ميعالوهبه. شوند گزيده تعريف آن، در توان .، نيز، تعريف نمودDataSet Designerها را

رد امكاناز لحاظ نظري، كامالً ، Typed DataSet، نيز، همچون TableAdapterةپذير است كه كد مربوط بهو منطقي باشد،، در اينجا، نيز، تصور موقعياما. از همان ابتدا نوشته شود تي كه انجام چنين عملي موجه

.دشوار است

TableAdapterپيكربندي ويزارداز استفاده ،باTableAdapter ايجاد

دوبار AdoSbsDataSet.xsd برروي Solution Explorer را باز نموده، در Chapter 08 - Startةپروژ.1.كليك كنيد

.كند باز ميDataSet Designer را در DataSetويژوال استوديو

Microsoft ADO.NET 2.0 244گام به گام با

. بكشيدDataSet Designer ابزار به روية از جعبTableAdapterيك فرم.2DataSet Designerپيكربنديد، ويزار TableAdapterكند را باز مي.

مي.3 ة اطالعاتي نمون شود، اشاره به بانك مطمئن شويد كه اتصالي كه توسط ويزارد پيشنهادAdoStepByStepةاگر چنين نيست، برروي دكم. ارددNew Connection كليك كرده، اتصال جديدي

با”،1چنان كه در فصلآن(را به. وجود آوريدبه)، ايجاد كرديد“ADO.NETشروع كار وقتي كار. كليك كنيدNextپايان رسيد، برروي

مية اتصال در فايل پيكربندي برنامة پيشنهاد ذخيره كردن رشت،ويزارد .دهد كاربردي رابردر صورت لزوم، عالمت قاب كنترل.4 . كليك كنيدNextروي را پاك كرده، سپس

مي ويزارد صفحه . نوع فرمان است تعيينگذارد كه خواستار اي را به نمايشو برUse SQL Statementsةگزيد پيشةگزين.5 . كليك كنيدNextروي را پذيرفته،

ر ويزارد صفحه مياي . براي پركردن جدول استSQLةدهد، كه خواستار استفاده از گزارا نشان: زير را وارد كنيدSQLةگزار.6

SELECT * FROM [Order Details]

245 هاTableAdapter كاربرد/ فصل هشتم

. كليك كنيدFinishبرروي.7آن DataSetبه متعلق TableAdapterو TableAdapter ،DataTableويزارد پيكربندي . افزايدميرا به

يككتوجه به، نيزOrdersو Order Details بين Relationنيد كه، عالوه بر اين، مي، .آورد وجود

8.DataSetرا ذخيره كنيد .) TableAdapters.csكنيد،مياستفادهشارپ يااگرازسي(TableAdapters.vbروي، برSolution Explorerدر.9

.دوبار كليك كنيد.كند باز ميForm Designerويژوال استوديو، فرم را در

Microsoft ADO.NET 2.0 246گام به گام با

. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام. 10. كليك كنيدShow TableAdaptersةبرروي دكم. 11

مي هاي تعريفTableAdapter، كاربرديةبرنام .گذارد شده را به نمايشاز،TableAdapterشده براي متدهاي تعريفةبراي مشاهد. 12 .ها را انتخاب كنيدTableAdapter يكي

. كاربردي را ببنديدةبرنام. 13

247 هاTableAdapter كاربرد/ فصل هشتم

Server Explore از TableAdapterايجاد

كهدر.1 از تمرين گذشته، هنوز باز بايد( باز است DataSet Designer هنوز در AdoSbsDataSetحالي. را باز كنيدView ،Server Explore از منوي Server Explore، با انتخاب)مانده باشد

ن نيست، بر روي اگر چني. شده يا خيرAdoStepByStep اطالعاتي اتصال به بانكاشاره به ببينيد.2در( كليك كرده Server Exploreة بر روي زبانConnect To Database ابزارة ميلةدكم مطابق آنچه

از يك بانكةايجاد نمون”،6فصل شد“ها DataRelationو DataSet اطالعاتي با استفاده )، ذكر.وجود آوريد بهAdoStepByStep موسوم به SQL Server اطالعاتي اتصالي به بانك

. را باز كنيدTables را باز كرده، سپس گره AdoStepByStepة اطالعاتي نمون اتصال به بانك.3

. بكشيدDataSet Designer را به داخل Customersجدول.4DataSet Designer ،DataTable وTableAdapterو آن به را ايجاد كرده، .كند اضافه ميDataSetها را

Microsoft ADO.NET 2.0 248گام به گام با

5.DataSetرا ذخيره كنيد .. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.6. كليك كنيدShow TableAdaptersةروي دكمبر.7

.دهد را نشان ميCustomers جديدTableAdapterجملهازشده، هاي تعريفTableAdapterكاربرديةبرنام. را انتخاب كنيدCustomersTableAdaptersشده، متدهاي تعريفةبراي مشاهد.8

. كاربردي را ببنديدةبرنام.9

249 هاTableAdapter كاربرد/ فصل هشتم

TableAdapterء اشياايجاد

ردالزم است، NET Framework.هاي ديگر تمام ردهانندهم ة نمون،TableAdapterة پيش از استفاده ازميءاين اشيا. وجود آوردجديدي از آن به ة از پنجرTableAdapter با كشيدن،توان، در زمان طراحي را

Data Sourcesة با استفاده از سازند،، يا در زمان اجراNewبه وجود آورد ،.

در ويژوال استوديو TableAdapterايجاد

1.Form Designerبزار را باز كنيداة را به نمايش درآورده، سپس جعب.

2.CustomersTableAdaptersاز بخش، را Chapter 08 Components،بهForm Designerبكشيد .ازةويژوال استوديو، نمون كند را به سيني اجزا اضافه ميTableAdapter جديدي

. تغيير دهيدtaCustomersها را به CustomersTableAdapters bug، نام Propertiesةدر پنجر

Microsoft ADO.NET 2.0 250گام به گام با

ويژوال بيسيك:كدبه كمك TableAdapterايجاد

. فشار دهيدF7براي به نمايش درآوردن ويرايشگر كد، برروي كليد.1:، به اعالن رده اضافه كنيدNewةسطر پايين را، در باالي سازند.2

Dim taEmployees As AdoSbsDataSetTableAdapters.EmployeesTableAdapter

ر.3 : اضافه كنيدNewةشده، به پايان سازند ا، در محل مشخصسطر زير

taEmployees = New AdoSbsDataSetTableAdapters.EmployeesTableAdapter()

:حال، شروع رده به اين صورت خواهد بود

Imports System.Data Imports System.Data.SqlClient Imports System.Reflection Public Class TableAdapters

Dim taEmployees As AdoSbsDataSetTableAdapters.EmployeesTableAdapter

Public Sub New()

' This call is required by the Windows Form Designer. InitializeComponent()

' Add exercise code here: taEmployees = New AdoSbsDataSetTableAdapters.EmployeesTableAdapter() End Sub

شارپسي:كدبه كمك TableAdapterايجاد

. فشار دهيدF7براي به نمايش درآوردن ويرايشگر كد، برروي كليد.1:، به اعالن رده اضافه كنيدNewةسطر پايين را، در باالي سازند.2

251 هاTableAdapter كاربرد/ فصل هشتم

Dim taEmployees As AdoSbsDataSetTableAdapters.EmployeesTableAdapter

: اضافه كنيدNewة، به پايان سازندشده سطر زير را، در محل مشخص.3

AdoSbsDataSetTableAdapters.EmployeesTableAdapter taEmployees;

:حال، شروع رده به اين صورت خواهد بود

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Data.SqlClient; using System.Drawing; using System.Reflection; using System.Text; using System.Windows.Forms; namespace Chapter_08 {

public partial class TableAdapters : Form { AdoSbsDataSetTableAdapters.EmployeesTableAdapter taEmployees;

public TableAdapters() {

InitializeComponent();

//Add exercise code here: taEmployees = new AdoSbsDataSetTableAdapters.EmployeesTableAdapter(); }

Microsoft ADO.NET 2.0 252گام به گام با

ها TableAdapterپيكربندي

هاي آن در زمان طراحي كند، بيشتر پيكربندي ساده عرضه ميproperty تنها دو TableAdapterاز آنجا كهميزمانييعني- مي-پردازيد كه به پيكربندي خود رده .گيرند صورت

TableAdapterهاي پيكربندي رده

Propertyةهاي ردTableAdapter اند ان داده شدهنش8-1 درجدول .Property مي : گيرند ها دردوگروه جايproperty ميةهايي كه نحو مي تعريف كردن رده را بيان و آنهايي كه مشخص TableAdapterكنند كنند،

.ها كار خواهد كرد چگونه با داده TableAdapterهاي رده 8property-1جدول

Property شرح

BaseClass كه رده .برد قابليتش را از آن به ارث ميTableAdapterاي

ConnectionModifier بودن قابل مشاهدهConnectionسازد شده را مشخصمي بندي بسته.

Modifier قابل مشاهده بودنTableAdapterسازد را مشخص مي.

Name نامTableAdapter.

GenerateDBDirectMethodsكه مشخص مي Deleteو Insert ،Updateهاي متدTableAdapterسازدمي به بانكرا، كه مستقيماً مي اطالعاتي ارسال يا شوند، عرضه كند

.خير

DeleteCommand ةگزارSQLها مورد استفاده براي حذف رديف.

InsertCommand ةگزارSQLها مورداستفاده براي درج رديف.

SelectCommand ةگزارSQLمورداستفاده براي پركردن DataTable.

UpdateCommand ةگزارSQL هان رديفساخت مورد استفاده براي روزآمد.

رد propertyتوان مي در انتهاي TableAdapter، با انتخاب DataSet Designer را در TableAdapterةهايDataTableة پنجرةو سپس مشاهدPropertiesر .يت ساختؤ، قابل

253 هاTableAdapter كاربرد/ فصل هشتم

BaseClass property،ةرد.NET Framework را، كه TableAdapter از آن منشاء گرفته، مشخص تنظيم شده System.ComponentModel.Componentرويبرگزيده صورت پيش، بهpropertyاين. سازد ميمي مذكورتنظيمات. است به)TableAdapter براي توسعه بخشيدن به صرفاً(توان را ندرت تغيير داد، ولي.خواهد بوداز به چنين كاري ني

ConnectionModifier property،ة مشاهديت قابلConnectionشده بندي بسته)encapsulated ( را مشخصو گزينvisibility modifierتمام. سازدمي . استFreindةگزيد پيشةهاي استاندارد وجود دارند،

Modifier property،مي را GetData ،DataTable از طريق متد، خودTableAdapterسازد مشخصاز گزينه. كند يا خير عرضه مي .گزيده است پيشPublic، كه Friendو Publicها عبارتند

Name propertyكه، همان ميرا اسمي، آيد از نامش برميطور آن،سازد مشخص به كه در كد به اسمTableAdapter ةگزيد پيشةگزين. شودمياشاره<DataTable>TableAdapterبه است، ولي مي توان آن را

.، تغيير داداست NET Framework.درءگذاري اشيا اي كه سازگار با قواعد نام هر رشتهGenerateDBDirectMethods property،مي كه مشخص و Insert ،Update فرامين TableAdapterسازد،

Deleteًبه ها به اجرا درمي در برابر منبع داده را، كه مستقيما ميآيند، ترتيب ديگرو بدين(آورد وجود. استproperty،True اينةگزيد پيشمقدار. يا خير) نخواهد بودDataTableنيازي به

TableAdapter كه قرار است توسط، راSQLهاي، گزارهCommand مربوط به propertyباالخره، چهارميبه اجرا هستند، ولي DataAdapterها مشابه موارد نظير در propertyاين. سازند درآيند، مشخص

property هايCommandفرامين. نمايند كمتري را عرضه ميTableAdapter تنها property هايCommandText ،CommandType وParametersنمايند، درحالي كه فراميني كه توسط را عرضه مي

DataAdapter اند بندي شده بسته)encapsulated(،property چون-هاي ديگريCommandTimeOut-را نيز .كنند عرضه مي

Microsoft ADO.NET 2.0 254گام به گام با

از الزم است به هنگام تصميم: مهم تر كوچكةمجموع، توجهي نيز به DataAdapterگيري پيرامون استفادهproperty هايTableAdapter دق. مبذول داريد نسبت به آنچه(تري بر رفتار فرمانيقاگر، نياز به كنترلبهبهتر داريد،) در اختيارتان هستTableAdapterكه در از است . استفاده نماييدDataTableجاي آن

TableAdapter،يا مي بهDataSet Designer كه توسط ويژوال استوديو گزيده، آيد، در حالت پيش وجودكه)query(تنها يك استعالم مياست GetDataو Fillبا متدهاي ابقمط، (كند، عرضه در ادامه، به متدهاي.

TableAdapterخواهيم پرداخت (.مي8-2هاي مشروح در جدول TableAdapter ،propertyاستعالم .نمايد را عرضه

TableAdapterهاي استعالم 8property-2جدول

Property شرح

FillMethodModifier متدةمشاهدقابليت Fillسازد را مشخص مي.

FillMethodName نام متد.

GenerateMethods مي ، يا هر GetDataو Fill متدهاي TableAdapter،سازد مشخصميدو، را به .آورد يا خير وجود

GetMethodModifer متدةقابليت مشاهد GetDataسازد را مشخص مي.

GetMethodName نام متد.

CommandText ةگزارSQLآيد كه توسط متدها به اجرا در مي.

CommandType ةنوع فرمان گزارSQL.

ExecuteMode ة گزارةنوع بازپس دادSQL.

Parameters ةمجموعParametersة در گزارSQL.

و سپس مشTableAdapter، انتخاب استعالم DataTableدر انتهاي TableAdapterتوان باانتخاب مي ةاهد،. قابل مشاهده ساختDataSet Designer را در TableAdapterهاي استعالم Properties ،propertyةپنجر

255 هاTableAdapter كاربرد/ فصل هشتم

GenerateMethods propertyتوان آن را برروي، كه ميFill ،Get يا هر دو تنظيم نمود، مشخص رد مي . استBoth،ةزيدگ پيشةگزين. تعريف خواهند شدTableAdapterةسازد چه متدهايي در

مي اين امكmethod>MethodModifier property>شود، در هر متدي كه انتخاب مي كه ان را به ما دهد، نام متد را method>MehtodName property>روي قابل مشاهده بودن تنظيم نماييم، درحالي كه آن را بر

GenerateMethodsبط را، براساس تنظيم هاي مرتproperty، تنها Propertiesةپنجر. سازد مشخص مي

propertyنمايد، عرضه مي.Property هايCommandText ،CommandTypeوParameters،در براي تمام فرامين داده NET.ها

Framework مشتركند .ExecuteMode propertyة گزارة نوع بازپس دادةكنند مشخصSQLاين. استpropertyن بر توا را مي

بدين Scalarدهد؛ ها را بازپس ميDataRow، كه گزارهاشاره بدان دارد تنظيم نمود، كه Readerرويمعناي آن كه استعالم هيچ، بهNonQueryياو دهد؛ معناست، كه استعالم مقدار واحدي را بازپس مي

.دهد مقداري را بازپس نمي

TableAdapter از Fillويرايش متد

1.DataSet Designer و متدهاي Employeesبه متعلق ()GetDataو Fill را به نمايش درآورده،

TableAdapterرا انتخاب كنيد .

Microsoft ADO.NET 2.0 256گام به گام با

.ة، برروي دكمPropertiesةدر پنجر.2 . . كليك كنيدCommandText propertyدر كنار.DataSet Designer ،Query Builderكند را باز مي.

:رت تغيير دهيد را به اين صوSQLرةگزا.3

SELECT EmplyeeID, LastName, FirstName FORM Employee

. كليك كنيدOKبرروي.4DataSet Designerميي قاب پيام مي را به نمايش پرسد روزآمدسازي فرامين را تجديد كند گذارد، كه

.يا خير

257 هاTableAdapter كاربرد/ فصل هشتم

. كليك كنيدYesبرروي.5DataSet Designer،متد Fillنو فهرست ستوDataTableكند را روزآمد مي .

6.DataSetرا ذخيره نماييد .

TableAdapterافزودن استعالم به

را انتخاب Add Query كليك راست كرده، EmployeesTableAdapter، برروي DataSet Designerدر.1.كنيد

Microsoft ADO.NET 2.0 258گام به گام با

و سپس برروي Use SQL Statement فرمان،ةگزيد نوع پيش.2 . كنيد كليكNext، را پذيرفته،مياي، صفحهTableAdapter Queryويزارد پيكربندي.3 گذارد، كه خواستار نوع استعالم را به نمايش

.است

. كليك كنيدNextروي را پذيرفته، سپس برSELECT Which Returns Rowsةگزيد پيش.4مي، صفحهTableAdapter Query ويزاردپيكربندي . استSQLةرگزارگذارد، كه خواستا اي را به نمايش

: به گزاره اضافه كنيدWHEREيك عبارت.5

SELECT EmployeeID, LastName, FirstName FROM Employees WHERE LastName = @LastName

. كليك كنيدNextبرروي.6

259 هاTableAdapter كاربرد/ فصل هشتم

مي، صفحهTableAdapter Queryويزارد پيكربندي ا اي را به نمايش ست، گذارد، كه خواستار متدهايي. قرار است اضافه شوندكه

و قاب كنترل تغييرFillByLastName را به Fill A DataTableنام متد.7 را Return A DataTable داده،.پاك كنيد

. كليك كنيدNextرويرب.8مية صفح،TableAdapter Queryويزارد پيكربندي مي نتايج را به نمايش ةكند گزار گذارد، كه اشاره

SELECT و متدFillاند ايجاد شده.. كليك كنيدFinishرويبر.9

به،TableAdapter Queryويزارد پيكربندي .كند اضافه ميTableAdapterاستعالم جديد را

10 .DataSetرا ذخيره كرده، ببنديد .

Microsoft ADO.NET 2.0 260گام به گام با

برةبراي اجراي برنام. 11 . فشار دهيدF5روي كليد كاربردي،د. 12 . كليك كنيدShow TableAdaptersةكمبرروي

مي تعريفTableAdapter كاربردي،ةبرنام .گذارد شده را به نمايش. را انتخاب كنيدEmployeesTableAdapterدر قاب فهرست،. 13

.گذارد هستند، به نمايش ميFillByLastName كاربردي، توابع استعالم را، كه شاملةبرنام

. كاربردي را ببنديدةبرنام. 14

ا TableAdapterء شياپيكربندي

و تنها دو TableAdapter تعريف شد، خود شيء TableAdapterةپس از آنكه رد بسيار ساده است،property مي ذكر شده8-3، كه در جدول (كند اند، عرضه مي. property تعريف رده،ةتوانيد، با توسع البته،

.) نيز اضافه كنيدهاي ديگري را TableAdapterهاي 8property-3جدول

Property شرح

ClearBeforeFill كند مشخص ميDataTableها خالي است يا خير پيش از بارگذاري داده.

Connection شيءConnection مي بندي بسته .دهد شده را بازپس

261 هاTableAdapter كاربرد/ فصل هشتم

ClearBeforeFill property،مي از، پيش از بارگذاري دادهDataTableكند مشخص ها در آن، خالي

DataRow ها هست يا خير.Connection property،شيء Connection را كه توسط TableAdapterبندي شده بسته)encapsulated (

و بدين بازپس مي ميدهد، كه ترتيب اين امكان را فراهم . رفتارش را تنظيم كنيمجزئيات ظريف آوردبه متعلق ConnectionModifier propertyبه مقداربا دادن،property، قابل مشاهده بودن اين ليكن

TableAdapter)در مي) تنظيم شدهDataSet Designerكه ConnectionModifierبراي مثال، اگر. شود كنترل

property برروي Private ،تنظيم شود Connection از سوي TableAdapterن شد عرضه .خواهد

TableAdapterكاربرد متدهاي

TableAdapter مي را به صورت پيش8-4، متدهاي مذكور در جدول طور كه همان. كند گزيده عرضهمياسامي تمامديديم، در اين متدها را . تغيير دهيمDataSet Designerتوانيم

TableAdapterةگزيد متدهاي پيش8-4جدول

شرح متد

Delete (col0…colN) مي ها را در منبع داده رديف .كند ها حذف

Fill(dataTble) در داده .كند مشخص بارگذاري ميDataTableها را

FillBy(dataTable,

param0…paramN) در داده ، براساس پارامترهاي مشخص، مشخصDataTableها را

.كند بارگذاري مي

GetData يكDataTableدهد بازپس مي.

GetDataBy(dataTable,

param0…paramN) مي، براساس پارامترهاي مشخص،DataTableيك .دهد بازپس

Insert(col0…colN) مي ها را در منبع داده رديف .كند ها درج

Update(dataTable) DataTableمي را با منبع دادهي مشخص .سازد ها همگاه

Update(dataset) DataTable مشخص در DataSetها همگاه را با منبع دادهيص مشخ.سازد مي

Update(dataRow) DataRowمي را با منبع داده .سازد ها همگاه

Update(dataRows()) ازةآراي مي ها را با منبع داده DataRow مشخصي .سازد ها همگاه

Update(col0…colN) مي ها را در منبع داده رديف .سازد ها روزآمد

Microsoft ADO.NET 2.0 262گام به گام با

كه دردسترس تنها زماني،Update(col0…colN)وDelete ،Insertمتدهاي GenerateDBDirectMethodsاند،

propertyة مربوط به ردTableAdapter بر روي Trueها برروي منبع دادهها مستقيماًآن. تنظيم شده باشدروكنند، عمل مي مي را DataSet از اين .زنند دور، Fill(dataTable) است، ولي تنها از يك روايت، يعني DataTableبه متعلق Fill مطابق متد،Fillمتد

.كند پشتيباني ميراة نسخ،GetDataمتد مي را بازDataTable جديدي - را بهDataTableاز نظر داخلي، اين متد. دهد پس

.خواند را فراميFillوجود آورده، متدبه تنها GetDataByو FillByمتدهاي ميزماني داراي پارامترهايي SELECT كه استعالم،آيند وجود

هستند، كه با فهرست پارامترهاي استعالم ) signature(اي داراي نشان ويژهمتدهاي مذكور. باشددر مشخص . مطابقت داردDataSet Designerشده

. است DataAdapter درUpdate(dataTable) مشابه متد Update(dataTable)باالخره، متد

اجراي متدهاي استعالم

در طور كه ديديم، استعالمهمان به اضافه ميTableAdapter به DataSet Designerهايي كه صورت كنيم،مي. شوند عرضه ميTableAdapterمتدهاي رده كه- Fill متدة بين عرض،توان براي هر استعالم

DataTableپر با داده، نمودهعنوان پارامتر دريافت را به ) نخست آن را پاك،صورت اختياريبهو،( هادويكي،-دهد جديدي را بازپس ميDataTableكه- Get يا متد-كند مي . انتخاب نمودرا يا هر

ءيل برتري آن بر تركيب پيشين اشياو دلTableAdapterةاولياين يكي از مزايايConnection/TableAdapter است .TableAdapter به توان استعالممي- قابل گسترش است هاي جديدي را

TableAdapter در DataSet Designerآن كرد اضافه و به، عرضه TableAdapterصورت متدهاي رده ها را.نمود

ويژوال بيسيك: گزيده اجراي متد استعالم پيش

به.1 : اضافه كنيد btnFill_Click event handlerدر ويرايشگر كد، سطر زير را

taEmployees.Fill(dsAdoSbs.Employees)

كد وجود آورده را، كه پيش از اين بهtaEmployees TableAdapter به متعلق Fill، متد اين سطر از.خواند بوديم، فرا مي

. فشار دهيدF5 كاربردي، بر روي كليدةبراي اجراي برنام.2

. كليك كنيدFillةبرروي دكم.3

.كند را پر ميDataGridView كاربردي،ةبرنام

263 هاTableAdapter كاربرد/ فصل هشتم

. كاربردي را ببنديدةبرنام.4

سي: گزيده اجراي يك متد استعالم پيش شارپ ويژوال

به.1 : اضافه كنيد btnFill_Click event handlerدر ويرايشگر كد، سطر زير را

taEmployees.Fill(dsAdoSbs.Employees);

وجود آورده را، كه پيش از اين بهtaEmployees TableAdapterبه متعلق Fill كد، متدازاين سطر .خواند بوديم، فرا مي

برةبراي اجراي برنام.2 . فشار دهيدF5روي كليد كاربردي،. كليك كنيدFillةروي دكمبر.3

.كند را پر ميDataGridView كاربردي،ةبرنام

Microsoft ADO.NET 2.0 264گام به گام با

. كاربردي را ببنديدةبرنام.4

م ويژوال بيسيك: تد استعالم داراي پارامتراجراي

به.1 : اضافه كنيد btnGet_Click event handlerدر ويرايشگر كد، سطر زير را

taEmployees.FillByLastName(dsAdoSbs.Employees, "Davolio")

.خواندمي را فراtaEmployees TableAdapter به متعلق FillByLastNameةگزيد، متد پيشاين سطر ازكد. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.2. كليك كنيدFillByLastNameةبرروي دكم.3

.كند را با ركورد مربوطه پر ميDataGridView كاربردي،ةبرنام

265 هاTableAdapter كاربرد/ فصل هشتم

. كاربردي را ببنديدةبرنام.4

سي: اجراي متد استعالم داراي پارامتر شارپ ويژوال

: اضافه كنيد btnGet_Click event handlerكد، سطر زير را به در ويرايشگر.1

taEmployees.FillByLastName(dsAdoSbs.Employees, "Davolio");

كد را، كه پيش از taEmployees TableAdapterبه متعلق FillByLastNameةگزيد، متد پيشاين سطر ازمياين به .خواند وجود آورده بوديم، فرا

. فشار دهيدF5 كاربردي، برروي كليدةي اجراي برنامبرا.2. كليك كنيدFillByLastNameةروي دكمبر.3

.كند را با ركورد مربوطه پر ميDataGridView كاربردي،ةبرنام

Microsoft ADO.NET 2.0 266گام به گام با

. كاربردي را ببنديدةبرنام.4

خالصه

آشناد،نآميز را درهم مي Connectionو DataTable هاي ها را، كه قابليتTableAdapterبادر اين فصلبه DataTableها مختص TableAdapter. شديم و در زمان طراحي 2005 ويژوال استوديوةوسيلها هستند،

ميبه .آيند وجودردبا و مثالي از افزودن استعالم آشنا شديم DataSet Designer در TableAdapterة تكنيك ايجاد ،

ايجاد سرراستسپس، توجه خويش را به فرآيند. را مشاهده كرديمTableAdapterةداراي پارامتر به ردازةنمون و فراخواندن متدهاي آن معطوف نموديمTableAdapter جديدي در اين ضمن،و. به هنگام اجرا

و(كنند عرضه ميTableAdapter شيءة ايجادشدةتازةو نمونTableAdapterةهايي كه ردpropertyبا با نزدةرابط را TableAdapterكه[ Connectionو DataTableءهاي عرضه شده توسط اشياpropertyيكيمي بسته . آشنا شديم) دارند]كنند بندي

ل نهمفص

هاDataView كاربرد:در پايان اين فصل، خواهيد توانست

. به فرم اضافه كنيدDataViewيك�.وجود آوريد بهDataViewدر زمان اجرا،�در ستون� .وجود آوريد بهDataRowهاي محاسبه شده. را مرتب كنيدDataViewهاي رديف�. را فيلتر كنيدDataViewهاي رديف�در يك مقداةپايبر� . بپردازيدDataViewر كليدي اوليه، به جستجو

براي فيلتررا، كه مكانيسميDataTableبه متعلق Select متدبا،“هاDataTable كاربرد”، هفتمدر فصلمي DataRowو مرتب كردن براي، مكانيسم ديگري استDataView.، آشنا شديمگذارد ها در اختيار

ز .مان طراحيانجام همين كارها در

هاDataView درك

DataViewو مرتب از شده نماي فيلتر داراي DataViewاگرچه. دهد را در اختيار ما قرار ميDataTableايكه. است، ولي مزايايي نيز داردDataTableبه متعلق Selectهمان قابليت متد ءها اشياDataRow از آنجا

آن مشخصي هستند، مي د توان بهها را هم و هم در زمان اجرا و همينر زمان طراحي وجود آورد،مي ها آسان ها را در بسياري موقعيتآن به اجرا درآوردن مزيت .سازد ترمي بازپس ميSelectها كه از متد DataRowةعالوه، برخالف آرايبه از شود، به DataViewتوان -ها

به ها براي كنترل صورت منبع داده .استفاده نمود) bound(ها دادههاي مقيد

.ها خواهيم پرداخت، به مقيدسازي به داده14و12در فصول

هر. وجود آوردها متعدد بهDataView توان، ميDataTableبراي هر دست كم يك DataTableدر واقع،DataView را در DefaultDataView propertyمي خود بسته را DefaultDataViewهاي property. كند بندي

و نه در زمان طراحي، تنظيم نمود مي .توان در زمان اجرا، DataRowViewء اشيا اينها هستند، ولي عمالً DataRow، هر چند بسيار شبيه DataViewهاي رديف

مي DataRowهستند، كه به .اند فهرست شده9-1 در جدول DataRowViewهاي property. دهند ها ارجاع

Microsoft ADO.NET 2.0 268گام به گام با

مي نيزDataRow توسط،Item propertyتنها:ذكرت و،ها propertyةشود؛ بقي عرضه به مختص منحصرDataViewهستند .

DataRowViewهاي 9property-1جدول

Property شرح

DataView DataView كه ،DataRowViewتعلق بدان دارد .

IsEdit كه . حال ويرايش است يا خير هم اكنون درDataRowView اشاره بدان دارد

IsNew كه . جديد است يا خيرDataRowView اشاره بدان دارد

Item دريمقدار ستونDataRowView.

Row DataRowشود كه هم اكنون مشاهده مي.

RowVersion روايت كنونيDataRowView.

DataViewManager ها- كه بهDataSetمانند(،، نيزDataViewManager. استDataSet شبيه DataViewManagerها، از نظر قابليت

مي DataTableصورت ظرفي براي از براي است همچون ظرفي)كند ها عمل و نگاهداري DataView حفظهر-ها در DataTableبراي . يكي،DataSet موجود

DataView در داخل،ها DataViewManager،ة از طريق مجموعDataViewSettingد شايد. اند سترس دردر واقع،، اما. وجود داردDataViewSetting، يك DataSet در DataTableهرتصور كنيم، براي

DataViewSettingبه، تا زماني بهصورتكه در كد به آن اشاره نشده، .آيد وجود نمي فيزيكيDataViewManagerكه ها اغلب موقعي مورد استفاده قرار مي اي وي جداول رابطه حاDataSetگيرند،

راها GetChildRowهايو فيلتر كردن در مورد تمام فراخوان امكان حفظ معيارهاي مرتبچهباشد،از. آورد فراهم مي هاي جداگانه در جدول فرزند استفاده كنيم، در اين صورت DataViewاگر قرار است

و فيلتركردن پس از هر بار فراخواني در مورد. از نو تنظيم شوندالزم است معيارهاي مرتبDataViewManager به معيارها برقرار شدند، رديف، پس از آن كه به GetChildRowةوسيلها صورت ها

و فيلتر مي .شوند خودكار مرتباز سازي بانك نمونه”،6در فصل و DataSet اطالعاتي با استفاده كه“ها DataRelationها DataSet، ديديمبه. استDefaultViewManager property داراي به شويد، عمالً ميDataSetدر واقع، هنگامي كه مقيد

DataViewManagerشد مقيد نيزگزيده پيش مي. خواهيد آن)از نقطه نظر فني(توان در بيشتر موارد، ازمينمودنظر صرف زمو فيلتر كردن پيش تواند براي تنظيم معيارهاي مرتب، ولي ان اجرا مفيد گزيده در.باشد

269 هاDataView كاربرد/ فصل نهم

ها را property توانمي- است DefaultViewManager property ،read-onlyليكن، توجه داشته باشيد كهبه جديدي بهDataViewManagerتوان تنظيم نمود، ولي نمي و آن را به صورت پيشوجود آورد گزيده

DataSetنسبت داد .

ها DataViewايجاد

درءها اشيا DataViewاز آنجا كه توانيد در زمان طراحي مايكروسافت هستند، ميADO.NET مستقليدر. وجود آورده، پيكربندي كنيدبه2005ها را با استفاده از ويژوال استوديو مايكروسافت آن البته،

ميزمان اجرا آن نيز نموبه وجود آوردراها توان .دو پيكربندي

طراحيها در زمان DataViewايجاد

Dataبرروي زبانه واقع DataViewاز طريق كنترل(ها در زمان اجرا DataView ويژوال استوديو از ايجادمي)ابزاردر جعبه هر كنترل ديگري، كافي است آن را به داخل فرم كشيده،و مانند. كند پشتيبانيproperty ةهايش را در پنجرProperties نماييم تنظيم.آن كه تاكنون low-level(ADO.NET( سطح پايينء اشيابسياري، همچون DataViewل،حابا اين ها بابهايم آشنا شده را هم از اين رو،و، ابزار گنجانده نشدهةگزيده در جعب صورت پيش، با( الزم است آن

.م اضافه كني)Choose Toolbox Itemsاستفاده از قاب گفتگوي

به،توديو به وجود آورده در ويژوال اسDataViewيك آن را مقيد

يدكنها داده

Solutionدر، را در ويژوال استوديو باز كرده، در صورت لزومChapter 09 - Startةپروژ.1

Explorer،روي فرمبرDataViews.vb)سي مي يا اگر با دو بار كليك ) DataViews.csكنيد، شارپ كارشForm Designerكنيد، تا فرم در .ود باز

Microsoft ADO.NET 2.0 270گام به گام با

، سپس انتخاب Choose Items، انتخاب Dataة را، با كليك راست برروي زبانDataViewكنترل.2DataView در قاب گفتگوي Choose Toolbox Items و كليك كردن بررويOKابزار اضافهة، به جعب

.كنيد.“كاربرد اتصاالت”،2تر، رجوع كنيد به فصل هاي مفصل دستورالعملةبراي مشاهد

. بكشيدForm Designer را به DataViewكنترل.3

. تغيير دهيدdvOrders را به DataView، نام Propertiesةدر پنجر.4. را انتخاب كنيدdvOrders ،Table property براي Propertiesةدر پنجر.5.د را انتخاب كنيOrders را باز نموده، dsAdoSbsبرروي پيكان رو به پايين كليك كرده، گره.6

271 هاDataView كاربرد/ فصل نهم

. تغيير دهيدOrderID را به Properties ،Sort propertyةدر پنجر.7. را انتخاب كنيدdgvOrders DataGridView، كنترل DataSet Designerدر.8. را انتخاب كنيدProperties ،DataSource propertyةدر پنجر.9 را گسترده، گره Other Data Sources گره كليك كرده، DataSourceبرروي پيكان رو به پايين. 10

DataViews List Instances و سپس . را انتخاب كنيدdvOrders را باز كرده،

Microsoft ADO.NET 2.0 272گام به گام با

. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام. 11در مرتب شدهOrderIDاستوديو، اطالعات را، كه برطبق مقادير درستونويژوال Ordersاند،

DataGridView مي .گذارد به نمايش

. كاربردي را ببنديدةبرنام. 12

ها در زمان اجرا DataViewايجاد

به را ميDataViewشيء ، كه در Newة از سه روايت سازند،DataView. وجود آوردتوان در زمان اجرامي ذكر شده9-2جدول .كند اند، پشتيباني

DataViewهاي سازنده9-2جدول

شرح متد

New() يكDataViewمي جديد به .آورد وجود

New(dataTable) يكDataViewمي جديد به و وجود آن را برروي Table propertyآورد،DataTableكند مشخصي تنظيم مي.

New(dataTable, rowFilter,

sort, rowState) و DataTable جديد، با DataViewيك ، فيلتر رديف، ترتيب،

DataViewRowStateمي مشخص به .آورد وجود

273 هاDataView كاربرد/ فصل نهم

ويژوال بيسيك:يدوجود آور بهDataViewبه كمك كد،

كد.1 . كليك كنيدF7 برروي كليد،براي نمايش دادن ويرايشگربه.2 : اضافه كنيدbtnCreate_Click event handlerسطور زير را

Dim drCurrent As DataRow Dim dvNew As DataView dvNew = New DataView() drCurrent = CType(lbCustomers.SelectedItem, DataRowView).Row dvNew.Table = dsAdoSbs.Orders dvNew.RowFilter = "CustomerID = '" & drCurrent(0) & "' " dgvOrders.DataSource = dvNew

يك ) استIbCustomersكه شامل مورد برگزيده در قاب فهرست(DataRowاين كد، نخست به اعالنو سپس با استفاده از سازنده پيش و ايجاد نمونةگزيد پرداخته، ازة مبادرت به اعالن DataView جديدي

.شود به انتخاب فعلي در قاب فهرست نسبت داده ميdrCurrentآنگاه،. نمايد ميTable propertyبه علق متdvNew DataView برروي جدول Ordersو تنظيم شده ،RowFilter property dgvOrdersسرانجام،. هاي مشتريان برگزيده را نشان دهد شود، كه تنها سفارش طوري تنظيم مي

DataGridView به DataViewشود جديد مقيد مي.. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.3. كليك كنيدCreateةوي دكم انتخاب نموده، بررCustomersيك مشتري را در قاب فهرست.4

DataGridViewگذارد، سفارشات مشتريان برگزيده شده را به نمايش مي.

Microsoft ADO.NET 2.0 274گام به گام با

. كاربردي را ببنديدةبرنام.5

سي:يد به وجود آورDataViewبه كمك كد، شارپ ويژوال

a.كد . كليك كنيدF7 برروي كليد،براي نمايش دادن ويرايشگرb.به : اضافه كنيدbtnCreate_Click event handlerسطور زير را

DataRow drCurrent; DataView dvNew;

dvNew = new DataView(); drCurrent = ((DataRowView)lbCustomers.SelectedItem).Row;

dvNew.Table = dsAdoSbs.Orders; dvNew.RowFilter = "CustomerID = '" + drCurrent[0] + "'"; dgvOrders.DataSource = dvNew;

) استIbCustomersكه شامل مورد برگزيده در قاب فهرست(DataRowاين كد، نخست به اعالن يكو سپس با استفاده از سازند و ايجاد نمون پيشةپرداخته، ازةگزيده مبادرت به اعالن DataView جديدي

دdrCurrentآنگاه،. نمايد مي مي به انتخاب فعلي در قاب فهرست نسبت .شود ادهTable propertyبه متعلقdvNew DataView برروي جدول Orders و RowFilter property تنظيم شده، dgvOrdersسرانجام،. هاي مشتريان برگزيده را نشان دهد شود، كه تنها سفارش طوري تنظيم مي

DataGridView به DataViewشود جديد مقيد مي.c.ردي، برروي كليد كاربةبراي اجراي برنامF5فشار دهيد .d.يك مشتري را در قاب فهرستCustomersة انتخاب نموده، برروي دكمCreateكليك كنيد .

DataGridViewگذارد، سفارشات مشتريان برگزيده شده را به نمايش مي.

275 هاDataView كاربرد/ فصل نهم

e.كاربردي را ببنديد برنامه .

ها DataViewپيكربندي

Property هايي كه از سوي شيءDataViewاند نشان داده شده9-3شوند، در جدول عرضه مي. DataViewهاي 9property-3جدول

Property شرح

AllowDelete مي مشخص مي در توان رديف سازد كه . حذف نمود يا خيرDataViewها را

AllowEdit مي مشخص مي در توان رديف سازد كه . تغيير داد يا خيرDataViewها را

AllowNew مي مشخص مي به توان رديف سازد كه اضافه نمود يا DataViewهايي را.خير

ApplyDefaultSort هاي مربوطه سازد كه از ترتيب تعيين شده از سوي منبع داده مشخص مي.شود يا خير استفاده مي

Count شمار DataRowView ها درDataView.

DataViewManager DataViewManager كه DataViewتعلق بدان دارد .

Microsoft ADO.NET 2.0 276گام به گام با

Property شرح

IsInitialized دهد نشان ميDataViewتعيين مقدار اوليه شده يا خير .

Item(index) DataRowViewدهد مشخصي را بازپس مي.

RowFilter در عبارت مورداستفاده براي فيلتر كردن رديف .DataViewهاي موجود

RowStateFilter DataViewRowState در جهت فيلتر كردن رديف مورد استفاده هاي موجودDataView.

Sort در عبارت مورداستفاده جهت مرتب نمودن رديف .DataViewهاي موجود

Table DataTableها براي كه منبع رديفDataViewاست .

Property هايAllowDelete ،AllowEdit وAllowNew،مي مي مشخص هاي توان داده سازند كه( تغيير داد يا خيرDataViewتوان از طريق را ميDataView شده از سويمنعكس ها را هميشه داده.

در مي .) مربوطه تغيير دادDataTableتوان با ارجاع به رديفCount propertyًمي دقيقا ميكند همان كاري را DataRowمعنا كه تعداد بدين–رود، كه از آن انتظار

و DataViewManagerهاي propertyدرحالي كه،. دهد را بازتاب ميDataViewردمنعكس شده هايTable ،DataViewمي موجود در برنامهء را به ساير اشيا .سازد كاربردي متصل

مي،Sortو RowFilter ،RowStateFilterهاي property باالخره، ها در DataRow كنند كه كدام كنترلDataView ش ها propertyدر ادامه، به اين. اند هاي مذكور به چه ترتيب قرار گرفتهو رديفده منعكس

.خواهيم پرداخت

DataColumnعبارات

متعلق به Sortو RowFilterهاي property، از سوي DataColumnعبارات، يا به زبان فني عباراتDataViewشده كه اقدام به ايجاد ستون محاسبهدر فصول گذشته، زماني. گيرند مورداستفاده قرار مي

و فيلتر كردن را براي متد DataTableدر به متعلقSelect كرديم، يا هنگامي كه عبارات مربوط به مرتبDataTable تنظيم نموديم، با چگونگي استفاده از عبارات DataColumnآن. آشنا شديم اكنون، زمان

تها فرارسيده كه از نزديك آن .وجه قرار دهيمرا مورديك DataColumnعبارت و هنگام كار با توابع است)string( رشتهبه صورت ميو ايجاد، از تابع توانبراي مثال، براي به هم پيوستن دو رشته در يك عبارت واحد،. هاي استاندارد استفاده نمود تمام رشته

سي+و در ويژوال بيسيك&(concatenationتوان از عملگر مي :دنمواستفاده) شارپ در

myExpression = “CustomerID = ‘” & StrCustID & “’”

277 هاDataView كاربرد/ فصل نهم

مي، در متن حاصل، در داخل عالئم نقلstrCustIDتوجه كنيد كه مقدار در ساختن. گيرد قول تكي قرارازيا، مستقيماDataColumnًعبارات توان به ستون اشاره نمود،مي،ColumnName property با استفاده

. واقعي بايد در داخل عالئم نقل قول قرار گيردولي هر مقدار متنيِكه،“گريخت”خاص ) characters(برخي نويسه هاي از عالوه، بايد به آن بدين معنا را بايد در داخل ها

به. داد قرار []دو شود، اشاره مي[Miles/Gallon] به صورت Miles/Gallonبراي مثال، به ستوني موسوم:اين طور

myExpression = “[Miles/Gallon] > 10”

مي فهرست كاملي از نويسه:توصيه در ها را DataColumn.Expressionعنوان تحت،MSDN Helpتوانيد

property،بيابيد .

خاصيةنكتن داديم، طور كه در مثال گذشته نشا، همانDataColumnمقادير عددي در عبارات ذكر:قرار گيرند، به اين صورت) hash mark(#ندارد، ولي مقادير مربوط به تاريخ بايد در بين دو

myExpression = “OrderDate > #01/01/2001#”

.month/day/year:به اين صورت است، بيان آن در اياالت متحدهةذكر تاريخ به صورت نحو: مهم

ميگونه كه مشاهمان DataRowهاي به ستون،ColumnName propertyتوان به كمك هده كرديم،درمي“ Child” به ColumnNameبا اضافه نمودن. اشاره نمود فرزند اشاره DataRowتوان به ستوني

:نمود، به اين صورت

myExpression = “Child.OrderTotal > 3000”

:ن به رديف والد نيز به همين صورت استبراي اشاره نمود) syntax( نگارشةنحو

myExpression = “Parent.CustomerID = ‘AFLKI’”

همغالباً به9-4، كه در جدول)aggregate(انباشت، به همراه يكي از توابع ذكر شده، اشاراتمي رديف و فرزند صورت هم. گيرند هاي والد مي از توابع و بدون اشاره توان مستقيماً انباشت، همچنين،

.هاي فرزند يا والد استفاده نمود به رديف

Microsoft ADO.NET 2.0 278گام به گام با

هم9-4جدول انباشت توابع

نتيجه تابع

Sum Sum

Avg Avereag

Min Minimum

Max Maximum

Count Count

StDev Statistical standard deviation

Var Standard variance

از NET Framework..يم هست مقاديرةها، اغلب ناچار به مقايس DataViewهنگام تنظيم عبارات برايمياند، نشان داده شده9-5طيف معمول عملگرهاي مقايسه، كه در جدول .جويد سود عملگرهاي مقايسه9-5جدول

عمل عملگر

AND ANDمنطقي

OR ORمنطقي

NOT NOTمنطقي

از كوچك> تر

از بزرگ< تر

م>= باكوچكتر از يا ساوي

بزرگتر از يا مساوي با<=

نابرابر <>

IN در يك مجموعه جاي دارد يا خيرموردنظرسازد مقدار مشخص مي .

LIKE ة نادقيق با استفاده از نويسةمقابلwildcard

بهاست مقادير در بين دو پرانتز قرار گرفتن مستلزم INعملگر و خود مقادير از),(وسيله كاما،مييكدي :شوند، به اين صورت گر جدا

myExpression = “myColumn IN (‘A’, ‘B’, ‘C’)”

279 هاDataView كاربرد/ فصل نهم

صفر-كند هاي قابل تبديل به يكديگر استفاده ميwildcard همچون%و*هاي از نويسهLIKEعملگربه تا هر چند نويسه مي يا انتهاي توان در ابتدا ميwildcardهاي از نويسه. جاي آن قرار گيرندتوانند

توان در ميانه ها را نمي رشته استفاده نمود، يا اين كه هر دو در انتهاي رشته بيايند، ولي هيچ يك از آن.رشته جاي داد

اند، پشتيباني ذكر شده9-6 از عملگرهاي حسابي، كه در جدول DataColumnعالوه بر اين، عبارات.كنند مي

عملگرهاي حسابي9-6جدول

عمل عملگر

جمع+

تفريق-

ضرب*

تقسيم/

)integer(تقسيم اعداد صحيح%

جايبه– DataColumnها در داخل عبارت رشته) concatenation(براي متصل كردن)+(نويسه جمع. كاربرد دارد-)&(ampersandتر نويسه معمول

مي9-7، مطابق جدول از شماري از توابع خاصDataColumnسرانجام، عبارات .كنند، پشتيباني توابع خاص9-7جدول

نتيجه تابع

Convert(expression, type) شده از سوي عبارت را، به نوع مقدار بازپس دادهدرمشخص .كند تبديل مي NET Framework.ي

Len(string) در يك رشته را بازپس هاي موجود تعداد نويسه .دهد مي

ISNULL(expression, replacementValue) به مشخص مي ارزشيابي dbNullصورت سازد، عبارتو اگر چنين است، مقدار جايگزين شده. شود يا خير مي

.دهد را بازپس مي

IIF(expression, valueIfTrue, valueIfFalse) صورت اگر عبارت بهTrue ،ارزشيابي شود valueIfTrueمي را باز ص. دهد پس ورت، در غير اينvalueIfFalse خواهد داد را بازپس.

TRIM(string) و انتها رشته را، در حالي نويسه ي هاي فاصله در ابتدامي حذف شدهآن .دهد اند، بازپس

Microsoft ADO.NET 2.0 280گام به گام با

نتيجه تابع

SUBSTRING(expression, start, length) عبارت را، درحالي كه از مكان شروع با مبناي صفرو تا طول مشخصي ادامه يافته، بازپس آغاز گرديده

.دهد مي

Sortعبارات

مي مورداستفاده قرار ميSort property، كه در DataColumnگرچه عبارات بسيار) تعمداً(توانند گيرند، هستند، كه با كاما از يكديگر جدا ColumnNameپيچيده باشند، ولي در بيشتر موارد به شكل يك يا چند

:اند، به اين صورت شده

myDataView.Sort = “CustomerID, OrderID”

ميبه به صورت اختياري شود مقاديرميموجب آورد، كه DESC يا ASCها ColumnNameدنبال توانشوبه ترتيب به گزيده صعودي است، لذا ذكر كليدواژه ترتيب پيش.دنصورت صعودي يا نزولي مرتب

ASCًا ضروري نيست، ولي براي روشن لزوما .ست اين كار صورت گيردتر شدن مطلب بهتر

ويژوال بيسيك : DataViewتغيير ترتيب در مرتب كردن

به.1 : اضافه كنيدbtnSort_Click event handlerدر ويرايشگر كد، سطور زير را

dvOrders.Sort = "EmployeeID, CustomerID, OrderID DESC" dgvOrders.Refresh()

بادهد، كه نخست طوري تغيير ميdgvOrders DataGridViewاين كد ترتيب را در مرتب كردن EmployeeID سپس ،CustomerID،و سرانجامOrderID،به ترتيب نزولي مرتب شود .

. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.2. فشار دهيدSortةروي دكمبر.3

ميرDataGridViewشده محتويات مرتب، كاربرديةبرنام .گذاردا به نمايش

281 هاDataView كاربرد/ فصل نهم

. كاربردي را ببنديدةبرنام.4

سي: DataViewتغيير ترتيب در مرتب كردن شارپ ويژوال

به.1 : اضافه كنيدbtnSort_Click event handlerدر ويرايشگر كد، سطور زير را

dvOrders.Sort = "EmployeeID, CustomerID, OrderID DESC"; dgvOrders.Refresh();

بادهد، كه نخست طوري تغيير ميdgvOrders DataGridViewين كد ترتيب را در مرتب كردنا EmployeeID سپس ،CustomerID،و سرانجامOrderIDبه ترتيب نزولي مرتب شود .

برةبراي اجراي برنام.2 . فشار دهيدF5روي كليد كاربردي،. فشار دهيدSortةبرروي دكم.3.گذارد را به نمايش ميDataGridViewةشد حتويات مرتبم، كاربرديةامنبر

Microsoft ADO.NET 2.0 282گام به گام با

. كاربردي را ببنديدةبرنام.4

RowStateفيلتردردخوكنوني وضعيتها DataRow، ديديم كه هفتمدر فصل از.دنكن حفظ ميRowState property را

RowState propertyبه متعلقDataView،توان براي محدود كردنميDataRowView با ها به موارديRowStateمقادير احتمالي. معين استفاده نمودRowStateFilter property اند ذكر شده9-8 در جدول.

DataViewRowState مقادير9-8جدول

شرح مقدار

Added اند هايي كه افزوده شده تنها رديف.

CurrentRows ها تمام مقادير جاري رديف.

Deleted اندي كه حذف شدههاي تنها رديف.

ModifiedCurrent اند هايي كه تغيير يافته مقادير جاري رديف.

ModifiedOriginal اند هايي كه تغيير يافته مقادير اصلي رديف.

None رديففاقد .

OriginalRows ها مقادير اصلي تمام رديف.

Unchanged اند هايي كه تغيير نيافته تنها رديف.

283 هاDataView كاربرد/ فصل نهم

ويژوال بيسيك: هاي جديد دن تنها رديفبه نمايش درآور

به.1 : اضافه كنيدbtnRowState_Click event handlerدر ويرايشگر كد، كد زير را

Dim drNew As DataRowView drNew = dvOrders.AddNew() drNew("CustomerID") = "ALFKI" drNew("EmployeeID") = 1 drNew("OrderID") = 0 dvOrders.RowStateFilter = DataViewRowState.Added dgvOrders.Refresh()

). خواهيم پرداختAddNew متدبهدر بخش آينده،(سازد جديد ميDataRowViewاين كد، نخست يك.را نشان دهد) افزوده شده(هاي جديد كند، كه تنها رديف را طوري تنظيم ميRowStateFilterسپس،

.شود، تا تغييرات را نشان دهد از نو ساخته ميdgvOrders DataGridViewسرانجام،. فشار دهيدF5 كاربردي، بر روي كليدةبراي اجراي برنام.2. كليك كنيدRow Stateةبرروي دكم.3

DataGridView،مي .دهد تنها ترتيب جديد را نشان

. كاربردي را ببنديدةبرنام.4

Microsoft ADO.NET 2.0 284گام به گام با

جد به نمايش درآوردن تنها رديف سي:يدهاي شارپ ويژوال

به.1 : اضافه كنيدbtnRowState_Click event handlerدر ويرايشگر كد، كد زير را

DataRowView drNew; drNew = dvOrders.AddNew(); drNew["CustomerID"] = "ALFKI"; drNew["EmployeeID"] = 1; drNew["OrderID"] = 0; dvOrders.RowStateFilter = DataViewRowState.Added; dgvOrders.Refresh();

يك خواهيم AddNewدر بخش آينده، در متد(سازد جديد ميDataRowViewاين كد، نخسترا نشان) افزوده شده(هاي جديد كند، كه تنها رديف را طوري تنظيم ميRowStateFilterسپس، ). پرداخت

مي از نو ساdgvOrders DataGridViewسرانجام،. دهد .شود، تا تغييرات را نشان دهد خته. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.2. كليك كنيدRow Stateةبرروي دكم.3

DataGridView،مي .دهد تنها ترتيب جديد را نشان

285 هاDataView كاربرد/ فصل نهم

. كاربردي را ببنديدةبرنام.4

DataViewكاربرد متدهاي

، كه AddNewمتد. اند ذكر شده9-9شوند، در جدول پشتيباني ميDataViewمتدهاي اوليه، كه از سويدر اضافه ميDataView جديد به DataRowViewدر تمرين گذشته مورداستفاده قرار داديم، يك كند،

.نمايد رديف با نمايه مشخص را حذف ميDeleteحالي كه متد DataView متدهاي9-9جدول

شرح متد

AddNew دي را به رديف جديDataViewكند اضافه مي.

BeginInit ةمقداردهي اوليDataViewكند را آغاز مي.

CopyTo ميهموارد را در يك آراي .كند كپي

Delete DataRowView را از DataViewكند حذف مي.

EndInit ةبه مقداردهي اوليDataViewدهد خاتمه مي.

Find نخستينةمكان نماي DataRowView كليدي) يا مقادير( حاوي مقدارمي شده را باز ترتيب مشخص .دهد پس

FindRows از آرايه كليدي ترتيب) يا مقادير(ها، شامل مقدار DataRowViewايمي شده، باز مشخص .دهد پس

ToTable يكDataTable براساس ،DataRowView ها درDataViewكند، ايجاد مي.

Findمتد

اگر مقداري را براي اين. كند پيدا ميSortها را براساس عبارت، رديفDataViewبه متعلقFindمتدproperty مشخص نكنيم، الزم است ApplyDefaultSort property را برروي True و مقادير تنظيم نماييم،

. مربوطه مطابقت داشته باشندDataTableةمشخص شده بايد با كليد اوليدر توان يك مقدار واحد يا آرايه وجود دارد، كه ميFindمتد دو روايت براي اي از مقادير را را، كه با مقدار يا مقادير DataRowView مبتني بر صفر نخستينةهر دو روايت، نماي. اختيارشان قرار داد

مي)1-يا اگر مطابقتي وجود نداشت(،)دارند(شده مطابقت دارد مشخص .دهند باز پس

Microsoft ADO.NET 2.0 286گام به گام با

ويژوال بيسيك:آنةف براساس مقدار كليد اولييافتن ردي

به.1 : اضافه كنيدbtnFind_Click event handlerدر ويرايشگر كد، كد زير را

Dim idxFound As Integer Dim strMessage As String idxFound = dvOrders.Find(10255) strMessage = "The OrderID is " & _ dvOrders(idxFound).Item("OrderID") strMessage &= vbCrLf & "The CustomerID is " & _ dvOrders(idxFound).Item("CustomerID") strMessage &= vbCrLf & "The Employee ID is " & _ dvOrders(idxFound).Item("EmployeeID") MessageBox.Show(strMessage)

مFindكد باال، از متد استفاده نموده، سپس نتايج را در يك قاب پيام به Order 10255كان جهت يافتن.گذارد نمايش مي

. فشار دهيدF5 كاربردي، بر روي كليدةبراي اجراي برنام.2. كليك كنيدFindةبرروي دكم.3

ميةبرنام .گذارد كاربردي نتايج را به نمايش

287 هاDataView كاربرد/ فصل نهم

. كاربردي را ببنديدة كليك كرده، برنامOKرويبر.4

سي:آنةيافتن رديف براساس مقدار كليد اولي شارپ ويژوال

به.1 : اضافه كنيدbtnFind_Click event handlerدر ويرايشگر كد، كد زير را

int idxFound; string strMessage; dvOrders.ApplyDefaultSort = true; idxFound = dvOrders.Find(10255); strMessage = "The OrderID is " + dvOrders[idxFound]["OrderID"]; strMessage += "\nThe CustomerID is " + dvOrders[idxFound]["CustomerID"]; strMessage += "\nThe Employee ID is " + dvOrders[idxFound]["EmployeeID"]; MessageBox.Show(strMessage);

استفاده نموده، سپس نتايج را در يك قاب پيام به Order 10255ن مكان جهت يافتFindكد باال، از متد.گذارد نمايش مي

برةبراي اجراي برنام.2 . فشار دهيدF5روي كليد كاربردي،. كليك كنيدFindةبرروي دكم.3

ميةبرنام .گذارد كاربردي نتايج را به نمايش

Microsoft ADO.NET 2.0 288گام به گام با

.يد كاربردي را ببندة كليك كرده، برنامOKرويبر.4

خالصه

مي،DataView. آشنا شديم DataView شيءبادر اين فصل يك اين امكان را به ما دهد كه محتوياتDataTableو و فيلتر كنيم در، ميDataTable متعلق به Filterو Sort برخالف متدهاي، را مرتب توان آن را

دهاي كنترلبراي،DataView.وجود آوردزمان طراحي به .را داردها منبع دادهنقش،ها اده مقيد به

چهارمبخش

ها كار با داده:در اين بخش

و روزآمدسازي داده:10فصل .ها ويرايش.ها مقيدسازي دستي به داده:11فصل.BindingSourceهاي ويندوز با استفاده از جزء ها در فرم مقيدسازي به داده:12فصل.هاي ويندوز در فرمADO.NETكاربرد:13فصلب مقيدسازي پايه:14فصل وب ها در فرمه دادهاي .هاي.ها هاي وب با استفاده از جزء منبع داده ها در فرم مقيدسازي به داده:15فصلو اعتبارسنجي هاي مقيد به داده كنترل:16فصل .ها

دهمصلف

ها ويرايشو روزآمدسازي داده: در پايان اين فصل، خواهيد توانست

�RowState property به متعلقDataRow ب .كار بريدهرا. را بازيابي نماييدDataRowروايت مشخصي از��DataRow را به DataTableاضافه كنيد .�DataRow را از DataTableحذف كنيد .�DataRowرا ويرايش نماييد ..ها معلق كنيد ها را در طول روزآمدسازي اعمال محدوديت،موقتاً�.ها را قبول يا رد كنيد تغييرات داده�

فصل، كار در اين چند. آشنا شديم مايكروسافت ADO.NETء از اشيابا برخيد فصل گذشته، در چنبه ويژه، در اين. ادامه خواهيم داد براي انجام وظايف ويژهءرا با نگاهي به چگونگي همكاري اين اشيا

و روزآمدسازي داده،فصل . ها خواهيم پرداخت به بررسي فرآيند ويرايش

Microsoft ADO.NET 2.0 290گام به گام با

هاشو روزآمدسازي دادهدرك فرآيند ويراي

و روزآمدسازي دادهADO.NETبا توجه به ساختمان غيرمتصل درها هاي يك منبع داده، فرآيند ويرايشميچهار مرحله :گيرد صورت

.ها ها از منبع داده بازيابي داده.1.ها دادهةدر حافظموجودةتغيير دادن نسخ.2.ها روزآمدسازي منبع داده.3.DataSetروزآمدسازي.4

را نخست، داده و احياناً كرده در حافظه ذخيرهوها بازيابي منبع دادهاز ها . دهيممي به كاربر نشان،هاي، كه جدولTableAdapter يا DataAdapterبه متعلق Fillطور معمول، با استفاده از متد اين مرحله، به

DataSetمي را پر مي ازر كه ديديم، دادهطوليكن، همان. گيرد كند، صورت Data Commandها با استفاده.توانند بازيابي شوندمي، نيز، DataReaderو

.ها خواهيم پرداخت، به مقيدسازي داده4در ادامه، درهمين بخش

ميمطابق دلخواهها در دومين مرحله، داده مي. يابند ما تغيير هاي توان تغيير داد، رديف مقادير راو رديفيجديد مي تغيير داده. كردهاي موجود را حذف را اضافه نمود، با ها را كدتوان، يا از نوشتن

و وب به داده هاي مقيدسازي فرم طريق مكانيسم در،در اين فصل. ها، صورت داد هاي ويندوز به كنكاشكدها چگونگي ايجاد تغييرات در داده ويندوز، انتقال هاي در فرم. خواهيم پرداختبه كمك نوشتن

به هاي مقيد به داده تغييرات از كنترل وها مقيدسازي به داده ويژگية، برعهدDataSetها نياز به هيچ ست.گيرنده گردد ها، البته، بايد احاله به سرويس هاي وب، هر تغييري در داده در فرم. اقدام ديگري نيست

بماند، الزم باقي موجود در حافظه ماندگاريها ادهدةاگر قرار است تغييرات صورت پذيرفته در نسخاز. سوم فرآيند استةها وارد شود، كه اين مرحل است در منبع داده هاي براي مديريت دادهDataSetاگر

مي موجود در حافظه استفاده كنيم، انتقال به منبع داده - متعلقUpdateتوان با استفاده از متد ها را Commandءتوان از اشيامي نيزاز سوي ديگر، مستقيماً. صورت دادTableAdapter يا DataAdapterبه

( تغييرات استفاده نمودةبراي احال و DataAdapterالبته، همانگونه كه ديديم،. Dataاز،هاTableAdapterها

Command مي دادهارائةها، نيز، براي .)كنند ها استفادهو آخرين مرحل ميدر چهارمين از را روزآمد نمود، تا بازتابDataSetتوان ه، وضعيت جديد منبعي

. گيرد صورت ميDataTable يا DataSetبه متعلقAcceptChangesاين كار با استفاده از متد. ها باشد داده. خواند را فراميAcceptChanges، خود به خود DataAdapterبه متعلقUpdateو Fillمتدهاي

TableAdapterو فرامين نيز به همين صورت عمل مي DataAdapter را با استفاده از Updateو Fillكند،ميخود ) encapsulated(ةشد بندي بسته ها Data Command به اجراي اگر مستقيماًاما. نمايد اجرا.مد شود روزآDataSet را فراخوانيم، تا وضعيت AcceptChangesپردازيم، الزم است به وضوح مي

دا/ فصل دهم 291هادهويرايشو روزآمدسازي

زماني هم، همواره اين احتمال وجود دارد كه رديفي در منبع ADO.NETبا توجه به روش غيرمتصل مورداستفاده

در داده مي. بارگذاري شده، دچار تغيير شده باشدDataSetها، نسبت به زماني كه گويند نقض به اين.زماني هممي پشتيبDBConcurrencyException خطاي از Updateمتد مي اني رود زماني كه نقض كند، كه انتظارمي هم روزآمد DataTableهايي كه توسط در واقع، هر وقت تعداد رديف. آيد، اعالم شود زماني پيشبه. شود اعالم ميDBConcurrencyExceptionشوند به صفر رسيد، مي نقدليل اين رويداد، ضطور معمول،وضع به اين صورت نيست؛ ممكن هميشه لزوماً،كه درك كنيمزماني است، ولي بسيار مهم است هم

. باشد رديفي براي روزآمد شدن وجود نداشتهاست حقيقتاً

و روايتDataRowState درك ها ها

است، كه RowState propertyةدارند نگاهDataRow، ديديم،“ها DataTableكاربرد”،7گونه در فصل همان چندين نسخه از DataTableعالوه بر اين،. حذف يا تغيير داده شده يا خير اضافه،يدهد رديف نشان مي

در. دارد، كه هر يك بازتاب روايت متفاوتي است هر رديف را در خود نگاه مي در اين بخش، به كنكاش.و رديف خواهيم پرداختRowState propertyهر دو روايت

RowState property RowState propertyمتعلق به DataRow،اقداماتي است كه از زمان ايجادةدهند بازتاب DataTable،يا، آن RowStateمقادير احتمالي. فراخوانده شد، صورت گرفته استAcceptChangesآخرين باري كه متد

.انددهآم10-1 تعريف شده، در جدول enumeration (DataRowState(كه با برشماري چنان DataRowState برشماري10-1جدول

شرح مقدار

Added DataRowجديد است .

Deleted DataRow از DataTableحذف شده است .

Detached DataRow هنوز به يك DataTableافزوده نشده است .

Modified محتوايDataRowتغيير يافته است .

Unchanged DataRowتغييري پيدا نكرده است .

از سوي متدهاي AcceptChanges كه متد،شوند، زماني وضع ميDataRowدرها رديفةمقادير پايFill يا Updateبه متعلقDataAdapter يا TableAdapter،ًفراخوانده، كد برنامهة به وسيل يا صراحتا آن. شود مي . تنظيم شده استUnchangedها بر روي DataRow همةبه متعلق DataState، لحظهدر

Microsoft ADO.NET 2.0 292گام به گام با

تغيير AcceptChanges پس از فراخواندن DataRow مقدار هر ستون چنانچه، كه وان انتظار داشتت ميبه متعلقRowة مجموعAddاگر، با استفاده از متد. شود تنظيم Modifiedروي آن برRowStateيابد،

DataSet ،DataRow به به آنRowState افزوده شوند، DataSetهاي جديدي شدخAdded تبديل . واهد AcceptChangesشان پيش از فراخوان بعدي را، حتي اگر محتوياتAddedهاي جديد، وضعيت رديف

.كنند تغيير يافته باشند، حفظ مي فراخوانده AcceptChangesكه تا زماني حذف شود، عمالDeleteً با استفاده از متد DataRowاگر يكا. شود حذف نميDataSetنشده، از طور كه خواهيم و، همانDeleted آن بر روي RowState، ين حالتدر

. تنظيم مي شوندNullروي آن برCurrentديد، مقادير DataRowًبه متعلق لزوماDataTableةكه به مجموعيك رديف مستقل، نيز، تا زماني. نيستRow هاي

DataTable كه در اين صورت،- افزوده نشدهRowStateصورتهب، آن Added داراي-در خواهد آمد RowState در وضعيت Detachedاست .

Rowهاي روايتDataTable براي هر DataRowفراخوانية، بسته به اعمالي كه از آخرين وهل AcceptChanges برروي آن

.دان ذكر شده10-2 در جدول DataRowهاي احتمالي روايت. داراي چندين روايت است،صورت پذيرفته DataRowVersion برشماري10-2جدول

معنا روايت

Current مقادير جاري هرDataRow.

Default هاي تازه مورداستفاده رديفةگزيد مقادير پيش.

Original مقاديري كه به هنگام ايجاد رديف يا آخرين باري كهAcceptChanges .فراخوانده شد، تنظيم شدند

Proposed شده پس از فراخواني متددهمقادير نسبت داBeginEdit.

مربوط به Currentروايت. دارد وجود Currentه يك روايت وار، همDataSetبراي هر رديف درDataRow كهات تغييرتمام بازتاب . از زمان ايجاد رديف، در مقادير آن صورت گرفته است،ي استكه رديف Original فراخوانده شد وجود داشتند، يك روايت AcceptChangesهايي كه در آخرين باري

به رديف. هاي اوليه است ند، كه حاوي مقادير دادهدار كه افزوده شدهDataSetهايي كه اند، تا زمانيAcceptChangesًفراخوانده نشده، روايت مجددا Original ندارند.

شDefaultValue property به DataTable هاي اگر مقدار يكي از ستون DataRowد، تمامو نسبت داده مربوطه ستونDefaultValue propertyرارشا، كه مقدخواهند بوداي گزيده پيشهاي جدول داراي روايت

.دكن تعيين مي

دا/ فصل دهم 293هادهويرايشو روزآمدسازي

DataRow به يا EndEditو پيش فراخوانده شدن به DataRow.BeginEditها، پس از فراخوانده شدنCancelEditي روايت، داراProposedبراي تعليق در ادامه، به بررسي اين متدها، كه موقتاً. هستندمي هاي داده محدوديت .گيرند، خواهيم پرداخت ها مورداستفاده قرار

را به نمايش DataSetبه متعلق Currentو Original تمرين زير، مقاديرة كاربردي نمونة برنام:تذكرپااين نمايش. گذارد مي مي به فرم ويندوزمتعلق BindingSource شيءيهبر ، كه در فصل گيرد صورترا، كديفعالً. سخن خواهيم گفتآنةبيشتر دربار،“ها مقيدسازي دستي به داده”، 11 كه مقادير مذكور

.در برنامه گنجانده شده استگذارد، به نمايش مي

و روايت DataRowStateكنكاش در DataRowهاي ها

را باز كرده و، در صورت Chapter 10 - Startة، پروژ2005ويژوال استوديو مايكروسافتدر.1سي(Editing.vbلزوم، برروي مي يا اگر از Solution Explorerدر ) Editing.csكنيد، شارپ استفاده

.دوبار كليك كنيد.گذارد به نمايش ميForm Designerويژوال استوديو فرم را در

. فشار دهيدF5 كاربردي، برروي كليدةاي اجراي برنامبر.2

Microsoft ADO.NET 2.0 294گام به گام با

در از دكمه.3 . استفاده كنيدDataSetهاي پيمايشي در باالي فرم، براي حركتو Originalو Currentهاي يكسان ها داراي روايت تمام رديف صورتبهنيز RowStatus هستند،

Unchangedاست . كليك Saveها را تغيير داده، سپس برروي يكي از رديفLast Name يا First Nameمقدار قاب متن.4

.كنيدو،شود رديف مذكور روزآمد ميCurrentروايت Modifiedبه نيز RowState تا نام را منعكس نمايد،.يابد تغيير مي

. كاربردي را ببنديدةبرنام.5

در ويرايش داده تحت كنترل برنامهDataSetها

ها خواهيم هاي مقيد به داده، به بحث پيرامون ويرايش با استفاده از كنترل4، در همين بخش در ادامه.پرداخت

دا/ فصل دهم 295هادهويرايشو روزآمدسازي

شامل،ي است، فرآيند سرراستند بارگذاري شدDataSetها، پس از آنكه در داخل ويرايش دادهو تنظيم مقادير ف به كاركردن با در اين فصل، توجه خويش را معطو.ها propertyفراخواندن متدها

فرميا فرم ويندوزدرها كنترلطرز كارنويسي نموده، بحث پيرامون به كمك برنامهDataSetمحتويات.كنيم وب را به فصول آينده واگذار مي

DataRowافزودن

بايد DataRowبلكه، شيء. وجود نداردDataTable جديد در DataRow براي ايجاديهيچ راه مستقيمو سپس به مجموعبهمستقالً . افزوده شودDataTableهاي رديفةوجود آمده،

و جدا DataTable متعلق به NewRowمتد با همان طرح جدولي كه براي آن ) detached(، يك رديف آزادمي. دهد فراخوانده شده، بازپس مي و جديدتوان مقادير رديف سپس، بهآن را تنظيم، DataTable را

.ضميمه نمود

ويژوال بيسيك : DataTableبهيزودن رديفاف

بربراي.1 . فشار دهيدF7روي كليد به نمايش درآمدن ويرايشگر كد،به.2 : اضافه كنيدbtnAdd_Click event handlerكد زير را

Dim drNew As DataRow drNew = dsAdoSbs.Employees.NewRow() drNew.Item("FirstName") = "New First" drNew.Item("LastName") = "New Last" dsAdoSbs.Employees.Rows.Add(drNew)

. پردازد، كه رديف جديد را در خود نگاه خواهد داشت، ميDataRowنخستين سطر به اعالن متغير مية فراخوانده شده، نمونNewRowسپس، متد هاي آن تنظيم شده، Field. آيد جديدي از متغير به وجود

.شود افزوده ميEmployeesبه جدول متعلقRowsةوعو خود به مجم. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.3. كليك كنيدAddرويبر.4

مي، كاربرديةبرنام .كند يك رديف تازه اضافهبر.5 . برويدDataSet، به آخرين رديف Move Lastةروي دكمبا كليك كردن

مي، كاربرديةبرنام .گذارد رديف جديد را به نمايش

Microsoft ADO.NET 2.0 296گام به گام با

. كاربردي را ببنديدةبرنام.6

سي: DataTableبهيافزودن رديف شارپ ويژوال

. فشار دهيدF7براي به نمايش درآمدن ويرايشگر كد، برروي كليد.1به.2 : اضافه كنيدbtnAdd_Click event handlerكد زير را

DataRow drNew; drNew = (AdoSbsDataSet.EmployeesRow)dsAdoSbs.Employees.NewRow(); drNew["FirstName"] = "New First"; drNew["LastName"] = "New Last"; dsAdoSbs.Employees.Rows.Add(drNew);

. پردازد، كه رديف جديد را در خود نگاه خواهد داشت، ميDataRowنخستين سطر به اعالن متغير به جدية فراخوانده شده، نمونNewRowسپس، متد ميدي از متغير و field. آيد وجود هاي آن تنظيم شده،

.شود افزوده ميEmployeesبه جدول متعلقRowsةخود به مجموع. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.3. كليك كنيدAddبرروي.4

تا، كاربرديةبرنام مي يك رديف .كند زه اضافهبر.5 . برويدDataSet، به آخرين رديف Move Lastةروي دكمبا كليك كردن

مي، كاربرديةبرنام .گذارد رديف جديد را به نمايش

دا/ فصل دهم 297هادهويرايشو روزآمدسازي

. كاربردي را ببنديدةبرنام.6

DataRowحذف

)اند ذكر شده10-3كه در جدول(ها، از سه متد DataRow، براي حذف DataTableهاي رديفةمجموعسه. كند استفاده مي مي فيزيكي از مجموعه صورت را بهDataRow، متدهر .كند حذف

DataRowCollection متعلق به Remove متدهاي10-3جدول

شرح متد

Clear() از تمام رديف مي DataTableها را .كند حذف

Remove(dataRow) DataRowميراي مشخص .كند حذف

RemoveAt(indes) DataRow در ميرايمكان مشخصواقع .كند حذف

بهباكهرديفي شد DataTableصورت فيزيكي از استفاده از يكي از اين متدها، ، پس از ماندگار حذفشد، از منبع دادهDataSet تغييراتنشد و اگر الزم است رديف به كلي از منبع داده. ها حذف نخواهد هاآن) چنين است نيزكما اينكه معموالً( حذف شود DataTableنيز متعلق به Deleteها از متد، بايد به جاي. استفاده كنيمDataRowشيء

ميصورت فيزيكي را بهDataRow تنها زماني Deleteمتد ، كه پس از آخرين باري كه كند حذفAcceptChanges فراخوانده شد، به DataTable كارش تنظيم مواقعدر غير اين.د شده باشفراخوانده ،

RowState property برروي Deleted،و مقادير روايتCurrent به متعلقDataRow برروي Nullاست .

Microsoft ADO.NET 2.0 298گام به گام با

بدان خواهيم11كه در فصل( BindingSource متعلق به كنترل MoveNext در تمرين زير از متد:تذكر بعدي در DataRow تبديل، بدانيد كار متد مذكور، تنها الزم استفعالً. استفاده شده است)پرداخت

DataTableبه رديف جاري است .

ويژوال بيسيك : Delete متد به كمك DataRowحذف

به.1 : اضافه كنيدbtnDelete_Click event handlerدر ويرايشگر كد، كد زير را

Dim dr As DataRow dr = GetRow() dr.Delete() bsEmployees.MoveNext()

ه اضاف تمرين scaffolding بخشبه، نيست مايكروسافت NET Framework.بهمتعلق، كه GetRowروال .شده است

. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.2. برروي فرم به نمايش درآمده باشندNancy Davolioهاي ببينيد داده.3. فشار دهيدDeleteرويبر.4

و شمارةبرنام بهة كاربردي رديف را حذف نموده، رديف بعدي را به نمايش درآورده، 8 كارمند را

.دهد تغيير مي

. كاربردي را ببنديدةبرنام.5

دا/ فصل دهم 299هادهويرايشو روزآمدسازي

سي: Delete متد به كمك DataRowحذف شارپ ويژوال

به.1 : اضافه كنيدbtnDelete_Click event handlerدر ويرايشگر كد، كد زير را

DataRow dr; dr = GetRow(); dr.Delete(); bsEmployees.MoveNext(); UpdateDisplay();

ه اضاف تمرين scaffolding بخشبه، نيست مايكروسافت NET Framework.بهمتعلق، كه GetRowروال .شده است

. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.2. برروي فرم به نمايش درآمده باشندNancy Davolioهاي ببينيد داده.3. فشار دهيدDeleteرويبر.4

و شمارةبرنام بهة كاربردي رديف را حذف نموده، رديف بعدي را به نمايش درآورده، 8 كارمند را

.دهد تغيير مي

. كاربردي را ببنديدةبرنام.5

Microsoft ADO.NET 2.0 300گام به گام با

DataRowتغيير دادن مقادير

به متعلقItem property نخست به كمك- ممكن نيستتر از اين سادهDataColumnتغيير دادن مقدارDataRow اشاره )reference (مي كنيم، آنگاه با استفاده از يك عملگر انتسابي ساده مقدار جديد به ستون

.دهيم را نسبت ميItem propertyصورت بهoverloadو از روايت م10-4هاي مذكور در جدول است، با. كندي پشتيباني

و read-onlyكنند، جملگي را مشخص ميDataRowVersion كه propertyاين حال، سه روايت هستند،آن نمي مي. ها براي تغيير مقادير استفاده نمود توان از توان از سه روايت ديگر، براي تغيير دادن مقادير

مي مقدار را بازCurrentكه روايت .دهند، استفاده نمود پس DataRow.Itemهاي روايت10-4 جدول

شرح روايت

Item(columnName) مقدارDataColumnمي با نام مشخص را باز .دهد پس

Item(dataColumn) مقدارDataColumnمي مشخص را باز .دهد پس

Item(columnIndex) مقدارDataColumn در مكان ،columnIndex مبتني بر صفر مشخص در .دهد، را بازپس ميDataRowبه متعلق Columnsةمجموع

Item(columnName,

rowVersion) با نام مشخص، را DataColumnبه مشخص، متعلق rowVersionمقدار

.دهد بازپس مي

Item(dataColumn,

rowVersion) .دهد را بازپس ميDataColumnبه مشخص متعلقrowVersionمقدار

Item(columnIndex,

rowVersion) columnIndex، درمكانDataColumnبه مشخص متعلقrowVersionمقدار

، را DataRowبه متعلقColumnsةمبتني بر صفر مشخص در مجموعمي باز .دهد پس

ويژوال بيسيك : DataRowويرايش

به.1 : اضافه كنيدbtnEdit_Click event handlerكد زير را

Dim drCurrent As DataRow drCurrent = GetRow() drCurrent.Item("FirstName") = "Changed"

دا/ فصل دهم 301هادهويرايشو روزآمدسازي

UpdateDisplay()

نهو اند، تمرين) scaffolding( جزئي از داربست UpdateDisplayو GetRowهاي در اينجا، نيز، روال .NET Framework.متعلق به

. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.2.كنيد كليك Editبرروي.3

و Changed را به FirstName ستون Current روايت، كاربرديةبرنام ،RowStatus را به Modified تغيير .دهد مي

. كاربردي را ببنديدةبرنام.4

سي: DataRowويرايش شارپ ويژوال

به.1 : اضافه كنيدbtnEdit_Click event handlerكد زير را

Dim drCurrent As DataRow DataRow drCurrent; drCurrent = GetRow(); drCurrent["FirstName"] = "Changed"; UpdateDisplay();

Microsoft ADO.NET 2.0 302گام به گام با

نهو اند، تمرين) scaffolding( جزئي از داربست UpdateDisplayو GetRowهاي در اينجا، نيز، روال.NET Framework.متعلق به

برةبراي اجراي برنام.2 . شار دهيدفF5روي كليد كاربردي،. كليك كنيدEditبرروي.3

و Changed را به FirstName ستون Current روايت، كاربرديةبرنام ،RowStatus را به Modified تغيير .دهد مي

. كاربردي را ببنديدةبرنام.4

DataRow مقاديردر تغييرات اعمالبه تعويق انداختن

راها رديفممكن استگاه، به داليل اجرايي يا به خاطر آنكه با رابطهدري تغيير يافته مشكالتيرش تا زمانيشايد بخواهيم، موجب شوندهاي تجاري يا يكپارچگي محدوديت ويرايش تكميلتةكه يك

.ريمطور موقت معلق گذابهراها نشده، اعتبارسنجي دادهمي دقيقاً،DataRowبه متعلق،BeginEditمتد و DataColumn رويدادهاي تغيير-كند همين كار را

DataRowكه تا زماني، راEndEdit يا CancelEditدر طول فرآيند. گذارد فراخوانده شوند، معلق مي،اين. شوند داده ميDataRowبه متعلق) Currentبه جاي روايت(Proposedهايي به روايت ويرايش، نسبت

. داردارجيخ وجودProposedتنها زماني است كه روايتو Current در روايت Proposed تكميل شود، مقادير ستون EndEditاگر ويرايش با فراخواندن كپي،

مي DataSet از DataRowبه متعلقProposedروايت با فراخواندنشاگر ويرايولي،. شوند حذفCancelEdit تكميل گردد، روايت Proposed متعلق به DataRow هاي شده، روايتحذفCurrent بدون تغيير

دا/ فصل دهم 303هادهويرايشو روزآمدسازي

بازراها به ترتيب متعهد به تغييرات شده، يا آنCancelEditو EndEditدر عمل،. مانند باقي مي.گردانند مي

ويژوال: براي به تعويق انداختن تغييراتBeginEditاستفاده از

بيسيك

به.1 : اضافه كنيدbtnDefer_Click event handlerكد زير را

Dim drCurrent As DataRow drCurrent = GetRow() drCurrent.BeginEdit() drCurrent.Item("FirstName") = "Proposed Name" MessageBox.Show(drCurrent.Item("FirstName", DataRowVersion.Proposed)) drCurrent.CancelEdit()

برةبراي اجراي برنام.2 . دهيد فشار F5روي كليد كاربردي،. كليك كنيدDeferرويبر.3

.گذارد را در يك قاب پيام به نمايش ميProposed Name، كاربرديةبرنام

. كليك كنيدOK برروي،براي بسته شدن قاب پيام.4و Current، مقدارهچون ويرايش لغو شد .مانند بالتغيير باقي ميRowStatus ستون

Microsoft ADO.NET 2.0 304گام به گام با

. كاربردي را ببنديدةبرنام.5

ويژوال: براي به تعويق انداختن تغييراتBeginEditاستفاده از

شارپ سي

به.1 : اضافه كنيدbtnDefer_Click event handlerكد زير را

DataRow drCurrent; drCurrent = GetRow(); drCurrent.BeginEdit(); drCurrent["FirstName"] = "Proposed Name"; MessageBox.Show(drCurrent["FirstName", DataRowVersion.Proposed].ToString()); drCurrent.CancelEdit();

برةبراي اجراي برنام.2 . فشار دهيدF5روي كليد كاربردي،. كليك كنيدDeferرويبر.3

.گذارد را در يك قاب پيام به نمايش ميProposed Name، كاربرديةبرنام

دا/ فصل دهم 305هادهويرايشو روزآمدسازي

. كليك كنيدOK برروي،براي بسته شدن قاب پيام.4و Current، مقدارهچون ويرايش لغو شد .مانند بالتغيير باقي ميRowStatus ستون

. كاربردي را ببنديدةبرنام.5

ها Data Source روزآمد ساختن

اعمال گرديد،)ي از آن است تبلورDataSetكه(هاي موجود در حافظه دادهةپس از آنكه تغييرات در نسخ يا با فراخواندن، Connection براي مناسب Commandء با به اجرا درآمدن اشيا،توانندمياين تغييرات

.، ماندگار شوندTableAdapter يا DataAdapterبه متعلقUpdateمتد

Microsoft ADO.NET 2.0 306گام به گام با

Adapter به كمك Data Sourceروزآمد ساختن

DataAdapter وTableAdapter هر دو، متد ،Updateءشي. نمايند را عرضه ميSystem.Data.Common.DbDataAdapterةرد در واقع همان، كهDataAdapter مي و به شمار Data رود

Provider ها،DataAdapter هاي متد برند، از شماري از روايت هاي خود را از آن به ارث ميUpdate نيز TableAdapter سوياز،تمام اين متدها. اند ذكر شده10-5 در جدول،اين متدها. كند پشتيباني مي.شوند عرضه مي

DbDataAdapter Update متدهاي10-5جدول

شرح متد

Update(dataSet) در به جدول نامهاي متعلق منبع داده .سازد را روزآمد ميDataSetبرده شده

Update(dataRows())ازةبه آرايهاي متعلق منبع داده .سازد ها را روزآمد ميDataRow مشخصي

Update(dataTable) به هاي متعلق منبع دادهDataTableسازد مشخصي را روزآمد مي.

Update(dataRows(),

dataTableMapping) از،هاي مشخصي راDataRowةبه آرايهاي متعلق منبع داده با استفاده

DataTableMappingمي، مشخص .سازد روزآمد

Update(dataSet,

dataTableName)

DataSet مشخصي را در DataTableNameةبه رشتهاي متعلق دادهمنبع.سازد مشخص روزآمد مي

كه عرضه ميRowUpdatedعنوان تحتCommand،propertyشيء هر،DataSetكندمينظارتنمايد، با RowUpdatedمقادير احتمالي. هاست، روزآمد شود منبع دادهدر SQLمقداري كه حاصل اجراي فرمان

property،با برشماري UpdateRowSource )شوند مشخصمي)اند ذكر شده10-6كه در جدول. UpdateRowSource برشماري10-6جدول

شرح مقدار

Both و نخستين رديف باز پس داده را، در رديف طرح هر پارامتر حاصل.كند، اعمال ميDataSetتغييريافته در

FirstReturnedRecord ادير موجود در نخستين رديف بازپس داده را، در رديف تغييريافتهمق.كند، اعمال ميDataSetدر

None مي پارامترهاي حاصل يا رديفةهم .انگارد هاي بازپس داده را ناديده

OutputParameters را در،طرح پارامترهاي حاصل ، اعمال DataSet در رديف تغييريافته.كند مي

دا/ فصل دهم 307هادهويرايشو روزآمدسازي

RowUpdatedproperty،به فراميني كه خود به خود براي متعلق DataAdapter و ها TableAdapterهابه ايجاد شده بر صورت پيشاند، CommandTextفراميني كه با تنظيم. تنظيم شده استNoneروي گزيده

propertyاز، به كمك برنامه به ايجاد شدهQuery Builderنويسي يا با استفاده پاند، بريشصورت گزيده.شوند تنظيم ميBothروي

به، مستقيماً DataAdapter متعلق به Updateهنگامي كه متد ، فراخوانده TableAdapterةوسيل يامي مي :گيرند شود، اقدامات زير به ترتيب صورت1.DataAdapter ،RowState هر رديف در DataSet يا DataAdapter داده، مشخص را مورد بررسي قرار

را براي اجرا-DeleteCommand يا InsertCommand ،UpdateCommand- مناسب Commandسپس .كند مشخص مي

و SourceColumnهاي property براساس، مناسبCommandبه شيء متعلقParametersةمجموع.2SourceVersionشود پر مي.

.شود مطرح ميRowUpdatingرويداد.34.Commandآيد را درمي مناسب به اج.به.5 ممكن،)كه در ادامه به آن خواهيم پرداخت( OnRowUpdated propertyمقدار بسته

. را روزآمد سازدDataSet مقادير رديف در DataAdapterاست.شود مطرح ميRowUpdatedمتد.67.AcceptChanges،بهDataSet يا DataAdapter شود فراخوانده مي.

ويژوال بيسيك : DataAdapter به كمكها روزآمد كردن منبع داده

به.1 : اضافه كنيدbtnUpdate_Click event handlerكد پايين را

daEmployees.Update(dsAdoSbs.Employees) UpdateDisplay()

برةبراي اجراي برنام.2 . فشار دهيدF5روي كليد كاربردي،. كليك كنيدSaveشته، سپس برروي را گذاChangedة واژNancyجاي، بهFirst Nameدر قاب متن.3

.نمايد تنطيم ميChangedبه ستون را برروي متعلقCurrent كاربردي، مقدارةبرنام

Microsoft ADO.NET 2.0 308گام به گام با

. كليك كنيدUpdateبرروي.4.دكن را از نو تنظيم ميDataSet كاربردي، منبع را روزآمد ساخته، سپس محتوياتةبرنام

. كاربردي را ببنديدةبرنام.5

سي: DataAdapter به كمكها كردن منبع دادهروزآمد شارپ ويژوال

به.1 : اضافه كنيدbtnUpdate_Click event handlerكد پايين را

daEmployees.Update(dsAdoSbs.Employees); UpdateDisplay();

دا/ فصل دهم 309هادهويرايشو روزآمدسازي

. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.2. كليك كنيدSave را گذاشته، سپس برروي Changedة واژNancy، به جاي First Nameدر قاب متن.3

.نمايد تنطيم ميChangedبه ستون را برروي متعلقCurrent كاربردي، مقدارةبرنام

. كليك كنيدUpdateبرروي.4.كند را از نو تنظيم ميDataSet كاربردي، منبع را روزآمد ساخته، سپس محتوياتةبرنام

. كاربردي را ببنديدةمبرنا.5

Data Command به كمكها روزآمد كردن منبع داده

چند آسان است، ولي هميشه بهترين انتخاب براي تغييرات ماندگار در منبع، هرUpdate متد كاربردوكني استفاده نميadapterاز هميشه البته،. رود شمار نميبهها داده براي ذخيره كردن ممكن استليم،جزدهدا ها، انجام اقداماتي براي حفظ يكپارچگي داده نيز،،زماني. بهره گيريم DataSetها از ساختاري به

و ترتيب معين الزم مي از. شود با نظم مي اين موقعيتدر هر يك براي كنترل Commandءتوان از اشيا ها،.ها استفاده نمود روزآمدسازي

Microsoft ADO.NET 2.0 310گام به گام با

مي براي مانUpdateكه از متد وقتي ة براي پر كردن مجموع،شود، متد مذكور دگاري تغييرات استفادهParameters،ازproperty هايSourceColumn وSourcVersionطور كه ديديم، ليكن، همان. كند استفاده مي

مقادير پارامترها را تنظيم آوريم، بايد صراحتاً به اجرا درمي را مستقيماCommandًهنگامي كه شيء .منمايي

ويژوال بيسيك : Data Command به كمكها روزآمد كردن منبع داده

به.1 : اضافه كنيدbtnCmd_Click event handlerكد زير را

Dim drCurrent As DataRow drCurrent = GetRow() cmdUpdateEmployees.Parameters("@FirstName").Value = drCurrent("FirstName") cmdUpdateEmployees.Parameters("@LastName").Value = drCurrent("LastName") cmdUpdateEmployees.Parameters("@EmployeeID").Value = drCurrent("EmployeeID") cnAdoSbs.Open() cmdUpdateEmployees.ExecuteNonQuery() cnAdoSbs.Close()

تر رااين كد، نخست دو متغير موقت ايجاد كرده، سپس به به متعلقUpdate برروي فرمان،تيب آن دوdaEmployees DataAdapterمي،اكنون بر روي فرم به نمايش گذاشته شدهو رديفي كه هم (كند تنظيم به.

سه.) تمرين استscaffolding بخشي از GetRow كه داشته باشيد،خاطر سپس، كد مذكور به تنظيممي بر روي مقاUpdateپارامتر در فرمان سرانجام، اتصال باز شده، فرمان به اجرا. پردازد دير رديف

و اتصال بسته مي .شود درآمده،به.2 . اضافه كنيدbtnFill_Click event handlerكد زير را

dsAdoSbs.Clear() daEmployees.Fill(dsAdoSbs.Employees) UpdateDisplay()

دا/ فصل دهم 311هادهويرايشو روزآمدسازي

و وضعيتو بارگذاري نموده، DataSetبههاا از منبع دادهرها داده مجدداً،اين كد سپس روايتمياطالعا (سازدت فرم را روزآمد scaffolding بخشي از UpdateDisplay كه متد داشته باشيد،خاطربه.

.) تمرين است. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.3. كليك كنيدSaveير داده، سپس برروي تغيNancy را به First Name ،Changed،در قاب متن.4

.سازد را روزآمد ميDataSetبه متعلقCurrent كاربردي، مقدارةبرنام

. كليك كنيدCommandرويبر.5مي كاربردي منبع دادهةبرنام را DataSet از آنجا كه اجراي فرمان مستقيماً،اما.سازد ها را روزآمد

در روزآمد نمي .يابد فرم بازتاب نميسازد، تغيير

Microsoft ADO.NET 2.0 312گام به گام با

. كليك كنيدFillرويبر.6مي داده مجدداً، كاربرديةبرنام تغيير First Name كه حال ديگر متن كنيدتوجه. كند ها را بارگذاري

.يافته است

. كاربردي را ببنديدةبرنام.7

سي:Data Commandكمكبهها روزآمدكردن منبع داده شارپ ويژوال

ب.1 : اضافه كنيدbtnCmd_Click event handlerه كد زير را

DataRow drCurrent; drCurrent = GetRow(); cmdUpdateEmployees.Parameters["@FirstName"].Value = drCurrent["FirstName"]; cmdUpdateEmployees.Parameters["@LastName"].Value = drCurrent["LastName"]; cmdUpdateEmployees.Parameters["@EmployeeID"].Value = drCurrent["EmployeeID"]; cnAdoSbs.Open(); cmdUpdateEmployees.ExecuteNonQuery();

دا/ فصل دهم 313هادهويرايشو روزآمدسازي

cnAdoSbs.Close();

را به متعلقUpdate برروي فرمان،اين كد، نخست دو متغير موقت ايجاد كرده، سپس به ترتيب آن دوdaEmployees DataAdapter همو رديفي مي،اكنون برروي فرم به نمايش گذاشته شده كه (كند تنظيم -به.

سه.) تمرين استscaffolding بخشي از GetRow كه داشته باشيد،خاطر سپس، كد مذكور به تنظيمسرانجام، اتصال باز شده، فرمان به اجرا. پردازد بر روي مقادير رديف ميUpdateپارامتر در فرمان ب و اتصال ميدرآمده، .شود سته

به.2 . اضافه كنيدbtnFill_Click event handlerكد زير را

dsAdoSbs.Employees.Clear(); daEmployees.Fill(dsAdoSbs.Employees); UpdateDisplay();

به ها را از منبع داده داده مجدداً،اين كد و وضعيتو بارگذاري نموده، DataSetها سپس روايتمياطالعات فرم را (سازد روزآمد scaffolding بخشي از UpdateDisplay كه متد داشته باشيد،به خاطر.

.) تمرين است. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.3. كليك كنيدSave تغيير داده، سپس برروي Nancy را به First Name ،Changedدر قاب متن.4

.سازد را روزآمد ميDataSetبه متعلقCurrent كاربردي، مقدارةبرنام

. كليك كنيدCommandبرروي.5

Microsoft ADO.NET 2.0 314گام به گام با

مي منبع داده، كاربرديةبرنام آن، ليكن.سازد ها را روزآمد را DataSet جا كه اجراي فرمان مستقيماً از.يابد سازد، تغيير در فرم بازتاب نمي روزآمد نمي

. كليك كنيدFillبرروي.6مي داده مجدداً، كاربرديةبرنام تغيير First Name كه حال ديگر متن كنيدتوجه. كند ها را بارگذاري.يافته است

. كاربردي را ببنديدةبرنام.7

دا/ فصل دهم 315هادهويرايشو روزآمدسازي

DataSetقبول يا رد تغييرات در

با،اين كار.ستها DataRow برايي جديدة تنظيم خط پاي،ها گام آخر در فرآيند روزآمدسازي داده AcceptChanges خود، DataAdapterبه متعلقUpdateمتد. گيرد صورت ميAcceptChangesاز متد استفاده

مياگر مستقيماًولي،. خواند را فرا مي براي روزآمدسازي مقادير،پردازيد، الزم است به اجراي فرماني. را فراخوانيدAcceptChanges،وضعيت رديف

مي، آنDataSetن تغييرات صورت گرفته در خواهيد، به جاي پذيرفت اگر مي توانيد متد ها را رد كنيد،RejectChangesرا فراخوانيد .RejectChangesهاي جديد، بازگرداندن، با دور انداختن تمام رديف

و بازگرداندن تمام ستون رديف در را بهDataSetشان، ها به مقادير اوليه هاي حذف شده، حالتي كهف .گرداند قرار داشت، باز ميAcceptChangesراخواني آخرين بار

را فراخوانيد، توانايي RejectChanges يا AcceptChanges،ها اگر پيش از روزآمدسازي منبع داده:مهمبه متعلقUpdateمتد. را از دست خواهيد دادUpdateماندگار كردن تغييرات با استفاده از متد

DataAdapter از ،RowStatus propertyها بايد ماندگار بمانند براي مشخص ساختن اين كه كدام رديف Unchanged رديف را برروي RowStatus، هر دو، RejectChangesو AcceptChangesو.كند استفاده مي. كنند تنظيم مي

AcceptChangesمتد

و DataSet ،DataAdapterء مورد پشتيباني اشيا،AcceptChangesمتد ،DataRowدر بيشتر موارد،. استهر راAcceptChanges فراخوانيد، چه خود DataSet را براي AcceptChangesتنها الزم است براي

DataTableعالوه،به. خواند خود فرامي DataTableدخوة نيز به نوب،AcceptChanges را براي هر DataRow .خواند فرامي

هاي هر ستون در رديفOriginalرسد، مقادير ميDataRow به AcceptChangesهنگامي كه فراخوانيو تغيير ميCurrent به مقادير،Modified يا Addedصورت بهRowStatusبا روي برRowStatus خوديابند،

Unchangedمي رديفةهاي حذف شده از مجموع رديف. شود تنظيم مي .شوند ها خارج

يژوال بيسيكو: DataSetقبول تغييرات در

:، كه در تمرين گذشته ايجاد كرديم، اضافه كنيدbtnCmd_Click event handlerكد زير را به انتهاي.1

dsAdoSbs.AcceptChanges() UpdateDisplay()

: به اين صورت درخواهد آمدevent handlerحال،

Microsoft ADO.NET 2.0 316گام به گام با

Dim drCurrent As DataRow drCurrent = GetRow() cmdUpdateEmployees.Parameters("@FirstName").Value = drCurrent("FirstName") cmdUpdateEmployees.Parameters("@LastName").Value = drCurrent("LastName") cmdUpdateEmployees.Parameters("@EmployeeID").Value = drCurrent("EmployeeID") cnAdoSbs.Open() cmdUpdateEmployees.ExecuteNonQuery() cnAdoSbs.Close() dsAdoSbs.AcceptChanges() UpdateDisplay()

به.2 . اضافه كنيدbtnAccept_Click event handlerهمان دو سطر را. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.3. كنيد كليكSaveرا گذاشته، سپس برروي Newة واژDavolio، به جاي Last Nameدر قاب متن.4

.سازد را روزآمد ميCurrent كاربردي، مقدارةبرنام

دا/ فصل دهم 317هادهويرايشو روزآمدسازي

. كليك كنيدCommandرويبر.5.شوند روزآمد ميRowStatusو Version فراخوانده شده، اطالعات AcceptChangesچون متد

.كنيد كليك Save تغيير داده، سپس برروي Davolio را به Last Name ،Newدر قاب متن.6.سازد را روزآمد ميRow Statusو Current مقدار، كاربرديةبرنام

. كليك كنيدAcceptبر روي.7.سازد را روزآمد ميRow Statusو Original كاربردي، مقدارةبرنام

Microsoft ADO.NET 2.0 318گام به گام با

و سپس بر روي Updateرويبر.8 ،Fillكليك كنيد .ها تنظيم شده، هيچ تغييري در منبع دادهUnchangedروي از نو برDataRowو RowStatusچون

.شود ماندگار نمي

. كاربردي را ببنديدةبرنام.9

دا/ فصل دهم 319هادهويرايشو روزآمدسازي

سي: DataSetقبول تغييرات در شارپ ويژوال

:، كه در تمرين گذشته ايجاد كرديم، اضافه كنيدbtnCmd_Click event handlerكد زير را به انتهاي.1

dsAdoSbs.AcceptChanges(); UpdateDisplay();

: به اين صورت درخواهد آمدevent handlerحال،

DataRow drCurrent; drCurrent = GetRow(); cmdUpdateEmployees.Parameters["@FirstName"].Value = drCurrent["FirstName"]; cmdUpdateEmployees.Parameters["@LastName"].Value = drCurrent["LastName"]; cmdUpdateEmployees.Parameters["@EmployeeID"].Value = drCurrent["EmployeeID"]; cnAdoSbs.Open(); cmdUpdateEmployees.ExecuteNonQuery(); cnAdoSbs.Close(); dsAdoSbs.AcceptChanges(); UpdateDisplay();

به.2 . اضافه كنيدbtnAccept_Click event handlerهمان دو سطر را. فشار دهيدF5 كاربردي، بر روي كليدةبراي اجراي برنام.3. كليك كنيدSave گذاشته، سپس برروي راNewةواژ Davolio، به جاي Last Nameدر قاب متن.4.سازد را روزآمد ميCurrent كاربردي، مقدارةبرنام.5

Microsoft ADO.NET 2.0 320گام به گام با

. كليك كنيدCommandبرروي.6.شوند روزآمد ميRowStatusو Version فراخوانده شده، اطالعات AcceptChangesچون متد

. كليك كنيدSaveروي تغيير داده، سپس برDavolio را به Last Name ،Newدر قاب متن.7.سازد را روزآمد ميRow Statusو Current مقدار، كاربرديةبرنام

دا/ فصل دهم 321هادهويرايشو روزآمدسازي

. كليك كنيدAcceptرويبر.8.سازد را روزآمد ميRow Statusو Original كاربردي، مقدارةنامبر

و سپس برUpdateرويبر.9 كليك كنيدFillروي،ها تنظيم شده، هيچ تغييري در منبع دادهUnchangedروي از نو برDataRowو RowStatusچون

.شود ماندگار نمي

Microsoft ADO.NET 2.0 322گام به گام با

. كاربردي را ببنديدةبرنام. 10

RejectChangesمتد

است، DataRowو DataSet ،DataTableء، مورد پشتيباني اشياAcceptChanges، همانند RejectChangesمتدميء اشياةها را روان سيلي از فراخوان،در سلسله مراتبواقعو هر شيء .سازد زير خودهاي هر ستون در رديفCurrentير رسد، مقاد ميDataRow به RejectChangesكه فراخوان هنگامي

و Original به مقادير Modified يا Deletedصورت بهRowStatusداراي ها آنRowStatus تغيير يافته،.شوند برداشته ميRowsةهاي اضافه شده، از مجموع رديف. شود تنظيم ميUnchangedبرروي

ويژوال بيسيك : DataRowرد كردن تغييرات در

: اضافه كنيدbtnReject_Click event handlerرا به كد زير.1

dsAdoSbs.RejectChanges() UpdateDisplay()

. فشار دهيدF5 كاربردي، بر روي كليدةبراي اجراي برنام.2و سپس برروي تغييرReject را به First Name ،Nancyدر قاب متن.3 . كليك كنيدSave داده،

.كند را روزآمد ميRowStatusو Current كاربردي، مقدارمةبرنا

دا/ فصل دهم 323هادهويرايشو روزآمدسازي

. كليك كنيدRejectرويبر.4و Original متعلق به رديف را به مقادير Current روايت، كاربرديةبرنام RowStatus آن بازگردانده،.نمايد تنظيم ميUnchanged برروي را مجدداً

. كاربردي را ببنديدةبرنام.5

سي: DataRowرد كردن تغييرات در شارپ ويژوال

به.1 : اضافه كنيدbtnReject_Click event handlerكد زير را

dsAdoSbs.RejectChanges(); UpdateDisplay();

Microsoft ADO.NET 2.0 324گام به گام با

برةبراي اجراي برنام.2 . فشار دهيدF5روي كليد كاربردي،و سپس برروي Reject را به First Name ،Nancyدر قاب متن.3 . كليك كنيدSave تغيير داده،

.كند را روزآمد ميRowStatusو Current كاربردي، مقدارةبرنام

. كليك كنيدRejectرويبر.4و Original متعلق به رديف را به مقادير Current روايت، كاربرديةبرنام RowStatus آن بازگردانده،.نمايد تنظيم ميUnchanged برروي را مجدداً

.ديد كاربردي را ببنةبرنام.5

دا/ فصل دهم 325هادهويرايشو روزآمدسازي

خالصه

NET. كاربردية برنامهردرها براي روزآمدسازي منبع داده ضروري،ةمرحل چهاربادر اين فصل،

Framework موجود در حافظه، روزآمدسازيةها، تغيير نسخ منبع دادهازها بازيابي داده: آشنا شديم و روزآمدسازي منبع داده .DataSetها

مي حفظ ميADO.NET را، كه توسط DataRowهاي همچنين، با روايت و اينكه چگونه از شوند، توانRowState propertyفرآيند ويرايش استفاده نمود، آشنا شديم جزئيات براي نظارت بر .

يازدهمفصل

ها مقيدسازي دستي به داده:در پايان اين فصل، خواهيد توانست

. استفاده كنيدمختلفي، از متدهاي،هاي كنترل propertyبراي مقيدسازي ساده به�. استفاده كنيدمختلفي، از متدهاي،هاي كنترل property به مركببراي مقيدسازي�.كنيد استفاده Bindingهاي شيء propertyاز�

از،هاي ويندوز مقيد ساختيم، ليكن در واقع ها در فرم ها را به كنترل هاي گذشته، داده در فصل چيزيهاي مورداستفاده براي مقيد ساختن با بررسي مكانيسمكار را در اين فصل،. نگفتيمجزئيات اين فرآيند

، دوازدهمدر فصل اين بحث،.كنيميم مايكروسافت، آغاز ADO.NETهاي هاي داده ها به منبع كنترل.، نيز، ادامه خواهد يافت“BindingSourceهاي ويندوز با استفاده از جزء ها در فرم مقيدسازي به داده”

هاي ويندوز ها در فرم درك مقيدسازي به داده

.NET Framework و انعطافبسيار، مكانيسم به پذيري براي مقيدسازي به داده قدرتمند هاي propertyهادر. گذاردميكنترل در اختيار مقبيشترگرچه ، مثالً- نمايش كنترل قابلريدا موارد اين مقيدسازي به

DisplayMember propertyبه كنترل متعلقListBox،ياText propertyبه يك كنترل متعلقTextBox-مي صورت مي هر گيرد، ولي را كنترلهر propertyتوان .ساخت ها مقيد داده به منبعيرا property همةتوان چون مي پس رنگتوانمي مقيد نمود، پس مثالًهاي هر كنترلي و هاي زمينه

و ويژگيةزمين پيش به كنترل هاي فونت فرم مقيد اطالعاتي جدول بانكفالن رديف در فالنهاي آن رامي. ساخت كاربرديةن اين امكان را داد، كه واسط كاربر برنامتوان به كاربرا با استفاده از اين تكنيك،

در اساسي تغيير ايجادبدونو اطالعاتي با روزآمد ساختن بانكرا، صرفاً هاي كاري با تمام ريزه(كديو نگهداري كه ممكن است .دن شخصي ساز،) باشدهمراهچنين تغييري با مربوط به حفظ

ها منابع دادهميهاي فرم ويندو كنترل و نه فقط جدول توان به منبع دادهز را اطالعاتي سنتي، مقيد بانكهايها،، IList هاي، الزم است واسط باشدها شايسته عنوان منبع داده آن شيئياز نقطه نظر فني، براي. ساخت

IBindingList يا IEditableObject به اجرا درآورد را.به، كه سادهIListواسط و مجموعه كمك آرايهتر از همه است، مي ها آن. شود ها عملي معناي اين سخن

به كنترل متعلقObjectCollection به محتويات Label كنترل Text property مقيد ساختن است، كه مثالً

Microsoft ADO.NET 2.0 328گام به گام با

ListBoxداشته باشد، سودي از اين دستهرچند كه تصور چنين موقعيتي، كه اقدامي(پذير است امكان مي ميIComponentو IListهاي واسطاجرايهر شيء را كه به ). دشوار استقدري در پردازد، توانو اجرا مقيد ساخت زمان .هاي طراحيار تغيير، از هشدآيد به اجرا درمي DataViewManagerو DataViewء، كه توسط اشياIBindingListواسط

مييياشيا. كند پشتيباني مي خود كالًمي كه موردي در فهرست يا سازند، هنگا كه اين واسط را عمليمية را براي هشدار دادن به برنامListChangedيابد، رويدادهاي فهرست تغيير مي .سازند كاربردي مطرح، BeginEdit، متدهاي آيد به اجرا درمي DataRowView، كه توسط شيء IEditableObjectباالخره، واسط

EndEdit وCancelEditكند را عرضه مي.مي مشغولADO.NETوشبختانه، هنگامي كه به كار در داخلخ جزئيات مربوط به توانيد عمدتاً ايد،

مي منبع دادهءاند، كه اشيا مهما زماني حقيقتاًه اين. واسط را ناديده بگيريداجراي .سازيد هاي خودتان را

كه،ءا از سوي شماري از اشيها در فرم ويندوز عمالً، مقيدسازي به دادهNET Framework.در داخلو مطابق تصوير پايين با يكديگر ميدارندكار سر .گيرد، صورت

BindingContextتنها هدف. قرار داردBindingContextدراين معماري منطقي، درباالترين سطح، شيء، كه فرم به آن اشارهها يكي براي هر منبع داده. استBindingManagerBaseءاي از اشيا مديريت مجموعه

.كند ميشه رديئير مي ارث ميControlة كه از از. باشدBindingContext دارايتواند برد، در بيشتر موارد،

BindingContextاي دارنده نگاهكنيد، ولي اگر فرم شامل يك كنترل فرم استفاده مي)container ( مانندPanel براي جدايي BindingContextباشد، ايجاد شيء) هاست اي مقيد به دادهه كه حاوي كنترل(GroupBoxيا

به غيرمستقيميمنظور پرهيز از افتادن در مسيربه(كنترل مذكور در هنگام اشاره به كنترل، هاي موجودراممكن) آن .دكنتر آسان است كار

توان مستقيماً، از اين رو نمي انتزاعي استاي ردهBindingManagerBaseطور كه اشاره شد، همان مديريت BindingContext كه توسط شيءييبلكه، اشيا. به وجود آورد جديدي از اين شيءةنمونرد نمونهشوند، عمالً مي .روند به شمار ميCurrencyManagerة يا ردPropertyManagerةهاي جديدي از

از نمونهBindingManagerBaseرا بازپس دهد، شيء ها بتواند تنها يك مقدار واحد اگر منبع داده اييا بتواند(دهدپس را بازءاي از اشيا ها مجموعه اگر منبع دادهو. خواهد بود PropertyManagerرده

رد نمونهBindingManagerBase، شيء)بازپس دهد ءاشيا. خواهد بود CurrencyManagerةاي ازADO.NETازة همواره نمون .آورند را به وجود ميCurrencyManager جديديرا ها به آن منبع داده رد مكان را در فهرست نگاه داشته، مقيدسازيCurrencyManagerشيء ها

ها مقيد بدان هستند، داند كدام كنترل ها خود هيچگاه نمي توجه داشته باشيد كه منبع داده. كند مديريت مي.گذارند يا كدام مورد را به نمايش مي

به/ فصل يازدهم 329ها دادهمقيدسازي دستي

ADO Position property متعلق به CurrencyManager،ها را در خود نگاه دادهة رديف جاري در يك مجموع

از پشتيباني نمي) cursors(ها از نشانگرADO.NETهاي منابع داده. دارد مي و از اين رو اطالعي كنند،نا. ندارند“ جاري”رديف نوس جلوه كند، ولي در عملأماين موضوع ممكن است در نظر اول كمي

پذير ها امكان دادهةدر يك مجموع“ نشانگر”معماري قدرتمندتري است، چه اكنون ديگر نگاهداري چندين.است

و مشخص، نمون براي هر منبع داده . وجود داردCurrencyManagerاي از شيء جداگانهةهاي مجزابه،هاي روي يك فرم اگر تمام كنترل يك يك منبع داده مقيد واحد CurrencyManagerهاي واحد باشند،

كه براي مثال، فرمي كه حاوي قاب. وجود خواهد داشت فيلدهاي يك جدول را به جملگي هاي متني است،ها وجود داشته ليكن، اگر چندين منبع داده. دارد CurrencyManager يك شيء تنهاگذارند، نمايش مي

كمثالً(باشند مي/ه اطالعات اصلي در فرمي ها يك شيء براي هر منبع داده،)گذارد مفصل را به نمايشCurrencyManager خواهد داشت جداگانه وجود.

از هر كنترل فرم ويندوز داراي مجموعه كنترل مذكورةويژ Binding است، كه اشياي DataBindingايهر. را در خود دارد يكها مقيد به دادهpropertyبراي طور همان. وجود داردBindingي متعلق به كنترل،

وراها، كنترلي منبع دادهBindingكه خواهيم ديد، شيء مذكور كنترلproperty كه قرار است مقيد شود،مي propertyها را براي كه داده(را .سازد مشخصمي)گذارد هاي مقيدسازي ساده به نمايش

CurrencyManager يك ،BindingsCollection propertyة از ردBindingManagerBaseبرد به ارث مي .BindingsCollectionء حاوي ارجاعاتي به اشياBinding هر كنترل استةويژ .

ADO.NETهاي ها به منبع داده مقيدسازي كنترل

در هاي فرم كنترل :كنندميها پشتيباني از دو نوع مقيدسازي به دادهNET Framework.هاي ويندوز�Property هاي كنترل كه حاوي يك مقدار واحد هستند، مقيدسازي ساده)simple-bound (شوندمي.�Property و مانند محتويات به نمايش گذاشته شده قاب-هاي كنترل ها، كه data gridهاي فهرست

.شوندمي) complex-bound( مقيدسازي مركب-حاوي چندين مقدار هستندميهر كن و مركب باشد ويژگيحال دارايدر عينتواند ترلي براي مثال،. هاي مقيدسازي ساده

MaxDate propertyبه كنترل متعلقMonthCalendar كه حداكثر مجاز تاريخ انتخاب شده را مشخص ،مي مقيدسازي ساده propertyسازد، مي ي حالدر. استDateTimeداراي يك مقدار تنها، كه رود به شمارهايي است كه قرار است در قالب حروف سياه اي از تاريخ آن، كه حاوي آرايهBoldedDates propertyكه

مي مقيدسازي مركب به propertyد،نو درشت به نمايش درآي .آيد حساب

Microsoft ADO.NET 2.0 330گام به گام با

propertyكنترل در ويژوال استوديوةهاي مقيدسازي ساد

ميي متعلق به كنترلproperty، هر NET Framework.در به حاوي يك مقدار واحد را صورت ساده به توان.ها مقيد نمود در منبع دادهيمقدار واحدسه. تواند در زمان طراحي يا در زمان اجرا صورت گيردمي،مقيدسازي در هر دو موقعيت، الزم است

:مقدار را مشخص كنيم. كه قرار است مقيد شودpropertyنام�.ها منبع داده�كه در داخل منبع دادهمسير پيمايش� .آيد درمييصورت مقدار واحدبه نهايتاًها،

مي،هاست مسير پيمايش شامل سلسله مراتبي از نام در. شوند كه با نقطه از يكديگر جدا براي مثال،، مسير پيمايش dsAdoSbs موسوم به DataSet در Products متعلق به جدول ProductIDاشاره به ستون

Products.ProductIDخواهد بود .؛dsAdoSbs.Products: ها وارد سازيد را به عنوان بخشي از منبع دادهTableNameيدتوان همچنين مي

پذيري همان طور كه خواهيم ديد، انعطاف. استProductID مسير پيمايش تنها همان،كه در اين صورت. تر است مهم) consistency(و پيگيريچيز خوبي است، ولي انسجام

كه property، كه است DataBindings بخش داراي در ويژوال استوديو Propertiesةپنجر هايي رامي مقيد به دادهاوقاتبيشتر هاي ديگري در قاب گفتگوي Property. گذارد ها هستند، به نمايش

Formatting and Advanced Bindingة موجودند، كه، هنگامي كه برروي دكم. . Advancedدر بخش.،Formatting and Advanced Bindingقاب گفتگوي. آيند كنيم، به نمايش درمي كليك ميPropertiesةپنجر

ها را در زمان طراحي برخي كنترلمتعلق به هاي مقيدسازي ساده propertyامكان دسترسي به تمامم .دآوريفراهم

Propertiesةر با استفاده از پنجpropertyمقيدسازي

و در صورت لزوم برروي Chapter 11 - Startةپروژ.1 يا(Binding.vb را در ويژوال استوديو باز كنيد،Binding.csمي، اگر از سي . دوبار كليك كنيدSolution Explorerدر) كنيد شارپ استفاده

در،ويژوال استوديو .گذارد به نمايش ميForm Designer فرم را

به/ فصل يازدهم 331ها دادهمقيدسازي دستي

. انتخاب كنيد، راCategoryID labelدر سمت راست واقع،tbCategoryIDاب متنق.2و سپس فهرست DataBindings، بخش Propertiesةدر پنجر.3 ،Text propertyرا باز كنيد .و Binding List Instances ،dsAdoSbs، گره Other Data Sourcesگره.4 ،Categories و سپس را باز،

CategoryIDخاب كنيد را انت..سازد مقيد ميCategoryID را به Text property،ويژوال استوديو

Microsoft ADO.NET 2.0 332گام به گام با

Formatting and با استفاده از قاب گفتگوي propertyمقيدسازيAdvanced Binding

. انتخاب كنيد،Name label در مجاورت، را در فرمtbCategoryName، قاب متن Form Designerدر.1و Advanced را باز، فيلد DataBindingsبخش) در صورت لزوم(، Propertiesةدر پنجر.2 را انتخاب،

.ةسپس برروي دكم . از. . كليك كنيدAdvanced propertyپس در Text property را، درحالي كه Formatting and Advanced Binding قاب گفتگوي،ويژوال استوديو

.كند حالت انتخاب قرار دارد، باز مي

. را باز كنيدBindingsفهرست.3و Binding List Instances ،dsAdoSbs، گره Other Data Sourcesگره.4 ،Categories و سپس را گشوده،

CategoryNameرا انتخاب نماييد .

به/ فصل يازدهم 333ها دادهمقيدسازي دستي

. كليك كنيدOKبرروي.5هايي مقيد به دادهها property يكي از Textو چون. كند را تنظيم ميdata binding،ويژوال استوديو

.آيد به نمايش درمي Propertiesةگزيده است، مقدار آن در پنجر پيش

هاي كنترل در زمان اجراpropertyةمقيدسازي ساد

درراپذيري زيادي انعطافNET Framework.كنيم، هنگامي كه در زمان اجرا مبادرت به مقيدسازي ميم چگونگي مشخص ساختن منبع داده و ميماقادير مسير پيمايش در اختيارها هر. دهد قرار براي مثال،

.كنند اشاره ميProductsبه جدول متعلقProductID زير، به ستون Bindingدو شيء

Microsoft ADO.NET 2.0 334گام به گام با

bndFirst = New System.Windows.Forms.Binding(“Text”, dsAdoSbs, _ “Products.ProductsID”) bndSecond = New System.Windows.Forms.Binding(“Text”. _ dsAdoSbs.Products, “ProductID”)

كه ميها هاي منبع داده propertyليكن، از آنجا و كنند بسيار با هم فرق ،.NET Framework ،currencyManagersمي متفاوتي را براي مديريت آن هاي فرم همگاه آورد، كنترل ها به وجود

)synchronized (دشون نمي.در اين تكنيك، مي براي مثال، ممكن است الزم باشد دو رديف. ها سودمند باشد موقعيتبرخيتواند

مي.از يك جدول را در يك فرم به نمايش درآوريد حال، بااين. سازد تكنيك مذكور انجام اين كار را آسان. به نمايش درآورندرا يك رديفهاي واقع برروي فرم، اطالعات خواهيد تمام كنترل در بيشتر موارد مي

و مقادير مسير پيمايش، الزم است در مشخص كردن منبع دادهبهترةنتيج براي گرفتن يك،ها همواره به.كنيدشيوه عمل

مي: توصيه هاي زمان طراحي خواهيد با مقيدسازيميوكنيد، اگر مبادرت به مقيدسازي در زمان اجراآن مراتب منبع دادهح سلسله همگاه شود، تنها باالترين سط ميها را، مطابق آيد، مشخص چه در پايين

:سازيدbndFirst = New System.Windows.Forms.Binding(“Text”, _

dsAdoSbs, “Products.ProductID”)

هر propertyها آشنا شديم، براي مقيد ساختن كه تاكنون با آنADO.NETء بسياري اشياانندهم كنترل اضافه DataBindingة را به وجود آورده، آن را به مجموعBindingل، نخست بايد شيء كنترمية از چندين روايت سازندBinding، شيء11-1مطابق جدول. نماييم .كند خويش پشتيباني

Bindingهاي سازنده11-1جدول

شرح متد

New(propertyName,

dataSource, dataMember) و منبع دادهpropertyبين و مسير پيمايش مشخص مشخص ،ها

bindingمي به .آورد وجود

New(propertyName,

dataSource, dataMember,

formattingEnabled)

و منبع دادهpropertyبين و مسير پيمايش مشخص مشخص هاbindingمي به شده را تنها زماني فرمتيها آورد، كه داده وجود

. باشدTrueصورت بهformattingEnabledرد كه گذا به نمايش مي

New(propertyName,

dataSource, dataMember,

formattingEnabled,

updateMode)

و منبع دادهpropertyبين و مسير پيمايش مشخص مشخص هاbindingمي به شده را تنها زماني فرمتيها آورد، كه داده وجود

كه به نمايش مي با Trueصورت بهformattingEnabledگذاردupdateModeمشخص باشد .

به/ فصل يازدهم 335ها دادهمقيدسازي دستي

شرح متد

New(propertyName,

dataSource, dataMember,

formattingEnabled,

updateMode, nullValue)

و منبع دادهpropertyبين و مسير پيمايش مشخص مشخص هاbindingمي به شده را تنها زماني ها فرمت آورد، كه داده وجود

م كهيبه نمايش با Trueصورت بهformattingEnabledگذاردupdateModeو شيء مشخص در مشخص باشد، شده

nullValueآن را تنها زماني به نمايش در مي آورد كه مقدار. باشدdbNullمعادل

New(propertyName,

dataSource, dataMember,

formattingEnabled,

updateMode, nullValue,

formatString)

و منبع دادهpropertyبين و مسير پيمايش مشخص مشخص هاbindingمي به شده را تنها زماني فرمتيها آورد، كه داده وجود

كه به نمايش مي با Trueصورت بهformattingEnabledگذاردupdateMode وformatStringو شيء مشخص مشخص باشد،

مي را تنها زماني به نماnullValueشده در كه يش در آورد. باشدdbNullمقدار آن معادل

New(propertyName,

dataSource, dataMember,

formattingEnabled,

updateMode, nullValue,

formatString, formatinfo)

و منبع دادهpropertyبين و مسير پيمايش مشخص مشخص هاbindingرا فرمتيها آورد، كه داده وجودمي به تنها زماني شده

كه به نمايش مي با Trueصورت بهformattingEnabledگذاردupdateMode وformatString و شيءformatinfo ،مشخص باشد

درو شيء مشخص را تنها زماني به نمايش در nullValueشده. باشدdbNullآورد كه مقدار آن معادل مي

كنند، يكي از اعضاي بر شماري را مشخص ميupdateModeيك پارامتراي هاي سازنده روايتDataSourceUpdateMode ةگزيد تنظيم پيش. پذيردمي، است11-2 را، كه داراي مقادير ذكر شده در جدول

و اين همان تنظيمي است كه بيشترين كاربرد را داردproperty ،OnPropertyChangedاين با اين. است،مي اسNeverحال، اگر از تنظيم مي تفاده و ) validation(توانيد براي كنترل زمان رويداد اعتبارسنجي كنيد،

در ادامه، در همين فصل،. استفاده كنيدBinding متعلق به WriteValue، از متد)formatting(بندي قالب. صحبت خواهيم كردWriteValue دربارة

DataSourceUpdateMode برشماري11-2جدول

شرح مقدار

Never و مقادير وارد شده در كنترل مورد منبع داده ها هيچگاه روزآمد نشده،.گيرند بندي مجدد قرار نمي تحليل، اعتبارسنجي يا قالب

OnPropertyChangedزماني كهpropertyمي كند، منبع داده كنترل تغيير مي .شود ها روزآمد

OnValidation كه زمانيpropertyمي كنترل مورد اعتبا ها گيرد، منبع دادهر سنجي قرارو هم مي زمان قالب روزآمد شده .شود بندي مجدد

Microsoft ADO.NET 2.0 336گام به گام با

در منبع. پذيرند را نيز به خود ميformatStringو nullValueدو روايت آخر سازنده، پارامترهايگزيده تصور آن را نوعي مقدار پيش. شود استفاده ميdbNullجاي مقدار بهnullValueها از شيء دادهبندي مقادير در منبع هاي خاص است، كه براي قالب شامل يك رشته نويسهformatStringشيء. كنيدآن داده مي ها از به. شود ها استفاده ةهاي فرمت، نگاه كنيد به موضوع ردspecifierبراي جزئيات مربوط

String در MSDN Help.

ويژوال بيسيك:نويسي به كمك برنامهpropertyمقيد ساختن

. فشار دهيدF7براي به نمايش درآوردن ويرايشگر كد، بر روي كليد.1به.2 : اضافه كنيدbtnSimple_Click event handlerسطور زير را

Dim newBinding As System.Windows.Forms.Binding newBinding = New System.Windows.Forms.Binding("Text",_ dsAdoSbs, "Categories.Description") tbCategoryDescription.DataBindings.Add(newBinding)

و سپس با ارائ را اعBindingاين كد، نخست يك شيء ها، منبع داده)property)Text نامةالن نموده،)dsAdoSbs ( و مسير پيمايش)Categories.Description (به به سازنده، نمونه . آوردميوجوداي از آن را

متعلق به DataBindingsة را به مجموعBinding، شيء جديد Addباالخره، كد مذكور با استفاده از متد.كند اضافه ميtbCategoryDescriptionكنترل

. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.3

به/ فصل يازدهم 337ها دادهمقيدسازي دستي

. كليك كنيدSimpleةروي دكمبر.4.گذارد را اضافه كرده، مقدار را در قاب متن به نمايش ميbinding كاربرديةبرنام

.در انتهاي فرم كليك كنيد)<(Next Rowةبرروي دكم.5

مي كدي كه اين دكمهةدر ادامه، در همين فصل، دربار .دكركند، صحبت خواهيم ها را اجرا

آنةبرنام م، كاربردي گروه بعدي، به همراه شرحي از .گذاردي را به نمايش

. كاربردي را ببنديدةبرنام.6

Microsoft ADO.NET 2.0 338گام به گام با

و عنوان منبع داده را بهdsAdoSbs.Categoriesاگر:مهم به را بهDescriptionها عنوان مسير پيمايشداد، چه ويژوال هاي رديف جاري نمايش نمي دادهDescription ارائه داده بوديم، فيلد Bindingةسازند

كه. آورد دوم به وجود ميCurrencyManagerاستوديو خود يك هاي زمان اجرا به وجود bindingهنگاميبا مي را DataSetشوند، يادتان باشد كه ) synchronized(هاي زمان طراحي همگاه bindingآوريد، كه بايد.ها مشخص سازيد عنوان تنها منبع دادهبه

سي: نويسي به كمك برنامهpropertyمقيد ساختن شارپ ويژوال

ب.1 بربراي . فشار دهيدF7روي كليده نمايش درآوردن ويرايشگر كد،به.2 : اضافه كنيدbtnSimple_Click event handlerسطور زير را

System.Windows.Forms.Binding newBinding; newBinding = new System.Windows.Forms.Binding("Text", dsAdoSbs, "Categories.Description"); tbCategoryDescription.DataBindings.Add(newBinding);

و سپس با ارائ Bindingاين كد، نخست يك شيء ها، منبع داده)property)Text نامةرا اعالن نموده،)dsAdoSbs ( و مسير پيمايش)Categories.Description (به به سازنده، نمونه مياي از آن را . آورد وجود

به متعلقDataBindingsة را به مجموعBinding، شيء جديد Add مذكور با استفاده از متد باالخره، كد.كند اضافه ميtbCategoryDescriptionكنترل

. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.3

به/ فصل يازدهم 339ها دادهمقيدسازي دستي

. كليك كنيدSimpleةبرروي دكم.4مي را اضافه كرده، مقدbinding كاربرديةبرنام .گذارد ار را در قاب متن به نمايش

.در انتهاي فرم كليك كنيد)<(Next Rowةبر روي دكم.5مي، كاربرديةبرنام .گذارد گروه بعدي، به همراه شرحي از آن، را به نمايش

مي در ادامه، در همين فصل، درباره كدي كه اين دكمه .كند، صحبت خواهيم نمود ها را اجرا

. كاربردي را ببنديدةبرنام.6

Microsoft ADO.NET 2.0 340گام به گام با

و عنوان منبع داده را بهdsAdoSbs.Categories اگر:مهم به را بهDescriptionها عنوان مسير پيمايشداد، چه ويژوال هاي رديف جاري نمايش نمي دادهDescription ارائه داده بوديم، فيلد Bindingةسازند

كه. آورد دوم به وجود ميCurrencyManagerاستوديو خود يك به bindingهنگامي هاي زمان اجرابا وجود مي شوند، يادتان باشد كه ) synchronized(هاي زمان طراحي همگاه binding آوريد، كه بايد

DataSetها مشخص سازيد عنوان تنها منبع داده را به.

propertyهاي مقيدسازي مركب كنترل

هاي propertyها مقيد شوند، به مقدار واحدي در منبع دادههاي مقيدسازي ساده، كه بايدpropertyبرخالفهاي ترين مثال رايج. موارد متعدد باشند)ةدهند نشانو احتماالً(توانند حاوي مقيدسازي مركب مي

property از كنترلي كه property، ولي هر ComboBoxو ListBoxهاي مقيدسازي مركب، البته، عبارتندمي چندين مقدار را مي به پذيرد، .صورت مركب مقيد گرددتواندمي اگرچه تكنيك شد توانند، بسته به كنترل موردنظر، متفاوت باشند، ولي بيشتر كنترل ها ةهاي مقيدو نه افزودن شيDataSource property با تنظيم مركب، مستقيماً ، DataBindingsة به مجموعBindingء،

.شوند مقيد ميشد رين كنترلت معمول DisplayMember، نيز،)ComboBoxو ListBox يا همان( مركبةهاي مقيد

propertyمي را عرضه مي DisplayMember property. سازد كدام كنترل به نمايش درآيد كنند، كه مشخص.شود به يك مقدار واحد تحويل مي

كنند، كه به كنترل را عرضه ميComboBox ،ValueMember propertyو ListBoxهاي عالوه، كنترلبهو درعين) user-friendly(دهد مقداري مناسب كاربر اجازه مي حال مقدار ديگري را را به نمايش گذارد،

.نويسي عرضه نمايد براي اهداف برنامه

. براي ايجاد جداول جستجو خواهيم پرداختValueMember property، به بررسي كاربرد13در فصل

بهكي شد به هنگام استفاده از كنترلآسانويژه امكان بهةهاي مقيد - مركب، مقيد ساختن به رابطهدر. شود موارد به نمايش درآمده در كنترل خود به خود فيلتر شوند است، كه موجب ميDataSetجاي

.تمرين زير، مثالي از اين تكنيك را خواهيم ديد

با مقيدسازي مركب به داده Propertiesة استفاده از پنجرها

. را برگزينيدIbProducts، قاب فهرست Form Designerدر.1 را Binding List InstancesگرهوOther Data Sources، گره Properties ،DataSource propertyةدر پنجر.2

. را انتخاب كنيدdsAdoSbsگشوده،3.DisplayMember property گره ،Categories وFK_Products_Categories و سپس ستون را گشوده،

ProductNameرا انتخاب كنيد .

به/ فصل يازدهم 341ها دادهمقيدسازي دستي

. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.4مي فرآورده،ويژوال استوديو .گذارد ها را در گروه جاري به نمايش

.در انتهاي فرم كليك كنيد)<(Nextةبرروي دكم.5

مي در ادامه، در همين فصل، به بررسي كدي كه اين دكمه .كنند، خواهيم پرداخت ها را اجرا

Microsoft ADO.NET 2.0 342گام به گام با

مي گروه بعدي، به همراه فرآورده، كاربرديةبرنام .گذارد هاي آن، را به نمايش. كاربردي را ببنديدةبرنام.6

: نويسي ها به كمك برنامه اضافه كردن مقيدسازي مركب به داده

ب يسيك ويژوال

به.1 : اضافه كنيدbtnComplex_Click event handlerدر ويرايشگر كد، سطر زير را

lbOrderDates.DataSource = dvOrderDates lbOrderDates.DisplayMember = "OrderDate"

را برروي ستون DisplayMember propertyو،dvOrderDates را برروي DataSourceكد باال،OrderDate به متعلقOrderDates DataTable،مي .كند تنظيم

و سپس برروي دكمF5 كاربردي، برروي كليدةبراي اجراي برنام.2 كليك Complexة فشار دهيد،.كنيد

به نمايش Productsهاي برگزيده در قاب فهرست ها را براي فرآورده، تاريخOrderDatesقاب فهرست.گذارد مي

. ديگري را انتخاب نماييدةهاي به نمايش درآمده، فرآورد از تغيير يافتن تاريخبراي مطمئن شدن.3

به/ فصل يازدهم 343ها دادهمقيدسازي دستي

. كاربردي را ببنديدةبرنام.4

: نويسي ها به كمك برنامه اضافه كردن مقيدسازي مركب به داده

شارپ ويژوال سي

بهشدر ويراي.1 : اضافه كنيدbtnComplex_Click event handlerگر كد، سطر زير را

lbOrderDates.DataSource = dvOrderDates; lbOrderDates.DisplayMember = "OrderDate";

را برروي ستون DisplayMember propertyو dvOrderDatesروي را برDataSourceكد باال، OrderDateبه متعلقOrderDates DataTableكند تنظيم مي.

برةبراي اجراي برنام.2 و سپس برروي دكمF5روي كليد كاربردي، كليك Complexة فشار دهيد،.كنيد

به نمايش Productsهاي برگزيده در قاب فهرست ها را براي فرآورده، تاريخOrderDatesقاب فهرست.گذارد مي

Microsoft ADO.NET 2.0 344گام به گام با

.نيدك ديگري را انتخابةهاي به نمايش درآمده، فرآورد براي مطمئن شدن از تغيير يافتن تاريخ.3

.ردي را ببنديد كاربةبرنام.4

BindingContextدرك شيء

اين. داردجاي bindingترين سطح سلسله مراتب در عاليBindingContextهمانگونه كه ديديم، شيءو كنترل را، كه كنترل تعامل بين منبع دادهBindingManagerBaseءشيء، اشيا را ها هاي مقيد شده به آن

كند، مفيدي را عرضه نميويژهبه هيچ متد يا رويداد،BindingContextشيء. كند برعهده دارد، مديريت مي).اند ذكر شده11-3در جدول( كه داراي دو روايت است Item موسوم به property مگر

به/ فصل يازدهم 345ها دادهمقيدسازي دستي

BindingContext Itemهاي روايت

شرح روايت

Item(dataSource) شيءBindingManagerBaseهمراه بهDataSourceس مشخص را بازپ.دهد مي

Item(dataSource,

dataMember) را بازDataMemberو DataSourceهمراه بهBindingManagerBaseشيء

آن پس مي . استRelationو يا DataMember ،DataTableدهد، كه در

به، كه تنها منبع دادهItem propertyخواست نشود، نخستين روايتدراگر مسير پيمايش نوانعها را به DataGridView براي DataTableبراي مثال، اگر. خواهد گرفتپذيرد، مورداستفاده قرار پارامتر مي

مي عنوان منبع داده ، كه CurrencyManagerزير براي بازيابي ) syntax(توان از نگارش ها مشخص شود،bindingكند، استفاده نمود مزبور را كنترل مي.

myDGV.DataSource = myDataSet.myTable myCurrencyManager = BindingContext(myDataSet.myTable)

را،روايت دوم مي امكان مشخص ساختن مسير پيمايش ليكن، مسير پيمايشي. دهد در اختيار ما قراربهيبدتشود، بايد كه در اينجا عرضه مي يكل به يك فهرست شود، نه اين كه . تنها باشدpropertyصورت

يك متعلقDescription مقيد به ستون Text propertyبراي مثال، اگر باشد، براي بازيابي DataTableبهCurrencyManager كه كنترل ،bindingتوان از نگارش زير استفاده نمود را برعهده دارد، مي:

myText.DataBindings.Add(“Text”, myDataSet, “myTable.Description”) myCurrencyManager = BindingContext(myDataSet, myTable)

CurrencyManagerدرك شيء

. اساسي داردنقشها در فرم ويندوز براي معماري مقيد به داده CurrencyManagerشيءCurrencyManager،و كنترل براي مديريت پيوند بين منبع داده به هايي كه داده ها هاي منبع مذكور را

و رويدادهاي خوproperty ند، از گذار نمايش مي ميدها، متدها .برد سود،)اند ذكر شده11-4در جدولو(شوند عرضه ميCurrencyManagerهايي كه از سوي property همة. هستندread-only، جملگي Position propertyءبه استثنا

Microsoft ADO.NET 2.0 346گام به گام با

CurrencyManagerهاي 11property-4جدول

Property شرح

Bindings ء اشياةمجموعBinding كه توسط CurrencyManager مديريت .شوند مي

Count هايي كه توسط شمار رديفCurrencyManagerشوند مديريت مي.

Current ها مقدار شيء جاري در منبع داده.

IsBindingSuspended دهد مقيدسازي در حالت تعليق است يا خير مقداري كه نشان مي .

List هرست مديريت شده از سويفCurrencyManager.

Position در فهرست مديريت شده از سوي،مورد جاري را CurrencyManager،.كند مشخص مي

Propert yهايBindings وCountو كنترل بين منبع دادهة رابط ب ها آهاي مقيد شده ن را مشخصهمي را بازBindingsCollection، كه شيء Bindings property. سازد مي براي Bindingءادهد، حاوي اشي پس

Bindingدر ادامه، جزئيات بيشتري از شيء.ندا ها مقيد شده است، كه به منبع دادههايي كنترلهر يك از.را مطرح خواهيم نمود

List property،را ارجاع مي به منبع دادهي مديريت CurrencyManagerدهد، كه توسط ها بازپسها در نوع نويسي منبع داده براي برنامه. دهد بازپس ميIList ارجاعي به واسط List property. شود مي

به، الزم است صراحتاً)DataTableمانند(دخو) native(اصلي . نوع درآوريدهمان آن راCount property،كه همان ر، شمار رديفآيد نامش برمياز طور ميهاي فهرست . دهدا بازپس

بالفاصله در دسترس است الزم ADO.NET ،Count propertyجمله از هاي ديگر، برخالف برخي از محيط.، تا پايان فهرست برويمCount propertyنيست، پيش از تنظيم كردن

Current property،يكبه،ها مقدار رديف جاري را در منبع داده همانند. دهد بازپس ميObjectصورتList property اگر بخواهيم با مقداري كه توسط ،Currentصورت نوع اصلي به)native ( آن بازپس داده

. آن را به اين نوع درآوريمكار كنيم، بايد صراحتاً) DataRowViewطور معمولبه(شود مي

Position property ها، الزم است اي تغيير رديف جاري در منبع دادهبر. استCurrent property،read-onlyخاطر آوريد كه به

ولي،( است CurrencyManager عرضه شده توسط property استفاده كنيم، كه تنها Position propertyاز .) نيستread-only البته،

Position property كليد Listطور كه خواهيم ديد، تغيير دادن اين همان. پيمايش استpropertyر زماندو تمام كنترلCurrentاجرا، رديف مي هاي مقيد به داده را تغيير داده .سازد ها را روزآمد

به/ فصل يازدهم 347ها دادهمقيدسازي دستي

ويژوال:ها براي پيمايش منبع دادهPosition propertyاستفاده از

بيسيك

به.1 : اضافه كنيدbtnFirst_Click event handlerدر ويرايشگر كد، كد زير را

BindingContext(dsAdoSbs, "Categories").Position = 0 UpdateDisplay()

برروي نخستين Categories DataTable را براي CurrencyManagerبه متعلقPosition propertyكد باال، كه(رديف تنظيم كرده UpdateDisplay، سپس تابع) مبتني بر صفر استاي نمايهPositionبه خاطر آوريد

را در قاب “ Category x or y” تمرين است، صرفاscaffoldingً كه بخشي از UpdateDisplay. خواند را فراميمي واقعمتن .گذارد در انتهاي فرم به نمايشبه.2 : اضافه كنيدbtnPrevious_Click event handlerكد زير را

Dim bmb As BindingManagerBase bmb = BindingContext(dsAdoSbs, "Categories") If bmb.Position = 0 Then Beep() Else bmb.Position -= 1 UpdateDisplay() End If

مي كه كد باال بررسي آن،Position property مقداركند . يا خيرهست0ش افزايش يابد، رقمكه پيش از، ليكن نتايجشود اعالم نمي حدود فهرست تنظيم شود، هيچ خطايياز در خارجPosition propertyاگر

.بيني خواهند بود غيرقابل پيشحاصلهآن دكمه مربوط به باقيكد.3 كاربردي،ة براي اجراي برناملذاجا قرار دارد، هاي پيمايش از پيش در

. فشار دهيدF5برروي كليد.كنيدهاي پيمايش استفاده براي حركت در ميان آنچه به نمايش درآمده، از دكمه.4

. را ببنديد كاربرديةبرنام.5

Microsoft ADO.NET 2.0 348گام به گام با

ويژوال:ها براي پيمايش منبع دادهPosition propertyاستفاده از

شارپ سي

به.1 : اضافه كنيدbtnFirst_Click event handlerدر ويرايشگر كد، كد زير را

BindingContext[dsAdoSbs, "Categories"].Position = 0; UpdateDisplay();

ي نخستين برروCategories DataTable را براي CurrencyManagerبه تعلقمPosition propertyكد باال، كهبه(رديف تنظيم كرده UpdateDisplay، سپس تابع) مبتني بر صفر استاي نمايهPositionخاطر آوريد

قا“ Category x or y” تمرين است، صرفاscaffoldingً كه بخشي از UpdateDisplay. خواند را فرامي ب را درمي واقعمتن .گذارد در انتهاي فرم به نمايشبه.2 : اضافه كنيدbtnPrevious_Click event handlerكد زير را

BindingManagerBase bmb; bmb = BindingContext[dsAdoSbs, "Categories"]; if (bmb.Position == 0) Console.Beep(); else {

bmb.Position -= 1; UpdateDisplay(); }

كه كد باال بررسي مي آن،Position property مقداركند يا هست0اش افزايش يابد، رقمكه پيش از، ليكن نتايجشود اعالم نمي حدود فهرست تنظيم شود، هيچ خطايياز در خارجPosition propertyاگر. خير

.بيني خواهند بود غيرقابل پيشحاصله كاربردي،ة براي اجراي برناملذاهاي پيمايش از پيش در آنجا قرار دارد، دكمه مربوط به باقيكد.3

. فشار دهيدF5روي كليد برآن.4 .كنيدهاي پيمايش استفاده چه به نمايش درآمده، از دكمهبراي حركت در ميان. كاربردي را ببنديدةبرنام.5

به/ فصل يازدهم 349ها دادهمقيدسازي دستي

CurrencyManagerمتدهاي

ع ذكر11-5شوند، در جدول عرضه ميCurrencyManager توسط شيء اغلبكه ) public(اممتدهاي.اند شده

CurrencyManager متدهاي11-5جدول

شرح متد

AddNew رامورد ميجديدي .كند به فهرست اضافه

CancelCurrentEdit سازد عمليات ويرايش فعلي را ملغي مي.

EndCurrentEdit شود به عمليات ويرايش فعلي متعهد مي.

GetitemProperties ةكنند توصيفةمجموع)descriptor(propertyرا براي منبع داده ها.دهد بازپس مي

Refresh ميهاي مقيد شده را مجدداً محتويات كنترل .گذارد به نمايش

RemoveAt(index) ميبامورد را، در مكاني كه .كند نمايه مشخص شده، حذف

ResumeBinding و اعتبارسنجي دادهه مقيدسازي به داده ها را، پس از فراخواندناSuspendBinding ،مي .گيرد از سر

SuspenBinding ًو اعتبارسنجي داده، مقيدسازي به دادهموقتا مي ها .گذارد ها را معلق

آن كه به ترتيب موارد به منبع داده- RemoveAtو AddNew-ها متدهاي ويرايش داده ها اضافه يا از، جملگي تنها براي استفاده در داخل EndCurrentEditو CancelCurrentEditكنند، در كنار متدهايميحذفشي از يك كنترل مقيدسازي سفاري مواردي كه روايتلذا، به استثناء. هاي مقيدسازي مركب هستند كنترل

ميمركب به . استفاده نماييد DataRowViewو DataViewبه آوريد، از متدهاي معادل متعلق وجود

. خواهيم پرداختResumeBindingو SuspenBinding، به بررسي متدهاي13در فصل

مي،ResumeBindingو SuspenBindingمتدهاي رو، اعبتارسنجي و، از اين(دهند مقيدسازي اجازهبه،طور معمولبه،اين متدها. معلق گذاشته شودموقتاً)ها داده مي زماني روند، كه اعتبارسنجي كارآن زم آن باشد كه دادهها مستل داده .كه اعتبارشان سنجيده شود، وارد فيلدهاي متعدد گردندها پيش از

به منبع دادهدر مورد تنها Refreshمتد ميهايي تغيير پشتيبانيةدرباررود، كه از آگاهي دادن كارو آرايه كنند، مانند مجموعه مي .ها ها

CurrencyManagerادن به رويدادهايد پاسخ

.اند ذكر شده11-6شوند، در جدول عرضه ميCurrencyManagerرويدادهايي كه از سوي

Microsoft ADO.NET 2.0 350گام به گام با

CurrencyManager رويدادهاي11-6جدول

شرح رويداد

BindingComplete دهد در پايان فرآيند مقيدسازي رخ مي.

CurrentChanged ميميزماني كه مقدار مقيدشده تغيير .دهد كند، رخ

CurrentItemChanged مي زماني كه حالت مقدار مقيدشده تغيير مي .دهد كند، رخ

DataError مي زماني كه خطايي اتفاق مي .دهد افتد، رخ

ItemChanged مي زماني كه مورد فعلي تغيير مي .دهد كند، رخ

ListChanged ميآنازيزماني كه فهرست، يا مورد ميك، تغيير .دهد ند، رخ

MetaDataChanged زماني كهmetadataمي در فهرست تغيير مي .دهد كند، رخ

PositionChanged زماني كهPosition propertyمي تغيير مي .دهد كند، رخ

مي، هردو،PositionChangedو CurrentChangedرويدادهاي در زماني رخ دهند، كه رديف جاريدر. كند تغيير ميCurrencyManagerفهرست كهيهاargumentتفاوت در اختيار رويداد قراري است

در استاندارد را دريافت ميPositionChanged ،System.EventArgs: گيرند مي ، ItemChangedحالي كه كند؛argument از نوع ItemChangedEventArgsنمايد، كه داراي دريافت ميIndex propertyاست .

ItemChangedاد رويد

كن كه داده،دهد زماني رخ ميItemChangedرويداد ، هنگام كار مواقعدر بيشتر.دنهاي مربوطه تغيير DataColumn يا DataRowبه متعلقChanging يا Changed، از رويدادهاي ADO.NETءكردن با اشيااگ. دارندپذيري بيشتري كنيم، چه اين دو انعطاف استفاده مي مير ولي، ، پاسخ تريد كنيد راحت احساس

. مانعي نداردمطلقاً CurrencyManagerبه متعلقItemChangedدادن به رويداد

ويژوال بيسيك : ItemChangedپاسخ به رويداد

به.1 : اضافه نماييدPosition_Changed event handlerدر ويرايشگر كد، كد زير را

Dim strMsg As String strMsg = "Row " strMsg &= (Me.BindingContext(dsAdoSbs, _ "Categories").Position + 1).ToString()

به/ فصل يازدهم 351ها دادهمقيدسازي دستي

MessageBox.Show(strMsg)

كهتنها مي كد فوق كاري .است رديف جاري در يك قاب پيامة، نمايش شماردهد انجامبرةي اجراي برنامبرا.2 و سپس برF5روي كليد كاربردي، دك فشار دهيد، كليك)<(Nextةمروي

.كنيدراة شمار، كاربرديةبرنام ميدر رديف جديد .گذارد قاب پيامي به نمايش

و برنام.3 . كاربردي را ببنديدةقاب پيام

سي: ItemChangedپاسخ به رويداد شارپ ويژوال

به.1 : اضافه نماييدPosition_Changed event handlerدر ويرايشگر كد، كد زير را

string strMsg; strMsg = "Row "; strMsg += (BindingContext[dsAdoSbs, "Categories"].Position + 1).ToString(); MessageBox.Show(strMsg);

كهتنها مي كد فوق كاري .است رديف جاري در يك قاب پيامة، نمايش شماردهد انجام

Microsoft ADO.NET 2.0 352گام به گام با

بر كاربةبراي اجراي برنام.2 و سپس برF5روي كليد ردي، كليك)<(Nextةروي دكم فشار دهيد،.كنيدراة شمار، كاربرديةبرنام ميدر رديف جديد .گذارد قاب پيامي به نمايش

و برنام.3 . كاربردي را ببنديدةقاب پيام

Bindingدرك شيء

وةشد هاي كنترل مقيد property از ارتباط بين استاي جلوه،Bindingشيء . CurrencyManager سادههر،هاي متعلق به كنترل DataBindingةگونه كه ديديم، مجموعهمان مقيد شده داراي يك property براي. استBindingشيء

Bindingپيكربندي شيء

Property هاي عرضه شده از سوي شيءBinding اند ذكر شده11-7 در جدول. Bindingهاي 11property-7جدول

Property حشر

BindableComponent كنترلي كهBindingبا آن همراه است .

BindingManagerBase BindingManagerBase كه شيء Binding را مديريت مذكور.كند مي

به/ فصل يازدهم 353ها دادهمقيدسازي دستي

Property حشر

BindingMemberInfo درباره شيءرااطالعاتي Bindingبر مذكور DataMemberةپاي،مي آن، بازةشده در سازند مشخص .دهد پس

Control كنترلي كه مقيدسازي متعلق بدان است.

ControlUpdateMode ها شامل كند چگونه تغييرات وارده به منبع داده مشخص مي. مقيد شوندpropertyحال

DataSource ها براي مقيدسازي منبع داده.

DataSourceNullValue مقداري كه قرار است، در صورتnull يا خالي بودن كنترل، در .ها ذخيره شوددهمبنع دا

DataSourceUpdateMode به مشخص مي مقيدشده، propertyكند چگونه تغييرات وارده.ها شوند شامل حال منبع داده

Formatinfo IFormatProviderاز مورداستفاده در فرمت كردن داده ها، پيش.نمايش

FormatString هاه فرمت، كه در فرمت كردن دادةكنند هاي مشخص نويسه.پيش از نمايش كاربرد دارند

FormattingEnabled ها شده يا خير كند فرمت شامل حال داده مشخص مي.

IsBinding دهد مقيدسازي فعال است يا خير نشان مي.

NullValue شيء به نمايش گذاشته شده، درصورتي كه مقدار در منبع. باشدdbNullها داده

PropertyName نامpropertyقيد شدهم.

ها، property جمله سايراز. هستندNewةها، در رابطه با سازند propertyديديم كه بيشتر اينBindingManagerBase property ،CurrencyManager يا PropertyMangerمي را باز دهد، كه شيء پس

Bindingكه؛كند را مديريت مي به شده مقيدPropertyName ،propertyو Controlهاي property، درحالي.دنساز كنترل را مشخصمييها داده

IsBinding property كه مقيدسازي فعال است يا خيراشاره به اين نكته دارد .propertyمقدار مذكور Trueدهد، مگر آنكه را بازپس ميSuspendBindingفراخوانده شده باشد .

Microsoft ADO.NET 2.0 354گام به گام با

BindingMemberInfo property DataSource propertyكه، منبع داده مي باز، شيء مقيد بدان شدهعنوانبه propertyهايي را توجه. دهد پس

مي تنها منبع دادهمذكور propertyداشته باشيد كه راو دهد ها را بازپس براي بازيابي. نه مسير پيمايشفيلدهاي اين. استفاده كنيمBindingMemberInfo property، الزم است از Bindingمسير پيمايش شيء

.اند ذكر شده11-8 در جدول،شيء مركب BindingMemberInfoهاي 11property-8جدول

Property شرح

BindingField propertyبه منبع داده Binding مسير پيمايش شيءةوسيلها، كه.شود مشخص مي

BindingMember مسير كامل پيمايش شيءBinding.

BindingPath ولي نه شامل-مسير پيمايش تا -propertyها منبع داده.

BindingMember property،به متعلقBindingMemberInfo propertyكل مسير پيمايشة نمايند تامههة نمايند،BindingPathفيلد. فيلد نهايي استة نمايندBindingFieldمقيدسازي است، درحالي چيز

باشد، “ Categories.CategoryProducts.ProductID”براي مثال، اگر مسير پيمايش. استBindingFieldخودBindingField عبارت است از ”ProductID“كه عبارت است از BindingPath، درحالي

”Categories.CategoryProducts“.سه و نه ارجاعي از نوع مقدارpropertyتوجه داشته باشيد كه هر رشته،ميرا شيء، به .دهند بازپس

ويژوال بيسيك : BindingMemberInfo propertyبررسي

به.1 : اضافه كنيدbtnBindings_Click event handlerدر ويرايشگر كد، كد زير را

Dim strMsg As String Dim bmo As System.Windows.Forms.BindingMemberInfo bmo = tbCategoryID.DataBindings(0).BindingMemberInfo strMsg = "BindingMember: " + bmo.BindingMember.ToString() strMsg += vbCrLf & "BindingPath: " + bmo.BindingPath.ToString() strMsg += vbCrLf & "BindingField: " + bmo.BindingField.ToString() MessageBox.Show(strMsg)

به/ فصل يازدهم 355ها دادهمقيدسازي دستي

ي محلي را كه قرار است در متد مورد استفاده قرار گيرند، اعالن دو سطر نخست كد، متغيرها در Bindingشيء)و تنها(به نخستين متعلقBindingMemberInfo property،سومين سطر. كنند مي

هاي propertyسطور باقيمانده،. دهد نسبت ميbmoيرغ را به متtbCategoryID.DataBindingsةمجموعbmoپ مي را در يك قاب .گذارد يام به نمايشدرا F5 كاربردي، كليدةبراي اجراي برنام.2 . كليك كنيدBindingsةه، برروي دكمادفشار

.گذارد را در يك قاب گفتگو به نمايش ميBindingMemberInfoهاي property كاربردي،ةبرنام

. كاربردي را ببنديدةبرنام.3

سي: BindingMemberInfo propertyبررسي شارپ ويژوال

به.1 : اضافه كنيدbtnBindings_Click event handlerدر ويرايشگر كد، كد زير را

string strMsg; System.Windows.Forms.BindingMemberInfo bmo; bmo = this.tbCategoryID.DataBindings[0].BindingMemberInfo; strMsg = "BindingMember: " + bmo.BindingMember.ToString(); strMsg += "\nBindingPath: " + bmo.BindingPath.ToString(); strMsg += "\nBindingField: " + bmo.BindingField.ToString(); MessageBox.Show(strMsg);

Microsoft ADO.NET 2.0 356گام به گام با

دو سطر نخست كد، متغيرهاي محلي را كه قرار است در متد مورد استفاده قرار گيرند، اعالن در Bindingشيء)و تنها(به نخستين متعلقBindingMemberInfo property، سومين سطر.كنند مي

هاي propertyسطور باقيمانده،. دهد نسبت ميbmoيرغ را به متtbCategoryID.DataBindingsةمجموعbmoگذارد را در يك قاب پيام به نمايش مي.درا F5 كاربردي، كليدةبراي اجراي برنام.2 . كليك كنيدBindingsةه، برروي دكمادفشار

.گذارد را در يك قاب گفتگو به نمايش ميBindingMemberInfoهاي property كاربردي،ةبرنام

. كاربردي را ببنديدةبرنام.3

Bindingكاربرد متدهاي شيء

.اند ذكر شده11-9شوند، در جدول عرضه ميBindingترين متدهايي كه از سوي شيء دوتا از جالب Binding متدهاي11-9جدول

شرح متد

ReadValue property مي در منبع دادهموجود مقيد شده را برروي مقدار .كند ها تنظيم

WriteValueدر در منبع دادهموجود مقدار مي مقيدpropertyها را برروي مقدار .كند شده تنظيم

دس، به ترتيب،اين دو متد م تي داده براي اخذ بهع دادهنبها از از مقيدpropertyها و راندن آن شده،propertyمي به منبع داده كه،زماني استدر شان كاربردينبيشتر. گيرند ها مورد استفاده قرار

. به حالت تعليق درآمده استSuspendBindingمقيدسازي با استفاده از متد

به/ فصل يازدهم 357ها دادهمقيدسازي دستي

Bindingپاسخ دادن به رويدادهاي شيء

در. اند ذكر شده11-10شوند، در جدول عرضه ميBindingيدادهايي كه از سوي شيء رو اين رويدادها،.ها براي كاربر كاربرد دارند نمايش دادهةكنترل نحو

. خواهيم پرداختParseو Format، به رويدادهاي13در فصل

Binding رويدادهاي11-10جدول

شرح رويداد

BindingComplete ميزم .دهد، كه عمليات مقيدسازي تكميل شده است اني رخ

Format به ها از منبع داده دهد، كه داده زماني رخ مي ها به كنترل رانده، يا از كنترل.اند ها كشيده شده منبع داده

Parse اند ها كشيده شده كنترل به منبع دادهازها دهد، كه داده زماني رخ مي.

خالصه

، با استفاده از هاي فرمدرها به دادهها هاي كنترل property مقيدسازيةنحوبادر اين فصل، ويندوزكه. آشنا شديم،low-level(ADO.NET( سطح پايينءاشيا هاي ها را در زمانproperty چگونهديديم

و كاربرد و اجرا كنترل كنيم، بههددر فصل آين. چگونه است Bindingو شيء CurrencyManagerطراحي ،)low-level( به ضرر كنترل سطح پايين، البته، كه بخش اعظم اين قابليت راBindingSourceبررسي كنترل

.آورد، خواهيم پرداخت صورت اتوماتيك درميبه

دوازدهم فصل

هاي ويندوز با استفاده ها درفرم دادهمقيدسازي به

BindingSourceاز جزء :در پايان اين فصل، خواهيد توانست

�BindingSourceبه فرم در ويژوال استوديو اضافه كنيد ..وجود آوريدبه BindingSource در زمان اجرا،�.سازيد را در ويژوال استوديو مقيد BindingSourceجزء�. را در زمان اجرا مقيد سازيد BindingSourceجزء��Property هايSort وFilter متعلق به BindingSource را تنظيم نماييد ..نشده اضافه كنيد مقيد BindingSourceيك مورد به�. پاسخ دهيد BindingSourceبه رويدادهاي�

را، با اجزاي سطح پاييني كه مقيدسازي به داده“ها مقيدسازي دستي به داده”، يازدهمدر فصل هاطور كه ديديم، معماري آن پيچيده است و، همان. آورند، آشنا شديم هاي ويندوز به اجرا درمي در فرم

ميراستش را بخواهيد .تواند بسيار دشوار باشد، كاركردن با آناي بين عرضه شده، همچون واسطه2 مايكروسافت ADO.NET، كه به تازگي در BindingSourcةرد

و كنترل منبع داده مي ها و هاي فرم ويندوز عمل را فرآيند مقيدسازي به دادهدر عين حالكند، ها. سازدميتر، آن را سادهدادهگسترش

BindingSourceدرك

BindingSourceكهدر يك جزء به اجرا System.Windows.Forms namespace توسط فرم ويندوز است،و از اين رو،آيد درمي از، فنيلحاظاز؛ مي به ADO.NET بخشي عمدتاBindingSourceً گرچه. رود شمار

از11كه در فصل( را CurrencyManagerو BindingContextءهمان اهداف اشيا دنبال) آمدهاآنشرحيمي كند، ولي نمونه مي به اي از آن بهتواند بهجود آمده،وصورت شيء مستقلي . كار آيددر مواقع متقضي

بندي شده مورداستفاده قرار بستهء، اغلب، همچون اشياCurrencyManagerو BindingContextء اشيا( .) گيرند مي

BindingContext ،CurrencyManagerاز را بسته بندي كرده و، همانگونه كه خواهيم ديد، بسياريpropertyم و متدهاي آن و متدهاي propertyةرينقستقيماًها ليكن،. هستندCurrencyManagerها

Microsoft ADO.NET 2.0 360گام به گام با

BindingSourceبريها معماري مقيدسازي به داده را، از چندين طريق بسيار CurrencyManager مبتنيو مهم، ساده مي گستردهحال در عينتر .سازد تر

BindingSource ،،غيرمستقيمي مسيراز لحاظي )indirection(و كنترل، بين منبع داده به ها هاي مقيدميآن آن چنانكه به فراواني(ها تغيير كند، منبع داده اگر، مثالًعبارت ديگر،به. گذارد در اختيار

مياي نيز چنين آزاردهنده DataMemberو DataSourceهاي property است، تنها كافي)آيند مواردي پيشآن كنترلهمة،متعاقباً.ا تغيير دهيمر BindingSourceبه متعلق هايشان را از منبع داده،هاي مقيد بهو پيكربندي مجدد آساناراين بسي. هاي جديد بيرون خواهند كشيد داده كنترلو كاملتر ازمقيدسازي

.فرم استواقع برمييي اشياة دامن، BindingSourceعالوه بر اين، آن را كه به توان از ها براي وان منبع دادهعنها

مي كنترل آن،ها به دادهADO.NET“سنتي”مقيدسازي. دهد هاي مقيد استفاده نمود، گسترش مستلزمكه. پشتيباني كندIListها از واسط است كه منبع داده ابزاري براي كنند، را اجرا ميIListاشيايي

ميهايشان نمايههاي دسترسي به موارد گوناگون به كمك مكان در واقع، اين قابليت.دنگذار در اختيارو اغلب اوقات از خلف قدرتمندتر براي بيشتر برنامه معموالً-IListهاي كاربردي كافي نيست،

IBindingList-ازشيء اخير، توانسته. شودمي استفاده ) notification(سازي آگاههاي ويژگي با پشتيبانيقا) sort(كردن مرتب .دهد را توسعه IListاي بليت پايهو تغيير،

BindingSourceاز انواعة نه تنها دامن مي شيءي به را كه ها مورداستفاده قرار عنوان منابع دادهتوان)change notification(سازي تغيير كه از آگاهيي اشيادر مورداين قابليت را دهد، بلكه، خود داد توسعه ميع پشتيباني نمي ميكنند، .كند رضه

هاي propertyتنظيم جايبه. ها استفاده نمود دادهعنوان منبع بهBindingSourceتوان ازخود همچنين، ميDataSource وDataMemberبه متعلقBindingSource با، مي از كه حاوي نمونه- List propertyتوان اي

، Add ،Remove- كار با فهرست معمول برايهاي فرمانةمجموع IListةرد. كار كرد- استIListشيء Clearو غيره مي-، به،توانمياز اين مجموعه. كند را عرضه براي اضافه يا حذف كردن مواردي كهبه كنترلةوسيل . نمودهآيند، استفاد به نمايش درمي BindingSourceهاي مقيد

ازتوان نميعنوان مثال،به. اند الجمع اين دو تكنيك مانعه:تذكر را رديف، موقتاList propertyً با استفاده هاكه. اضافه نمودDataTableبه تنظيم شده، فراخواندن BindingSourceبه متعلقDataSource propertyهمينپي اعالم خطا را Addمتد . خواهد داشتدر

كهشگفتيبنابراين، جاي و نيست CurrencyManagerبا كامل مطابقت BindingSourceهاي propertyمتدها(دارند ]encapsulate[بندي را بستهCurrencyManager، شيء BindingSourceخاطر آوريد كه جزءبه.).كند مي

از قدري سادهBindingSourceكار كردن با مستقيماBindingSourceً. استCurrencyManagerترproperty هايCurrencyManager.Listو غيرمستقيم تاحدي در طي مسير بدين ترتيب را عرضه،مي صرفه ميعالوهبه. كند جويي براي. بر عهده دارندرا عادي وظايفد، كه انجامنماي، متدهايي را عرضه

به/ فصل دوازدهم BindingSource 361هاي ويندوز با استفاده از جزء ها درفرم دادهمقيدسازي

با استفاده از DataSet ديديم كه براي به نمايش درآوردن رديف قبلي11مثال، در فصلCurrencyManagerك مي، از چنين :كنيم دي استفاده

Dim bmb As BindingManagerBase bmb = BindingContext(dsAdoSbs, “Categories”) bmb.Position -= 1

را از،اين سه سطر استفاده BindingSource با فراخواني متد در يك سطر، كه براي انجام همان كار.دكنيد، مقايسهشو مي

myBindingSource.MovePrevious

و متدها در اين فصل، با مثالpropertyبه تدريج، با بررسي جزئيات ةشيوهاي ديگري از اين هاشدتر كردن كارها آسان كه درك آنچه در پشت صحنه با وجود اينبه همين دليل،. آشنا خواهيمفة متد توصيه شد BindingSourceگذرد همواره مهم است، ولي مي بهرم ما براي مقيدسازي هاي ويندوزدر داده . استNET Framework.ها

BindingSourceايجاد اجزاي

و اجرا،هاي توان، در زمان را مي BindingSourceاجزاي . ايجاد نمود هر دو، طراحي

در زمان طراحي BindingSourceايجاد اجزاي

BindingSource،در بخش،گزيده صورت پيشبه Dataوة در جعب و ابزار يژوال استوديو گنجانده شده،ميةهمچون هر كنترل ديگر در جعب ازةتوان با كشيدن آن به سطح طراحي فرم، نمون ابزار، آن جديدي

.وجود آوردبهرا

در ويژوال استوديو BindingSourceايجاد

و در صورت لزوم برروي Chapter 12 - Startةپروژ.1 را در ويژوال استوديو باز كرده،BindingSources.vb)سي مي يا اگر با دو Solution Explorerدر ) BindingSources.csكنيد، شارپ كار

.بار كليك كنيددر،ويژوال استوديو .گذارد به نمايش ميForm Designer فرم را

Microsoft ADO.NET 2.0 362گام به گام با

. به سطح طراحي فرم بكشيد، ابزارة در جعبData از بخش، را BindingSourceجزء.2ميويژو .كند ال استوديو جزء مذكور را به سيني اجزا اضافه

.دهيد تغيير bsOrders، نام جزء را به Propertiesةدر پنجر.3

به/ فصل دوازدهم BindingSource 363هاي ويندوز با استفاده از جزء ها درفرم دادهمقيدسازي

در زمان اجراBindingSourceايجاد اجزاي

BindingSource ة، از سه روايت سازند12-1، مطابق جدولNewاز اين سه، سومين. كند پشتيباني ميپذيرد، بيشتر از دوتاي ديگر مورداستفاده را ميDataMemberو DataSourceرهاي روايت، كه پارامت

.دارد BindingSourceة سازند12-1جدول

شرح متد

New() BindingSource را جديد گزيده، به وجود پيشproperty، با مقاديري.آورد مي

New(Container) BindingSource را جديد به پيشproperty، با مقاديري وجود گزيده،بهوآورده .كند مشخص اضافه ميContainer آن را

New(dataSource,

dataMember) BindingSource را جديد و DataSourceهاي propertyوجود آورده،بهي

DataMemberكند آن را برروي مقادير داده شده تنظيم مي .

ال بيسيك ويژو:كدبه كمك BindingSourceايجاد جزء

كد.1 . فشار دهيدF7 برروي كليد،براي به نمايش درآوردن ويرايشگر

Microsoft ADO.NET 2.0 364گام به گام با

:، اضافه كنيدBindingSource_Loadسطر زير را به باالي اعالن رده، باالتر از روال.2

Dim bsEmployees As BindingSource

:شروع فايل رده به اين صورت خواهد بودحال،

Imports System.Data Imports System.Data.SqlClient Imports System.Windows.Forms Public Class BindingSources

Dim bsEmployees As BindingSource

Private Sub BindingSources_Load(ByVal sender As System.Object,_ ByVal e As System.EventArgs) Handles MyBase.Load taOrderTotals.Fill(dsAdoSbs.OrderTotals) taEmployees.Fill(dsAdoSbs.Employees) End Sub

به.3 : اضافه كنيدbtnCreateEmployees_Click event handlerكد زير را

bsEmployees = New BindingSource()

سي:كدبه كمك BindingSourceايجاد جزء شارپ ويژوال

كد.1 . فشار دهيدF7 برروي كليد،براي به نمايش درآوردن ويرايشگراز.2 :، اضافه كنيدBindingSourceسطر زير را به باالي اعالن رده، باالتر

BindingSource bsEmployees;

:شروع فايل رده به اين صورت خواهد بودحال،

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data;

به/ فصل دوازدهم BindingSource 365هاي ويندوز با استفاده از جزء ها درفرم دادهمقيدسازي

using System.Data.SqlClient; using System.Drawing; using System.Text; using System.Windows.Forms; namespace Chapter_12 {

public partial class BindingSources : Form { BindingSource bsEmployees; public BindingSources() {

InitializeComponent(); }

private void BindingSources_Load(object sender, EventArgs e) {

taOrderTotals.Fill(dsAdoSbs.OrderTotals); taEmployees.Fill(dsAdoSbs.Employees); }

به.3 : اضافه كنيدbtnCreateEmployees_Click event handlerكد زير را

bsEmployees = new BindingSource();

BindingSourceپيكربندي اجزاي

شان را در جدول ترين رايجشوند، عرضه مي BindingSourceهاي بسياري كه از سوي جزء property از.ايم آورده2-12

Microsoft ADO.NET 2.0 366گام به گام با

BindingSourceهاي 12property-2جدول

propertyمتد ها CurrencyManagerIList

AllowNew مي مشخص مي توان به فهرست سازد موارد را اضافه نمود BindingSourceشده از سوي مديريت.يا خير

Count شده از سوي در فهرست مديريت،تعداد موارد راBindingSource ،مي .دهد بازپس

×

Current شده از سويد جاري را در فهرست مديريتمورBindingSource دهد بازپس مي.

×

DataMember كه فهرست داخل منبع داده BindingSourceها را،.سازد مقيد بدان است، مشخص مي

DataSource كه منبع داده مقيد بدان BindingSourceها را،.سازد است، مشخص مي

Filter ،كه براي فيلتر كردن موارد در فهرست عبارتي را مورد BindingSourceشده از سوي مديريت

.سازد گيرد، مشخصمي استفاده قرار مي

IsBindingSus

pended

×. معلق است يا خيردهد مقيد سازي فعالً نشان مي

Item مشخص، در فهرستة در مكان نماي،عنصري پس را باز، BindingSourceشده از سوي مديريت

.دهد مي

×

List فهرست مديريت شده از سويBindingSource .××

Position شده از سوي مورد جاري در فهرست مديريتBindingSource سازد را مشخص مي.

×

RaiseListCha

ngedEvents

ListChangedرويدادBindingSourceسازد،ميمشخص

.كند يا خير را مطرح مي

Sort كردن موارد در فهرست عبارتي را، كه براي مرتب مورداستفاده BindingSourceشده ازسوي مديريت.سازد گيرد، مشخصمي قرار مي

IListو CurrencyManagerءهاي اشيا propertyة درست قرين،ها property كه اين،توجه داشته باشيدكه را عرضه ميCurrencyManager ،Bindings property. ليكن، اين تشابه يك به يك نيست. هستند كند،

به/ فصل دوازدهم BindingSource 367هاي ويندوز با استفاده از جزء ها درفرم دادهمقيدسازي

AllowRemoveو AllowEditهاي IBindingList ،property. قابل دسترسي نيست indingSource از مستقيماًآن را عرضه مي . در دسترس قرار ندارندها نيز مستقيماً كند، كه

BindingSourceبه متعلقDataMemberو DataSourceهاي CurrencyManager ،propertyاز سوي ديگر،، Filterو Sortهاي property. نمايد سازند، عرضه نمي را مشخص مي BindingSourceهاي را، كه منبع داده

مورد شوند، مستقيماً عرضه ميDataViewها از سوي به دادهADO.NETكه در مقيدسازي سنتي.د هستن BindingSourceپشتيباني

Property هايDataSource وDataMember

مي دادهء ارجاعي به اشيا هيچو بدونگونه كه ديديم، مستقيماًهمان از اي مربوطه، BindingSourceتوانو مورد با استفاده از nullصورت بهDataSource propertyاگر. ها استفاده نمود عنوان منبع دادهبه بوده،وجودبهي جديدIBindingList افزوده شده باشد، در اين صورت BindingSource به فهرست Addمتد

مةه-تواند ناهمگن باشد توجه داشته باشيد كه فهرست نمي.، كه حاوي مورد جديد استخواهد آمد.اقالم افزوده شده، بايد از يك نوع شيء واحد باشند

مي در موقعيت از هاي زير، بهم BindingSourceتوان ازعنوان منبع مستقلقيد نشده، هاي دادهي:استفاده نمود

. كوچك باشدفهرست نسبتاً�و معين باشند� .اعضاي آن در زمان اجرا معلوم. نباشدينياز به ماندگار شدن هيچ تغيير�

و كنترل اي بين منبع داده همچون واسطه BindingSourceليكن، در اغلب موارد از جزء هاي مقيد هاو كنترل جزء به منبع داده-شود استفاده مي مي ها مقيد شده، با BindingSource. شوند ها به جزء مقيد

به و، احياناDataSource propertyًتنظيم ها مقيد، به منبع دادهDataMember propertyصورت اختياري،و.شود مي

DataSource propertyانبر،توان را مي :هاي فهرست، از جمله اي از واسط واع گستردهروي فهرستي كه.Array، مانند IListءاشيا�.هاDataReader، مانند IEnumerableءاشيا�.DataViewManager، مانند IBindingListءاشيا�.DataView، مانند IBindingListViewءاشيا�.DataSet، مانند IListSourceءاشيا�.ITypedListءاشيا�.آورد، تنظيم نمود اجرا درميرا به

مي تر از گستره هاي واسط، در واقع، بسي گسترده ردهةاين گستر به تواند مستقيماً اي است كهاز. ها مقيد شود كنترل به مي BindingSourceبراي مثال، توجه كنيد كه با استفاده توان كنترل را

DataReaderاين تكنيك، از باالسري. مقيد نمود)overhead (DataSetحال كند، ولي درعين پرهيز مي

Microsoft ADO.NET 2.0 368گام به گام با

مي هاي داده توانايي پيمايش در رديف ، اغلب زماني مفيد مزبورتكنيك. دهد ها را در اختيار كاربران قرار.ها داريد به دادهread-only كه نياز به دسترسي واقع خواهد شد،

ها را، كه Array ماننديياشيا) change notification(ير گاهي دادن تغيآ امكان BindingSourceعالوه،بهو تنها واسط مي را به اجرا درميIListخود فاقد چنين امكاني هستند از،چهگر. گذارد آورند، در اختيار

به مقيدسازي كنترل، تئوريلحاظ پذير بود، ولي امكانADO.NETهاي پيشين ها در روايتArrayهاشده بازتاب هاي مقيد مربوطه، در كنترلة محدود بود، چه تغييرات وارده در آرايكاربرد اين تكنيك

مي برايي خوبراي راه بسBindingSource. يافتند نمي .گذارد حل اين مسئله در اختياراي از رده مقيد شود؛ به نمونهBindingSourceبه جزء متعلقDataSource property،حتي الزم نيست

يكتو مي اين توانايي خارج شرح. مقيد نمود،، يا حتي نتايج حاصل از فراخوان يك متدTypeان آن را بهبي است، ولي ميADO.NETة كتابي دربارة حوصلاز حال، چنين تواناييدرعين. اندازه مفيد باشد تواند

.هاست ويندوز در مقيدسازي به داده گسترش درخور توجه قابليت فرمةدهند نشانكه يا رده،شيء، نوع يك مقيد بدان مي BindingSourceاي شود، هر چه كه باشد، اگر حاوي بيش از

در(مورد فهرست باشد الزم است) طور هم هست، همين، معموالDataSet ADO.NETًكه وضعDataMember property را نيز برروي فهرست خاصي، كه BindingSource آن داده بيرون هايش را از

. ديديم، اين روش معمول هر شيء مقيد تركيبي است11طور كه در فصل همان. كشد، تنظيم كنيم مي

درويژوال استوديو DataSourceوDataMemberهاي propertyتنظيم

. در سيني اجزا را انتخاب كنيدbsOrders، كنترل Form Designerدر.1 BindingSources Listو گره Other Data Sources، گره DataSource، فهرست Propertiesةدر پنجر.2

Instances را باز كرده، سپس dsAdoSbsرا انتخاب نماييد .

به/ فصل دوازدهم BindingSource 369هاي ويندوز با استفاده از جزء ها درفرم دادهمقيدسازي

. را انتخاب كنيدOrderTotals را گشوده، سپس DataMemberفهرست.3

4.dgvOrders DataGridViewرا انتخاب كنيد .. را انتخاب كنيدbsOrders را گشوده، سپس DataSource، فهرست Propertiesةدر پنجر.5

Microsoft ADO.NET 2.0 370گام به گام با

: نويسي به كمك برنامهDataSourceوDataMemberهاي propertyتنظيم

ويژوال بيسيك

، در زير سطري btnCreateEmployees_Click event handlerدر ويرايشگر كد، سطور زير را به انتهاي.1:كه پيش از اين اضافه نموديد، اضافه كنيد

bsEmployees.DataSource = dsAdoSbs bsEmployees.DataMember = "Employees" tbEmployeeID.DataBindings.Add("Text", bsEmployees, "EmployeeID") tbHireDate.DataBindings.Add("Text", bsEmployees, "HireDate") tbFullName.DataBindings.Add("Text", bsEmployees, "FullName")

bsEmployees BindingSourceبه علق متDataMemberو DataSourceهاي propertyدو سطر نخست، مي وجود آوردهرا، كه پيش از اين به به. كنند ايد، تنظيم سه سطر آخر، كنترل قاب متن برروي فرم را

BindingSource روال اين چنين باشدةحال، بايد بدن. سازند مقيد مي :

bsEmployees = New BindingSource() bsEmployees.DataSource = dsAdoSbs bsEmployees.DataMember = "Employees" tbEmployeeID.DataBindings.Add("Text", bsEmployees, "EmployeeID") tbHireDate.DataBindings.Add("Text", bsEmployees, "HireDate") tbFullName.DataBindings.Add("Text", bsEmployees, "FullName")

. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.2

به/ فصل دوازدهم BindingSource 371هاي ويندوز با استفاده از جزء ها درفرم دادهمقيدسازي

. كليك كنيدCreate bsEmployeeةروي دكمبر.3 مربوط به نخستين كارمند را به FullNameو EmployeeID ،HireDateهاي كاربردي، دادهةبرنام.گذارد نمايش مي

. كاربردي را ببنديدةبرنام.4

: نويسي كمك برنامه بهDataSourceوDataMemberهاي propertyتنظيم

شارپ ويژوال سي

، در زير سطري btnCreateEmployees_Click event handlerدر ويرايشگر كد، سطور زير را به انتهاي.1:كه پيش از اين اضافه نموديد، اضافه كنيد

bsEmployees.DataSource = dsAdoSbs;

Microsoft ADO.NET 2.0 372گام به گام با

bsEmployees.DataMember = "Employees"; tbEmployeeID.DataBindings.Add("Text", bsEmployees, "EmployeeID"); tbHireDate.DataBindings.Add("Text", bsEmployees, "HireDate"); tbFullName.DataBindings.Add("Text", bsEmployees, "FullName");

: روال اين چنين باشدةحال، بايد بدن

bsEmployees = new BindingSource(); bsEmployees.DataSource = dsAdoSbs; bsEmployees.DataMember = "Employees"; tbEmployeeID.DataBindings.Add("Text", bsEmployees, "EmployeeID"); tbHireDate.DataBindings.Add("Text", bsEmployees, "HireDate"); tbFullName.DataBindings.Add("Text", bsEmployees, "FullName");

را، bsEmployees BindingSourceبه متعلقDataMemberو DataSourceهاي propertyدو سطر نخست، مي وجود آوردهكه پيش از اين به به. كنند ايد، تنظيم سه سطر آخر، كنترل قاب متن برروي فرم را

BindingSource سازند مقيد مي.اج.2 بركاةراي برنامبراي . فشار دهيدF5روي كليد ربردي،

به/ فصل دوازدهم BindingSource 373هاي ويندوز با استفاده از جزء ها درفرم دادهمقيدسازي

. كليك كنيدCreate bsEmployeeةبرروي دكم.3 مربوط به نخستين كارمند را به FullNameو EmployeeID ،HireDateهاي كاربردي، دادهةبرنام.گذارد نمايش مي

. كاربردي را ببنديدةبرنام.4

property هايSort وFilter Property هايSort وFilterبه متعلقBindingSource بسته به فهرست مديريت شده از سوي ،

BindingSource يك اگر منبع داده. كنند، تا حدي متفاوت عمل مي Sort باشد، BindingListهاي مربوطه

propertyاگر. استپذيرد كه همان نام ستوني است كه فهرست با آن مرتب شده تنها يك رشته را ميدردهمنبع دا سازي مركب هاي مرتب توانيد از عبارت باشد، آنگاه ميIBindingListViewهاي مربوطه

سازي پيشرفته پشتيباني آورند، از مرتب هايي كه اين واسط را به اجرا درمي استفاده كنيد، چه رده.كنند مي

Filter propertyسطواةهاي مربوط تنها زماني در دسترس است، كه منبع دادهIbindingListView را به ها خود يك منبع داده BindingSourceتوجه داشته باشيد كه اين بدان معناست كه اگر. اجرا درآورد

. در دسترس نيستFilter propertyباشد،

در ويژوال استوديو Sort propertyتنظيم

. را انتخاب كنيدForm Designer ،bsOrdersدر.1. تايپ كنيدSort propertyعنوان را بهProperties،CustomerIDةدر پنجر.2

Microsoft ADO.NET 2.0 374گام به گام با

برة اجراي برنامبراي.3 . فشار دهيدF5روي كليد كاربردي،.آيند به نمايش درميCustomerID سفارش در سفارشات

. كاربردي را ببنديدةبرنام.4

ويژوال بيسيك: با نوشتن كدFilter propertyتنظيم

زي.1 : اضافه كنيدbtnFilterOrders_Click event handlerر را به در ويرايشگر كد، سطر

bsOrders.Filter = "EmployeeID = " + tbEmployeeID.Text

. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.2

به/ فصل دوازدهم BindingSource 375هاي ويندوز با استفاده از جزء ها درفرم دادهمقيدسازي

و سپس دكمbsEmployeesةبرروي دكم.3 . كليك كنيدFilter Ordersة،ميسفارشاتتنها كاربردي،ةبرنام .گذارد نخستين كارمند را به نمايش

. كاربردي را ببنديدةبرنام.4

سي: با نوشتن كدFilter propertyتنظيم شارپ ويژوال

به.1 : اضافه كنيدbtnFilterOrders_Click event handlerدر ويرايشگر كد، سطر زير را

bsOrders.Filter = "EmployeeID = " + tbEmployeeID.Text;

. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.2 و سپس دكمbsEmployeesةبرروي دكم.3 . كليك كنيدFilter Ordersة،

ميسفارشات كاربردي، تنهاةبرنام .گذارد نخستين كارمند را به نمايش

. كاربردي را ببنديدةبرنام.4

Microsoft ADO.NET 2.0 376گام به گام با

BindingSourceاي كاربرد متده

.اند ذكر شده12-3شوند، در جدول عرضه مي BindingSourceپركاربردترين متدهايي كه از سوي جزء BindingSource متدهاي12-3جدول

CurrencyManager IList IBindingList شرح متد

Add اي را به فهرست داخلي، كه توسط مورد تازه

BindingSource ميش نگهداري مي .افزايد ود،

×

AddNew شده اي را به فهرست مديريت تازه مورد

.افزايد مي BindingSourceتوسط

××

CancelEdit كند عمليات ويرايش كنوني را لغو مي.×

Clear شده تمام عناصر را از فهرست مديريت

.كند حذف مي BindingSourceتوسط

×

Contains ش مشخص مي در فهرست مديريتيءسازد

وجود دارد يا BindingSourceشده توسط

.خير

×

EndEdit الوقوع را برروي فهرست تغييرات قريب

اعمال BindingSourceشده توسط مديريت

.كند مي

×

Find مي مورد مشخصةنماي ×.دهد شده را بازپس

IndexOf مي مورد مشخصةنماي ×.دهد شده را بازپس

Insert مشخص در فهرستةموردي را در نماي

درج BindingSourceشده توسط مديريت

.كند مي

×

MoveFirst نخستين مورد در فهرست جاري را

.سازد مي

MoveLast سازد آخرين مورد در فهرست جاري را مي.

MoveNext سازد مورد بعدي در فهرست جاري را مي.

MovePrevious ميمور .سازدد قبلي در فهرست جاري را

به/ فصل دوازدهم BindingSource 377هاي ويندوز با استفاده از جزء ها درفرم دادهمقيدسازي

CurrencyManager IList IBindingList شرح متد

Remove شده مورد مشخص را از فهرست مديريت

.كند حذف مي BindingSourceتوسط

××

RemoveAt موردي را درمكان مشخص از فهرست

حذف BindingSourceشده توسط مديريت

.كند مي

××

RemoveCurrent شده مورد جاري را از فهرست مديريت

.كند حذف مي BindingSourceتوسط

RemoveFiter موجود را از فهرست مديريتهاي فيلترةهم

.كند حذف مي BindingSourceشده توسط

RemoveSort از مرتبهاي معيارةهم سازي موجود را

BindingSourceشده توسط فهرست مديريت

.كند حذف مي

×

ResetBindings آ كنترل ميهاي مقيد را كه مقادير،سازد گاه

.خود را از نو تازه كنند

×

ResetCurrentItemمي كنترل كه مقادير،سازد هاي مقيد را آگاه

. كنندتجديدخود را از نو

ResumeBinging مي دادهمقيدسازي به ×.گيرد ها را از سر

SuspendBinding مي دادهمقيدسازي به ×.سازد ها را معلق

، يا واسط IList، واسط CurrencyManager متناظر با متدهاي ها مستقيماً بيشتر اين نيز،،در اينجاIBindingListمختص،باقي متدها. هستند CurrencyManagerو بسته هاي موجود قابليتةبندي ساد بوده،بهلذا، مثالً. روند به شمار مي برروي يك رشته Filter propertyل تنظيمد معا،RemoveFilterكار بردن،.خالي است

بهةهاي مربوط در اختيار منبع داده اين متدها مستقيماًبيشتر كه بد نيست بدانيد BindingSource مقيد

است، تنها متد DataView، كه مقيد به BindingSourceبه متعلقFind، متد از اين رو، مثالً. گيرند قرار ميFindبهق متناظر متعلDataViewاين بدان معناست كه قابليت دقيق متدها، بسته به قابليت. خواند را فرا مي

مي منبع داده .كند ها، قدري تفاوت

Microsoft ADO.NET 2.0 378گام به گام با

Positionمتدهاي

باةهاي ساد بندي، البته، بستهMovePreviousو MoveFirst ،MoveLast ،MoveNextمتدهاي كارCurrencyManager ديديم11 هستند، كه در فصل.

ويژوال: براي تغيير دادن رديف جاريPositionاستفاده از متدهاي

بيسيك

به.1 : اضافه كنيدbtnFirst_Click event handlerدر ويرايشگر كد، كد زير را

bsEmployees.MoveFirst()

به.2 : اضافه كنيدbtnPrevious_Click event handlerدر ويرايشگر كد، كد زير را

bsEmployees.MovePrevious()

به.3 : اضافه كنيدbtnNext_Click event handlerدر ويرايشگر كد، كد زير را

bsEmployees.MoveNext()

به.4 : اضافه كنيدbtnLast_Click event handlerدر ويرايشگر كد، كد زير را

bsEmployees.MoveLast()

. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.5هاي ها، از دكمه كليك كرده، سپس براي حركت از ميان دادهCreate bsEmployeesة دكمرويبر.6

.پيمايش در انتهاي فرم استفاده كنيدميةبرنام .گذارد كاربردي جزئيات كارمندان را به نمايش

بر: تذكر كه براي Filter كليك كنيد، چه، معيارهاي Filter Ordersةروي دكمالزم است براي هر كارمندbsOrders BindingSource اند، ايستا هستند تنظيم شده.

به/ فصل دوازدهم BindingSource 379هاي ويندوز با استفاده از جزء ها درفرم دادهمقيدسازي

. كاربردي را ببنديدةبرنام.7

ويژوال: براي تغيير دادن رديف جاريPositionاستفاده از متدهاي

شارپ سي

به.1 : اضافه كنيدbtnFirst_Click event handlerدر ويرايشگر كد، كد زير را

bsEmployees.MoveFirst();

به.2 : اضافه كنيدbtnPrevious_Click event handlerدر ويرايشگر كد، كد زير را

bsEmployees.MovePrevious();

به.3 : اضافه كنيدbtnNext_Click event handlerدر ويرايشگر كد، كد زير را

bsEmployees.MoveNext();

به.4 : اضافه كنيدbtnLast_Click event handlerدر ويرايشگر كد، كد زير را

bsEmployees.MoveLast();

. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.5هاي ها، از دكمه كليك كرده، سپس براي حركت از ميان دادهCreate bsEmployeesةروي دكمبر.6

.پيمايش در انتهاي فرم استفاده كنيد

Microsoft ADO.NET 2.0 380گام به گام با

نمةبرنام مي كاربردي جزئيات كارمندان را به .گذارد ايش

كه براي Filter كليك كنيد، چه، معيارهاي Filter Ordersةالزم است براي هر كارمند بر روي دكم:تذكرbsOrders BindingSource اند، ايستا هستند تنظيم شده .

. كاربردي را ببنديدةبرنام.7

AddNewو Addمتدهاي

ك- AddNewو Add- شامل دو متد12-3جدول به است، ميه ، ولي دارندهاي يكساني رسد قابليت نظراستفاده قرار مورد BindingSourceة تنها در مورد اجزاي مقيد نشدAddمتد. در واقع چنين نيست

در مي مي تنها زماني بهAddNewحالي كه متد گيرد، كه كار . تنظيم شده باشدDataSource propertyرود،

ويژوال بيسيك: اضافه كنيدBindingSourceيك فهرست موردي را به

به.1 : اضافه كنيدbtnAddOrder_Click event handlerدر ويرايشگر كد، سطر زير را

bsOrders.AddNew()

. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.2و سپس دكمbsEmployeesةبرروي دكم.3 . كليك كنيدFilter Ordersة،. كليك كنيدAdd Orderةبرروي دكم.4

يكةبرنام و آن را بهOrderTotals DataTable خالي جديد به سفارش كاربردي - مربوطه افزوده،.آورد جاري درميسفارشصورت

به/ فصل دوازدهم BindingSource 381هاي ويندوز با استفاده از جزء ها درفرم دادهمقيدسازي

. كاربردي را ببنديدةبرنام.5

يك فهرست سي: اضافه كنيدBindingSourceموردي را به شارپ ويژوال

به.1 : اضافه كنيدbtnAddOrder_Click event handlerدر ويرايشگر كد، سطر زير را

bsOrders.AddNew();

. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.2و سپس دكمbsEmployeesةروي دكمبر.3 . كليك كنيدFilter Ordersة،. كليك كنيدAdd Orderةبرروي دكم.4

يكةبرنام و آن را بهOrderTotals DataTable خالي جديد به سفارش كاربردي - مربوطه افزوده،.آورد جاري درميسفارشصورت

. كاربردي را ببنديدةبرنام.5

Microsoft ADO.NET 2.0 382گام به گام با

BindingSourceپاسخ دادن به رويدادهاي

بيشتر در اينجا، نيز،. اند شدهذكر12-4 در جدول،BindingSourceرويدادهاي عرضه شده از سوي جزء. هستندCurrencyManagerها رويدادهاي آن

BindingSource رويدادهاي12-4جدول

CurrencyManager شرح رويداد

AddingNew پس از فراخواني متدAddNew ولي پيش از ، افزوده BindingSourceفهرست آنكه موردي به.دهد شود، رخ مي

BindingComplete گيرنده هاي سرويس پس از آنكه تمام كنترلمي BindingSourceمقيد به .دهد شدند، رخ

×

CurrentChanged شده كه مورد جاري در فهرست مديريتزماني تغيير كرد، رخ BindingSourceاز سوي

.دهد مي

×

CurrentItemChanged كه يك زمانيpropertyشده در فهرست مديريت تغيير كرد، رخ BindingSourceاز سوي

. دهد مي

×

DataError مورد رسيدگي از كه خطاي جاري،زماني مي قرارميBindingSourceسوي .دهد گيرد، رخ

×

DataMemberChanged كه زمانيDataMember propertyبه متعلقBindingSourceمي تغيير مي .دهد كند، رخ

DataSourceChanged كه زمانيDataSource propertyبه متعلقBindingSourceمي تغيير مي .دهد كند، رخ

ListChanged آنكه فهرست مربوطه يا موردي در زمانيمي تغيير مي .دهد كند، رخ

×

PositionChanged كه زمانيPosition propertyبه متعلقBindingSourceمي تغيير مي .دهد كند، رخ

×

سوي، كه پيش از افزودن يك مورد به فهرست مديريت شده از AddingNewبا پاسخ دادن به رويدادBindingSourceمي روي مي به اضافه كردن موارد جديد به منبع دادهةتوان طريق دهد، هاي مربوطه را

رد. دلخواه تغيير داد يكحا، كه AddinNewEventArgةرويداد مذكور، پارامتري را از propertyمل تنهامي بر روpropertyبا تنظيم اين. كند است، دريافت ميNewObjectموسوم به توان قابليتي شيء،

AddNewزد هاي مربوطه به اجرا درمي را، كه توسط منبع داده .آيد، دور

به/ فصل دوازدهم BindingSource 383هاي ويندوز با استفاده از جزء ها درفرم دادهمقيدسازي

Property هايDataSourceChanged وDataMemberChanged،كه همان ، آيد شان برمي از اسمگونهامثالً. كنند تغيير شان كه مقادير،شوند زماني مطرح مي قدامي براساس نوع، ممكن است، اگر الزم است

.صورت دهيد، به اين رويدادها پاسخ خواهيد داد) شود مقيد بدان مي BindingSourceكه(ها منبع داده

PositionChangedرويداد

طور همان،اين رويداد. برد به ارث ميCurrencyManager از PositionChangedهمانگونه كه ديديم، رويدادكه، هركآيد از نامش برميكه مي تغيير ميListبه متعلقPosition propertyجا .شود كند، شروع

ويژوال بيسيك : PositionChangedپاسخ دادن به رويداد

، كه پيش از btnCreateEmployees_Click event handlerدر ويرايشگر كد، سطر زير را به انتهاي.1:اين ايجاد كرديم، اضافه كنيد

AddHandler bsEmployees.PositionChanged,_ AddressOf bsEmployees_PositionChanged

: به اين صورت باشدevent handlerة بدن،حال بايد

bsEmployees = New BindingSource() bsEmployees.DataSource = dsAdoSbs bsEmployees.DataMember = "Employees"

tbEmployeeID.DataBindings.Add("Text", bsEmployees, "EmployeeID") tbHireDate.DataBindings.Add("Text", bsEmployees, "HireDate") tbFullName.DataBindings.Add("Text", bsEmployees, "FullName") AddHandler bsEmployees.PositionChanged,_ AddressOf bsEmployees_PositionChanged

به.2 : اضافه كنيدbsEmployees_PositionChanged event handlerكد زير را

txtPosition.Text = (bsEmployees.Position + 1).ToString() + " of " _ + bsEmployees.Count.ToString()

. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.3

Microsoft ADO.NET 2.0 384گام به گام با

و سپس يكي از دكمهCreate bsEmployeesةبرروي دكم.4 . كليك كنيد،هاي پيمايش،مي، كاربرديةبرنام .گذارد اطالعات مربوط به مكان را در قاب متن به نمايش

. كاربردي را ببنديدةبرنام.5

سي: PositionChangedپاسخ دادن به رويداد شارپ ويژوال

از، كه پيشbtnCreateEmployees_Click event handlerدر ويرايشگر كد، سطر زير را به انتهاي.1:اين ايجاد كرديم، اضافه كنيد

bsEmployees.PositionChanged += new EventHandler(bsEmployees_PositionChanged);

: به اين صورت باشدevent handlerة بدن،حال بايد

bsEmployees = new BindingSource(); bsEmployees.DataSource = dsAdoSbs; bsEmployees.DataMember = "Employees"; tbEmployeeID.DataBindings.Add("Text", bsEmployees, "EmployeeID"); tbHireDate.DataBindings.Add("Text", bsEmployees, "HireDate"); tbFullName.DataBindings.Add("Text", bsEmployees, "FullName"); bsEmployees.PositionChanged += new EventHandler(bsEmployees_PositionChanged);

به/ فصل دوازدهم BindingSource 385هاي ويندوز با استفاده از جزء ها درفرم دادهمقيدسازي

به.2 : اضافه كنيدbsEmployees_PositionChanged event handlerكد زير را

txtPosition.Text = (bsEmployees.Position + 1).ToString() + " of " _ + bsEmployees.Count.ToString();

. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.3و سپس يكي از دكمهCreate bsEmployeesةبرروي دكم.4 . كليك كنيد،هاي پيمايش،

مي، كاربرديةبرنام .گذارد اطالعات مربوط به مكان را در قاب متن به نمايش

. كاربردي را ببنديدةبرنام.5

خالصه

از) هرچند نه از نظر فني(، كه BindingSource شيءبادر اين فصل، رود به شمار ميADO.NETبخشيدر( را CurrencyManager ADO.NETو) شود اعالن ميSystem.Windows. Forems namespaceچرا كه

ميبسته و دادهproperty دسترسي به BindingSource.، آشنا شديمكند بندي را CurrencyManagerهاي هاو گستر آسان ف ها براي كنترل منابع دادهةتر، ميهمان.سازد ترمي راخها مقيد را توان گونه كه ديديم، حتي

، از آن همچون CurrencyManager List propertyگرديده از سوي ارجاعIListبا افزودن دستي موارد به .هاي مستقل استفاده نمود منبع داده

سيزدهمفصل

هاي ويندوز در فرمADO.NETكاربرد:در پايان اين فصل، خواهيد توانست

از براي پيمايش مجموعه BindingNavigatorاز كنترل� . استفاده كنيدها ركورداي.ها استفاده كنيد تر كردن ورود داده هاي ويژه براي ساده از كنترل�. با يكديگر استفاده كنيدهاي مرتبط ها براي نمايش داده از روابط داده�.ها را فرمت كنيد داده،Formatو Parseبا استفاده از رويدادهاي�بر رديف� . بيابيدDataSetو معيارهاي ديگر، در Sortاساس ستون ها را،.ها كار كنيد با رويدادهاي تغيير داده�.با رويدادهاي اعتبارسنجي كار كنيد�.كار بريد را بهErrorProviderجزء�

به”، يازدهمدر فصل هاي ها در فرم مقيدسازي به داده”،12، وفصل“ها دادهمقيدسازي دستيدر كه از مقيدسازي به دادهيي، به بررسي اشيا“BindingSourceويندوز با استفاده از جزء ADO.NETها

ميمايكروسافت ا. كنند، پرداختيم پشتيباني هايو فرمADO.NETز در اين فصل، كنكاشي در استفاده.دآورخواهيم به عمل ويندوز براي انجام برخي كارهاي رايج

ها براي پيمايش از ميان دادهBindingNavigatorاستفاده از

BindingNavigator نوع خاصي از كنترل ToolStripجزءبا است، كه همراهBindingSource كند كار مي . باشد، كه ToolStripItemهاي اي از كنترل بندي شده كه حاوي مجموعهاين كنترل، از پيش، طوري پيكر

البته، چون. هستند)Deleteو MoveFirstمانند( BindingSource متناظر با متدهاي خود مستقيماًBindingNavigatorيك نيز خودToolStripرود، براي آن كه مناسب كاربردمان شود، به شمار مي

د مي از. يگري نيز به آن اضافه كنيمتوانيم موارد ، ToolStripبراي آشنايي با جزئيات طرز استفادهبه مي . رجوع كنيدMSDN Helpتوانيد

به فرم BindingNavigatorافزودن كنترل

و در صورت 2005 را در ويژوال استوديو Chapter VB 2005 Express - Startةپروژ.1 باز كرده،سي(UsingADONet.vbلزوم برروي مي يا اگر از در ) UsingADONet.csكنيد، شارپ استفاده

Solution Explorerدوبار كليك كنيد .

Microsoft ADO.NET 2.0 388گام به گام با

در،ويژوال استوديو .كند باز ميForm Designer فرم را

. ابزار به سطح طراحي فرم بكشيدة در جعبDataةاز زبانرا BindingNavigatorكنترل.2مي كنترل،ويژوال استوديو .كند را به فرم اضافه

389 هاي ويندوز در فرمADO.NETكاربرد/ فصل سيزدهم

. تغيير دهيدbnCategoriesبه، نام كنترل راPropertiesةدر پنجر.34.BindingSource property را به bsCategoriesتغيير دهيد .. تغيير دهيدBottom متعلق به كنترل را به Dock propertyمقدار.5. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.6

. استفاده كنيدCategories DataTable براي پيمايش از ميان BindingNavigatorةاز دكم.7

. كاربردي را ببنديدةبرنام.8

Microsoft ADO.NET 2.0 390گام به گام با

هاي ويندوز ها در كنترل نمايش داده

.NET Framework،مي از كنترلمتنوعي از انواع،هاي ويندوز در فرم و همان ها پشتيباني طور كه كند،در تواند مستقيم يا غيرمستقيم به يك منبع داده فرم ميpropertyديديم، هر . مقيد شودADO.NETها

از برخيبا اين قسمت در ليكن،. اين كتاب استةها خارج از حوصل جزئيات كنترلپرداختن به سفانه،أمتشدها هاي رايج براي مقيدسازي به داده تكنيك .آشنا خواهيم

ها ورود دادهتسهيل

مي اين همه كنترل NET Framework. آنكهيل يكي از دال و دقيق، البته، سادهكند عرضه تر كردن ورود ترو زمانييقيناًاند، ولي مناسبي بودهةهاي قاب متن همواره گزين كنترل. هاست داده كه صرف انتخاب

با اجراي كنترل مي دادهپيرامون كاربر انديشههاي هر چه سازگارتر يهوده تلف نشدهبشود، مسلماً ها. است

از اين است كه قطعاً، ساده گواه بر اين واقعيتيك مثال نسبتاً و True حاوي combo box استفادهFalse يا Yes وNo براي نشان دادن مقادير Boolean ممكن است، ولي در بيشتر موارد، استفاده از كنترل

CheckBox ارائه شده از سوي .NET Framework و كارآمدتر خواهد بودؤمخيلي .ثرترChecked property متعلق به كنترل CheckBoxمي، كه مشخص مي تواند كند قابي انتخاب شده يا خير،

و يا با استفاده از تكنيكبه سادگي .هاي استاندارد در زمان اجرا مقيد شود در زمان طراحي،

Booleanمقاديرننمايش درآورد براي بهCheckBoxاستفاده ازكنترل

. انتخاب كنيدcbCurrent به نام CheckBox، كنترل Form Designerدر.1و سپس قاب فهرست را براي Data Bindings، نخست گره Propertiesةدر پنجر.2 ،Checked

propertyباز كنيد .. را انتخاب كنيدCurrent را گشوده، سپس ستون bsCategoriesگره.3بركةبراي اجراي برنام.4 . فشار دهيدF5روي كليد اربردي،

.گذارد را در قاب كنترل به نمايش ميCurrent مربوط به ستون Boolean كاربردي، مقدارةبرنام

391 هاي ويندوز در فرمADO.NETكاربرد/ فصل سيزدهم

. كاربردي را ببنديدةبرنام.5

نمايش مقادير قابل فهم براي كاربر

جايبه( خوددلخواهي به ساختگيها اطالعاتي، از كليد تر كردن طرح بانك طراحان، براي سادهاغلبمي)هاي موضوع مورد نظر برآمده از ويژگيهايكليد ، خود اطالعاتي، معموالً موتور بانك. كنند استفاده

هر(Identityهاي به ستونرا ساختگياين كليدهاي ساختگياين كليدهاي. دهدمي، نسبت)نام ديگريا بهمبه( فني بسيار كارآمد، وليةاز نقط مياغلب. براي كاربران فاقد معنا هستند)عمولطور ةتوان كليد اولي،

. آن را ناديده گيرندتوانندمياند، يا زماني كه مشغول كار كردن با جدول اوليه؛را از كاربران پنهان نمود.ندرت وضع چنين استليكن، در مورد كليدهاي خارجي به

ListControlة، كه از ردComboBoxو ListBoxمانند( NET Framework.هاي كنترلكار با خوشبختانه، تكنيك. است آسان بسيار،ديگريحتي ستوني در جدول، مقيد ساختن كنترل به ستون براي)برند ارث مي: استو ساده سرراست، كامالًاين كار1.property هايDataSource وDisplayMemberك متعلق بربه و ستوننترل را مطلوبي،روي جدول

. تنظيم كنيد،و مناسب براي كاربر را برروي ستون كليدي در ValueMember propertyها، سپس، براي تنظيم مقيدسازي به داده.2

.جدولي كه قرار است روزآمد شود، تنظيم نماييد را به فيلدي كه قرار است Selected property به وجود آوريد، كه Bindingسرانجام، يك شيء.3

.دده روزآمد شود، پيوند

Microsoft ADO.NET 2.0 392گام به گام با

اطالعاتي كه در تصوير زير نشان داده شده، اگر فرمي را براي براي مثال، با توجه به طرح بانكبه به وجود آوريد، بهRelativesروزآمد كردن جدول بهطور معمول، -جاي آن كه كاربر را وادار كنيد

و غيره است، از كنترل Fatherمعناي بهSister ،Type 2معناي بهType 1ر بسپارد كه خاط ،ComboBox . استفاده كنيدRelationshipبراي نشان دادن نوع

به كنترل متعلقDisplayMember property، الزم است NET Framework. اين طرح در اجرايبرايComboBox را برروي Relationships.Relationship و سپس ،ValueMember property آن را بر روي

Relationships.RelationshipIDبا فرض اين تنظيمات،. تنظيم كنيمComboBox مقدار Sister را به نمايش در مي بهگذارد، .دهد را بازپس مي1 عدد SelectedValueعنوان حالي كه

الزم است،)نويسي برنامهانجام اين كار به كمكيا( Propertiesةها در پنجر propertyپس از تنظيم به Binding يك شيء)Relatives در جدول RelationshipID به ستون SelectedValueبراي پيوند دادن(

ها براي مقيدسازي به دادهSelectedValueو چون در زمان طراحي. اضافه كنيمComboBoxكنترل: را با نوشتن كد اضافه كنيد مزبور شيءموجود نيست، الزم است

Relationships.DataBindings.Add(“SelectedValue”, myDS, _ “Relatives.Relationship”)

ComboBox در كنترل Full Namesنمايش

. را انتخاب كنيد Form Designer ،bsProducts BindingSourceدر.1و سپس DataSource، قاب فهرست Propertiesةدر پنجر.2 . را انتخاب كنيدbsCategories را باز كرده،

393 هاي ويندوز در فرمADO.NETكاربرد/ فصل سيزدهم

و سپس DataMemberقاب فهرست.3 و Categories كه DataRelationنام(Products_Categories را باز،Products DataTable در Typed DataSetرا انتخاب كنيد)دهد را به يكديگر پيوند مي .

كIbProductsقاب فهرست.4 .نيد را انتخابو DataSource، فهرست Propertiesةدر پنجر.5 . را انتخاب كنيدbsProducts را باز،و DisplayMemberفهرست.6 . را انتخاب كنيدProductName را باز،و ValueMemberفهرست.7 . را انتخاب كنيدProductID را باز،برةبراي اجراي برنام.8 و سپس براي F5روي كليد كاربردي، از DataSetحركت از ميان فشار دهيد،

.كليدهاي پيمايش استفاده كنيد.گذارد انتخابي را به نمايش ميCategory در Products تنها، كاربرديةبرنام

. كاربردي را ببنديدةبرنام.9

Microsoft ADO.NET 2.0 394گام به گام با

ها DataRelationكار با

را اش در ايجاد طرح شود، با توانايي اجرا ميADO.NETها كه توسط مدل داده در بطههاي اي كاملDataSetمي فرم را سادهدر روابط با عمق دلخواهة، ارائ با مقيد ساختن خود،،NET Framework.و.كند تر

فرم را بر عهدهيها كنترل) synchronization(، همگاه كردن DataTable به جاي DataRelationكنترل به يك.گيرد مي

با استفاده از اجزاي،هاي مرتبط با يكديگر، نمايش دادهADO.NET 2و 2005در ويژوال استوديوBindingSource نخست،. ساده بسيار، كاري استDataRelation ها را در يكTyped DataSet به وجود

به جزء متعلقDataSource propertyهاي مرتبط با يكديگر، سپس، براي نمايش رديف. آوريم ميBindingSource روي را برDataTable و به متعلقDataMember property در يك سوي رابطه،

DataRelation)نهDataTable (در طرف )مي، ديگر رابطه)هاي بسيار .كنيم تنظيم

DataRelation كنترل به ختنمقيد سا

و در پنجر bsDetails BindingSource، كنترل Form Designerدر.1 ، Propertiesة را انتخاب،DataMember property را برروي Products_ProductDetailsتنظيم كنيد .

. را انتخاب كنيدProduct ID، قاب متن Form Designerدر.2و گره Text property، قاب فهرست Data Bindings، بخش Propertiesةدر پنجر.3 ،bsDetails را

و سپس . را انتخاب كنيدProductIDگشوده،اUnit Priceقاب متن.4 .نتخاب كنيد راو drop-down (Text property(، قاب فهرست فروافتادني Data Bindings، بخش Propertiesةدر پنجر.5 ،

و سپس bsDetailsگره . را انتخاب كنيدUnitPrice را گشوده،. را انتخاب كنيدTotal Salesقاب متن.6و گره Text، قاب فهرست Data Bindings، بخش Propertiesةدر پنجر.7 ،bsDetails و سپس را گشوده،

TotalSalesرا انتخاب كنيد .و سپس F5 كاربردي، برروي كليدةبراي اجراي برنام.8 هاي مختلف را در قاب Product فشار داده،

. انتخاب كنيدProductsفهرست مية كاربردي، جزئيات فرآورد برنامه .گذارد انتخاب شده را به نمايش

395 هاي ويندوز در فرمADO.NETكاربرد/ فصل سيزدهم

رةبرنام.9 .ا ببنديد كاربردي

ها فرمت كردن داده

در بزرگي است كه دادهنقص اطالعاتي، اين هاي بانكدنيايدر ميهاآنهاي خامي كه به ذخيره شوند،ها، صفاتي كه از نظر براي تسهيل در يكپارچگي داده. اند مناسبنشان دادن به كاربرانبراي ندرت

س كاربران مقادير واحدي به شمار مي و از كدهاي مصنوعي تونروند، در هاي متعددي تقسيم شده،آن براي ذخيره مي سازي كارآمد و. شود ها استفاده و راز، گاه با چيزهاي عجيب در اين دنياي پر رمز

بريا، چند تكه مقادير،مثالً-يغريب و فالن متدولوژيةپايرمزگذاري اسرارآميز يا از دور خارج مبهممي-شده .شويم مواجه

و نمايش آن در فرمتي كه مناسب كاربران، براي تفسير دادهNET Framework.خوشبختانه، هاي خام.دهد انساني است، چندين متد قدرتمند در اختيار ما قرار مي

دلخواهرشته هاي فرمت

سه وجود داردBindingبه شيء متعلقproperty، سه NET Framework 2.0.در :ند جديد، كه هرFormatString ،FormatInfo وFormattingEnabled . اين سهpropertyو ساد ة، امكان فرمت كردن مجدد

و .سازند را فراهم ميDateTimeمقادير عددي خامFormatString property رشتهمقداري از نوع )string(-به موسومformat specifier - را كه نشان

ب موردنظر مقداردهد مي مي چگونه در رشته. پذيرد ايد فرمت شود، هاي استاندارد براي مقادير عدديو مقادير13-1جدول ،DateTime اند ذكر شده13-2 در جدول.

Microsoft ADO.NET 2.0 396گام به گام با

هاي عددي استاندارد13Format Specifier-1جدول

Specifier شرح

Cيا cپول رايج

Dيا dاعشار

Eيا eگذاري علمي نشانه

Fيا fاعشار ثابت

Gياgترين ارائه عام، فشرده

Nيا nمي عددي، كه با يك و اعشار فرمت .شود هزار جداكننده

Pيا pدرصد

Rيا rو برگشت، كه تضمين مي عددي تا همان مقدار عددي تحليلةكند رشت رفت.خواهد شد

Xيا xشماري شانزده

استانداردDateTimeهاي 13Format Specifier-2جدول

Specifier شرح

dshort date

Dlong date

tshort date

Tlong time

flong date وshort time

Flong date وlong time

gshort date وshort time

Gshort date وlong time

Mيا mالگوي ماه روز

Rيا rالگويRFC1123

397 هاي ويندوز در فرمADO.NETكاربرد/ فصل سيزدهم

Specifier شرح

sو زمان قابل مرتب كردن تاريخ

uز و مان كلي قابل مرتب كردنتاريخ

Uو زمان كامل قابل مرتب كردن تاريخ

Yيا yالگوي سال ماه

كه؛ندا ها حساس هاي فرمت استاندارد به فرهنگspecifier همة بازپس در نهايتكهيفرمتبه اين معنادر داده مي “d”اده از كدهايي چون عالوه، با استفبه. هماهنگ است، Control Panelشود، با تنظيمات محليمي)digit placeholder(براي جانگهدار رقمي“#”و dayبراي ) custom( براي فرمت دلخواه specifierتوان،به. وجود آوردبه به specifierبراي جزئيات مربوط .MSDN Helpهاي فرمت دلخواه، رجوع كنيد

FormatInfo property امكان مشخص ساختن IFormatProvider آنةفرمت كردن بر عهدةوظيفكه( رامي)است IFormatProvider از NET Framework.اگر هيچ مقداري به آن داده نشود،. گذارد در اختيار

.كند استفاده ميSystem.Windows.Forms.Application.CurrentCultureتدارك ديده شده از سوياIFormatProviderواسط است، امكان ايجاد توابع دلخواه براي فرمت System namespaceز، كه بخشي

custom(هاي فرمت دلخواه بينده اگر نياز به فرمت كردن دلخواه داريد، تدارك. دهد كردن را به ما مي

format providers(توانند مفيد باشند، ولي اين موضوعمي)اين كتابةدر حوصل) شايد خوشبختانه از براي. گنجد نمي . MSDN Helpبه، رجوع كنيدعملي كارجزئيات آگاهي بيشتر

propertyكند است، مشخص ميFalseةگزيد صورت پيش، كه بهFormattingEnabled propertyباالخره،مگر در مواردي كه مقدار. گيرند يا خير در عمل مورداستفاده قرار ميFormatInfoو FormatStringهايدهيد، ناديده گرفته ديگر ارائه ميproperty را تغيير داده باشيد، مقاديري كه براي دو propertyاين .شوند مي

: FormatString propertyفرمت كردن مقدار تاريخ با استفاده از

ويژوال بيسيك

. فشار دهيدF7ةبراي نمايش ويرايشگر كد، برروي دكم.1به.2 : اضافه كنيدbtnBindingFormat_Click event handlerسطور زير را

Dim myBinding As Binding myBinding = tbUnitPrice.DataBindings("Text") myBinding.FormatString = "C" myBinding.FormattingEnabled = True

Microsoft ADO.NET 2.0 398گام به گام با

. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.3. كليك كنيدBinding Formatةبرروي دكم.4مي را كه بهUnit Price، كاربرديةرنامب .گذارد صورت مقدار پول رايج فرمت شده، به نمايش

. كاربردي را ببنديدةبرنام.5

: FormatString propertyفرمت كردن مقدار تاريخ با استفاده از

شارپ ويژوال سي

. فشار دهيدF7ةبراي نمايش ويرايشگر كد، برروي دكم.1به.2 : اضافه كنيدbtnBindingFormat_Click event handlerسطور زير را

Binding myBinding; myBinding = tbUnitPrice.DataBindings["Text"]; myBinding.FormatString = "C"; myBinding.FormattingEnabled = true;

. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.3. كليك كنيدBinding Formatةبرروي دكم.4

مي را كه بهUnit Price، كاربرديةبرنام .گذارد صورت مقدار پول رايج فرمت شده، به نمايش

399 هاي ويندوز در فرمADO.NETكاربرد/ فصل سيزدهم

. كاربردي را ببنديدةبرنام.5

Parseو Formatرويدادهايمي گرچه براي بسياري كارهاي قالب از بندي رايج، FormatInfoو FormatStringهاي propertyتوان

به. محدود استكاربردشان بسيارنمود، ولي استفاده ها، بازپس دادن propertyكار گرفتن اين هدف ازمي. بندي شده براي نشان دادن به كاربران است قالبةرشتمقداري از نوع شود اقدامات گاه الزم

مقاي ها يا حتي تغيير نوع داده رشته) unpacking(تري صورت گيرد، مانند گشودن پيچيده .دار يككند، عرضه ميParseو Formatهاي دو رويداد به نامADO.NET متعلق به Bindingخوشبختانه، شيء

مية برنامدرها كه از انجام كارهاي پيچيده با داده زماني روي Formatرويداد. نمايند كاربردي پشتيبانيكه مي ك ها از منبع داده داده) مطابق تصوير زير(دهد، يا نترلي برروي يك فرمها به ويندوز رانده،

مي برعكس از كنترل به منبع داده از دهد، كه داده تنها موقعي روي ميParseرويداد. شوند ها كشيده ها.ها كشيده شوند كنترل به منبع داده

مي)اصلي(ها از فرمت محلي دادهةبراي ترجم از،خواهيد براي كاربر نمايش دهيد به فرمتي كه عكس براي تبديل به فرمت اصلية در ترجمParse رويداد از سوي ديگر،. كنيد استفاده Formatرويداد

.كاربرد دارد.گيرندمي)اند ذكر شده13-3هاي آن درجدولpropertyكه( ConverEventArgs argument،هردورويداد

ConverEventArgsهاي 13property-3جدول

Property شرح

DesiredType ها با مقدار دلخواه نوع داده

Value ها مقدار داده

Microsoft ADO.NET 2.0 400گام به گام با

Value propertyهنگامي كه رويداد. هاي واقعي است حاوي دادهFormatشود، اين آغاز ميproperty propertyشود، اين آغاز ميParseوقتي كه رويداد. هاي اصلي در فرمت اصلي خود است حاوي دادهو فرمت جديد براي تغيير فرمت، الزم است اين مقدار را برروي داده. اي فرمت شده استه حاوي داده ها

. تنظيم كنيدevent handlerدر داخل از براي تغيير نوع داده .كنيم استفاده ميDesiredType propertyهاي مقدار،

Formatد رويدادركارب

مي،Formatجا كه رويداد از آن مي ها از منبع داده دهد كه داده هم زماني روي در ها رانده و هم شوند،ميكه از كنترل زماني ميگردند اخذ دهد، اطمينان، لذا الزم است پيش از هر اقدامي در مورد آنچه رخ

مي اگر نوع داده. حاصل كنيد مي هاي مقدار را تغيير از دهيد، DesiredTypeتوانيد براي انجام اين بررسي

property شود، ناچاريد براي مشخص ساختن ها تغييري حاصل نمي ليكن، اگر در نوع داده. استفاده كنيد Tag propertyتنظيم. خارجي نسبت به رويداد داردةها، از متدي استفاده كنيد كه جنب جهت حركت داده

از. اي براي اين كار است متعلق به كنترل راه ساده ري استفاده براي منظور ديگTag propertyاگرمي مي به كنيد، جاي آن از متغيري در سطح فرم استفاده نماييد، يا جهت را از خود مقدار تعيين توانيد.كنيد

ويژوال بيسيك : Formatها با استفاده از رويداد تغيير فرمت داده

به.1 : اضافه كنيدFormatName event handlerدر ويرايشگر كد، سطور زير را

If tbName.Tag <> "PARSE" Then e.Value = CType(e.Value, String).ToUpper() End If tbName.Tag = "FORMAT"

كند، تا مشخص سازد مقدار را بررسي ميtbNameبه كنترل متعلقTag propertyكد باال، نخست ”PARSE “ة گزارةاگر چنين نيست، بدن. هست يا خيرIfة مبادرت به ترجمValue propertyبه متعلق

مي) است كه حاوي مقدار واقعي داده(eپارامتر .كندو تبديل آن به حرف بزرگ

به:توصيه ميبه] scaffolding[كه بخشي از داربست(، load event handler اگر نگاهي ندازيد،بي) رود شماراگر. افه شده استها اضDataTable پيش از پر شدن Format event handlerمشاهده خواهيد كرد كه

handlerت را پس از پر شدن آن ثيري بر نخستين رديفي كه نمايش داده شده، نخواهدأها اضافه كنيد،.داشت

. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.2

401 هاي ويندوز در فرمADO.NETكاربرد/ فصل سيزدهم

.آورد را با حروف بزرگ به نمايش درميName كاربردي، محتواي فيلدةبرنام

.ربردي را ببنديدكاةبرنام.3

سي: Formatها با استفاده از رويداد تغيير فرمت داده شارپ ويژوال

به.1 : اضافه كنيدFormatName event handlerدر ويرايشگر كد، سطور زير را

if ((string)tbName.Tag != "PARSE") {

string eStr = (string)e.Value; e.Value = eStr.ToUpper(); }tbName.Tag = "FORMAT";

كند، تا مشخص سازد مقدار را بررسي ميtbNameبه كنترل متعلقTag propertyكد باال، نخست ”PARSE “ة گزارةاگر چنين نيست، بدن. هست يا خيرIfة مبادرت به ترجمValue propertyبه متعلق

به، كه حاوي مقدار واقعي دادهeپارامتر و تبديل آن مي است، .كند حرف بزرگ

به:توصيه ميبه] scaffolding[كه بخشي از داربست(، load event handler اگر نگاهي بيندازيد،) رود شماراگر. ها اضافه شده است DataTable پيش از پر شدن Format event handlerمشاهده خواهيد كرد كه

handlerت را پس از پر شدن آن برأها اضافه كنيد، نخستين رديفي كه نمايش داده شده، نخواهد ثيري.داشت

Microsoft ADO.NET 2.0 402گام به گام با

. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.2.آورد را با حروف بزرگ به نمايش درميName كاربردي، محتواي فيلدةبرنام

. كاربردي را ببنديدةبرنام.3

Parseكاربرد رويداد

ها از كنترل به منبع دهد، كه داده زماني روي ميParseديم، رويداد همانگونه كه پيش از اين عنوان كرمي داده به ها كشيده و هايي كه براي به نمايش داده“ از فرمت خارج كردن”طور معمول، براي شوند،

. اند، كاربرد دارد سفارشي شدهFormat رويدادةوسيلدرآمدن بهمي تنها يك بار فراخوانParseاز آنجا كه همواره“ از فرمت خارج كردن”شود، الزم است اين اقدام ده

و(ها به كنترل رانده گيرد، كه داده صورت گيرد؛ برخالف اقدام فرمت كردن، كه تنها زماني صورت مي.شوندمي)كه از آن بيرون كشيدهنه زماني

يا:مهم كه( Format كنيد، كه رويداد ها را طوري تنظيمproperty همواره توجه داشته باشيد كه متغيرها.كند فرمت ها مجدداً ها به منبع دادهآنةها را پيش از ارائ داده)شود فراخوانده ميParseهميشه پس از

ويژوال : Parseها با استفاده از رويداد بازگرداندن فرمت اصلي داده

بيسيك

به.1 :ضافه كنيداParseName event handlerدر ويرايشگر كد، سطور زير را

tbName.Tag = "PARSE" e.Value = CType(e.Value, String).ToLower()

403 هاي ويندوز در فرمADO.NETكاربرد/ فصل سيزدهم

MessageBox.Show(e.Value)

مي“ PARSE” را به Tag propertyاين كد مقدار (دهد تغيير خاطر آوريد كه، براي پرهيز از فرمتبه.كد). بررسي كرديمFormat event handlerكردن مجدد مقدار، آن را در به متعلقevent propertyسپس،

.گذارد را بدل به حروف كوچك كرده، آن را در يك قاب پيام به نمايش ميeپارامتر. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.23.Category Name را از BEVERAGES به DRINKSها حركت تغيير داده، سپس به رديف بعدي داده

.كنيدParse event handler مقدار را به حروف كوچك تبديل نموده، مقدار جديد را با حروف كوچك در يك .گذارد قاب پيام به نمايش مي

و برنام.4 . كاربردي را ببنديدةقاب پيام

ويژوال : Parseها با استفاده از رويداد بازگرداندن فرمت اصلي داده

شارپ سي

: اضافه كنيدParseName event handlerرا به در ويرايشگر كد، سطور زير.1

tbName.Tag = "PARSE"; string eStr = (string)e.Value; e.Value = eStr.ToLower(); MessageBox.Show(e.Value.ToString());

Microsoft ADO.NET 2.0 404گام به گام با

مي“ PARSE” را به Tag propertyاين كد مقدار (دهد تغيير خاطر آوريد كه، براي پرهيز از فرمتبه.درك كد.) بررسي كرديمFormat event handlerردن مجدد مقدار، آن را به متعلقevent propertyسپس،

.گذارد را بدل به حروف كوچك كرده، آن را در يك قاب پيام به نمايش ميeپارامتر. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.23.Category Name را از BEVERAGES به DRINKSها حركت تغيير داده، سپس به رديف بعدي داده

.كنيدParse event handler مقدار را به حروف كوچك تبديل نموده، مقدار جديد را با حروف كوچك در يك .گذارد قاب پيام به نمايش مي

و برنام.4 . كاربردي را ببنديدةقاب پيام

ها دادهيافتن

و متداول استي كار،DataTable در دنظر مورةجستجو براي يافتن داد .هاي كاربردي در برنامه معمول: چندين متد با اين قابليت در اختيار دارد،2005ويژوال استوديو

اي براي اضافه كردن اين از مكانيسم ساده)در ويژوال استوديو( Form Designer در حال حاضر،�.كند قابليت به فرم پشتيباني مي

پشتيباني Find آن پرداختيم، از متد دربارةبررسيبه12، كه در فصل BindingSourceجزء�.كند مي

.كنند، نيز، از جستجو پشتيباني ميlow-level(ADO.NET( سطح پايينءاشيا�

405 هاي ويندوز در فرمADO.NETكاربرد/ فصل سيزدهم

Add Query با استفاده از قاب گفتگويها دادهيافتن

يك“ها DataAdapterكاربرد”،8در فصل از، ديديم كهها مكانيسمي TableAdapter هاي مزيتي براي استبه نمودن استعالمعرضه ردهاي پارامتردار Form. گذارند در اختيار ميTableAdapterةعنوان متدهاي

Designerاي براي در ويژوال استوديو اين قابليت، با در اختيار گذاشتن مكانيسم مبتني بر گفتگوي سادهميدوز، افزودن قابليت جستجو به فرم وين .يابد تبلور

را، ميForm Designer در Data از منوي،Add Queryبا انتخاب TableAdapterبه توان استعالم جديدي به فرم ToolStripدر هر دو صورت، يك كنترل. افزود يا استعالم از پيش موجودي را انتخاب نمود

و كنترل گزيده، پيشو استانداردToolStrip اين.شود اضافه مي براي هر پارامتر استعالمToolStripButton،رايهاي متن قابداراي مي است، كه استعالم .كنند اجرا

مي جا كه اين كنترلاز آن را طوري پيكربندي نمود، كه مناسب ToolStrip توان ها استاندارد هستند،موردتوجه قرار ) usability(قابليت كاربري نظر ممكن است از نقطهموردي كه مثالً. كاربردي باشدةبرنام

، كل TableAdapterبه متعلقFillاست، كه با فراخواندن متد استاندارد ToolStripButton گيرد، اضافه كردن ميها را مجدداً ركوردةمجموع .گذارد به نمايش

به فرم ويندوز Search ToolStripافزودن

و سپس Form Designer ،tbName TextBoxدر.1 ،Add Query را از منوي Dataانتخاب كنيد ..گذارد را به نمايش ميSearch Criteria Builder قاب گفتگوي،ويژوال استوديو

Microsoft ADO.NET 2.0 406گام به گام با

. را از قاب فهرست انتخاب كنيدFillByName(categoryName)، سپس Existing Query Nameةگزين.2قاب گفتگو،. اضافه شده استTableAdapterبه،از اين پيش،FillByName(categoryName)استعالم

.گذارد متن استعالم را به نمايش مي

. كليك كنيدOKرويبر.3.كند جستجو به فرم اضافه ميToolStripيك،ويژوال استوديو

. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.4

407 هاي ويندوز در فرمADO.NETكاربرد/ فصل سيزدهم

و سپس برروي dairy products، تايپ كنيد ToolStrip برروي CategoryNameدر قاب متن.5 ،FillByNameكليك كنيد .

.گذارد را به نمايش ميDairy Products Category رديف، كاربرديةبرنام

. كاربردي را ببنديدةبرنام.6

از يافتن داده BindingSourceها با استفاده

متد،DataTable پر كردن مجدد براي،ToolStripروي بر واقع “ execute query”ةدر پشت صحنه، دكم- DataTableحاصل عمل فراخواني اين متد، فيلتر كردن. خواند را فرا ميTableAdapterبه ستعالم متعلقا

كد. است-هاي مربوطه DataRowو نه فقط نمايش نه( در فايل كد فرم ToolStripBittonاز آن جا كه و.ها كار چندان دشواري نيستDataRow، نمايش دادن قرار دارد) فايل طراح- همان. استBindingSourceبه جزء متعلقFindها، به كار بستن متد DataRow نمايش براييك راه

را فراخوان متد به منبع داده مستقيماBindingSource.Findً ديديم، متد12طور كه در فصل هاي مربوطهردنمايد، طوري ارائه مي در جستجوهاي ساده. هاي منبع مذكور دارد دادهةكه رفتار دقيق آن بستگي بهآن هايي كه داده ستون تر تنها جستجوهاي پيچيدهامكان دارند، ولياند، هميشه ها ذخيره شده ها در

.ها پشتيباني كنندآنازهاي مربوطه اند، كه منبع داده زماني عملي در ويژوال استوديو، تنها راه عملي ساختن مكانيسم Search ToolStripةزيدگ البته، تغيير كد پيش

مي. كند استفاده مي BindingSourceهب متعلقFindجستجويي است، كه از متد با اين قابليت را توان، موردي در منو، رويداد خروج از كنترل قاب متن، يا هر گونه ابزار اي برروي فرم استفاده از دكمه

. كاربردي عملي ساخت واسط مناسب برنامه-ركارب

Microsoft ADO.NET 2.0 408گام به گام با

ازييافتن رديف ويژوال بيسيك : BindingSource با استفاده

را، كه به كمك قاب گفتگوي FillByNameToolStripButton_Click event handlerدر ويرايشگر كد،.1Search Criteria Builderاضافه شده، پيدا كنيد .

رابه.2 . قرار دهيدجاي كد موجود، كد زير

Dim firstRow As Integer firstRow = bsCategories.Find("CategoryName", _ CategoryNameToolStripTextBox.Text) If firstRow <> -1 Then bsCategories.Position = firstRow End If

. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.3و سپس برروي dairy products، تايپ كنيد ToolStrip برروي CategorNameدر قاب متن.4 ،

FillByNameكليك نماييد ..اند هاهمچنان دورازدسترس اقي رديفدهد، ولي رانمايش ميDairy Products categoryكاربردي،ةبرنام

. كاربردي را ببنديدةبرنام.5

409 هاي ويندوز در فرمADO.NETكاربرد/ فصل سيزدهم

ازييافتن رديف سي: BindingSource با استفاده شارپ ويژوال

را، كه به كمك قاب گفتگوي FillByNameToolStripButton_Click event handlerدر ويرايشگر كد،.1Search Criteria Builderاضافه شده، پيدا كنيد .

.جاي كد موجود، كد زير را قرار دهيدبه.2

int firstRow; firstRow = bsCategories.Find("CategoryName", categoryNameToolStripTextBox.Text); if (firstRow != -1) bsCategories.Position = firstRow;

. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.3و سپس بر روي dairy products، تايپ كنيد ToolStrip برروي CategorNameدر قاب متن.4 ،

FillByNameكليك نماييد .مي راDairy Products categoryكاربردي،ةبرنام .اند ها همچنان دورازدسترس ديفقيبادهد، ولي نمايش

. كاربردي را ببنديدمةبرنا.5

Microsoft ADO.NET 2.0 410گام به گام با

DataViewدرييافتن رديف

،)sort(ها براساس كليد كنوني مرتب كردن كنيد، براي يافتن رديف استفاده نمي BindingSourceاگر از( استفاده كنيدDataViewبه متعلقFind توانيد از متد مي هاي فرم ويندوز كه كنترل،خاطر داشته باشيدبه.

كار DataView هستند، لذا در قريب به اتفاق موارد با DataTable متعلق به DefaultViewهمواره مقيد به .)كنيد مي

م: به دو شكل موجود استFindمتد و ديگري آرايهييكي، يك پارامتر شيء را انتخاب از كند، اي.كنيم در چندين ستون مرتب شده باشد، از روايت دوم استفاده ميDataViewاگر. پارامترها را

ويژوال بيسيك : DataViewدرييافتن رديف

به.1 : اضافه كنيدbtnDataView_Click event handlerدر ويرايشگر كد، كد زير را

Dim firstRow As Integer Dim dv As DataView dv = dsAdoSbs.Categories.DefaultView dv.Sort = "CategoryName" firstRow = dv.Find(CategoryNameToolStripTextBox.Text) If firstRow <> -1 Then bsCategories.Position = firstRow End If

برةبراي اجراي برنام.2 . فشار دهيدF5روي كليد كاربردي،ةروي دكم را تايپ كرده، سپس برproduceة واژToolStrip بر CategoryNameمتن در قاب.3

DataView Findكليك كنيد .. را به نمايش گذاريدProduce category كاربرديةبرنام

411 هاي ويندوز در فرمADO.NETكاربرد/ فصل سيزدهم

. كاربردي را ببنديدةبرنام.4

سي: DataViewدرييافتن رديف شارپ ويژوال

به.1 : اضافه كنيدbtnDataView_Click event handlerدر ويرايشگر كد، كد زير را

int firstRow; DataView dv; dv = dsAdoSbs.Categories.DefaultView; dv.Sort = "CategoryName"; firstRow = dv.Find(categoryNameToolStripTextBox.Text); if (firstRow != -1) bsCategories.Position = firstRow;

. فشار دهيدF5 كاربردي، برروي كليدةي برنامبراي اجرا.2ةروي دكم را تايپ كرده، سپس برproduceة واژToolStrip بر CategoryNameدر قاب متن.3

DataView Findكليك كنيد .. را به نمايش گذاريدProduce categoryكاربردية برنام

Microsoft ADO.NET 2.0 412گام به گام با

. كاربردي را ببنديدةبرنام.4

DataTableدرييافتن رديف

اگر الزم است رديفي. كاربردش محدود استة آسان، ولي دامنDataView متعلق به Findاستفاده از متداند پيدا كنيد، بايد از متد ها مرتب شده را براساس معيارهاي پيچيده يا در ستوني سواي ستوني كه داده

Selectبه متعلقDataTableاستفاده كنيد . در رديف صحيح در چندين CurrencyManagerدشوار نيست، ولي قرار دادن Selectكاربرد متد

از. گيرد مرحله صورت مي براي انجام DataTableو DataView اشياءاين فرآيند مستلزم استفاده. براي نمايش نتايج، استBindingContextجستجو، در كنار شيءپس از آنكه رديف. اجرا كنيدDataTableوم در برابر را با معيارهاي مورد لزSelectنخست بايد متد

شود، به دست بازپس داده ميSelectاي كه توسط متد را از آرايهSort يافت شد، مقدار ستون موردنظرو سپس از آرايه براي اجراي از. استفاده كنيدDataView در برابر Findآورده Positionو باالخره،

propertyبه متعلقBindingContext يا CurrencyManagerكل عملدر. براي نمايش نتيجه استفاده نماييد ،و ناهنجار است، ولي، اگر الزم باشد مكرراًارفرآيند بسي از اين تكنيك استفاده كنيد، خيلي زود دشوار

.وار ياد خواهيد گرفت را طوطي پياپيحلامر

بي: را پيدا كنيدDataTableرديفي را در سيك ويژوال

به.1 : اضافه كنيدbtnDataTable_Click event handlerدر ويرايشگر كد، سطور زير را

Dim dr() As AdoSbsDataSet.CategoriesRow Dim dv As DataView Dim firstRow As Integer

413 هاي ويندوز در فرمADO.NETكاربرد/ فصل سيزدهم

dr = dsAdoSbs.Categories.Select("CategoryID = 5") If dr.Length <> 0 Then dv = dsAdoSbs.Categories.DefaultView dv.Sort = "CategoryName" firstRow = dv.Find(dr(0).Item("CategoryName")) bsCategories.Position = firstRow End If

به متعلقSelect، از متد5 معادل CategoryID با DataRowةكد باال، پس از اعالن چند متغير، براي يافت Categories DataTableكه. كند استفاده مي مي يك آرايه بازپس ميSelectاز آن جا كه دهد، كد بررسي كند

كد مزبور، با فرض صحت اين. نظيري براي آن يافت شود باشد، تا لزوما0ًطول آرايه بزرگتر از DataView براي يافتن رديفي در DataTable مربوط به DefaultView متعلق به Findموضوع، از متد

و سپس استفاده مي .دهد را در محل نتيجه قرار مي BindingSourceكند،

از مورد، مستقيماًنظير هميناي براي جستجوي ساده،در عمل. نمايشي است اين مثال صرفاً:تذكرDataView وBindingSource شود استفاده مي.

برةبراي اجراي برنام.2 وF5روي كليد كاربردي، DataTable Findة سپس برروي دكم فشار دهيد،.كليك كنيد

.گذارد را به نمايش ميGrains/Cereals category، كاربرديةبرنام

. كاربردي را ببنديدةبرنام.3

Microsoft ADO.NET 2.0 414گام به گام با

سي: را پيدا كنيدDataTableرديفي را در شارپ ويژوال

به.1 :ضافه كنيداbtnDataTable_Click event handlerدر ويرايشگر كد، سطور زير را

AdoSbsDataSet.CategoriesRow[] dr; DataView dv; int firstRow; dr = (AdoSbsDataSet.CategoriesRow[]) dsAdoSbs.Categories.Select("CategoryID = 5"); if (dr.Length != 0) {

dv = dsAdoSbs.Categories.DefaultView; dv.Sort = "CategoryName"; firstRow = dv.Find(dr[0]["CategoryName"]); bsCategories.Position = firstRow; }

به متعلقSelect، از متد5 معادل CategoryID با DataRowةكد باال، پس از اعالن چند متغير، براي يافتCategories DataTableكه. كند استفاده مي ميميپس يك آرايه بازSelectاز آنجا كه دهد، كد بررسي كند

كد مزبور، با فرض صحت اين. نظيري براي آن يافت شود باشد، تا لزوما0ًطول آرايه بزرگتر از DataView براي يافتن رديفي در DataTable مربوط به DefaultView متعلق به Findموضوع، از متد

و سپس استفاده مي مي را در محل نتيجه BindingSourceكند، .دهد قرار

از مورد، مستقيماًنظير هميناي براي جستجوي ساده،در عمل. نمايشي است اين مثال صرفاً:تذكرDataView وBindingSource شود استفاده مي.

و سپس برروي دكمF5 كاربردي، بر روي كليدةبراي اجراي برنام.2 DataTable Findة فشار دهيد،.كليك كنيد

.گذارد را به نمايش ميGrains/Cereals categoryكاربرديةبرنام

415 هاي ويندوز در فرمADO.NETكاربرد/ فصل سيزدهم

. كاربردي را ببنديدةبرنام.3

هاي ويندوز ها در فرم اعتبارسنجي داده

.NET Frameworkبه يك منبعهاآنةها، پيش از ارائ نجي ورود دادهها براي اعتبارس از شماري تكنيك مي داده از: ها آشنا شديم هاي اولين مورد از اين تكنيك نمونهپيش از اين، با برخي. گيرد ها، بهره استفاده

.ها به مقادير مناسب هاي خاص براي محدود كردن ورود داده كنترلو داده رشتهNET Framework.ها، پس از ورود داده ها عرضه اي از رويدادها را در سطوح كنترل

مي مي م نمايد، كه اين امكان را به ما .و سپس مديريت كنيمرا يافتهشكالت دهد، كه

ها رويدادهاي تغيير داده

ميها در سطح منبع داده،ها، اغلب اعتبارسنجي داده كارآمدترها منبع داده بدين ترتيب،. گيرد صورتكهها كنترل يا كنترلمستقل از نوع يا عنوان، فرآيندي است اعتبارسنجي،چه،دشخواهد براي تغيير ييآناها داده .شده استاستفادههاز

شش رويداد را DataTable، مشاهده كرديم، شيء“ها DataTableكاربرد”، هفتمن كه در فصل همامي عرضه مي آن كند، كه زمان به ترتيب،اين رويدادها. ها استفاده نمود ها براي اعتبارسنجي داده توان از

:رخداد از اين قرارند�ColumnChanging �ColumnChanged �RowChanging

Microsoft ADO.NET 2.0 416گام به گام با

�RowChanged �RowDeleting �RowDeleting

.دهند روي ميRowDeleltedو RowDeletingاگر قرار است رديفي حذف شود، تنها رويدادهاي:تذكر

مي استفاده ميTyped DataSetاگر از در كنيد، event handler يك DataTableتوانيد براي هر ستوناز. آوريدوجود جداگانه به يك استفاده ميUntyped DataSetاگر به تنهايي به تمام event handlerكنيد،

در ستون مي. كند رسيدگي ميDataRowها مي براي مشخص ساختن ستوني كه تغيير از كند، توانColumn propertyبه پارامتر متعلقDataColumnChangeArgsا، كه در اختيار رويداد قرار مي ستفاده گيرد،

.نمود

رويدادهاي تغيير ستون

ميبه : شود طور معمول، براي اعتبارسنجي مقادير جداگانه، از دو رويداد تغيير ستون استفادهColumnChangingو؛دهد، كه پيش از روزآمد شدن مقدار روي ميColumnChangedر خ، كه پس از آن

صحيحيمشخص يا اين كه فرمت ) range(ةبراي مثال، براي مشخص ساختن مقدار در دامن. دهد مي.توان از اين رويدادها استفاده نمود دارد يا خير، مي

ويژوال بيسيك : ColumnChangingپاسخ به رويداد

در.1 -، كه پيش از اين در همين فصل بهParseName event handlerدر ويرايشگر كد، يادداشت كد را.وجود آورديم، پاك كنيد

به.2 : اضافه كنيدCategories_ColumnChanging event handlerسطور زير راDim str As String

str = "Column: " & e.Column.ColumnName.ToString()

str += vbCrLf + "New Value: " & e.ProposedValue

MessageBox.Show(str, "Column Changing")

پProposedValue كد باال، صرفاً مي را در قاب .دهد يام نمايش. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.3. تايپ كرده، به رديف بعدي حركت كنيدCategory Name را به عنوان Beverages Newعبارت.4

ميةبرنام .گذارد كاربردي مقدار جديد را در يك قاب پيام به نمايش

417 هاي ويندوز در فرمADO.NETكاربرد/ فصل سيزدهم

. كاربردي را ببنديدةبرنام.5

سي: ColumnChangingبه رويداد پاسخ شارپ ويژوال

در.1 -، كه پيش از اين در همين فصل بهParseName event handlerدر ويرايشگر كد، يادداشت كد را.وجود آورديم، پاك كنيد

به.2 : اضافه كنيدCategories_ColumnChanging event handlerسطور زير را

string str; str = "Column: " + e.Column.ColumnName.ToString(); str += "\nNew Value: " + e.ProposedValue; MessageBox.Show(str, "Column Changing");

.دهد را در قاب پيام نمايش ميProposedValue كد باال، صرفاً . فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.3. تايپ كرده، به رديف بعدي حركت كنيدCategory Nameنوانع را بهBeverages Newعبارت.4

ميةبرنام .گذارد كاربردي مقدار جديد را در يك قاب پيام به نمايش

Microsoft ADO.NET 2.0 418گام به گام با

. كاربردي را ببنديدةبرنام.5

رويدادهاي اعتبارسنجي كنترل

ها نيزرلگيرد، هر كدام از كنت صورت ميDataTableعالوه بر آن كه اعتبارسنجي توسط رويدادهايدر كنترلةهم. اين را انجام دهندتوانند مي ، از رويدادهاي زير، به ترتيبي Windows.Forms namespaceها

مي كه آمده :كنند اند، پشتيباني�Enter �GotFocus �Leave �Validating �Validated �LostFocus

و ColumnChangingادل رويدادهايمع، براي اعتبارسنجي، تقريباValidtedًو ValidatingرويدادهايColumnChangedمي. هستند نه-كند ليكن، اين مزيت را دارند كه به محض آن كه كاربر كنترل را ترك وبه مستقيماCurrencyManagerًزماني كه شيء مي مجدداBindingSourceًةوسيل يا روي-شود جاگذاري

.دهند ميرو فرآيند پاسخ هر گويي به رويدادهاي تغيير داده مشابه پاسخيدادها دقيقاًگويي به اين ها، يا در واقعبه رويدادي در رده وجود را بهevent handlerكافي است روال.، استNET Framework.هاي متعلق

و هر گونه اقدام الزم را در داخل آن انجام دهيد .آورده،

419 هاي ويندوز در فرمADO.NETكاربرد/ فصل سيزدهم

ErrorProviderكاربرد جزء

استفاده MessageBoxهاي ها، از كنترل ه، در پاسخ به رويدادهاي اعتبارسنجي دادهدر تمرينات گذشت. نيستچندان مناسب) usability(اين تكنيك رايجي است، ولي از نقطه نظر قابليت كاربري. كرديمو پس از آنكه كنار گذاشته شدند، اطالعات مربوط به خطاهاي بسيار مزاحمMessageBoxيها كنترل اند،

مي رخ داده نيز با آن .روند ها از بيندارد، كه مكانيسم بسيار بهتري براي در اختيار را ErrorProvider جزء NET Framework.،خوشبختانه

توان آن را به يك كنترل خاص يا شيء منبع، كه ميErrorProvider. نمايش خطاها براي كاربر استدر داده ميها مقيد نمود، شمايل خطا را وقتي كه كاربر به شمايل مذكور. دهد كنار كنترل مربوطه نمايش

يك اشاره مي ميبه پيام خطاي مشخص شده را ToolTipكند، .دگذار نمايش

به كنترل فرمErrorProviderمقيد ساختن

در را به كنترلErrorProviderطور معمول، وقتي كه به مي فرمي Validating، خطا را در رويداد كنيم الصاقميبه محض خارج شدنكه(به كنترل متعلق مي)دهد كاربر از كنترل روي هر. كنيم تنظيم ليكن، در

مي. بررسي خطاها را به جريان انداختفرآيند توان رويدادي مي KeyPressتوان از رويداد براي مثال،بهولي. طور مجزا استفاده نمودبراي بررسي هر نويسه به كه اگر از رويداد باشيدخاطر داشته،

KeyPressاز براي بررسي خطاهاي پيچيده استفاده مي گويي سيستم كاسته پاسختوانكنيد، ممكن است.شود

ويژوال بيسيك: در كنترل فرمErrorProviderاستفاده از

به.1 از پيشكه( را Categories_ColumnChanging event handlerدر ويرايشگر كد، يادداشت مربوط. پاك كنيد) آن را اضافه كرده بوديم، در همين فصل،اين

به.2 : اضافه كنيدtbName_Validating event handlerكد زير را

If tbName.Text = "error" Then epControl.SetError(tbName, "Please re-enter the Category Name") e.Cancel = True Else epControl.SetError(tbName, "") End If

. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.3

Microsoft ADO.NET 2.0 420گام به گام با

4.errorعنوان نام را بهcategory و كوچك خاطر داشته باشيد، كه مقايسهبه( تايپ كنيد ها به بزرگو با فشار دادن برروي كليد)ندا بودن حروف حساس ،Tabاز فيلد خارج شويد .

ميي، كاربرديةبرنام راك شمايل خطا را به نمايش و كانون توجه قرار Name قاب متندرگذارد،.دهد مي

. كاربردي را ببنديدةبرنام.5

سي: در كنترل فرمErrorProviderاستفاده از شارپ ويژوال

به.1 ازكه( را Categories_ColumnChanging event handlerدر ويرايشگر كد، يادداشت مربوط پيش. پاك كنيد) آن را اضافه كرده بوديم،در همين فصل،اين

به.2 : اضافه كنيدtbName_Validating event handlerكد زير را

if (tbName.Text == "error") {

epControl.SetError(tbName, "Please re-enter the Category Name"); e.Cancel = true; }else epControl.SetError(tbName, "");

. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.3

421 هاي ويندوز در فرمADO.NETكاربرد/ فصل سيزدهم

4.errorعنوان نام را بهcategory و كوچك به خاطر داشته باشيد، كه مقايسه( تايپ كنيد ها به بزرگبر)ندا بودن حروف حساس و با فشار دادن . از فيلد خارج شويدTabروي كليد،

خط، كاربرديةبرنام مي يك شمايل راا را به نمايش و كانون توجه قرار Name قاب متندرگذارد،.دهد مي

. كاربردي را ببنديدةبرنام.5

ها به منبع دادهErrorProviderمقيد ساختن

باتمرين در با اين. آشنا شديم متعلق به كنترل Validating از درون رويداد ErrorProvider كاربرد قبل،كهها نيز مقيد ساخت توان به منبع داده را ميErrorProvider، جزء حال هر ستون يا رديفيدر،تواندمي؛

شمايل خطا را در كنار هر كنترلي،ErrorProvider. شمايل خطا را به نمايش درآوردرخ داده،ييكه خطا.آورد كه مقيد به همان منبع است، به نمايش درمي

مErrorProviderمقيد ساختن مي،ها نبع داده به شيء در اين مزيت را دارد كه اجازه دهد چندين خطاو ارتقاي درخورتوجهي در قابليت كاربري اين خود،.دنيك زمان به نمايش درآي ) usability( بهبود

.رود سيستم به شمار مي

ويژوال بيسيك : DataColumn در ErrorProviderكاربرد

. را انتخاب كنيدepDataSource ErrorProvider، كنترل Form Designerدر.1 را انتخاب bsCategories را باز كرده، سپس DataSource property، قاب فهرست Propertiesةدر پنجر.2

.كنيد

Microsoft ADO.NET 2.0 422گام به گام با

آن را به گذشتهكه در تمرين( را tbName_Validating event handlerدر ويرايشگر كد، يادداشت.3. پاك كنيد)وجود آورديم

به.4 : اضافه كنيدbtnDataError_Click event handlerسطور زير را

Dim dr As DataRow dr = CType(bsCategories.Current, DataRowView).Row dr.SetColumnError(1, "This is the error")

مي بهCategory Name ستوندر يي ساختگياين كد، خطا .آورد وجود. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.5. كليك كنيدData Source Errorةروي دكمبر.6

را شمايل خطا، كاربرديةبرنام مي به نمايش Name در كنار قاب متن يي .آورد در

. كاربردي را ببنديدةبرنام.7

سي: DataColumn در ErrorProviderكاربرد شارپ ويژوال

. را انتخاب كنيدepDataSource ErrorProvider، كنترل Form Designerدر.1 را انتخاب bsCategories را باز كرده، سپس DataSource property، قاب فهرست Propertiesةدر پنجر.2

.كنيدبهگذشتهكه در تمرين( را tbName_Validating event handlerدر ويرايشگر كد، يادداشت.3 - آن را

. پاك كنيد)وجود آورديمبه.4 : اضافه كنيدbtnDataError_Click event handlerسطور زير را

423 هاي ويندوز در فرمADO.NETكاربرد/ فصل سيزدهم

DataRow dr; dr = ((DataRowView)bsCategories.Current).Row; dr.SetColumnError(1, "This is the error");

مي بهCategory Name ستوندر يي ساختگياين كد، خطا .آورد وجود. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.5. كليك كنيدData Source Errorةبرروي دكم.6

را شمايل خطا، كاربرديةبرنام مي به نمايش Name در كنار قاب متن يي .آورد در

. كاربردي را ببنديدةبرنام.7

خالصه

. آشنا شديمهاي ويندوز در فرمADO.NETهاي ها براي كار با داده شماري از تكنيكبا،در اين فصلو مركبيمجددنگاه آن10كه نخستين بار در فصل( به مقيدسازي ساده ) ها آشنا شده بوديم با

از براي نمايش دادهDataRelation به كاربردانداخته، باهمچنين،.يمپرداختهاي مرتبط DataTable هاBinding.Format property و رويدادهايFormat وParse فر، كه دا مت كردن دادهدر ، آشنا رندها كاربرد

با،و باالخره. شديم ها براي اعبتارسنجي دادهErrorProviderكاربردهاي مختلف كنترل مطالبي در رابطه.آموختيم

چهاردهمفصل

وب ها در فرم اي به داده مقيدسازي پايه هاي:در پايان اين فصل، خواهيد توانست

. نماييدهاي استاندارد را مقيد سازي ساده كنترل،هاي گوناگون به راه�.مركب نماييد مقيد سازي،ADO.NETءها را به اشيا هاي داده كنترل�و را در سرويسADO.NETءوضعيت اشيا� . حفظ كنيدوبةبرروي صفحدهندهرا داده� .، پيمايش كنيدASP.NETةروي صفحبر،هاشد ها را از كنترل منبع داده� . ساده روزآمد سازيدةهاي مقيدبا� مايكروسافت ADO.NETهاي ويندوز، به بررسي شيء هايي درفرم مثالذكردر فصول گذشته،

در مقيدسازي به داده،در اين فصل. پرداختيم و فرمASP.NETها را هاي وب مورد مايكروسافت. قرار خواهيم دادتوجه

وب ها در فرم درك مقيدسازي به داده هاي

ADO.NETاز به بهة، مستقل از هر برنامNET Framework.عنوان بخشي كار كاربردي است، كه آن راو) فصول گذشتهياه مانند تمرين( ويندوز فرم كاربردي،ةاين برنام خواهدمي حال؛گيرد مي ، فرم وب،ش آن ها به كنترل، روشي كه دادهحالبااين. تجاري در سطح متوسط باشديئييا اخذها ها رانده يا ازنه مي با ها در فرمو معماري مقيدسازي به داده؛ADO.NETشوند، تابعي است از خود كنترل، هاي وب،

.ايم، بسيار متفاوت است آن چه تاكنون ديدهوب ها در فرم معماري مقيدسازي به داده بخش بيشترين،اينكهاول: مبتني بر دو فرض است،هاي

بهي به دادهس دسترموارد وةدهند تعامالت بين سرويس:گيرد صورت ميread-onlyصورت ها وب.سويه استيك، همواره لزوماًمرورگردر( اماآيند، ها براي كاربران به نمايش درمي كه داده پذيرفته شده است،ي، اين فرضاينجا، در اوالً

آن)بيشتر موارد به. شوند ها روزآمد نمي توسط در نتيجه، به جزء در برخي موارد استثنايي، مقيدسازييك ها در فرم داده مي ها از منبع داده داده: سويه است وب تغييراتي كه كاربر اماشوند، ها به كنترل رانده

ميبر مقاد .شوند ها بازگشت داده نمي كند، به منبع داده ير كنترل اعمال DataSet داشته باشيد، كه مقيد به ستوني در TextBox ويندوز كنترل يك فرمدريك مثال ساده اينكه، اگر

و كاربر مقدار كنترل مذكور را تغيير دهد، مقدار جديد خود به خود به وسيل به NET Framework.ةاست،DataSetو رويدادهاي تغيير منتقل مي و Item ،DataColumnشود، ،DataRowليكن، اگر. شوند آغاز مي

Microsoft ADO.NET 2.0 426گام به گام با

وب روي برTextBox كنترل همين يك ستوني، فرم ، الزم است براي را به نمايش گذارد DataSet از. كد اضافه كنيد، چندين سطرDataSetدن مقدارشروزآمد

باةدهند هاي سرويسو كنترل Data Source هاي به بررسي كنترل،15در فصل وب، كه براي كاركردن.اند، خواهيم پرداخت ها طراحي شده آن

ASP.NET 2.0 ،هاي كنترلData Source ازة مجموع،ها اين. كندميعرضهرا خاصي جديديكهةدهند هاي سرويس كنترل در به منظور،در اينكه- وب هستند، و به داده دسترسي تسهيل ها

مي را بستهADO.NETء اشيا،ها سنتي به دادهةمقيدسازي دو سوي به-دننماي بندي شباهت بسياري، Data Sourceهاي، در كنار كنترلASP.NET 2.0. ويندوز دارند به فرم متعلق BindingSourceاجزاييكبراي اجرايكه، گيرد دربرميها را نيز هاي مقيد به داده جديدي از كنترلةمجموع سويه مقيدسازي.شوند وارد تعامل ميData Sourceهاي با كنترل،ها به داده

وةدهند هاي استاندارد سرويس طور كه در اين فصل خواهيم ديد، مقيدسازي كنترلهمان وبها را به منبع دادهها هنگامي كه يكي از اين كنترل- يك سويه، است ذاتاًاماپذير، امكانHTMLهاي كنترل

به سازيد، داده مقيد مي آن مقيد شده رانده ميpropertyها تنها شوند، مگر ها به كنترل كشيده نمي شوند؛.آنكه خودتان اقدام به اين كار كنيد

و كنترلةدهند اين بدان معنا نيست كه، هنگام استفاده از سرويس ، HTMLهاي استاندارد وب بايد منظور تنها اين است، كه اين كار.ي خاصي دارديه ممكن نيست، يا حتي دشوارمقيدسازي دو سو

و روزآمد كردن در ادامه، در همين فصل، تكنيك. صورت دستي انجام شودبه هايي براي راندن، اخذبه داده و با استفاده از كنترلها شد گفتهي پيشها صورت دستي .بررسي خواهد

در ها در فرم عماري مقيدسازي به دادهمدرفرض دوم پيش ، اين است كه NET Framework. وبمي وب صفحهةدهند سرويس و در اختيار مي اي را آماده و اين تعامل به همين جا ختم به. شود گذارد،

و برگشت-گزيده، فاقد وضعيت معين است طور پيشبيان ديگر، اينترنت، به ها وضعيت صفحه بين رفت.شود دهنده حفظ نميسبه سروي

بايد اضافه كنيم، كاربرDataSet، حتي اگر كدي را براي روزآمد كردني كه ذكر كرديمدر ادامه مثالو روزآمدو براي عملي ساختن.دهنده قرار دهد هر گونه تغييري را در اختيار سرويسصراحتاً - اين كار

چه چه در سوي سرويس( كد اضافه چند سطري،ههاي مربوط كردن منبع داده و در طرف گيرندهبه. بنويسد)دهنده سرويس رويدادهاي تغيير الزم است رسيد، هنوز DataSetالبته، پس از آن كه تغييرات

DataColumn وDataRow آغاز شوندنيز.از، بهASP.NET. گزيده است پيشي، اين رفتار تنها رفتارحال بااين ، NET Framework.عنوان بخشي

و دو سوي سرويسدرها از شماري از مكانيسم،هركجا كه الزم شد، براي حفظ وضعيت گيرندهمي سرويس خواهيم)ها دسترسي به دادهبراي(ها، به برخي از اين مكانيسمادامهدر. كند دهنده استفاده.پرداخت

وب ها در فرم اي به داده مقيدسازي پايه/ فصل چهاردهم 427 هاي

در هاي وب به منبع داده كنترلةمقيدسازي ساد ADO.NETها

ها propertyةهمهاي ويندوز، از مقيدسازي ساده عمالً ها در فرم فرم وب، نيز، همچون كنترليها كنترلو مقيدسازي مركب به يك مقدار واحد در منبع داده هايي كه چندين مقدار را به نمايش property ها،

مي مي وب هاي مقيدسازي براي فرم با اين حال، مكانيسم. كنند گذارند، پشتيباني در اندكي،هاي با آن چهو به كار برديم، متفاوتند مورد فرم در كجايي موردنظرها كنترلكهو بسته به اين.هاي ويندوز ديديم

هاي هايي با موارد متناظر خويش در فرم تفاوت، جاي دارند NET Framework.هاي سلسله مراتب رده.ويندوز دارند

ا از نقطه نظر مقيدسازي به داده : سه نوع كنترل داريمساساًها،

ميها هاي مقيد به داده، به جزئيات كنترل15در فصل .شودبررسي

.DetailsViewها، مانند ساده به دادهةكنترل مقيد شد�شد كنترل� .GridViewها، مانند مركب به دادهةهاي مقيدبه،هاي استاندارد كنترل� ، اينها، تماماً.دها مقيد شون صورت دستي به داده كه الزم است

.اند سادهةمقيد شدpropertyيك- معادل با مقداري واحد،) محيط فرم ويندوزدرست مانند( سادهة كنترل مقيد شد و نه

مي-فهرست هاي استاندارد فرم وب مقيد شده مركب، هاي ويندوز، كنترل برخالف فرم،اما. گيرد قرارpropertyو در زمان آشكارامقدار اين بلكه،. نندك را عرضه نميها هاي مقيدسازي به داده بازيابي شده،:براي انجام اين كار، سه راه وجود دارد. شود نسبت داده ميpropertyاجرا به

.كدبا نوشتن propertyتنظيم صريح�.DataBinder.Eval در كد، با استفاده از متد propertyتنظيم�.ها با استفاده از عبارت مقيدسازي به داده، HTMLة در رشتpropertyتنظيم�ساين حاصل يكههر به داده: سويه است روش، مقيدسازي شوند، ولي كنترل رانده ميpropertyها

اصطالح كاربردترتيب، بدين. يابند بازتاب نميDataSetدر،هاpropertyتغييرات وارده به مقادير اين است كه مقادير از نهايية نتيج،اما. احدي با مسامحه همراه استتتوسط ما،“ها مقيدسازي به داده”

منظور ما برآورده در هر صورت آيند، لذا وب به نمايش درمي ها در كنترل واقع بر فرم يك منبع دادهميها ها به منبع داده ها از كنترل هاي اخذ دادهاهردر ادامه،. شود مي . شودبررسي

ASP.NETمدل رويدادبه هاي اين فصل، كد مقيدسازي به داده كه در مثال،شايد قدري عجيب به نظر رسد ها را

Page_PreRender event handler و نه ،Page_Load event handlerدليل اين كار، مربوط.، اضافه كرديمدر مي .ASP.NETشود به مدل رويداد، ولي پيش از رويداد Page_Load پس از رويداد ها براي رويدادهاي كنترلASP.NET ،event handlerدر

Page_PreRenderهاي در مثال خود، پيمايش را با استفاده از كنترل،ما. شوند، آغاز ميButton اجرا

Microsoft ADO.NET 2.0 428گام به گام با

به كنترل فيلد پنهان متعلقValue propertyهاي پيمايش مقدار طور كه خواهيم ديد، دكمههمان.يمكردhfPositionد، تا رديف دهن را تغيير ميCategory )تغيير يابد)آيد به نمايش درميوبة صفحةكه به وسيل .

.ها آغاز شوند بايد پيش از وقوع مقيدسازي به دادهButtonهاي event handlerبراي اين كار،مي كند، كد مقيدسازي به داده شما از پيمايش پشتيباني نميةاگر صفح به ها هم . برودPage_Loadتواند

بها زماني الزم است مقيدسازي به دادهتنه به كه رويداد كنترل بر داده، برودPage_PreRenderها هايت ميأنمايش درآمده .گذارد ثير

هاي كنترل propertyتنظيم صريح

در نخستين تكنيك براي نمايش مقادير داده با استفاده از property كنترل، تنظيم صريح propertyهاروي يك مقدار برproperty مشابه تنظيم،)آنةو نتيج(اين تكنيك. ساده است) assignment(دادن نسبت

.است) literal(واقعي را از DataRow آشكارا هستند، الزم است BindingContextهاي وب فاقد چيزي معادل از آنجا كه فرم

ت. شناسيمباز مقداري كه قرار است بيرون كشد، الاقل در باالترين(نها يك رديف را بسياري از صفحاتمي)ها سطح سلسله مراتب داده اگر. است0 معادل Rowsة نمايه در مجموعبنابراينگذارند، به نمايش

پيمايش كنند، الزم است به DataRow بخواهيد كاربران بتوانند در ميان چندين)هاي اين فصل مانند مثال(بهصورت دستي رد رديف جاري را بگيريد، طور معمول با استفاده از يك متغير در سطح كه اين كار

مي)هاي خودمان مانند مثال(صفحه يا .گيرد يك فيلد پنهان صورت هيچ،اند، در عملو سپس به دور انداخته شده) render(در مورد صفحات وب، كه يك بار ارائه

و فيلد پنهان ليكن، در مثال خود، پيمايش. وجود نداردتفاوتي بين استفاده از متغير در سطح صفحهو پايداةدهند ها به سرويس بين سرزدنةفاصلدروبة صفح الزم استبنابراينخواهيم نمود، ر

در جا، استفاده از فيلد پنهان اندكي آساندر اين. بالتغيير باقي بماند تر است، چه مقدار آن خود به خودViewStateندما صفحه بالتغيير باقي مي.

ويژوال بيسيك: يك كنترلpropertyتنظيم

و در صورت 2005 را در ويژوال استوديو Chapter 14 - Startسايتوب.1 ، براي باز نياز باز كرده،. دوبار كليك كنيدSolution Explorer در Default.aspx.vbرويبر،دن صفحه در وضعيت طراحيرك

وب ها در فرم اي به داده مقيدسازي پايه/ فصل چهاردهم 429 هاي

كلبر،code-behindةبراي نمايش صفح.2 .فشار دهيد F7يد روي: اضافه كنيدPage_PreRender event handlerسطور زير را به باالي.3

Dim pos As Integer pos = CType(hfPosition.Value, Integer) tbCategoryID.Text = _ dsAdoSbs.Categories.Rows(pos).Item("CategoryID").ToString()

به ذخير عددي از مقدارةاين كد، نخست ارائ ميه شده در كنترل فيلد پنهان را و سپس دست آورد،.كند در آن مكان تنظيم ميtbCategoryID را برروي كنترل قاب متن Text propertyمقدار

. فشار دهيدF5براي اجراي صفحه، برروي كليد.4.گذارد را به نمايش ميCategoryID،مرورگر

Microsoft ADO.NET 2.0 430گام به گام با

.مرورگر را ببنديد.5

سي: يك كنترلpropertyتنظيم شارپ ويژوال

ك2005 را در ويژوال استوديو Chapter 14 - Startسايت وب و در صورت لزوم، براي باز دنر باز كرده،. دوبار كليك كنيدSolution Explorer در Default.aspx.vb بر روي،صفحه در وضعيت طراحي

.دهيدفشار F7 برروي كليد،code-behindةبراي نمايش صفح.1: اضافه كنيدPage_PreRender event handlerسطور زير را به باالي.2

int pos; pos = Convert.ToInt16(hfPosition.Value); tbCategoryID.Text = dsAdoSbs.Categories.Rows[pos]["CategoryID"].ToString();

به عددي از مقدار ذخيره شده در كنترل فيلدةاين كد، نخست ارائ مي پنهان را آورد، سپس دست.كند در آن مكان تنظيم ميtbCategoryID را برروي كنترل قاب متن Text propertyمقدار

. فشار دهيدF5براي اجراي صفحه، برروي كليد.3.گذارد را به نمايش ميCategoryID،مرورگر

وب ها در فرم اي به داده مقيدسازي پايه/ فصل چهاردهم 431 هاي

.مرورگر را ببنديد.4

اproperty تنظيم DataBinder.Evalز هاي كنترل با استفاده

در دومين تكنيك نمايش مقادير داده با نوشتن مذكور property كنترل، عبارت است از تنظيم propertyها است، متدي System.Web.UI namespace، كه بخشي از DataBinderدةر. DataBinder.Evalكد به كمك متد

بهه كند، كه عبارات مقيدسازي به داده ايستا را عرضه مي صورت اختياري نتيجها را اعتبارسنجي نموده،.آورد درمي)string(را به قالب يك رشته

سازد، كه اينمي تبديل نوع را عملي اين متد،. سرراست استبسيار Evalمتد ) syntax( نگارشةنحومي خود در برخي موقعيت باين. كند ها كار را بسيار آسان شموضوع، به ويژه زماني كه از يئيا

ADO.NETهاي ريزي كه در آن نياز به قالب-كنيم كار مي)casting (ميدرپي و ار تواند بسي پي استمي ديرDataBinderحال، بااين. صادق است-پيچيده شود و مانند تمام اشيا مقيد كه ديرمقيدييشود،

.اي را نيز به دنبال دارد شوند، هزينه ميمياي ايستايئشDataBinderاز آنجا كه از آن ) instantiation(اي جديد توان بدون ايجاد نمونه ست، محصور <%و #%>هاي كه با نويسه( صفحه HTMLوان از داخلت را ميDataBinder. استفاده نمود

overload،14-1 در پذيرفتن يك رشته فرمت اختياري، مطابق جدول Evalمتد. يا در كد فراخواند) شده.تاس

DataBinder.Eval متدهاي14-1جدول

شرح متد

Eval(dataSource,

dataExpression) ها را در زمان اجرا بازپس درمنبع دادهdataExpressionمقدار.دهد مي

Microsoft ADO.NET 2.0 432گام به گام با

شرح متد

Eval(dataSource,

dataExpression, formatStr) ها را در زمان اجرا بازپس در منبع دادهdataExpressionمقدارو .كند فرمت ميformatStr سپس آن را براساس داده،

ءهنگام كار كردن با اشيا. ها دارد داده برايرايعنوان نخستين پارامتر، انتظار ظرفبه،EvalمتدADO.NETًاين شيء معموال ،DataSet ،DataTable يا DataViewهمچنين، اگر عبارت از داخل كنترل. است

List در يك templateمي اجر باشد، كه در اين صورت نخستين پارامتر Containerتواند شيءا شود،. باشدContainer.DataItemهمواره بايد

رةاي است كه قرار است مورد داد، رشتهEvalپارامتر دوم متد با. دهدا بازپس خاصي هنگامي كهبه كار ميADO.NETءاشيا هرمياما است، DataColumnطور معمول نام كنيم، اين پارامتر عبارت تواند.اي معتبري باشد داده

- بهString.Format است كه متد فرمتي است، كه مشابه format specifierآخرين پارامتر اختياري، يك Object عبارت از Evalاگر پارامتر حذف شود، مقدار بازپس داده شده توسط متد. كار گرفته است

. ريخته شودمناسبي به قالب نوعم است صريحاًالزكه، خواهد بود

ويژوال بيسيك : DataBinder.Evalكاربرد

به.1 كه در تمرين گذشته انجام داديد، به tbCategoryID.Textسطر زير را، پس از نسبت دادنPage_PreRender event handlerاضافه كنيد :

tbCategoryName.Text = DataBinder.Eval(dsAdoSbs.Categories.Rows(pos), _ "CategoryName").ToString()

Text property، مقداري را به DataBinder متعلق به شيء Evalسطر باال، با استفاده از متد ايستاي .دهد نسبت ميtbCategoryNameبه كنترل متعلق

: به اين صورت باشدPage_PreRenderحال، بايد رويداد

Protected Sub Page_PreRender(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles Me.PreRender Dim pos As Integer pos = CType(hfPosition.Value, Integer) tbCategoryID.Text = _ dsAdoSbs.Categories.Rows(pos).Item("CategoryID").ToString() tbCategoryName.Text = DataBinder.Eval(dsAdoSbs.Categories.Rows(pos), _ "CategoryName").ToString()

وب ها در فرم اي به داده مقيدسازي پايه/ فصل چهاردهم 433 هاي

End Sub

بر.2 . فشار دهيدF5روي كليد براي اجراي صفحه،.گذارد را به نمايش ميCategory Name،مرورگر

.مرورگر را ببنديد.3

سي: DataBinder.Evalكاربرد شارپ ويژوال

به.1 كه در تمرين گذشته انجام داديد، به tbCategoryID.Textسطر زير را، پس از نسبت دادنPage_PreRender event handlerاضافه كنيد :

tbCategoryName.Text = DataBinder.Eval(dsAdoSbs.Categories.Rows(pos), _ "CategoryName").ToString();

Text property، مقداري را به DataBinderبه شيء متعلقEvalسطر باال، با استفاده از متد ايستاي .دهد نسبت ميtbCategoryNameبه كنترل متعلق

: به اين صورت باشدPage_PreRenderحال، بايد رويداد

protected void Page_PreRender(object sender, EventArgs e) {

int pos; pos = Convert.ToInt16(hfPosition.Value);

tbCategoryID.Text = dsAdoSbs.Categories.Rows[pos]["CategoryID"].ToString();

Microsoft ADO.NET 2.0 434گام به گام با

tbCategoryName.Text = DataBinder.Eval(dsAdoSbs.Categories.Rows[pos], "CategoryName").ToString(); }

بربراي اجراي.2 . فشار دهيدF5روي كليد صفحه،.گذارد را به نمايش ميCategory Name،مرورگر

.مرورگر را ببنديد.3

Data-Bindingكاربرد عباراتم به تد براي راندن دادهآخرين ها در داخل از عبارت مقيدسازي به دادهاستفاده كنترل، propertyها

و آن <%و #%>هاي بين نويسه،ها عبارات مقيدسازي به داده. استstream (HTML(جريان محصورند،.دهند، كه معرف كنترل است، قرار ميHTML tagرا در داخل

، اشاره كرديمها كنترل، كه در دو بخش گذشته به آنpropertyاي تنظيم برخالف دو متد صريح بركه. آيند فراخوانده نشده، به اجرا درنميDataBindها تا زماني كه متد عبارات مقيدسازي به داده از آنجا

ندن خواند، لذا فراخوا هاي فرزند را فرامي كنترلةهم،DataBindبه كنترل متدهاي متعلقDataBindمتد DataBindًچه موجود در صفحه معموال خود هاي موجود در صفحه كنترلبدين ترتيب تمام كافي است،

ميخواند فرابه خود .شونده

وب ها در فرم اي به داده مقيدسازي پايه/ فصل چهاردهم 435 هاي

ويژوال بيسيك : Data-Bindingكاربرد عبارت

: اضافه كنيدPage_PreRender event handlerسطور زير را به انتهاي.1

tbPosition.Text = (pos + 1).ToString() + " of " + dsAdoSbs.Categories.Count.ToString() DataBind()

در نمايش ميtbPositionنخستين سطر، اطالعات مربوط به مكان را در قاب متن حالي كه سطر دهد، همة را در DataBindدخوةخواند، كه آن نيز به نوب به صفحه را فرامي متعلقDataBindدوم متد

.واقع بر صفحه فرا خواهد خواندهاي كنترلPage_PreRender event handler اين صورت باشدبه بايد:

Protected Sub Page_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreRender Dim pos As Integer = CType(hfPosition.Value, Integer) tbCategoryID.Text = dsAdoSbs.Categories.Rows(pos).Item("CategoryID").ToString() tbCategoryName.Text = DataBinder.Eval(dsAdoSbs.Categories.Rows(pos), _ "CategoryName").ToString() tbPosition.Text = (pos + 1).ToString() + " of " + dsAdoSbs.Categories.Count.ToString() DataBind() End Sub

و در صورت لزوم، برdesigner از Default.aspxةزبان.2 . كليك كنيدSourceةروي دكم را انتخاب،.گذارد را به نمايش ميHTML جريان،ويژوال استوديو

Microsoft ADO.NET 2.0 436گام به گام با

3.attribute زير را به قاب متن tbDescriptionاضافه كنيد :

Text=<%#dsAdoSbs.Categories.Rows(hfPosition.Value).Item("Description")%>

بهةسطرباال، براي نسبت داد ، از يك عبارت tbDescriptionبه كنترل متعلقText property مقدار.كند محصور شده، استفاده مي<%و #%>هاي ها، كه در بين نويسه مقيدسازي به داده

:اكنون بايد اعالن كنترل مذكور به اين صورت باشد

<asp:TextBox ID="tbDescription" Text=<%#dsAdoSbs.Categories.Rows(hfPosition.Value).Item("Description")%> runat="server" Style="z-index: 103; left: 112px; position: absolute; top: 200px" Width="504px"></asp:TextBox>

بر.4 . فشار دهيدF5روي كليد براي اجراي صفحه،.گذارد را به نمايش ميDescription،رگرمرو

وب ها در فرم اي به داده مقيدسازي پايه/ فصل چهاردهم 437 هاي

.مرورگر را ببنديد.5

سي: Data-Bindingكاربرد عبارت شارپ ويژوال

: اضافه كنيدPage_PreRender event handlerسطور زير را به انتهاي.1

tbPosition.Text = (pos + 1).ToString() + " of " + dsAdoSbs.Categories.Count.ToString(); DataBind();

دهد، درحالي كه سطر نمايش ميtbPositionنخستين سطر، اطالعات مربوط به مكان را در قاب متن همة را در DataBindدخوةخواند، كه آن نيز به نوب به صفحه را فرامي متعلقDataBindدوم متد

.هاي واقع بر صفحه فرا خواهد خواند كنترلPage_PreRender event handler اين صورت باشدبه بايد:

protected void Page_PreRender(object sender, EventArgs e) {

int pos; pos = Convert.ToInt16(hfPosition.Value);

tbCategoryID.Text = dsAdoSbs.Categories.Rows[pos]["CategoryID"].ToString();

Microsoft ADO.NET 2.0 438گام به گام با

tbCategoryName.Text = DataBinder.Eval(dsAdoSbs.Categories.Rows[pos], "CategoryName").ToString();

tbPosition.Text = (pos + 1).ToString() + " of " + dsAdoSbs.Categories.Count.ToString(); DataBind(); }

و در صورت لزوم، برروي دكمdesigner از Default.aspxةزبان.2 . كليك كنيدSourceة را انتخاب،.گذارد را به نمايش ميHTML جريان،ويژوال استوديو

3.attribute زير را به قاب متن tbDescriptionاضافه كنيد :

Text=<%#dsAdoSbs.Categories.Rows(hfPosition.Value).Item("Description")%>

بهةسطرباال، براي نسبت داد ، از يك عبارت tbDescriptionبه كنترل متعلق Text property مقدار.كند محصور شده، استفاده مي<%و #%>هاي ها، كه در بين نويسه مقيدسازي به داده

:اكنون بايد اعالن كنترل مذكور به اين صورت باشد

<asp:TextBox ID="tbDescription"

وب ها در فرم اي به داده مقيدسازي پايه/ فصل چهاردهم 439 هاي

Text=<%#dsAdoSbs.Categories.Rows(hfPosition.Value).Item("Description")%>

runat="server" Style="z-index: 103; left: 112px; position: absolute; top: 200px" Width="504px"></asp:TextBox>

. فشار دهيدF5براي اجراي صفحه، برروي كليد.4.گذارد را به نمايش ميDescription،مرورگر

.مرورگر را ببنديد.5

وب كنترلمقيدسازي مركب هاي

شد تمام كنترل و لذا BaseDataList يا BaseDataBoundControl مركب وب از اعقابةهاي مقيد هستند،، ADO.NETء به اشيا آنهابااين حال، مقيدسازي. اند طراحي شدهDataSourceهاي جديد براي كار باكنترل

پذير امكان كامالً، ويندوز ده در محيط فرمهاي مورد استفا هايي بسيار شبيه تكنيك با استفاده از تكنيك.است

شد تمام كنترل . كنند را عرضه ميDataMemberو DataSourceهاي property مركب،ةهاي مقيدDataSource propertyبا(كه-ها ويندوز، بر روي ظرف داده، درست مانند محيط فرم هاي property اگر

ADO.NETبه)كنيد كار مي ازط، مي- DataView يا DataSet ،DataTableور معمول، عبارتند . شود تنظيم براي،) استDataTable كه حاوي چند DataSetمثل مورد( حاوي چندين فهرست باشد Data Sourceاگر

اين،. كند، استفاده ميDataMember propertyاز هايش را از خواهد كشيد، يافتن فهرستي كه كنترل داده. است، با نگارشي كمتر قابل انعطافاما ويندوز، هاي نظير در محيط فرم property مشابه

Microsoft ADO.NET 2.0 440گام به گام با

مي ListBoxهايي چون، كنترل سرانجام DataTextFieldگذارند،، كه تنها يك مقدار را به نمايش

propertyستفاده موردا)كه قرار است به نمايش درآيد(كنند، كه براي يافتن تنها يك ستون را عرضه مي.گيرند قرار مي

ويژوال بيسيك : ListBoxمقيد ساختن مركب يك كنترل

و سطور پايين را، پيش از فراخوان Default.aspx.vbةبرروي زبان.1 كه در تمرين DataBind كليك،: اضافه كنيدPage_PreRender event handlerگذشته اضافه كرديم، به

dvProducts.Table = dsAdoSbs.Products dvProducts.RowFilter = "CategoryID = " & tbCategoryID.Text lbProducts.DataSource = dvProducts lbProducts.DataMember = "Products" lbProducts.DataTextField = "ProductName"

به( را dvProducts DataViewدو سطر نخست، نكه و ةمونعنوان بخشي از داربست تمرين اعالنشد تازه مي) اي از آن ساخته به هاي مقيدسازي به داده property،سطور باقيمانده. كنند فيلتر هاي متعلق

IbProducts ListBox را به DataViewدهند نسبت مي.: به اين صورت باشدPage_PreRender event handlerحال، بايد

Protected Sub Page_PreRender(ByVal sender As Object,_ ByVal e As System.EventArgs) Handles Me.PreRender Dim pos As Integer pos = CType(hfPosition.Value, Integer) tbCategoryID.Text = dsAdoSbs.Categories.Rows(pos).Item("CategoryID").ToString() tbCategoryName.Text = DataBinder.Eval(dsAdoSbs.Categories.Rows(pos), _ "CategoryName").ToString() tbPosition.Text = (pos + 1).ToString() + " of " + dsAdoSbs.Categories.Count.ToString()

dvProducts.Table = dsAdoSbs.Products

وب ها در فرم اي به داده مقيدسازي پايه/ فصل چهاردهم 441 هاي

dvProducts.RowFilter = "CategoryID = " & tbCategoryID.Text

lbProducts.DataSource = dvProducts lbProducts.DataMember = "Products" lbProducts.DataTextField = "ProductName"

DataBind() End Sub

. فشار دهيدF5روي كليدبربراي اجراي صفحه،.2گر را با اسامي فرآوردهIbProductsمرورگر، قاب فهرست ميهاي مرتبط با . كند وه فعلي پر

.مرورگر را ببنديد.3

سي: ListBoxمقيد ساختن مركب يك كنترل شارپ ويژوال

و سطور پايين را، پيش از فراخوان Default.aspx.vbةبرروي زبان.1 كه در تمرين DataBind كليك،: اضافه كنيدPage_PreRender event handlerگذشته اضافه كرديم، به

dvProducts.Table = dsAdoSbs.Products; dvProducts.RowFilter = "CategoryID = " + tbCategoryID.Text;

Microsoft ADO.NET 2.0 442گام به گام با

lbProducts.DataSource = dvProducts; lbProducts.DataMember = "Products"; lbProducts.DataTextField = "ProductName";

به( را dvProducts DataViewدو سطر نخست، و نمونكه ةعنوان بخشي از داربست تمرين اعالنشد تازه مي) اي از آن ساخته به هاي مقيدسازي به دادهproperty،سطور باقيمانده. كنند فيلتر هاي متعلق

IbProducts ListBox را به DataViewدهند نسبت مي.: به اين صورت باشدPage_PreRender event handlerحال، بايد

protected void Page_PreRender(object sender, EventArgs e) {

int pos; pos = Convert.ToInt16(hfPosition.Value);

tbCategoryID.Text = dsAdoSbs.Categories.Rows[pos]["CategoryID"].ToString(); tbCategoryName.Text = DataBinder.Eval(dsAdoSbs.Categories.Rows[pos], "CategoryName").ToString();

tbPosition.Text = (pos + 1).ToString() + " of " + dsAdoSbs.Categories.Count.ToString();

dvProducts.Table = dsAdoSbs.Products; dvProducts.RowFilter = "CategoryID = " + tbCategoryID.Text;

lbProducts.DataSource = dvProducts; lbProducts.DataMember = "Products"; lbProducts.DataTextField = "ProductName";

DataBind(); }

بر.2 . فشار دهيدF5روي كليد براي اجراي صفحه،

وب ها در فرم اي به داده مقيدسازي پايه/ فصل چهاردهم 443 هاي

مي را با اسامي فرآوردهIbProductsمرورگر، قاب فهرست .كند هاي مرتبط با گروه فعلي پر

.ر را ببنديدمرورگ.3

ADO.NETحفظ وضعيت شيء

و برگشت خويش وضعيت،وب جا كه فرماز آن كند، اگر دهنده حفظ نمي ها به سرويس را در بين رفتدر DataSetخواهيد مي و مدتي كه پس فرستادن آن را، زماني كه نخستين بار صفحه به وجود آمد

طوهمراه با تغييرات به را حفظ كنيد، بايد اين كار به همان صورتل انجاميد، وجود آمده توسط كاربر به. انجام دهيدصراحتاًر مي يا Applicatonهاي دهنده در يكي از وضعيت سرويس كامپيوتردردنكربا ذخيرها، توان آن

Sessionدر وضعيتوبة صفح خودروي، يا بر View،مي. حفظ نمود را در يك DataSetتوان همچنين،پ برفيلد كهوبةروي صفحنهان View ذخيره كردن آن در وضعيت در زمانعمالً حفظ نمود، كاري

.گيرد صورت ميرا اگر بخواهيم داده با ناچاريم ذخيره سازيم،وبةدهنده يا برروي صفح سرويسدر كامپيوترها

بريمتوانمي. آشنا شويم) concurrency(مباحث همراهي و دهنده، ها به سرويس گشت با ذخيره كردن رفت تغييرات ايجاد،اما.مها نياز به انجام محاسبات دارند، به كار خود بهبود بخشي به ويژه هنگامي كه داده

و ناپايدارها اگر داده. يابند هاي ذخيره شده بازتاب نمي در داده،هاي مربوطه شده در منبع داده فرارهر بيشتر تغييرات اخير را بازتاب ميADO.NETكه مطمئن شويم اشياي باشند، براي آن دهند، الزم است

. ها را از نو به وجود آوريم بار آن

Microsoft ADO.NET 2.0 444گام به گام با

دهنده در سرويسADO.NETءظ اشياحف

ASP.NETدر سمت. دارد كاربردي اينترنتي در اختيارة، چندين مكانيسم براي حفظ وضعيت برنام،اين دو وضعيت، در واقع. بسيار آسان استSessionو Applicatonهاي دهنده، كاربرد وضعيت سرويس

ب هايي كه داده نامه عبارتند از واژه مي/هاي نام صورت جفتهها را سپس،. كنند مقدار در خود ذخيرهبهيدامق مير ذخيره شده هنگام بازگشت به وضعيت اصلي،،نهايتاً.شوند صورت يك شيء بازيابي

. خواهيد آورددرشان اصلي قالب نوعبهراها دادهوضعيت. است) scope( تفاوت در دامنه:بسيار شبيه به يكديگرند، Sessionو Applicatonهاي وضعيتApplicaton،و براي تمام كاربران رةدر داخل برنام در تمام صفحات ). global(يت استؤ كاربردي قابل

هاي وضعيتدربارةبراي اطالعات بيشتر(. تنها مختص به يك نشست مرورگر است،Sessionوضعيت Applicaton وSession رجوع كنيد به اسناد ،ASP.NET(. مي كه دادههنگامي و بارگذاري مي ها ايجاد از شوند، رد متعلقIsPostBack propertyتوان - Pageةبه

ميدر بار نخستي كه صفحه براي نشستي از يك مرورگر خاص بارگذامقدار آن كه و Falseشود، ري. استفاده نمود- استTrueآنپس از

ويژوال بيسيك : Session در وضعيت DataSetذخيره كردن

به.1 :، اضافه كنيدIfشده در داخل بخش، در مكان مشخصPage_Load event handlerسطر زير را

dsAdoSbs = CType(ViewState("dsAdoSbs"), AdoSbsDataSet)

خوت را به وضعيDataSet سطر باال، از event handlerكه تنها زمانياماگرداند، يش بازمي اصلي.شود فراخوانده ميPostbackرويداد

به.2 نشان داده شده، Else، در جايي كه در داخل بخش Page_Load event handlerسطر زير را:اضافه كنيد

Session("dsAdoSbs") = dsAdoSbs

. كند ذخيره ميdsAdoSbsبا كليد Session را در وضعيت dsAdoSbs DataSetاين سطر، : به اين صورت باشدPage_Load event handlerحال، بايد

Protected Sub Page_Load(ByVal sender As Object,_ ByVal e As System.EventArgs) Handles Me.Load taCategories = New AdoSbsDataSetTableAdapters.CategoriesTableAdapter()

وب ها در فرم اي به داده مقيدسازي پايه/ فصل چهاردهم 445 هاي

taProducts = New AdoSbsDataSetTableAdapters.ProductsTableAdapter() dvProducts = New DataView() dsAdoSbs = New AdoSbsDataSet()

If IsPostBack Then 'Add exercise code here: 'dsAdoSbs = CType(Session("dsAdoSbs"), AdoSbsDataSet) dsAdoSbs = CType(ViewState("dsAdoSbs"), AdoSbsDataSet) Else taCategories.Fill(dsAdoSbs.Categories) taProducts.Fill(dsAdoSbs.Products) 'Add exercise code here: 'Session("dsAdoSbs") = dsAdoSbs hfPosition.Value = "0" End IfEnd Sub

سي: Session در وضعيت DataSetذخيره كردن شارپ ويژوال

به.1 :، اضافه كنيدIfشده در داخل بخش، در مكان مشخصPage_Load event handlerسطر زير را

dsAdoSbs = new AdoSbsDataSet();

از event handlerكه تنها زمانياماگرداند، خويش بازمي اصليت را به وضعيDataSetسطر باال، .شود فراخوانده ميPostbackرويداد

به.2 نشان داده شده، اضافه Elseكه در داخل بخش، درجاييPage_Load event handlerسطر زير را:كنيد

Session["dsAdoSbs"] = dsAdoSbs;

. كند ذخيره ميdsAdoSbsبا كليد Session را در وضعيتdsAdoSbs DataSetاين سطر، : به اين صورت باشدPage_Load event handlerحال، بايد

protected void Page_Load(object sender, EventArgs e) {

Microsoft ADO.NET 2.0 446گام به گام با

taCategories = new AdoSbsDataSetTableAdapters.CategoriesTableAdapter(); taProducts = new AdoSbsDataSetTableAdapters.ProductsTableAdapter(); dvProducts = new DataView(); dsAdoSbs = new AdoSbsDataSet();

if (IsPostBack) {

//Add exercise code here: dsAdoSbs = (AdoSbsDataSet)ViewState["dsAdoSbs"]; }

else {

taCategories.Fill(dsAdoSbs.Categories); taProducts.Fill(dsAdoSbs.Products);

//Add exercise code here: Session["dsAdoSbs"] = dsAdoSbs; hfPosition.Value = "0"; }}

بر روي صفحه ADO.NETءحفظ اشيا

ه بهرهندده از منابع سرويسليكن،، در عمل بسيار آسان استدهنده ها در سرويس ذخيره كردن دادهمي مي و لذا ت برد، ها راه ديگر، ذخيره كردن داده. داشته باشد) scalability(پذيري ثير منفي بر قياسأتواند

چون امادهنده كاسته خواهد شد، به اين ترتيب، از فشار برروي سرويس. استوبةبرروي خود صفحمي ها همچون بخشي از جريان داده داده مي ها ارائه و فرستادن توا شوند، ند زمان الزم براي بارگذاري

.صفحه را افزايش دهد ViewState propertyو يا در ) custom(ها برروي صفحه، يا در يك فيلد پنهان سفارش شده دادهميمتعلق مي. شوند به كنترل، ذخيره از در تئوري، ViewState اما استفاده نمود، ViewState propertyتوان.تر است رايجPageةردبه متعلق

وب ها در فرم اي به داده مقيدسازي پايه/ فصل چهاردهم 447 هاي

ويژوال بيسيك : ViewState property در DataSetذخيره كردن

كه يادداشت.1 و سپس به حال Session را در وضعيت DataSetهاي مربوط به دو سطري را، ذخيرهو در تمرين گذشته اضافه كرديم، پاك كنيد اول باز مي .گردانند،

كه.2 به حال اول بازگردانده، به Sessionرا از وضعيت DataSetسطر زير را، به جاي سطريPage_Load event handlerاضافه كنيد :

dsAdoSbs = CType(ViewState("dsAdoSbs"), AdoSbsDataSet)

Postback از رويداد event handler تنها زماني كه اماگرداند، را به حال اول بازميDataSet،اين سطر .فراخوانده شده باشد

Page_Load event handler، به Sessionسطر زير را، به جاي سطر مربوط به نسبت دادن وضعيت.3:اضافه كنيد

ViewState("dsAdoSbs") = dsAdoSbs

.كند ذخيره ميdsAdoSbs با كليد ViewState را به dsAdoSbs DataSetاين سطر، :رت باشد به اين صوPage_Load event handlerحال بايد

Protected Sub Page_Load(ByVal sender As Object,_ ByVal e As System.EventArgs) Handles Me.Load

If IsPostBack Then 'Add exercise code here: 'dsAdoSbs = CType(Session("dsAdoSbs"), AdoSbsDataSet) dsAdoSbs = CType(ViewState("dsAdoSbs"), AdoSbsDataSet) Else taCategories.Fill(dsAdoSbs.Categories) taProducts.Fill(dsAdoSbs.Products) 'Add exercise code here: 'Session("dsAdoSbs") = dsAdoSbs ViewState("dsAdoSbs") = dsAdoSbs hfPosition.Value = "0" End IfEnd Sub

Microsoft ADO.NET 2.0 448گام به گام با

سي: ViewState property در DataSetذخيره كردن شارپ ويژوال

كه يادداشت.1 و سپس به حال Session را در وضعيت DataSetهاي مربوط به دو سطري را، ذخيرهو در تمرين گذشته اضافه كرديم، پاك كنيد اول باز مي .گردانند،

كه.2 به حال اول بازگردانده، به Session را از وضعيت DataSetسطر زير را، به جاي سطريPage_Load event handlerاضافه كنيد :

dsAdoSbs = (AdoSbsDataSet)ViewState["dsAdoSbs"];

Postback از رويداد event handler تنها زماني كه اماگرداند، را به حال اول بازميDataSet،اين سطر .فراخوانده شده باشد

Page_Load event handler، به Session زير را، به جاي سطر مربوط به نسبت دادن وضعيت سطر.3:اضافه كنيد

ViewState("dsAdoSbs") = dsAdoSbs

.كند ذخيره ميdsAdoSbs با كليد ViewState را به dsAdoSbs DataSetاين سطر، :شد به اين صورت باPage_Load event handlerحال بايد

protected void Page_Load(object sender, EventArgs e) {

taCategories = new AdoSbsDataSetTableAdapters.CategoriesTableAdapter(); taProducts = new AdoSbsDataSetTableAdapters.ProductsTableAdapter(); dvProducts = new DataView(); dsAdoSbs = new AdoSbsDataSet();

if (IsPostBack) {

//Add exercise code here: //dsAdoSbs = (AdoSbsDataSet)Session["dsAdoSbs"]; dsAdoSbs = (AdoSbsDataSet)ViewState["dsAdoSbs"]; }

else {

وب ها در فرم اي به داده مقيدسازي پايه/ فصل چهاردهم 449 هاي

taCategories.Fill(dsAdoSbs.Categories); taProducts.Fill(dsAdoSbs.Products);

//Add exercise code here: //Session["dsAdoSbs"] = dsAdoSbs; ViewState["dsAdoSbs"] = dsAdoSbs;

hfPosition.Value = "0"; }}

اجراي پيمايش

Position ropertyهاي ويندوز، ديديم كه تغيير، در بررسي فرم“ها مقيدسازي دستي به داده”،11در فصلاين. دهد را كه هم اكنون بر روي فرم به نمايش درآمده، تغيير ميCurrencyManager ،DataRowبهمتعلق

، ناچاريم كل فرآيند را ADO.NETها از اشياي فرآيند مشابه محيط فرم وب است، ولي همانند نمايش داده.صورت دستي صورت دهيمبه

از در تمرين به صورت hfPosition متعلق به كنترل فيلد پنهان Value propertyهاي قبلي در اين فصل،شود تنظيم مي0 برروي hfPosition.Value property، ابتدا. استفاده كرديمCategoriesاي در جدول نمايه

براي اجراي پيمايش، با كدي كه بسيار ). DataTable.Rows مبتني بر صفرةنخستين رديف در مجموع(.كنيد كار ميproperty ويندوز است، با اين هاي به فرمشبيه به كد پيمايش مربوط

كد11براي مثال، در فصل ،btnNext_Click event handlerبه اين صورت بود :

ويژوال بيسيك

Private Sub btnNext_Click(ByVal sender As System.Object,_ ByVal e As System.EventArgs) Handles btnNext.Click Dim bmb As BindingManagerBase bmb = Me.BindingContext(dsAdoSbs, "Categories") If bmb.Position = bmb.Count - 1 Then Console.Beep() Else bmb.Position += 1 End IfEnd Sub

Microsoft ADO.NET 2.0 450گام به گام با

شارپ ويژوال سيprivate void btnNext_Click(object sender, EventArgs e) {

BindingManagerBase bmb; bmb = this.BindingContext[dsAdoSbs, "Categories"];

if (bmb.Position == bmb.Count - 1) Console.Beep(); else bmb.Position += 1; }

:هاي معادل در اين فصل مقايسه كنيد كد مزبور را با روال

ب يسيك ويژوالProtected Sub btnNext_Click(ByVal sender As Object,_ ByVal e As System.EventArgs) Handles btnNext.Click Dim pos As Integer = CType(hfPosition.Value, Integer)

If pos < (dsAdoSbs.Categories.Count - 1) Then pos += 1 hfPosition.Value = pos.ToString() End IfEnd Sub

شارپ ويژوال سيprotected void btnNext_Click(object sender, EventArgs e) {

int pos = Convert.ToInt16(hfPosition.Value); if (pos < dsAdoSbs.Categories.Count - 1) {

pos += 1; hfPosition.Value = pos.ToString(); }}

وب ها در فرم اي به داده مقيدسازي پايه/ فصل چهاردهم 451 هاي

ميهمان ازة شماراز اگر شمارشگر مكان كمتر:اي يكي است بينيد، قابليت پايه طور كه رديف باشد،.دو تفاوت كوچك وجود دارد. كاهد آن مي

وب، شمارشگر مكان يك فيلد پنهان در فرم. شود به شمارشگر مكان نخستين تفاوت مربوط مي، كه يك رشته است، Value property، اما. نياز نيستBindingManagerBaseاست، لذا به كسب ارجاعي به

و شماره از خود فهرست بازيابي DataTableبايد پيش از تغيير مكان به قالب يك مقدار عددي درآيد،.شود

رو به صدا درآمدن بيپ در محيط وب مسئله: شود به محيط تفاوت ديگر مربوط مي ساز است، از اينميهمان صورتن بخش از كد به اي .شود حفظ

ويژوال بيسيك : Move First Navigationاجراي

به.1 : اضافه كنيدbtnFirst_Click event handlerكد زير را

hfPosition.Value = "0"

Valueةبه رشترا مقدار عددي مكان رديفةالزم، براي ترجم) casting(اين سطر، قالب ريزي

propertyصورت رشته به0 رقمةا استفاده از ارائب)string(مي .زند، دوربر.2 . فشار دهيدF5روي كليد براي اجراي صفحه،در.3 .هاي پيمايش استفاده كنيد، از دكمهCategories DataTableبراي حركت

.مرورگر را ببنديد.4

Microsoft ADO.NET 2.0 452گام به گام با

سي: Move First Navigationاجراي شارپ ويژوال

به.1 : اضافه كنيدbtnFirst_Click event handlerكد زير را

hfPosition.Value = "0";

Valueةبه رشترا مقدار عددي مكان رديفةالزم، براي ترجم) casting(ريزي اين سطر، قالب

propertyبه صورت رشته0 رقمة با استفاده از ارائ )string(مي .زند، دوربر.2 .يد فشار دهF5روي كليد براي اجراي صفحه،در.3 .هاي پيمايش استفاده كنيد، از دكمهCategories DataTableبراي حركت

.مرورگر را ببنديد.4

هاي پيمايش وارد كاربردي واقعي وب، الزم است كدي را براي غيرفعال كردن كنترلةدر برنام:تذكروة ارائ، از حذفمورد ديگري. است كد مذكور از اين مثال حذف شده كار، براي سادگيليكن،. كنيم رفت

و سرويسDataSetبرگشتي كل به بين مرورگر ميدهنده دو خوبي در اين مثال كار كند، چه هرDataTable ها، كردن داده بايد كدي را براي فيلترمعموالً، كاربردي واقعية در برناماما. اند كوچكبسيار

يكةو ارائ ، اين كار، معموالً. هاي مرتبط با آن، اضافه كنيم Product DataRowو Category DataRow تنها. گيرد صورت ميSELECT . . . WHERE يعني SQL استانداردةبا استفاده از گزار

وب ها در فرم اي به داده مقيدسازي پايه/ فصل چهاردهم 453 هاي

هاي مربوطه روزآمد ساختن منبع داده

در يك فرم وب به وجود ADO.NETءهاي جديدي از اشيا كه زماني كه نمونهداشته باشيد،خاطر بهمياًآيند، دقيق مي در تئوري، رفتار يكسان بدين. هاي ويندوز كنند كه در فرم به همان صورت عمل

.اند ها يكسان معناست كه فرآيندهاي روزآمدسازي منبع داده يا فراخواندن متد،Data با اجراي فرمان، روزآمدسازي مستقيماًدر عمل. هستچنيننيز در يك سطح

Updateبه متعلقAdapter،مي يك آوريد كه معماري مقيدسازي به دادهياد، به اما. يردگ صورت ها در وب مقادير بازپس داده شده از سوي صفحه را به شيء به همين دليل، الزم است صراحتاً. سويه است

.اي مناسب برانيم دادهتDataTable كنترل به ستوني از يك property ويندوز، پس از آنكه در فرم كه مقيد شد، هر غييري

و خود به خود در از سوي ديگر، الزم. يابد بازتاب ميDataTableكاربر در مقدار اعمال نمايد، بالفاصلهبراي مثال،. را روزآمد سازدADO.NET مقدار را از كنترل بازيابي نموده، شيء است فرم وب صراحتاً

، از مقادير كنترل DataTableدريرديف يا روزآمد كردن Dataتوانيم، براي تنظيم پارامترهاي فرمان مي.استفاده كنيم

Command شيء كاربرداز ترين راه براي روزآمد كردن منبع داده شايد سرراست باشد، كه به Data Commandها، استفاده

مياي شيوه و كارآمد روزآمدسازي را عملي كه. سازد مستقيم Dataاشكال اين تكنيك، اين است

Command نه،ها داده منبع مي،DataTableو .سازد را روزآمدشد، كه پس از بازپس فرستادوبةو صفحDataTableبراي بازتاباندن تغييرات در ن به مرورگره

و يا مجدداDataTableًشوند، الزم است يا در اقدامي جدا ارسال مي را از DataTable را روزآمد سازيد،كهاي را نيز در بر دارد، رويكرد اخير هزينه.دهاي مربوطه پركني منبع داده سفر رفت يك است الزم چرا

همگيرد اطالعاتي صورت بانكةدهندو برگشت به سرويس تضمين ) concurrency(زماني، اما در عوض.شود مي

ويژوال : Commandها با استفاده از شيء روزآمد سازي منبع داده

بيسيك

به.1 : اضافه كنيدbtnUpdateCmd_Click event handlerكد زير را

Dim cn As New SqlConnection() cn.ConnectionString = "Data Source=(local)\SQLEXPRESS;” + - “Initial Catalog=AdoStepByStep;Integrated Security=True"

Microsoft ADO.NET 2.0 454گام به گام با

Dim cmdUpdate As New SqlCommand() cmdUpdate.Connection = cn cmdUpdate.CommandText = "UPDATE Categories " + _ "SET CategoryName = @name, Description = @description WHERE (CategoryID = @ID)" cmdUpdate.Parameters.AddWithValue("@name", tbCategoryName.Text) cmdUpdate.Parameters.AddWithValue("@description", tbDescription.Text) cn.Open() cmdUpdate.ExecuteNonQuery() cn.Close() taCategories.Fill(dsAdoSbs.Categories)

SqlConnectionسپس، شيء مذكور. آورد جديد به وجود ميSqlConnectionاين كد، نخست يك شيءرCommandTextو ConnectionString ،Connectionهاي property وجود آورده،بهرا مي آن .كندا تنظيم

بر.2 . فشار دهيدF5روي كليد براي اجراي صفحه،.XXX: تايپ كنيدDescriptionدر انتهاي.3

. كليك كنيدUpdate Commandةروي دكمبر.4برمرورگر را بست.5 تF5روي كليد ه، براي باز كردن مجدد مرورگر و سپس كهأ فشار داده، ييد كنيد

.دگار شده استهاي مربوطه مان تغيير در منبع داده.مرورگر را ببنديد.6

وب ها در فرم اي به داده مقيدسازي پايه/ فصل چهاردهم 455 هاي

ويژوال : Commandها با استفاده از شيء روزآمد سازي منبع داده

شارپ سي

به.1 : اضافه كنيدbtnUpdateCmd_Click event handlerكد زير را

SqlConnection cn = new SqlConnection(); cn.ConnectionString = "Data Source=(local)\\SQLEXPRESS;” “Initial Catalog=AdoStepByStep;Integrated Security=True"; SqlCommand cmdUpdate = new SqlCommand(); cmdUpdate.Connection = cn; cmdUpdate.CommandText = "UPDATE Categories " + "SET CategoryName = @name, Description = @description WHERE (CategoryID = @ID)"; cmdUpdate.Parameters.AddWithValue("@name", tbCategoryName.Text); cmdUpdate.Parameters.AddWithValue("@description", tbDescription.Text); cmdUpdate.Parameters.AddWithValue("@ID", tbCategoryID.Text); cn.Open(); cmdUpdate.ExecuteNonQuery(); cn.Close(); taCategories.Fill(dsAdoSbs.Categories);

مي جديد بهSqlConnectionاين كد، نخست يك شيء SqlConnectionسپس، شيء مذكور. آورد وجود.كند آن را تنظيم ميCommandTextو ConnectionString ،Connectionهاي propertyوجود آورده،بهرا

. فشار دهيدF5براي اجراي صفحه، برروي كليد.2.XXX: تايپ كنيدDescriptionدر انتهاي.3

Microsoft ADO.NET 2.0 456گام به گام با

. كليك كنيدUpdate Commandةبرروي دكم.4تF5مرورگر را بسته، براي باز كردن مجدد مرورگر برروي كليد.5 و سپس كهأ فشار داده، ييد كنيد

.هاي مربوطه ماندگار شده است تغيير در منبع داده.مرورگر را ببنديد.6

Adapter كاربردطور كه همان.، روزآمد كرديمData Command با استفاده از ها را، مستقيماً در تمرين گذشته، منبع داده

. سازد را روزآمد نميViewState property ماندگار در DataSet اماديديم، اين تكنيك كارآمدي است، از را روزآمد DataSetرويكرد ديگر اين است كه نخست و سپس DataAdapter يا TableAdapter كنيم،

مي. نيمك استفاده DataSetها از طريق براي روزآمد كردن منبع داده هاي كند كه داده اين رويكرد، تضمينو قابليتكنمياند، منعكس ها به وجود آورده بازپس داده شده به كاربران، هر تغييري را كه آن adapterد،

از هاي نمونهتا اين لحظه، در بيشتر موارد،. دهد را در اختيار كاربران قرار مي يا TableAdapter جديديDataAdapter ،براي پر كردن DataTableآ .داي ورده به وجود

از روزآمد كردن منبع داده ويژوال : TableAdapterها با استفاده

بيسيك

به.1 : اضافه كنيدbtnUpdateAdapter_Click event handlerكد زير را

Dim dr As DataRow

وب ها در فرم اي به داده مقيدسازي پايه/ فصل چهاردهم 457 هاي

dr = dsAdoSbs.Categories.Rows(CType(hfPosition.Value, Integer)) dr("CategoryName") = tbCategoryName.Text dr("Description") = tbDescription.Text taCategories.Update(dsAdoSbs.Categories)

و برDataRowكد باال، نخست رد جديدي را اعالن، تنظيم Categories DataTableيف جاري رويمي خواندن كد باقيمانده را آساناما، الزم نيست حتماًاين كارانجام. كند مي .سازد تر

روي برTextBoxهاي متعلق به كنترلTextاساس مقادير را برDataRowدومين بخش كد، دو ستون ازو در همان حال، سطر آخر جدول با در منبع دادهCategories صفحه روزآمد ساخته، هاي مربوطه را،

. كند، روزآمد ميTableAdapterبه متعلقUpdateاستفاده از متد بر.2 . فشار دهيدF5روي كليد براي اجراي صفحه،.اش تغيير دهيد را به مقدار اوليهXXX ،Descriptionبا حذف.3

. كليك كنيدUpdate TableAdapterةروي دكمبر.4ر.5 بسمرورگر برا تF5روي كليد ته، براي بازكردن مجدد مرورگر و سپس كهأ فشار داده، ييد كنيد

.هاي مربوطه ماندگار شده است تغيير در منبع داده.مرورگر را ببنديد.6

Microsoft ADO.NET 2.0 458گام به گام با

از دادهروزآمدكردن منبع ويژوال : TableAdapterها با استفاده

شارپ سي

به.1 : اضافه كنيدbtnUpdateAdapter_Click event handlerكد زير را

DataRow dr; dr = dsAdoSbs.Categories.Rows[Convert.ToInt16(hfPosition.Value)]; dr["CategoryName"] = tbCategoryName.Text; dr["Description"] = tbDescription.Text; taCategories.Update(dsAdoSbs.Categories);

بر جديدي راDataRowكد باال، نخست و تنظيم Categories DataTableروي رديف جاري اعالن،مي، ولي خواندن كد باقيمانده را آسان الزم نيست حتماًاين كارانجام. كند مي .سازد تر

روي برTextBoxهاي به كنترلمتعلقText را براساس مقادير DataRowدومين بخش كد، دو ستون ازو در همان با در منبع دادهCategories حال، سطر آخر جدول صفحه روزآمد ساخته، هاي مربوطه را،

. كند، روزآمد ميTableAdapterبه متعلقUpdateاستفاده از متد . فشار دهيدF5براي اجراي صفحه، برروي كليد.2.اش تغيير دهيد را به مقدار اوليهXXX ،Descriptionبا حذف.3

وب ها در فرم اي به داده مقيدسازي پايه/ فصل چهاردهم 459 هاي

.ليك كنيدكUpdate TableAdapterةروي دكمبر.4بس.5 برمرورگر را ت فشار داF5روي كليد ته، براي بازكردن مجدد مرورگر و سپس كهأده، ييد كنيد

.هاي مربوطه ماندگار شده است تغيير در منبع داده.مرورگر را ببنديد.6

خالصه

را در اين فصل، بررسي مقيدسازي به داده بابا،ها در محيط فرم وب مقيدسازي دستي به آشناييها در فرم ديديم كه برخالف فرم ويندوز، مقيدسازي به داده. آغاز نموديم،ADO.NET سطح پايينءيااش

DataTableدر وب،ة صفحدرتغييرات صورت گرفته در مقادير به نمايش درآمده. سويه است وب يك. كد نوشته شودچند سطرييابد، مگر آنكه مربوط بازتاب نمي

ل پانزدهمفص

از ها در فرم مقيدسازي به داده هاي وب با استفاده

ها جزء منبع داده:در پايان اين فصل، خواهيد توانست

.ها به وجود آوريد منبع داده،Visual Web Designerدر�به منبع داده،در زمان اجرا� .وجود آوريدها. را پيكربندي كنيدData Sourceهاي كنترل�. فعال كنيدData Source را در cachingويژگي�. استفاده كنيدData Sourceاز متدهاي�. پاسخ دهيدData Sourceبه رويدادهاي�

وب ها در فرم اي به داده مقيدسازي پايه”،14در فصل هاي مقيدسازي، به بررسي تكنيك“هايوب كنترل ، Data Sourceهاي كنترلبافصل،در اين. مايكروسافت پرداختيمADO.NETءبه اشيا هاي فرمشدند، هست Microsoft .NET Framework 2.0در جديدي اشياءكه .آشنا خواهيم

Data Sourceدرك جزء

اي بين در اين كه مانند واسطه( است، NET Framework 2.0.در شيء جديدي، كه Data SourceجزءADO.NETمي شده برروي دادهنشانو هاي مقيدو كنترل معادل جزء تقريباً)كند فرم عمل

indingSource ويندوز است، ولي با چند تفاوت مهم در فرم .. ها نيست دادهةبينند مستقل ازتداركBindingSource ،Data Sourceآشكارترين تفاوت اين كه، برخالف

.اند هاي مختلف شده بيننده تداركحال مناسب)15-1مطابق جدول(كه،چندين روايت وجود دارند Data Sourceهاي كنترل15-1جدول

شرح كنترل

SqlDataSource و روزآمدسازي داده با منابع داده از ها، كه براي بازيابي استفاده SQLهامي مي .كند كنند، رابطه برقرار

AccessData Source از اعقابSqlDataSourceاطالعاتي بانك حال، كه مناسب OleDbه است شد.

Microsoft ADO.NET 2.0 462گام به گام با

شرح كنترل

ObjectData Source رد دادهءبا اشيا ميةاي .كند مياني رابطه برقرار

XmlData Source هاي با دادهExtensible Markup Language (XML)كند رابطه برقرار مي.

SiteMapData Source ميةهاي نقش بيننده با تدارك .كند سايت رابطه برقرار

بData Sourceهاي هاي كنترل كه گروه،كنيد توجه مي ADO.NETهاي دادهةبينند تداركا متناظردر هاي داده بيننده در واقع، دسترسي به تمام تدارك. نيستند تعريف System.Data namespaceها، كهاز شده اشاره به زبان “ Sql”در اين مورد خاص، پيشوند. پذير است امكانSqlDataSourceاند، با استفادهSQLو نه موتور بانك .، داردSQL Server اطالعاتي،

AccessDataSource از اعقاب بالفصل كنترل SqlDataSourceتنها. قابليت دو رده يكسان است. است DataFile را با ConnectionString property جاي AccessDataSource. هاي اتصال است propertyتفاوت در

propertyكند تر است، عوضمي در زمان اجرا آسانآندن، كه مشخص كر.و به همين دليل، از System.Web.UI.DataSourceControl از اعقاب Data Sourceهاي تمام كنترل هستند،

ليكن،. آيد تعريف شده، به حساب نميSystem.Data namespace، كه در ADO.NETنقطه نظر فني جزئي ازمي هاي رابطه كه با دادهAccessDataSourceو SqlDataSourceهاي كنترل ء اشياگويند، احتماالً اي سخن

ADO.NETبندي را بسته)encapsulate (هاي اينها، تنها، دو روايت از كنترل. كنندميData Source ،هستند . آنها خواهيم پرداختةكه در آينده به بحث دربار

ك BindingSourceتفاوت دوم بين ، اين است كه قابليت دومي از گستردگي SqlDataSourceنترلواستفاده بنابراين در محيط فرم وب حضور ندارد، CurrencyManagerهنوز. برخوردار استياندك كمتر

مي. آورد امكان پيمايش را فراهم نميSqlDataSourceاز خواهيد از پيمايش در فرم خود پشتيباني اگرت . ذكر كرديم، استفاده كنيد14هايي كه در فصل كنيككنيد، الزم است از

مي امكان دسترسي به دادهSqlDataSourceجاي شگفتي است كه كند، نيز، هايي را كه خود مديريتشوند، هيچ عرضه مي BindingSource، كه از سوي كنترل Item يا Listهاي Property. آورد فراهم نمي

. ندارندSqlDataSourceمعادلي براي و اجراي فرامين محدود به اتصال به دادهSqlDataSourceدر اساس، قابليت Select ،Insert ،Deleteها

و كنترل Updateو ،cachingنيست، بلكهء اشياةبندي ساد بستهاين جزء، صرفاًاما. هاست داده و اعتبارسنجي مقيد به دادههاي كنترل”،16ها، كه در فصل شده به داده هاي مقيد ازكنترل هاآنبا،“هاها مقيدسازي به دادهةده، مكانيسمي را براي اجراي دوسويكر، نيز پشتيبانيشدخواهيم آشنا

مي دركنترل .گذارد هاي استاندارد وب در اختيار

463ها هاي وب با استفاده از جزء منبع داده ها در فرم زي به دادهمقيدسا/ فصل پانزدهم

Data Sourceايجاد اجزاي

ا، ميADO.NETء را، برخالف اشياData Sourceهاي كنترل در(هاي معمولي ستفاده از تكنيكتوان باو هم در زمان اجرا .وجود آورد بهVisual Web Developerدر)زمان طراحي

در زمان طراحيData Sourceايجاد اجزاي

، كه در زمان طراحي در Visual Web Designer ابزارة جعبDataة در زبان،Data Sourceهاي تمام كنترلرادر،Data Sourceبراي ايجاد.دان دسترس است، گنجانده شده زمان طراحي، كافي است كنترل مناسب

.به سطح طراحي بكشيد

Visual Web Designer در Data Sourceايجاد يك

1.Chapter 15 - Start Web site و در صورت 2005 را در ويژوال استوديو ، برروي نياز باز،Default.aspx در Solution Explorer،صف دوبار كليك درو سپس براي به نمايش درآوردن حه. كليك كنيدDesignةروي دكمنماي فرم بر

. را برروي سطح طراحي بكشيدSqlDataSourceاز كنترل ) instance( جديدية ابزار، نمونةاز جعب.2.تغيير دهيد sqlCategoryDetails كنترل را به Properties ،IDةدر پنجر.3

Microsoft ADO.NET 2.0 464گام به گام با

در زمان اجراData Sourceايجاد اجزاي

هم توان نمونه، ميstream(HTML(در جريان به كنترلةهاي جديد از و پيكربندي هاي وب وجود آوردمي. بحث ما خارج استة حوصلازنمود، ليكن اين موضوع از البته، دلخواهزبانهر توان، با استفاده

ازه نمون،نويسي، نيز هاي استاندارد برنامهو تكنيكCLRسازگار با . كردي را ايجاد كنترلهر هاي جديديبه Controlsة به مجموعمزبوركنترل،الزم جديدةتنها شرط اين است كه پس از ايجاد نمون متعلق

.دشوصفحه يا يك كنترل ظرف اضافه

ويژوال بيسيك:كدبه كمك Data Sourceايجاد

. فشار دهيدF7 روي كليد مربوط به صفحه، برcode-behindبراي نمايش فايل.1از.2 :، اضافه كنيدPage_PreInit event handlerسطر زير را بر باالي اعالن رده، پيش

Dim WithEvents sqlProducts As SqlDataSource

به.3 : اضافه كنيدPage_PreInit event handlerسطور پايين را

sqlProducts = New SqlDataSource() sqlProducts.ID = "sqlProducts" Me.Controls.Add(sqlProducts)

465ها هاي وب با استفاده از جزء منبع داده ها در فرم زي به دادهمقيدسا/ فصل پانزدهم

ها را تنظيم آنID propertyوجود آورده، را بهData Source جديدي از كنترلةدو سطر نخست، نمونمي كنترلةسطر آخر، كنترل را به مجموع. كند مي به. كند هاي صفحه اضافه حال بايد شروع فايل رده

:اين صورت باشد

Imports System.Data Imports System.Data.SqlClient Imports System.Web.UI Partial Class _Default Inherits System.Web.UI.Page

Dim WithEvents sqlProducts As SqlDataSource Protected Sub Page_PreInit(ByVal sender As Object,_ ByVal e As System.EventArgs) Handles Me.PreInit sqlProducts = New SqlDataSource() sqlProducts.ID = "sqlProducts" Me.Controls.Add(sqlProducts) End Sub

سي:كدبه كمك Data Sourceايجاد شارپ ويژوال

. فشار دهيدF7روي كليد مربوط به صفحه، برcode-behindبراي نمايش فايل.1از.2 :، اضافه كنيدPage_PreInit event handlerسطر زير را بر باالي اعالن رده، پيش

SqlDataSource sqlProducts;

به.3 : اضافه كنيدPage_PreInit event handlerسطور پايين را

sqlProducts = new SqlDataSource(); sqlProducts.ID = "sqlProducts"; this.Controls.Add(sqlProducts);

ها را تنظيم آنID propertyوجود آورده، را بهData Source جديدي از كنترلةدو سطر نخست، نمون مي كنترلةسطر آخر، كنترل را به مجموع. كند مي به. كند هاي صفحه اضافه حال بايد شروع فايل رده

:اين صورت باشد

Microsoft ADO.NET 2.0 466گام به گام با

using System; using System.Data; using System.Data.SqlClient; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; public partial class _Default : System.Web.UI.Page {

SqlDataSource sqlProducts; protected void Page_PreInit(object sender, EventArgs e) {

sqlProducts = new SqlDataSource(); sqlProducts.ID = "sqlProducts"; this.Controls.Add(sqlProducts); }

Data Sourceهاي پيكربندي كنترل

property هاي عرضه شده از سوي كنترلData Source،مي :شوند به چهار گروه تقسيم�Property مي هاي مربوطه متصل به منبع دادهData Sourceكنند چگونه هاي اتصال، كه مشخص

.شود�property هاي هاي فرمان، كه گزارهSQLكنترلة مورداستفاد Data Sourceرفتار فرمانة، به اضاف

.كنند مذكور، را مشخص مي�Property هاي پيكربندي، كه رفتار كنترلData Sourceكنند را مشخص مي.�Property هايcachingكنند كنترل، كه مشخص ميData Sourceها را در خود پنهان داده)cache (

.، چگونه؛آريو اگر؛نگاه دارد يا خيرSqlDataSource وAccessDataSourceء، به استثناproperty هاي اتصال، تمامproperty را هاي ديگر

.ردكخواهيم را بررسيها property تمام اين در اينجا،.كنند عرضه مي

467ها هاي وب با استفاده از جزء منبع داده ها در فرم زي به دادهمقيدسا/ فصل پانزدهم

Property هاي اتصال

اتصال هاي propertyشوند، عرضه ميData Sourceهاي ها كه از سوي كنترل propertyنخستين گروه ازميپيداستشان طور كه از نامهستند، كه همان هاي مربوطه كنند چگونه كنترل به منبع داده، مشخص

در15-3و15-2هايي هستند كه، مطابق جداول propertyاينها تنها. متصل گردد ،SqlDataSource وAccessDataSourceكنند طور يكسان عمل نمي به.

ا 15property-2جدول SqlDataSourceتصال هاي

Property شرح

ConnectionString استفاده هاي مربوطه مورد ال به منبع دادهاي كه براي اتص رشته.گيرد قرار مي

ProviderName هاي مربوطه ها، كه براي اتصال به منبع داده دادهةبينند نام تدارك.گيرد مورداستفاده قرار مي

AccessDataSource هاي اتصال 15property-3جدول

Property شرح

ConnectionString هاي مربوطه مورداستفاده اي كه براي اتصال به منبع داده رشته.گيرد قرار مي

DataFile اطالعاتي مكان فايل بانك

ProviderName هاي مربوطه ها، كه براي اتصال به منبع داده دادهةبينند نام تدارك.يردگ مورداستفاده قرار مي

و مكانيسم دسترسي بيننده، جدول داده به طور كامل تداركSqlDataSource ،ConnectionStringدر هادر را مشخص مي استفاده براي موردADO.NETهاي دادهةبينند، تداركProviderNameكه، حالي كند؛

ميها به دادهدسترسي .كند مشخصو نام فايل DataFile، از AccessDataSourceدر AccessDataSource، كه mdb. براي مشخص كردن محلمي داده مي هايش را از آن بيرون - در زمان اجرا بهConnectionString كه، در حالي.شودكشد، استفاده

و وجود مي -Data Source ،read ديگر در اين كنترل propertyدو. استOleDb همواره ProviderNameآيد،

onlyتند هس.

ويژوال بيسيك: هاي اتصال propertyتنظيم

: اضافه كنيدPage_PreInit event handlerدر ويرايشگر كد، سطر زير را به انتهاي.1

Microsoft ADO.NET 2.0 468گام به گام با

sqlProducts.ConnectionString = _ "Data Source=(local)\SQLEXPRESS;Initial Catalog=AdoStepByStep;" + _ "Integrated Security=True"

: به اين صورت باشدevent handlerةحال، بايد بدن

sqlProducts = New SqlDataSource() sqlProducts.ID = "sqlProducts" Me.Controls.Add(sqlProducts) sqlProducts.ConnectionString = _ "Data Source=(local)\SQLEXPRESS;Initial Catalog=AdoStepByStep; " + _

"Integrated Security=True"

سي: هاي اتصال propertyتنظيم شارپ ويژوال

: اضافه كنيدPage_PreInit event handlerدر ويرايشگر كد، سطر زير را به انتهاي.1

sqlProducts.ConnectionString = _ "Data Source=(local)\SQLEXPRESS;Initial Catalog=AdoStepByStep;+_ Integrated Security=True";

: به اين صورت باشدevent handlerةحال، بايد بدن

sqlProducts = new SqlDataSource(); sqlProducts.ID = "sqlProducts"; this.Controls.Add(sqlProducts); sqlProducts.ConnectionString = _ "Data Source=(local)\\SQLEXPRESS;Initial Catalog=AdoStepByStep;” + Integrated Security=True";

propertyهاي فرمان

براي بازيابي،را– Data Source كنترلة مورد استفادSQLهاي ها، فرمان propertyگروه بعديو حذف رديف مي-هاي مربوطه ها در منبع داده روزآمدسازي، درج ،براي هر اقدام. سازند مشخص

469ها هاي وب با استفاده از جزء منبع داده ها در فرم زي به دادهمقيدسا/ فصل پانزدهم

از مجموعه و هر مجموعاي سه15-4 فرمان، مطابق جدولة فرامين وجود دارند، property، داراي.جداگانه است

Data Sourceهاي فرمان 15property-4جدول

Property شرح

DeleteCommand ةگزارSQLها از منبع شده، كه براي حذف رديف يا روال ذخيرهمي داده .گيرد هاي مربوطه مورداستفاده قرار

DeleteCommandType درة رشت،كند مشخص مي عنوان بهDeleteCommand موجود.شده تفسير شود يا روال ذخيرهSQLةگزار

DeleteParameter ParameterCollectionة مورداستفادDeleteCommand.

InsertCommand ةگزارSQLها از منبع شده، كه براي درج رديف يا روال ذخيرهمر داده ميهاي .گيرد بوطه مورداستفاده قرار

InsertCommandType درة رشت،كند مشخص مي عنوان بهInsertCommand موجود.شده تفسير شود يا روال ذخيرهSQLةگزار

InsertParameter ParameterCollectionة مورداستفادInsertCommand.

SelectCommand ةگزارSQLاز بازيابي دادهشده، كه براي يا روال ذخيره هام منبع داده ميربوطه موردهاي .گيرد استفاده قرار

SelectCommandType ة رشت،كند مشخص ميSelectCommandةعنوان گزار بهSQL .تفسير شود يا روال ذخيره شده

SelectParameter ParameterCollectionة مورداستفادSelectCommand.

UpdateCommand ةگزارSQLها شده، كه براي روزآمدسازي داده روال ذخيره يامي در منبع داده .گيرد هاي مربوطه مورداستفاده قرار

UpdateCommandType ة رشت،كند مشخص ميUpdateCommandةعنوان گزار بهSQL .تفسير شود يا روال ذخيره شده

UpdateParameter ParameterCollectionةاستفاد موردUpdateCommand.

property هاي<action>)كه<action>ازها در آن يا Select ،Update ،Insert هاي واژه عبارت استDelete(باCommandText propertyرد متعلق حاوي،propertyاين.ند متناظر ADO.NET در Commandةبه. كه قرار است اجرا شود،اي است شده يا روال ذخيرهSQLةگزار

Microsoft ADO.NET 2.0 470گام به گام با

property هاي<action>CommandType ،هاي ردههمانندDataColumnةكند كه رشت، مشخص ميو SqlDataSourceدرهر دو مورد. چگونه تفسير شودaction>Command property>موجود در

AccessDataSource ،<action>CommandType property عضوي ازبرشماري )enumeration (SqlDataSource

CommandType را، كه داراي مقادير StoredProcedure وTextپذيرد است، مي.د، كه در بخش بعدي بدان اشارهنكن را نيز عرضه ميaction>Parameters>ةع فرمان، مجموعانواةهم

.خواهيم نمودسه15-5 نيز، مطابق جدول Data Sourceهاي كنترل ،propertyتاررفةد، كه نحوننك عرضه مي

.كنند ها را مشخصمي فرمان Commandهاي پيكربندي 15property-5جدول

Property شرح

CancelSelectOnNullParameter ةاگر پارامتري در مجموعSelectParameters برابر با Nullيا كند بازيابي داده باشد، مشخص مي ها ملغي شده.خير

ConflictDetection كنترل،كند مشخص مي Data Sourceها چگونه به مغايرتمي در هم .نمايد زماني رسيدگي

OldValueParameterFormatString فرمت، كه شامل حال اسامي پارامترهاي ارائهةرشت . شده استUpdate يا Deleteشده به متدهاي

CancelSelectOnNullParameter property كه مقدار ،Boolean هميبه خود ميپذيرد، كند مان كاري را Select باشد، اقدام Nullو يكي از پارامترها معادل) گزيده پيش(property ،Trueاگر: آيد كه از نامش برمي.لغو خواهد شد

ConflictDetection propertyهم،كند مشخص مي و Updateزماني در مورد اقدامات كه چگونه بهDeleteرسيدگي شود .propertyروي يك عضو برشماريبر،ور مذكConflictOptions كه داراي مقادير ،

OverwriteChanges وCompareAllValuesشود است، تنظيم مي.OverwriteChangesمي، كه پيش شود اين اقدامات، به سادگي، برروي هر تغييري گزيده است، موجب

)هاي مربوطه صورت گرفتهه شدند، در منبع دادهها خواند كه نخستين بار داده از زماني، احتماالً،كه(آن،حال در عين،اما. است كارآمد كامالً،اين گزينه. نوشته شوند كاربره در محيطي چنداستفاده از

با مي .اتي نيز همراه باشدخطرتواندوةدر واقع، براي مقايس. كننده است گمراه،اي تا اندازه،CompareAllValuesةنام گزين مقادير قديم

مي نميDelete يا Updateجديد، اقدام به كند، اين است كه مقادير قديمي را در اختيار كند؛ تنها كاري كهو انجام اقدام مناسب بنويسيد، قرار مي .دهد روالي كه الزم است براي انجام مقايسه

471ها هاي وب با استفاده از جزء منبع داده ها در فرم زي به دادهمقيدسا/ فصل پانزدهم

OldValueParameterFormatStringكه تنها زماني به كار مي روي برConflictDetection propertyرود،CompareAllValuesاين. تنظيم گرددpropertyفرمت است، كه از نگارشة حاوي يك رشت )syntax ( متد

String.Formatاز اين رشته، براي فرمت كردن اسامي پارامترهايي كه در اختيار متدهاي. كند استفاده ميDelete وUpdateميگيرند، استفاد قرار مي .شوده

ويژوال بيسيك : SelectCommand propertyتنظيم

: اضافه كنيدPage_PreInit event handlerدر ويرايشگر كد، سطور زير را به انتهاي.1

sqlProducts.SelectCommand = "SELECT [CategoryID], [ProductID], " + _ "[ProductName], [SupplierID] FROM [Products] " + _

"WHERE ([CategoryID] = @CategoryID)"

: به اين صورت باشدevent handlerةحال، بايد بدن

sqlProducts = New SqlDataSource() sqlProducts.ID = "sqlProducts" Me.Controls.Add(sqlProducts) sqlProducts.ConnectionString = "Data Source=(local)\SQLEXPRESS;Initial Catalog=AdoStepByStep;" + _ "Integrated Security=True" sqlProducts.SelectCommand = "SELECT [CategoryID], [ProductID], " + _ "[ProductName], [SupplierID] FROM [Products] " + _ "WHERE ([CategoryID] = @CategoryID)"

سي: SelectCommand propertyتنظيم شارپ ويژوال

: اضافه كنيدPage_PreInit event handlerدر ويرايشگر كد، سطور زير را به انتهاي.1

sqlProducts.SelectCommand = "SELECT [CategoryID], [ProductID], " + _ "[ProductName], [SupplierID] FROM [Products] " + _ "WHERE ([CategoryID] = @CategoryID)"

: به اين صورت باشدevent handlerةحال، بايد بدن

Microsoft ADO.NET 2.0 472گام به گام با

sqlProducts = new SqlDataSource(); sqlProducts.ID = "sqlProducts"; this.Controls.Add(sqlProducts); sqlProducts.ConnectionString = "Data Source=(local)\\SQLEXPRESS;Initial Catalog=AdoStepByStep;" + "Integrated Security=True"; sqlProducts.SelectCommand = "SELECT [CategoryID], [ProductID], " + "[ProductName], [SupplierID] FROM [Products] " + "WHERE ([CategoryID] = @CategoryID)";

پارامترهاي فرمان

Data Source متعلق به كنترل action>Command>و action>Command>هاي property درحالي كه- متعلقaction>Parameters>هاي propertyهستند، DataAdapter ADO.NETهاي propertyمتناظر با مستقيماً

هايي مجموعهData Sourceهاي propertyو DataAdapterهاي Property. بسيار متفاوتندData Sourceبهميرا تشكي رد، مجموعهData Source در مورد امادهند،ل تعريف شده در Parameterةها شامل اعقاب

Web.UI.WebControls namespaceو نه رد ها دادهةبينند پارامتر تعريف شده توسط اين يا آن تداركة،.اند نشان داده شده15-6 در جدول Parameterهاي رده. هستند

Data Source متعلق به Parameterهاي رده15-6جدول

شرح Parameterرده

ControlParameter مقداري را ازpropertyبه كنترل واقع بر صفحه بازيابي متعلق.كند مي

QueryStringParameter استعالم جاريةمقدار در رشت-مقداري را از تركيب كليد .كند بازيابي مي

SessionParameter ر مقداري را از متغيSessionكند بازيابي مي.

CookieParameter مييمقداري را از كوكي مشخص .كند بازيابي

FormParameter مقداري را ازproperty عرضه شده در شيء Request جاري .كند بازيابي مي

473ها هاي وب با استفاده از جزء منبع داده ها در فرم زي به دادهمقيدسا/ فصل پانزدهم

Session متغيرةدربار. اند براي بهره گرفتن از محيط فرم وب طراحي شدهParameterهاي بيشتر ردهةاز حوز، Control Parameterء ساير انواع، به استثنادربارةثبح. داشتيم14بحث مختصري در فصل

. خارج استمطالب كتابمي،Control Parameterاز Controlبراي مثال،. شود براي انجام مقيدسازي دوسويه استفاده

Parameter،كهproperty هايControlID وPropertyName آن بر روي Text propertyبه كنترل متعلقTextBoxمي آيد، داده تنظيم شده، زماني كه گزاره به اجرا درمي .كشد ها را از كنترل بيرون

كه صفحه براي نخستين بار به زماني(ها به داخل كنترل الزم است كدي بنويسيد، كه براي راندن دادهآن14هايي كه در فصل از يكي از تكنيك،)آيد نمايش درمي ، روزآمد اما. ها كرديم، استفاده كند اشاره به

مي كردن منبع داده .گيرد هاي مربوطه با تغييرات زمان اجرا، بدون نوشتن هيچ كد اضافي صورتهاي property هستند، كه Parameterاي پايهة از اعقاب ردParameterهاي همانگونه كه ديديم، تمام رده

مي15-7ور در جدول مذك .كنند را عرضه Parameterهاي 15property-7جدول

Property شرح

ConvertEmptyStringToNullخاليةسازد، كه اگر پارامتر حاوي يك رشت مشخص مي .دهد يا خير بازپس ميNullباشد،

DefaultValue ميةگزيد مقدار پيش .كند پارامتر را مشخص

Direction به،سازد مشخص مي كه پارامتر براي مقيد ساختن مقداريتوان از كنترل براي كنترل مورداستفاده قرار گرفته، يا مي

.تغيير مقدار استفاده نمود

Name نامpropertyپارامترهاة در مجموع .

Size بزرگي پارامتر.

Type سيستمي پارامترةنوع داد .

، توجه داشته باشيد كه اما. هايشان به خوبي پيداست از نام،Parameterةهاي ردproperty وظايفType propertyسيستمية نوع داد .NET Frameworkياين، با پارامترها. پذيرد را ميData Command كه ،

DbType مختص Data Providerمي را مي .كند پذيرد، فرق

ويژوال بيسيك : Command Parameterافزودن

: اضافه كنيدPage_PreInit event handlerدر ويرايشگر كد، سطور پايين را به انتهاي.1

Dim theParam As ControlParameter

Microsoft ADO.NET 2.0 474گام به گام با

theParam = New ControlParameter("CategoryID", "lbCategories", "SelectedValue") sqlProducts.SelectParameters.Add(theParam)

: بدين صورت باشدevent handlerةحال، بايد بدن

sqlProducts = New SqlDataSource() sqlProducts.ID = "sqlProducts" Me.Controls.Add(sqlProducts) sqlProducts.ConnectionString = _ "Data Source=(local)\SQLEXPRESS;Initial Catalog=AdoStepByStep;" + _ "Integrated Security=True" sqlProducts.SelectCommand = "SELECT [CategoryID], [ProductID], " + _ "[ProductName], [SupplierID] FROM [Products] " + _ "WHERE ([CategoryID] = @CategoryID)" Dim theParam As ControlParameter theParam = New ControlParameter("CategoryID", "lbCategories", "SelectedValue") sqlProducts.SelectParameters.Add(theParam)

سي: Command Parameterافزودن شارپ ويژوال

: اضافه كنيدPage_PreInit event handlerدر ويرايشگر كد، سطور پايين را به انتهاي.1

ControlParameter theParam; theParam = new ControlParameter("CategoryID", "lbCategories", "SelectedValue"); sqlProducts.SelectParameters.Add(theParam);

: بدين صورت باشدevent handlerةحال، بايد بدن

sqlProducts = new SqlDataSource(); sqlProducts.ID = "sqlProducts";

475ها هاي وب با استفاده از جزء منبع داده ها در فرم زي به دادهمقيدسا/ فصل پانزدهم

this.Controls.Add(sqlProducts); sqlProducts.ConnectionString = "Data Source=(local)\\SQLEXPRESS;Initial Catalog=AdoStepByStep;" + _

"Integrated Security=True"; sqlProducts.SelectCommand = "SELECT [CategoryID], [ProductID], " + "[ProductName], [SupplierID] FROM [Products] " + "WHERE ([CategoryID] = @CategoryID)"; ControlParameter theParam; theParam = new ControlParameter("CategoryID", "lbCategories", "SelectedValue"); sqlProducts.SelectParameters.Add(theParam);

در زمان طراحيCommandو Connectionهاي propertyتنظيم

و فرمان متعلق Visual Web Designer ،propertyدر ، طي يك مرحله، Data Sourceهاي به كنترلهاي اتصال.شوند، تعريف ميConfigure Data Source Wizardبا استفاده از

Visual Web Designer در Data Sourceپيكربندي

و در صورت لزوم، براي به نمايش درآوردDefault.aspxةروي زبانبر.1 ن صفحه در نماي فرم،،. كليك كنيدDesignروي بر

را Configure Data Source، سپس درآوردهنمايشبه را sqlCategoryDetails Smart Tagمنوي.2.انتخاب كنيد

Visual Web Designer ويزارد ،Configure Data Sourceكند را آغاز مي.

Microsoft ADO.NET 2.0 476گام به گام با

را.3 اگر اتصال.، انتخاب كنيد داردAdoStepByStepة اطالعاتي نمون كه اشاره به بانك،اتصاليو اتصال جديدي را مطابق آن چه در New Connectionة، برروي دكمنيستموجود كليك كرده،به“ADO.NETبا شروع كار”،1فصل .وجود آوريد، شرح داده شد،

ذخة اتصال را در فايل پيكربندي برنامةقاب كنترلي را، كه رشت.4 مي كاربردي سازد، پاك كرده، يرهبرو . كليك كنيدNextروي سپس

را Configure The Select Statement ،Specify Column From A Table Or Viewةروي صفحبر.5و سپس . انتخاب كنيدName را در قاب فهرست Categoriesانتخاب،

.را انتخاب كنيد)*(ها قاب كنترل تمام ستون.6

477ها هاي وب با استفاده از جزء منبع داده ها در فرم زي به دادهمقيدسا/ فصل پانزدهم

. كليك كنيدWHEREبرروي.7Configure Data Source Wizard قاب گفتگوي ،Add WHERE Clauseگذارد را به نمايش مي.

8.CategoryID را در قاب فهرست Column و ،Control را در قاب فهرست Sourceانتخاب كنيد .9.IbCategories را در قاب فهرست Control ID و سپس برروي . كليك كنيدAdd انتخاب،

و سپس OKبرروي. 10 ،Nextك .نيد كليك.گذارد را به نمايش ميTest Qurey، صفحه Configure Data Sourceويزارد

. كليك كنيدFinishرويبر. 11تي قاب پيامي را داVisual Web Designerاگر. 12 و كليدهاي دادهأر بر به ييد ايجاد مجدد فيلدها ها

. كليك كنيدNoنمايش درآورد، برروي . فشار دهيدF5گزيده، برروي كليدش صفحه در مرورگر پيشبراي نماي. 13

ASP.NETهاي مايكروسافت، كنترلSqlDataSourceبه را پركرده، نتايج را در كنترل هاي مقيد شده.گذارد نمايش مي

Microsoft ADO.NET 2.0 478گام به گام با

.مرورگر را ببنديد. 14

Property هاي پيكربندي

ك property ديگرةمجموع ، AccessDataSourceو SqlDataSourceهاي نترلهاي عرضه شده از سويproperty اين. اند ذكر شده15-8هاي پيكربندي هستند، كه در جدولpropertyرفتارةكنندها، عوامل تعيين

مي بهData Sourceكلي .روند شمار هاي پيكربندي15property-8جدول

Property شرح

DataSourceMode شيءADO.NET،بر را استفاده قرار ها مورد اي بازيابي داده كه.سازد گيرد، مشخصمي مي

FilterExpression عبارت فيلترگذاري، كه براي نتايج حاصل از فراخوان متدSelect ميبه .شود كار گرفته

FilterParameters ParameterCollectionگذاري عبارت فيلترة مورداستفاد.

SortParameterName ميرااي شده روال ذخيرهنام پارامتر در، كه سازد مشخص با استفاده از روال ذخيره شدههاي بازيابي مرتب كردن داده

.كاربرد داردشده،

479ها هاي وب با استفاده از جزء منبع داده ها در فرم زي به دادهمقيدسا/ فصل پانزدهم

DataSourceMode propertyبه متعلقSqlDataSource وAccessDataSource عضوي از برشماري ،SqlDataSourceModeردپذي را، كه حاوي دو مقدار است، مي:DataReader وDataSet .DataSet مقادير

.ندا گزيده پيشFilterExpression propertyمياي رشته كاربرد Selectد، كه براي نتايج حاصل از متد ساز را مشخص

به كاررا String.Format، نگارش syntax (SQL(جاي استفاده از نگارش بهFilterExpression property. داردهاي property، كه همچون FilterParametersة، مقادير پارامترهاي خود را از مجموعpropertyاين. يردگ مي

<action>Parameters ميمي15-6 پارامترها را از انواع ذكر شده در جدول .كند پذيرد، اخذ SelectCommandTextگيرد، كه مقدار تنها زماني مورد استفاده قرار ميSortParameterName، سرانجام

propertyد بازة نتيجةدر اين مورد، مجموع. نام يك روال ذخيره شده باشد اده شده توسط روال پس را propertyكه همان نام مشخص شده براي اين( SelectParametersة عضو مجموعةوسيلذخيره شده، به

مي)دارد .شود مرتب

property هايcaching

و نحوData Sourceهاي propertyةآخرين مجموع Dataها توسط داده) داري نهان(caching انجامة، انجام

Sourceاين مجموعه. كنند را كنترل مي property،اند ذكر شده15-9 در جدول ها .caching تنها زماني كه امكان تنظيم DataReader برروي DataSourceModeاگر. باشدDataSourceMode ،DataSetپذير است،

.خواهد گرديد را موجب NotSupportedExceptionها اعالم خطاي property شود، تنظيم هر كدام از اين Data Source Cacheهاي 15property-9جدول

Property شرح

CacheDuration هايي كه كنترل تعداد ثانيهData Sourceمي داده .دارد ها را نهان

CacheExpiration رفتارcachingسازد كنترل را مشخص مي.

CacheKeyDependency نهانءاز سوي كاربر را، كه انقضاي اشياكليد تعريف شده .سازد كند، مشخصمي داشته شده را كنترل مي

EnableCaching كند، كنترل مشخص ميData Sourceمي داده يا ها را نهان سازد.خير

SqlCacheDependency و جداول هاي بانك داري، كه براي وابستگي نهانSQLاطالعاتي.گيرند مورداستفاده قرار مي

CacheDuration property،مي نهان Data Sourceها چه مدت توسط كنترل كند كه داده مشخص.شود مدت زمان به ثانيه مشخصمي. شوندمي

Microsoft ADO.NET 2.0 480گام به گام با

CacheDuration،براساس تنظيم CacheExpirationPolicyمي تفسير مي Absoluteتوان برروي شود، كهتنظيم شده،) گزيده پيش(Absolute برروي CacheExpirationPolicyكه زماني. تنظيم شودSlidingيا

كه،اما. شوند ثانيه پس از بازيابي به دور انداخته ميCacheDurationداشته شده هاي نهان داده هنگاميCacheExpirationPolicyوي بررSlidingداشته شده هاي نهان تنظيم شده، دادهCacheDuration ثانيه پس از مي آخرين دسترسي به آن .شوند ها، به دور انداخته

property هايCacheKeyDependency وSqlCacheDependency،جزئيات امكان كنترل caching را فراهممي اين،CacheKeyDependency property. سازند مي از امكان را دهد، كه مقدار كليد را براي چندين مورد

cacheميهمةانقضاي كليد،. تنظيم كنيم از SqlCacheDependency.دساز موارد پيوند يافته را منقضيمي) باشدچنيناگر( SQL Serverبه متعلقcacheويژگي وابستگي هاي جفت،propertyاين. كند استفاده

شهايجدول به مشخص كه موتور بانكزماني. پذيرد را ميConnectionString;TableNameعنوان ده.رسد به سر ميcacheسازد، را از تغيير جدول آگاه ميASP.NET،اطالعاتي

شود، ناديده گرفته تنظيم ميTrueروي كه برEnableCachingءها، به استثنا propertyتمام اين(شوند مي .) استFalseگزيده پيش.

ويژوال بيسيك: سادهcachingفعال ساختن

و سطور زير را به انتهاي Default.aspx.vbةروي زبانبر.1 Page_PreInit event handler كليك،:اضافه كنيد

sqlProducts.EnableCaching = True sqlProducts.CacheDuration = 120

:رت باشد به اين صوevent handlerةحال، بايد بدن

sqlProducts = New SqlDataSource() sqlProducts.ID = "sqlProducts" Me.Controls.Add(sqlProducts) sqlProducts.ConnectionString = _ "Data Source=(local)\SQLEXPRESS;Initial Catalog=AdoStepByStep;" _ "Integrated Security=True" sqlProducts.SelectCommand = "SELECT [CategoryID], [ProductID], " + _ "[ProductName], [SupplierID] FROM [Products] " + _ "WHERE ([CategoryID] = @CategoryID)"

481ها هاي وب با استفاده از جزء منبع داده ها در فرم زي به دادهمقيدسا/ فصل پانزدهم

Dim theParam As ControlParameter theParam = New ControlParameter("CategoryID", "lbCategories", "SelectedValue") sqlProducts.SelectParameters.Add(theParam) sqlProducts.EnableCaching = True sqlProducts.CacheDuration = 120

سي: سادهcachingفعال ساختن شارپ ويژوال

و سطور زير را به انتهاي Default.aspx.vbةبرروي زبان.1 اضافه Page_PreInit event handler كليك،:كنيد

sqlProducts.EnableCaching = True; sqlProducts.CacheDuration = 120;

: به اين صورت باشدevent handlerةحال، بايد بدن

sqlProducts = new SqlDataSource(); sqlProducts.ID = "sqlProducts"; this.Controls.Add(sqlProducts); sqlProducts.ConnectionString = "Data Source=(local)\\SQLEXPRESS;Initial Catalog=AdoStepByStep;" "Integrated Security=True"; sqlProducts.SelectCommand = "SELECT [CategoryID], [ProductID], " + "[ProductName], [SupplierID] FROM [Products] " + "WHERE ([CategoryID] = @CategoryID)"; ControlParameter theParam; theParam = new ControlParameter("CategoryID", "lbCategories", "SelectedValue");

Microsoft ADO.NET 2.0 482گام به گام با

sqlProducts.SelectParameters.Add(theParam); sqlProducts.EnableCaching = true; sqlProducts.CacheDuration = 120;

Data Sourceكاربرد متدهاي

15-10شوند، در جدول عرضه ميAccessDataSourceو SqlDataSourceهاي ترلمتدهايي كه توسط كنبا مستقيماً،اين متدها. اند ذكر شده هربه.اند هاي فرمان براي هر نوع عمل property متناظر عبارت ديگر،

درة يا روال ذخيره شدSQLة گزار،متد به سادگي به را action>Command> متناظر property موجود.آورد اجرا درمي

SqlDataSource متدهاي15-10جدول

شرح متد

Delete فرمانSQLدرةشد يا روال ذخيره .كند را اجرا ميDeleteCommand property موجود

Insert فرمانSQLدرةشد يا روال ذخيره .كند را اجرا ميInsertCommand property موجود

Select فرمانSQLدرةشدره يا روال ذخي .كند را اجرا ميSelectCommand property موجود

Update فرمانSQLدرةشد يا روال ذخيره .كند را اجرا ميUpdateCommand property موجود

ةشده در مجموع، از پارامترهاي مشخصد، براي انجام وظايف خوDeleteو Update ،Insertمتدهاي<action>Parametersمي استفاد رد دارد، كه نمونهargument نياز به Selectمتد. كننده ةاي است از

DataSourceArguments . property اند ذكر شده15-11هاي اين رده در جدول. DataSourceArgumentsهاي 15property-11جدول

Property شرح

Empty رد نمونه مي بازDataSourceArgumentsةاي خالي از .دده پس

MaximumRows پس دهد، مشخص هايي را كه قرار است باز بيشترين تعداد رديف.سازد مي

RetrieveTotalRowCount ها بايد بازپس داده شوند يا خير كل رديف،كند مشخص مي.

SortExpression كه رشته هاي بازيابي مرتب كردن دادهبراي، data source view،اي.كند، از آن استفاده ميDataSourceView.Selectشده توسط متد

StartRowIndex سازد رديف شروع را كه قرار است بازپس داده شود، مشخص مي.

TotalRowCount ها كل تعداد رديف

483ها هاي وب با استفاده از جزء منبع داده ها در فرم زي به دادهمقيدسا/ فصل پانزدهم

Empty property،مي زماني از مورداستفاده قرار DataSourceArgumentsگيرد، كه نيازبه قابليت خاصيآن. نيست ااز ة را بدون ايجاد نمونDataSourceArguments.Emptyتوان ايستاست، ميpropertyين جا كه:از رده ارائه نمود، مانند) instantiate(جديدي

myDataSource.Select(DataSourceArguments.Empty)

property هايRetrieveTotalRowCount وTotalRowCount ميبهيكديگربا همراه كه. روند كار هنگاميRetrieveTotalRowCount ،True را هايي كه معيار انتخاب در منبع داده است، تعداد كل رديف هاي مربوطه

. شود بازپس داده ميTotalRowCount property، در Selectپس يافتن متد سازد، پس از باز برآورده مي.ددار برد كارSelect براي رويداد event handler در propertyگونه كه در بخش بعد خواهيم ديد، اين مانه

Property هايStartRowIndex وMaximumRowsمي براي فراخواني داده . گيرند ها مورداستفاده قرار، بدين ترتيب، مثالً. كند بازيابي ميStartRowIndex را با شروع از MaximumRowsهاي رديفSelectمتد

و11روي برStartRowIndex با تنظيم،هاي مربوطه از منبع داده16تا11هاي بازيابي رديفMaximumRowsممكن است5روي بر .

DataSourceArguments،يكproperty ديگر –SortExpression -مي كند، كه از سوي متد را عرضهSelectبه متعلقDataSourceViewاز آنجا كه متد. گيرد مورداستفاده قرار ميGetViewبه متعلقDataSet و مشتق، نمي كنترلبه استثناء است، Protectedمتدي كار DataSourceView با توان مستقيماً هاي منشعب.كرد

ويژوال بيسيك : Selectها با استفاده از متد بارگذاري داده

به.1 : اضافه كنيدbtnProducts_Click event handlerسطور زير را

Dim dv As DataView dv = sqlProducts.Select(DataSourceSelectArguments.Empty) lbProducts.DataSource = dv lbProducts.DataTextField = "ProductName" lbProducts.DataBind()

پس داده بازDataViewروي، را اعالم كرده، سپس آن را برDataView ،dvاين كد، نخست يك متغير Selectتوجه داشته باشيد كه متد. كند تنظيم ميSqlDataSourceبه متعلقSelectي متد شده از سو

از نمونه مي)كه ايستاست( را Empty DataSourceSelctedArgumentsاي .كند دريافت را IbProductبه قاب فهرست متعلقDataTextFieldو DataSourceهاي propertyسه سطر بعدي،

سطر آخر، قاب فهرست را مقيد ساخته،. كنند تنظيم ميDataViewبه متعلقProductNameن برروي ستو.دهد مقاديري را كه قرار است به نمايش درآيند حاصل مي

Microsoft ADO.NET 2.0 484گام به گام با

. فشار دهيدF5گزيده، برروي كليد براي اجراي صفحه در مرورگر پيش.2و سپس برCategoryيك.3 . كليك كنيدShow Productsروي را انتخاب،

ASP.NET،ميه فرآورد .گذارد هاي برگزيده را در قاب فهرست به نمايش

.مرورگر را ببنديد.4

سي: Selectها با استفاده از متد بارگذاري داده شارپ ويژوال

به.1 : اضافه كنيدbtnProducts_Click event handlerسطور زير را

DataView dv; dv = (DataView)sqlProducts.Select(DataSourceSelectArguments.Empty); lbProducts.DataSource = dv; lbProducts.DataTextField = "ProductName"; lbProducts.DataBind();

پس داده بازDataViewروي، را اعالم كرده، سپس آن را برDataView ،dvاين كد، نخست يك متغير Selectتوجه داشته باشيد كه متد. كند تنظيم ميSqlDataSourceبه متعلقSelect شده از سوي متد

از نمونه .كند را، كه ايستاست، دريافت ميEmpty DataSourceSelctedArgumentsاي را IbProductبه قاب فهرست متعلقDataTextFieldو DataSourceهاي propertyسه سطر بعدي،

سطر آخر، قاب فهرست را مقيد ساخته،. كنند تنظيم ميDataViewبه متعلقProductNameبرروي ستون.دهد مقاديري را كه قرار است به نمايش درآيند حاصل مي

485ها هاي وب با استفاده از جزء منبع داده ها در فرم زي به دادهمقيدسا/ فصل پانزدهم

. فشار دهيدF5گزيده، برروي كليد براي اجراي صفحه در مرورگر پيش.2و سپس برروي Categoryيك.3 . كليك كنيدShow Products را انتخاب،

ASP.NET،ميه فرآورد .گذارد هاي برگزيده را در قاب فهرست به نمايش

.مرورگر را ببنديد.4

Data Sourceدهي به رويدادهاي پاسخ

عرضه AccessDataSourceو SqlDataSourceهاي ها، كه از سوي كنترل رويدادهاي مرتبط با منبع داده، يكي Filtering رويدادء، به استثناData Sourceدادهاي تمام روي. اند ذكر شده15-12شوند، در جدول مي

.آورند از متدهايي را كه در بخش گذشته بررسي كرديم، در پرانتز مي Data Source رويدادهاي15-12جدول

شرح رويداد

Deleted پس از تكميل اقدامDeleteدهد رخ مي.

Deleting پيش از اجراي اقدامDeleteدهد رخ مي.

Filtering پيش از عملي ساختن يكFilterدهد رخ مي.

Insterted پس از تكميل اقدامInstertدهد رخ مي.

Insterting پيش از اجراي اقدامInstertدهد رخ مي.

Selected پس از تكميل اقدامSelectدهد رخ مي.

Selecting پيش از اجراي اقدامSelectدهد رخ مي.

Updated ميل اقدام پس از تكUpdateدهد رخ مي.

Updating پيش از اجراي اقدامUpdateدهد رخ مي.

Microsoft ADO.NET 2.0 486گام به گام با

ويژوال بيسيك : Selectedپاسخ به رويداد

به.1 : اضافه كنيدsqlProducts_Selected event handlerسطور زير را

txtSelectedRows.Text = "This product has " + e.AffectedRows.ToString() +

" associated products." txtSelectedRows.Visible = True

واقع بر صفحه را label در كنترل Selectپس داده شده از سوي متد هاي باز كد باال، تعداد رديف .دهد نشان مي

. فشار دهيدF5براي نمايش صفحه در مرورگر، برروي كليد.2و سپس برروي Categoryيك.3 . كليك كنيدShow Products را انتخاب،

ASP.NET،و تعداد فرآورده فرآورده مي هاي مرتبط .گذارد هاي انتخاب شده را به نمايش

.مرورگر را ببنديد.4

سي: Selectedپاسخ به رويداد شارپ ويژوال

: اضافه كنيدPage_PreInit event handlerسطر زير را به انتهاي.1

487ها هاي وب با استفاده از جزء منبع داده ها در فرم زي به دادهمقيدسا/ فصل پانزدهم

sqlProducts.Selected += new SqlDataSourceStatusEventHandler(sqlProducts_Selected);

به.2 : اضافه كنيدsqlProducts_Selected event handlerسطور زير را

txtSelectedRows.Text = "This product has " + e.AffectedRows.ToString() +

" associated products."; txtSelectedRows.Visible = true;

واقع بر صفحه را label در كنترل Selectهاي بازپس داده شده از سوي متد باال، تعداد رديفكد .دهد نشان مي

بر.3 . فشار دهيدF5روي كليد براي نمايش صفحه در مرورگر،و سپس برروي Categoryيك.4 . كليك كنيدShow Products را انتخاب،

ASP.NET،و تعداد فرآو فرآورده مي ردههاي مرتبط .گذارد هاي انتخاب شده را به نمايش

.مرورگر را ببنديد.5

Microsoft ADO.NET 2.0 488گام به گام با

خالصه

بر، كه مقيدسازي دوسويه بين منبع دادهSqlDataSourceدر اين فصل، با توجه خاص به SQLهاي مبتنيميو كنترل) SQL Server نه لزوماً( Data Sourceهاي به بررسي كنترلرساند، هاي فرم وب را به انجاممي. داختيمپر به را در زمان SqlDataSourceهاي توان كنترل ديديم كه وهاي طراحي يا اجرا وجود آورد،

راآن، action> Parameters property>با افزودن يك پارامتر به مي به كنترلها در. شوند هاي فرم وب مقيدو رويدادهاي،)سازي نهان(cachingپايان، بررسي مختصري از عرضه شده از سوي اينةساد متدها

Dataهاي تر با كنترل هايي كه براي كار نزديك در فصل آينده، به موضوع كنترل.جزء به عمل آورديم

Sourceشوند، بازخواهيم گشت طراحي مي.

شانزدهمفصل

و اعتبارسنجي هاي مقيد به داده كنترل ها:در پايان اين فصل، خواهيد توانست

و پيكربندي كنيد را بهListهاي كنترل� .وجود آورده. استفاده كنيدListاز متدهاي كنترل�. پاسخ دهيدListبه رويدادهاي كنترل�.ي بر قالب اضافه كنيدنهاي مبت ها را به كنترل قالب�.ها مقيد سازيد را به منبع دادهTemplateهاي نترلك��DataControlFieldsهاي را به كنترلDetailView وDataGridاضافه كنيد ..هاي اعتبارسنجي را به صفحات فرم وب اضافه كنيد كنترل�

وب ها در فرم اي به داده مقيدسازي پايه”،14در فصل وب در ADO.NETء، به بررسي اشيا“هاي فرمبا“ها هاي وب با استفاده از جزء منبع داده ها در فرم مقيدسازي به داده”،15 در فصل. پرداختيم ، ها در فرم وب را تسهيل كرده، انجام آن را با نوشتن كه كار مقيدسازي به داده( Data Sourceهاي كنترل

مي سطرتنها چند . آشنا شديم)سازد كد ميسر Data Sourceهاي هاي فرم وب، كه براي كار با كنترل هاي مقيد به داده بررسي كنترلدر اين فصل، بهو مي هاي همچنين، با كنترل. به كار برده شوند، خواهيم پرداختADO.NETءتوانند با اشيا طراحي شده

بهبسيار خوبيحل، كه مانند نظايرشان در فرم ويندوز راهASP.NETاعتبارسنجي براي رسيدگيمي خطاهاي ورود داده شد ها در اختيارمان .گذارند، آشنا خواهيم

ها هاي مقيد به داده درك كنترل

System.Web.UI.Controls، كه از اعقاب مستقيم Repeaterكنترلءها، به استثنا هاي مقيد به داده كنترلقBaseDataList يا BaseDataBoundControlاست، از نسل رااي ابليت پايه هستند، كه اين خود شان.ها در تصوير زير نشان داده شده است هاي مقيد به داده سلسله مراتب كنترل. سازد مشخص ميمي پذيرترين كنترل مقيد به داده انعطاف، يكي ازRepeaterكنترل هرمي. رود ها به شمار توان از <ItemTemplate></ItemTemplate>خشب درداخلHTMLوASP.NETوبةدهند سرويسهاي ازكنترلتركيبي

.استفاده نمودمي، اين بخش را براي هر رديف در منبع دادهRepeaterكنترل با،ها داده. كند هاي مربوطه تكرار

ها رانده به كنترل) مشاهده كرديم14كه در فصل(ها مقيدسازي به داده) syntax(استفاده از نگارش

Microsoft ADO.NET 2.0 490گام به گام با

(شوند مي يكد كه اين مقيدسازي به دادهخاطر آوريبه. آن،ها به كنترل رانده داده،سويه است ها ولي ازآن.) شوند اخذ نمي شود، در اينجا به بحث تعريف ميHTML در جريان منحصراRepeaterًجا كه از. آن نخواهيم پرداختدربارة

ها، مانند اين كنترل. هستندBaseDataListة، از اعقاب ردDataListو Data List ،DataGridهاي كنترلبه ها در منبع داده، چندين رديف از دادهRepeaterكنترل ميهاي مربوطه را اما، برخالف. گذارند نمايش

Repeaterآن، مي و با نوشتن كد قابل دسترسي توان .ندا ها را در زمان طراحي پيكربندي نمود، GridView كنترل اما است، Microsoft ASP.NET 2.0باني پشتيDataGrid هنوز مورد كنترل گرچه

ازجا در ايناما،(جايگزين آن شده شد آن نخواهصحبتي ، در اينكه هيچ ساختاري را DataListكنترل.)درا، چندين رديف از منبع دادهاما. استRepeaterكند، شبيه ها تحميل نمي به داده ) layout(در طرح-ها

مي-)templates(ها قالبةوسيلتعريف شده به .گذارد به نمايشرا قابليت گروهي از ردهListControlةرد مي-ها ها رفتاري property اما،رسند كه به نظر متفاوت

مي-بسيار شبيه به يكديگر دارند ها، مقادير يك ستون واحد از تمام كنترلةاين مجموع. كند تعريفميها هاي منبع داده رديف .گذارد را به نمايش

دخوة ديگر، كه به نوبةدهند هاي سرويس هاي مركب، مانند ظرفي براي كنترل كنترل مقيد به دادهدر مقيد به اقالم واقعي داده را سه كنترل دادهASP.NET 2.0. كند هستند، عمل مي BindingSourceاي اي

.GridViewو DetailsView ،FormView: كند تعريف ميمي، هر دو، يك رديف واحد از منبع دادهFormViewو DetailsViewهاي كنترل . گذارند ها را به نمايش

تر است، چندين رديف را به نمايش قديميDataGridروي، كه دنبالهGridViewدرحالي كه، كنترل.شود ها مشخصمي البقةوسيلبه،DataListها، همچون ها در اين كنترل طرح داده. گذارد مي

در آيد، داده طور كه از نامشان برميهاي سلسله مراتبي، همان هاي مقيد به داده سرانجام، كنترل ها راميهرمي از مي،ASP.NET. گذارند سلسله مراتب به نمايش : كند دو كنترل سلسله مراتبي را تعريف

Menu وTreeView .ميهر دوي اين به ها را در. مقيد ساختSiteMapDataSource يا XmlDataSourceتوان.هاي سلسله مراتبي نخواهيم داشت هاي مقيد به داده كنترلدربارةاين كتاب بحثي

در مايكروساNET Framework.ء همچون بيشتر اشيا،توانميراها هاي مقيد به داده كنترل فت،به زمان و اجرا هاي در زمان اجرا، به ويژه در مورد كنترلام اين كارانج اماوجود آورد، هاي طراحيو پيكربندي كنترل. است دشوار گاه بسياري بر قالب،نمبت ها در زمان طراحي در اين فصل، به ايجاد

و پاسخ. خواهيم پرداخت دهي به رويدادها، همواره در زمان اجرا به اجرا البته، متدهاي فراخوان.آيند درمي

property ها مقيدسازي به دادههاي

اي كه قابليت پايه( را DataSourceIDو DataSourceهاي property،ها هاي مقيد به داده تمام كنترلمي مقيدسازي به داده مي)گذارند ها را در اختيار تا(ستاه property بيشتر همينو. نندك عرضه

آن)شان در سلسله مراتب جايگاه به، كه مي هاي مقيد به دادهلعنوان كنترها را .كند ها مطرح

و اعتبارسنجي هاي مقيد به داده كنترل/ فصل شانزدهم 491 ها

DataSource propertyهاي اي را كه واسط، هر شيءIEnumerable يا IListSourceكند، را اجرا ميو ArrayListكه،DataViewو DataTable مانند،ADO.NETءاين، البته، نه تنها شامل اشيا. پذيرد مي ها

Hashtable مي تنظيم كنيم، بايد مقيدسازي به مستقيماًرا DataSource property اگر،اما. شود ها، نيز،به داده آن14هايي كه در فصل تكنيكبه كمكو(صورت دستي ها را . صورت دهيم)ها اشاره كرديم به.كنند استفاده ميDataSourceID property از هاي اين فصل، تماماً مثال

DataSourceID propertyة، رشتID متعلق به كنترل Data Sourceكه زماني. پذيرد را ميproperty تنظيم بهها، بدون هاي مقيد به داده، تمام كنترلگرديد ها اخذ ها را از منبع داده هيچ كد اضافي، داده نيازسويه پشتيباني از مقيدسازي يكGridViewو DetailsView ،FormViewهاي، كنترلهمچنين. كنند ميبهها، بدونآن.كنند مي مي ها به منبع داده هيچ كد اضافي، تغييرات را از كنترل نياز .آورند ها پس

Listهاي درك كنترل

ListControlبه نمونهتوان مستقيماً نميبنابراين( انتزاعي استة، خود يك رد اما،)وجود آورداي از آنASP.NETر پنج كنترل را تعريف مي مي پايهةدكند كه از اين ميهمچنين. آيند اي هاي خاص توان كنترل،

مي(خود را، نيز، در كنترل. تعريف نمود)آيند كه از اين رده عبارتند NET Framework.هاي تعريف شده:از

BulletedList CheckBoxList DropDownList ListBox RadioButtonList

و توسع،ها اين كنترلةهم و رويدادهاي property اما،ندااي پايهListControlة ادامه ها، متدهاو رفتار استاندارد اين يا آن كنترل خاص است ةرداز اين رو، مثالً. ديگرشان مرتبط با نمايش

BulleteList ،BulletStyle propertyمي را عرضه مي ن الفباي تصويري كردتوان ازآن براي مشخص كند، كه)glyph (ش رد. ده در كنار هر مورداستفاده نمودنمايش داده ListBox ،SelectionModeةدرحالي كه،

propertyميك را عرضه مي مي كنترل از انتخابسازد ند، كه مشخص .كند يا خير هاي متعدد پشتيباني

Listهاي ايجاد كنترل

مي Listهاي كنترل ردتوان را ،نيز، درةمانند هر هاي استفاده از تكنيك، با NET Framework. كنترلو اجرا به وجود آورد استاندارد، در زمان در زمان طراحي، كافي است كنترل را به سطح.هاي طراحي

و نمون . جديدي از رده به وجود آوريدةطراحي صفحه بكشيد؛ در زمان اجرا، متغيري را اعالم نموده

Microsoft ADO.NET 2.0 492گام به گام با

ابزارةها در جعب جاگذاري كنترلةتغيير گزين

. باز كنيد2005در ويژوال استوديو مايكروسافترا Chapter 16 - Startسايتوب.1و سپس برروي Solution Explorer در Default.aspxدر صورت لزوم، برروي.2 دوبار كليك كرده،

. كليك كنيدDesignةدكمVisual Web Designer،مي .گذارد فرم را در نماي طراحي به نمايش

3.Options را از منويToolsة انتخاب، گرHTML Designer و . را انتخاب كنيدCSS Positioning را باز،بر راي كنترل كردن مكان كنترلب روي را برCSS Positioningةروي صفحه، الزم است گزينها

absoluteتنظيم كنيد . Change positioning to the following for controls add using the”عنواناگر تاكنون قاب كنترل تحت.4

Toolbox, paste, or darg and drop “كه انتخاب،توجه داشته باشيد. انتخاب نشده، آن را انتخاب كنيد .گزيده نيز هست باشد، كه پيشAbsolutely Positionedقاب فهرست

. كليك كنيدOKبرروي.5

و اعتبارسنجي هاي مقيد به داده كنترل/ فصل شانزدهم 493 ها

Visual Web Designer در ListBoxايجاد يك كنترل

. ابزار به داخل صفحه بكشيدة جعبStandardة از زبانListBoxيك كنترل.1Visual Web Designer،مية كنترل را به گوش .كند باالي سمت چپ صفحه اضافه

چپ.2 . آن را مطابق تصوير زير تنظيم كنيدة موجود كشيده، اندازDetailsViewكنترل را به سمت

Verificationاگر قاب گفتگوي. تغيير دهيدlbCategoriesبهراكنترل) Properties ،)IDةدر پنجر.3

Results ظاهر شد، برروي OKكليك كنيد .

Listهاي پيكربندي كنترل

آنة پاية توسط ردListهاي اي تمام كنترل طور كه ديديم، قابليت پايههمان ، ListControlها، انتزاعيبرةرد. شود تعريف مي و DataSource ،DataSourceIDهاي دسازي به دادههاي مقيproperty پايه، عالوه

DataMember ،property مي16-1هاي پيكربندي مندرج در جدول .كند را نيز عرضه ListControlهاي پيكربندي 16property-1جدول

propertyشرح ها

AppendDataBoundItems افة ضميم،ها سازد اقالم در منبع داده مشخص مي زوده اقالم ايستاي. بشوند يا خيرItemsشده به مجموعه

DataTextField مي ستون منبع داده شود، مشخص ها را، كه در فهرست نشان داده.سازد مي

Microsoft ADO.NET 2.0 494گام به گام با

propertyشرح ها

DataTextFormatString بندي مورداستفاده براي فرمت كردن مقادير فرمتةرشتDataTextFieldها، پيش از نمايش دادن آن.

DataValueField هاي مربوطه را، كه توسط دادهستون منبعSelectedValue property مي باز مي پس داده .سازد شود، مشخص

Items ء اشياةمجموعListItemآيند، كه توسط كنترل به نمايش درمي.

SelectedIndex مبتني بر صفر مورد انتخاب شده در كنترلةنماي .

SelectedItem ListItemانتخاب شده .

SelectedValue مقدارDataValueFieldبه متعلقListItem.

AppendDataBoundItems property،كه امكان تركيب اقالم منبع داده هاي مربوطه را به اقالم ايستاييمي افزودهItemsةصورت دستي به مجموعبه آنةگزيد، كه مقدار پيشpropertyاين. گذارد ايد، در اختيار

Falseميژه، زمانيوي است، به را به فهرست بازيابي شده از Allمانند ) generic(خواهيد مقادير عام كه.ها اضافه كنيد، بسيار مفيد است منبع داده

DataTextField propertyمي رشته را پذيرد، كه ستوني در منبع داده اي را كه قرار است در كنترل(هاميمقادير موج. يابدمي)به نمايش درآيد به ود در اين ستون را صورت اختياري، با تنظيم توان

DataTextFormat propertyفرمتي كه با نگارشة برروي رشت )syntax ( متدString.Format ،سازگاري دارد امكان مشخص كردن يك مقدار ستون را، سواي آنچه به كاربر نشان داده DataValueField. فرمت نمودآن، زماني كه propertyاين. دهد شده، مي كه به كاربر نشان داده شده كار الزم است با فيلد ديگري به جز

.كنيد، مفيد است-، كه بهListItemءاي است از اشيات كه شامل مجموعه اسItems، البته، List كنترل propertyترين مهمها براساس ListItem باشد،ها مقيد به دادهListاگر كنترل. كنترل به نمايش درخواهند آمدةوسيلبه هاي منبع داده رديف ميهاي مربوطه مي. آيند وجود آن همچنين، دستي نيز به صورتبهراها توان

AppendDataBoundItemsبسته به مقدار-دو تكنيك اين طور كه ديديم، همان. مجموعه اضافه نمود

property -ًجايگزين يكديگر نيستند لزوما .property SelectedIndexبه كنترل متعلقListمبتني بر صفرة، نماي ListItemدر جارية انتخاب شد

در را مشخص ميItemsةمجموع . انتخاب شده استListItem خود SelectedItemحالي كه سازد،SelectedValue تنها Value propertyبه متعلقListItemمي انتخاب شده را باز .دهد پس

اصلي را property است، چهار List، كه نمايانگر اقالم به نمايش گذاشته شده در كنترل ListItemةردهايشان از نامSelectedو Enabledهاي propertyوظايف . Valueو Enabled ،Selected ،Text:ندك عرضه مي

و اعتبارسنجي هاي مقيد به داده كنترل/ فصل شانزدهم 495 ها

نListبندي است، كه در كنترل فرمتة حاوي رشتText property. پيداست مايش درخواهد آمد، درحالي به.شود تعريف ميDataValueField property حاوي مقدار ستون است كه توسط Value propertyكه

Visual Web Designer در ListBoxپيكربنديو براي به نمايش درآوردن منوي آن برروي،lbCategories ListBox، برروي Form Designerدر.1

SmartTagس و . را انتخاب كنيدChoose Data Sourceپس كليك كرده،

Visual Web Designer،ويزارد Data Source Configurationآورد را به نمايش درمي.. را انتخاب كنيدsqlCategories، باز كرده را Select Data Sourceقاب فهرست.2بر را ميRefresh Schemaاگر پيوند.3 .روي آن كليك كنيدبينيد،

بر:يهتوص .شود كه اسامي فيلدها در دسترس قرار گيرند موجب ميRefresh Schemaكليك كردن

را انتخاب CategoryName را گسترش داده، Select A Data Field To Display In قاب فهرست.4به گزيده را، بامقدار پيش Select A Data Field For The Value Of The ListBoxقاب فهرست.كنيد اش،

.حال خود واگذاريد

Microsoft ADO.NET 2.0 496گام به گام با

. كليك كنيدOKرويبر.5 True را به lbCagtegories ،AutoPostBack property مربوط به قاب فهرست Propertiesةدر پنجر.6

.تغيير دهيدبر يش صفحه در مرورگر پيشبراي نما.7 . فشار دهيدF5روي كليد گزيده،

.مرورگر را ببنديد.8

و اعتبارسنجي هاي مقيد به داده كنترل/ فصل شانزدهم 497 ها

Listكاربرد متدهاي كنترل

مي- ClearSelection– تنها يك متد ListControlة پايةرد تمام Selected property، كه نمايد را عرضهListItem ةهاي موجود در مجموعItems كنترل را برروي Falseهاي مشخصي ردهمياناز. كند تنظيم مي

را تعريف-GetSelectedIndices- يك متد اضافي ListBoxشوند، تنها كنترل حاصل ميListControlكه از مي را بازIntegerاي از مقادير، آرايهGetSelectedIndices. كند مي هم پس اقالم برگزيدهةدهد، كه نمايانگر. استListBoxدر

ويژوال بيسيك : ListBoxهاي برگزيده در ListItem بازيابي

برةبراي به نمايش درآوردن صفح.1 ك كد پشت صحنه در ويرايشگر كد، . فشار دهيدF7ليد رويبه.2 : اضافه كنيدbtnShowSelection_Click event handlerسطور زير را

Dim currSelection As Int32() currSelection = lbCategories.GetSelectedIndices() tbMessages.Text = currSelection(0).ToString()

و integerةاين بخش از كد، يك آراي پس داده شده توسط متد سپس آن را برروي مقدار باز را اعالم،GetSelectedIndicesعضو آرايه در قاب متن)و تنها(سطر آخر، نخستين. كند تنظيم ميMessage را به

.گذارد نمايش مي. فشار دهيدF5گزيده، برروي كليد براي به نمايش درآوردن صفحه در مرورگر پيش.3و سپس برروي Categoriesموردي را در قاب فهرست.4 . كليك كنيدShow Selection انتخاب،

ASP.NETمورد برگزيده را در قاب متنة نماي Messageگذارد به نمايش مي..مرورگر را ببنديد.5

Microsoft ADO.NET 2.0 498گام به گام با

سي: ListBoxهاي برگزيده در ListItem بازيابي شارپ ويژوال

كةبراي به نمايش درآوردن صفح.1 . فشار دهيدF7د، برروي كليد كد پشت صحنه در ويرايشگربه.2 : اضافه كنيدbtnShowSelection_Click event handlerسطور زير را

Int32[] currSelection; currSelection = lbCategories.GetSelectedIndices(); tbMessages.Text = currSelection[0].ToString();

بر را اعالintegerةاين بخش از كد، يك آراي و سپس آن را روي مقدار بازپس داده شده توسط متد م،GetSelectedIndicesعضو آرايه در قاب متن)و تنها(سطر آخر، نخستين. كند تنظيم ميMessage را به

.گذارد نمايش مي. فشار دهيدF5گزيده، برروي كليد براي به نمايش درآوردن صفحه در مرورگر پيش.3و سپس برروي Categories موردي را در قاب فهرست.4 . كليك كنيدShow Selection انتخاب،

ASP.NET،مورد برگزيده را در قاب متنة نماي Messageگذارد به نمايش مي..مرورگر را ببنديد.5

Listپاسخ دادن به رويدادهاي كنترل

مي،ListControlة پايةرد شد16-2كند، كه درجدول دو رويداد را عرضه ،BulletedListةرد. انده ذكرمي-Click-يرويداد ديگر مي را نيز عرضه پيوندي درفهرست كليكةدهد كه دكم كند، كه زماني رخ

.كنند هاي پايه اضافه نمي قابليتي را به قابليت،Listهاي كنترلساير. شود مي

و اعتبارسنجي هاي مقيد به داده كنترل/ فصل شانزدهم 499 ها

ListControl رويدادهاي16-2جدول

شرح رويداد

SelectedIndexChangedميزم و برگشتة كه نماي،دهد اني روي ها برگزيده در بين رفت.كند تغيير مي

TextChanged كه،دهد زماني روي ميText propertyو برگشت ها در بين رفت.كند تغيير مي

پس دهنده باز شوند، كه صفحه به سرويس توجه داشته باشيد كه رويدادها تنها زماني آغاز مي EnableViewState، كه قرار است آغاز شود، الزم است ListControl براي هر رويداد.فرستاده شود

property متعلق به كنترل برروي Trueگزيده است اين مقدار پيش. تنظيم شود.

ويژوال بيسيك : SelecteIndexChangedپاسخ به رويداد

به.1 : اضافه كنيدlbCategories_SelectedIndexChanged event handlerدر ويرايشگر كد، سطر زير را

tbMessages.Text = lbCategories.SelectedItem.Text

. فشار دهيدF5گزيده، برروي كليد براي نمايش صفحه در مرورگر پيش.2. انتخاب كنيدCategoriesموردي را در قاب فهرست.3

ASP.NET،نام مورد برگزيده را در قاب متن Messagesذاردگ به نمايش مي.

.مرورگر را ببنديد.4

Microsoft ADO.NET 2.0 500گام به گام با

سي: SelecteIndexChangedپاسخ به رويداد شارپ ويژوال

به.1 : اضافه كنيدlbCategories_SelectedIndexChanged event handlerدر ويرايشگر كد، سطر زير را

tbMessages.Text = lbCategories.SelectedItem.Text;

. فشار دهيدF5روي كليدبرگزيده، يش صفحه در مرورگر پيشبراي نما.2. انتخاب كنيدCategoriesموردي را در قاب فهرست.3

ASP.NET،نام مورد برگزيده را در قاب متن Messagesگذارد به نمايش مي.

.مرورگر را ببنديد.4

هاي مبتني بر قالب درك كنترل

هاي ظروفي براي كنترل، در اينكه جملگيGridViewو DataList ،DetailsView ،FormViewهاي كنترل(روند ديگر هستند، مركب به شمار مي ، نيز، با وجود آنكه از DataListاين موضوع در مورد كنترل.

و طرح كنترل.) صادق است نيست، CompositeDataBoundControlة پايةاعقاب رد كه محتوا هاييآن كنترل خو هاي مركب مذكور ميدها را در مي) templates(ها دهند، توسط قالب جاي .شود تعريف

وب است، كه در داخل كنترل مركبةدهند هاي سرويسو كنترلHTML عناصرةقالب، همان مجموعشدبه به، بهFormViewهاي مبتني بر قالب، مانند برخي از كنترل. نمايش گذاشته خواهند طور كامل

مي قالبةوسيل بر، يك ساختار پايهDetailsViewحالي كه ديگران، ماننددر. شوند هايشان تعريف ايو تنها براي برخي از بخش مي محتوياتشان تحميل نموده، .كنند هاي آن از قالب استفاده

و اعتبارسنجي هاي مقيد به داده كنترل/ فصل شانزدهم 501 ها

انواع قالب

خو متفاوتاي، مجموعه16-3هر كنترل مبتني بر قالب، مطابق جدول ها را عرضه از قالبدو ويژه.ندك مي

هاي مبتني بر قالب ترلكن16-3جدول

ها قالب كنترل

DataList HeaderTemplate

FooterTemplate

ItemTemplate

AlternatinItemTemplate

SelectedItemTemplate

EditItemTemplate

SeparatorTemplate

DetailsView HeaderTemplate

FooterTemplate

PagerTemplate

EmptyDataTemplate

FormView HeaderTemplate

FooterTemplate

PagerTemplate

ItemTemplate

EmptyDataTemplate

EditItemTemplate

InsertItemTemplate

GridView EmptyDataTemplate

PagerTemplate

Microsoft ADO.NET 2.0 502گام به گام با

ميهمان ازة مجموع،هاي مبتني بر قالب گرچه هر يك از كنترلاتوان ديد، طور كه از جدول متفاوتير قالب ميها هم برخي تفاوتعليرغمو. وجود دارد نيز در خود توجهيپوشانيهماماكند،ا عرضه ةها،

. اي يكساني در هر كنترل بر عهده دارند، وظايف پايه16-4انواع قالب، مطابق جدولها انواع قالب16-4جدول

شرح قالب

HeaderTemplate كند بخش سرنويس را تعريف مي.

FooterTemplate كند بخش پانويس را تعريف مي.

PagerTemplate آمده را تعريفةهاي پيمايش دركنترل تحت صفح بخش حاوي كنترل .كند مي

ItemTemplate آيد، تعريف هاي انتخاب نشده به نمايش درمي رديفي را، كه براي داده.كند مي

AlternatinItemTemplateانتخاب نشده به نمايش هاي يك در ميان رديفي را، كه براي داده مي درمي .كند آيد، تعريف

EmptyDataTemplat به ها فاقد هر گونه داده رديفي را، كه زماني كه منبع داده اي استمي نمايش درمي .كند آيد، تعريف

SelectedItemTemplate آيد، تعريف هاي انتخاب شده به نمايش درمي رديفي را، كه براي داده.كند مي

EditItemTemplate آيد، هاي در حال ويرايش به نمايش درمي رديفي را، كه براي داده.كند تعريف مي

InsertItemTemplate آيد، تعريف هاي در حال درج به نمايش درمي رديفي را، كه براي داده.كند مي

SeparatorTemplate مي ها به نمايش درمي بخشي را، كه بين رديف داده .دكن آيد، تعريف

هاي مبتني بر قالب ها به كنترل اضافه كردن قالب

GridViewو DetailsViewهاي براي مثال، كنترل. نيازمند قالب نيستند،هاي مبتني بر قالب كنترلةهممي گزيده داراي ساختارهاي پيش شان، مورداستفاده ها براي تعريف كردنن ايجاد قالبتوان بدو اند، كه

به، بهFormViewها، مانندلساير كنتر. قرار داد مي قالبةوسيلطور كامل و هايشان تعريف الزم شوند،يكحدها را به نمايش گذارند، كه بتوانند دادهاست، پيش از آن . تعريف كنيمItemTemplateاقل

و اعتبارسنجي هاي مقيد به داده كنترل/ فصل شانزدهم 503 ها

و ويرايش قالب بر. سرراست استبسيارها در زمان طراحي، فرآيندي فرآيند ايجاد روي كافي استو قالبي را كه ميEdit Templatesنترل كليك راست،ك خواهيد با آن كار كنيد، را از منوي زمينه انتخاب،

ةهم. گذارد داري را در داخل كنترل به نمايش ميlabel قاب Visual Web Designerسپس،. انتخاب نماييددر كه به قاب اضافه ميHTML وب يا عناصرةدهند هاي سرويس كنترل اين قاب گنجانده خواهند شوند،.شد

آن توانيد، با اعالم كردن كنترل همچنين مي و عناصر در داخل عناصر قالب، هر ها ها را ايجاد كنيد،هم. چند كه در اينجا به بررسي اين تكنيك نخواهيم پرداخت هاي اعالم شده در درون كنترلةبراي مثال،

ازبه، <ItemTemplate></ItemTemplate>عنصر نشان داده شده براي اقالم ItemTemplateصورت بخشي.آيند اي انتخاب نشده درمي داده

DataList در كنترل ItemTemplate ويرايش

Smart Tag كليك كرده، منوي Default.aspxةروي زبان برpage designerبراي به نمايش درآوردن.1و سپdlProducts DataListرا براي . را انتخاب كنيدEdit Templatesس نشان داده،

Visual Web Designer ،ItemTemplateگذارد را در كنترل به نمايش مي.

2.caption وlabel بهرا . حذف كنيددارند، CategoryID، كه اشاره

Microsoft ADO.NET 2.0 504گام به گام با

اب را انتخEnd Template Editingرا به نمايش درآورده،) نه قالب(DataList براي Smart Tagمنوي.3.كنيد

Visual Web Designerنمايش را روزآمد سازيد ،.

مقيد كردن كنترل در داخل يك قالب

به برخالف كنترل ميهايي كه خود به خود مييآيند، هنگامي كه كنترلي را به قالب وجود كنيد، الزم اضافهبه ها به داده است مقيدسازي در. دهيدآشكار انجامصورت ها را با،Visual Web Designerاين كار

كه انجام ميFieldsاستفاده از قاب گفتگوي كنترلة را از منوي زمينEdit Data Bindingsشود، كه زماني.آيد كنيد، به نمايش درمي انتخاب مي

هر، ميFieldsدر قاب گفتگوي ها در منبع دادهي به فيلدبه كنترل را مستقيماً متعلقpropertyتوانيم ذكر كرديم، از عبارتي براي14كه در فصل ) syntax( يا، با كمك گرفتن از نگارشي.مقيد سازيم

.ها استفاده كنيم به داده) custom(مقيدسازي دلخواه

ها مقيد كردن كنترل قالب به منبع داده

و سپس dlProducts DataList را براي Smart Tagمنوي.1 را Edit Templates به نمايش درآوريد،.انتخاب كنيد

و caption (SupplierID( پس از عنوان label را براي كنترل Smart Tagمنوي.2 به نمايش درآوريد،.نيدك را انتخاب Edit DataBindingsسپس

Visual Web Designer قاب گفتگوي ،DataBindingsرا به نمايش درآوريد . Refresh Dataاگر قاب گفتگوي. روي آن كليك كنيدبر به نمايش درآمده،Refresh Schemaاگر پيوند.3

Schemaروي ظاهر شده، برOKكليك كنيد .و راBound Toقاب فهرست.4 . را انتخاب كنيدSupplierIDباز،

Visual Web Designer عبارت ،Custom Bindingمي را به .آورد وجود

و اعتبارسنجي هاي مقيد به داده كنترل/ فصل شانزدهم 505 ها

. كليك كنيدOKبرروي.1و سپس درآورده به نمايش dlProducts DataListبراي راSmart Tagمنوي.2 ،End Template Editing

.كنيدرا انتخاببر پيشبراي نمايش صفحه در مرورگر.3 . فشار دهيدF5روي كليد گزيده،

ASP.NET ،Supplier ID را در Data Listگذارد به نمايش مي.

.مرورگر را ببنديد.4

ها DataControlFieldدرك

DetailsView وGridViewهاي در موقعيت هاي داده هايي كه چگونگي نمايش رديف يك، از قالب، هيچبر در عوض، اين دو كنترل ساختمان شبكه. نمايند كنند، پشتيباني نمي مختلف را تعريف مي مانندي را

مي داده و براي نمايش داده ها تحميل رد هاي واقعي، از كنترل كنند، DataControlFieldةهاي حاصل از.آورند استفاده به عمل مي

از رده مي. اند ذكر شده16-5 در جدول DataControlFieldهاي حاصل توانيد البته، اگر الزم باشد،. داشته باشيدDataControlFieldازراانواع فيلد كنترل دلخواه خود

Microsoft ADO.NET 2.0 506گام به گام با

از رده16-5جدول DataControlFieldهاي حاصل

شرح رده

BoundField گذارد متن را به نمايش مي.

ButtonField مي دكمه .گذارد اي را به نمايش

CheckBoxField گذارد قاب كنترلي را به نمايش مي.

CommandField و-ها اي با داده هايي را كه كارهاي پايه دكمه انتخاب، ويرايش، درجمي-حذف مي صورت .گذارد دهند، به نمايش

HyperLinkField ميف .گذارد راپيوندي را به نمايش

ImageField گذارد تصويري را به نمايش مي.

TemplateField گذارد محتواي دلخواه را به نمايش مي.

ها DataControlFieldپيكربندي

و رويدادها كه متعلق propertyازرااي خاص خود مجموعه،هر نوع مشتق از انواع فيلد كنترل - ها، متدهابهعنصر واسط به نوع مينمايش داده شده براي كاربرند، ، ButtonFieldبراي مثال،. گيرد كار

ButtonType propertyكه را عرضه مي بهكند، اي كه قرار است براي نمايش دادن عنوان نوع دكمه آن رااز. كنيم مورداستفاده قرار گيرد، تعريف مي بيشتر اين . Linkو Button ،Imageمقادير احتمالي عبارتند

property با سرراستبسيارها بدين ترتيب،. هاي كنترل استاندارد از همان هستندpropertyو متناظر. هستندCheckBoxهاي property از همان نوع CheckBoxFieldهاي property، مثالً

استفاده قرار موردDataGridو DetailsView براي هر دو كنترل DataControlFieldهاي رده:تذكرمي از آنجا كه واسطاماگيرند، مي از هاي متفاوتي از سوي اين دو كنترل عرضه هاي propertyشوند،

است كاربرد DataControlFieldهايي كه براي كنترلي كه شامل Property. كنند يكساني پشتيباني نمي.شوند ندارد، به سادگي ناديده گرفته مي

هاي كدام متناظر با كنترل، كه هيچTemplateFieldو CommandFieldهاي ند از رده عبارتءدو استثنا. وب نيستندةدهند استاندارد سرويس

CommadField DataControlField از مجموعهCommandFieldةرد مي ها را عرضه ميpropertyاي آن كند، كه كه توان از ها براي كنترل اين

در جدول،CommandFieldةويژهاي Property. به نمايش درآيند، استفاده نمودها هاي دادهكدام فرمان.اند ذكر شده6-16

و اعتبارسنجي هاي مقيد به داده كنترل/ فصل شانزدهم 507 ها

CommandFieldهاي 16property-6جدول

property شرح

ButtonType ها براي نمايش نوع دكمه.

CancelImageUrl URLة تصويري براي نمايش جهت دكمcancel.

CancelText ةعنوان دكمcancel.

DeleteImageUrl URLة تصويري براي نمايش جهت دكمdelete.

DeleteText ةعنوان دكمcancel.

EditImageUrl URLة تصويري براي نمايش جهت دكمedit.

EditText ةعنوان دكمedit.

InsertImageUrl URLة تصويري براي نمايش جهت دكمinsert.

InsertText ةعنوان دكمinsert.

NewImageUrl URLجديدة تصويري براي نمايش جهت دكم .

NewText جديدةعنوان دكم .

SelectImageUrl URLة تصويري براي نمايش جهت دكمselect.

SelectText ةعنوان دكمselect.

ShowCancelButton ةسازد دكم مشخص ميcancelآيد يا خير به نمايش درمي.

ShowDeleteButton ةسازد دكم مشخص ميdeleteآيد يا خير به نمايش درمي.

ShowEditButton ةسازد دكم مشخص ميeditآيد يا خير به نمايش درمي.

ShowInsertButton ةسازد دكم مشخص ميinsertآيد يا خير به نمايش درمي.

ShowSelectButton ةسازد دكم مشخص ميselectآيد يا خير به نمايش درمي.

UpdateImageUrl URLة تصويري براي نمايش جهت دكمupdate.

UpdateText ةعنوان دكمupdate.

ميهمان مي propertyتوان ديد، طور كه ميآن: گيرند ها در دو گروه قرار كنند هايي كه مشخصمي دكمه و گروهي كه مشخص به كنند چنين دكمه اي جهت انجام يك عمل چگونه به نمايش درآيد، اي

تصوير يا عنوان را URLترتيب، بهaction>Text>و action>ImageUrl>هاي دكمه. نمايش درآيد يا خير.كنند مشخص ميproperty،با تنظيم نظر نمايش مورد ButtonType propertyاگر. شود مشخص ميButtonType ،Image باشد، از متن Link يا ButtonType ،Buttonاگر. شود استفاده ميaction>ImageUrl property>باشد، از

.شود براي عنوان دكمه استفاده ميaction>Text property>موجود در

Microsoft ADO.NET 2.0 508گام به گام با

و همان را قبول ميBoolean است، كه مقادير Show<action>Buttonها، property ديگرةمجموع - كند،نةسازد دكم طور كه از نامش پيداست، مشخص مي كه. مايش درآيد يا خير اقدام مربوطه به توجه كنيد

، تنها پس از آن كه كاربر يكي از Updateةدكم. نيستShowUpdateButton propertyدر اينجا، اثري از و تنها راه تكميل اقدام مذكور است اقدامات ديگر را انتخاب نمود، به نمايش در مي .آيد،

الEditبراي مثال، اگر كاربر به را انتخاب كند، وجود آمده، زم است براي متعهد شدن به تغييراتUpdateكه. را انتخاب نمايد از تنها زماني به نمايش درميUpdateاز آنجا هاي دكمهآيد كه يك يا چندتا

و بايد در طول اقدام)شان فعال گردد اقدامات(ديگر به نمايش درآيند هاي مذكور نمايش داده شوند،،. غيرضروري استUpdateButton propertyوجود

DatailsViewاضافه كردن فيلد دكمه به كنترل

را Add New Field را نمايش داده، سپس dvCategoryDetails متعلق به كنترل Smart Tagمنوي.1.انتخاب كنيد

Visual Web Designer قاب گفتگوي ،Add Fieldدهد را نمايش مي.2.CommandField در قاب فهرست Choose A Field Type و سپس قاب كنترل ،Edit/Update را انتخاب

.كنيد

. كليك كنيدOKبرروي.3Visual Web Designer،ة يك دكمEdit به DataViewكند اضافه مي.

ن.4 بر پيشگرمايش صفحه در مروربراي . فشار دهيدF5روي كليد گزيده،

و اعتبارسنجي هاي مقيد به داده كنترل/ فصل شانزدهم 509 ها

برربر.5 و سپس .يك كنيد كلEditةروي دكموي موردي در قاب فهرست،ASP.NET ،Category Details را در وضعيت )mode (مي .گذارد ويرايش به نمايش

. كليك كرده، سپس مرورگر را ببنديدCancelرويبر.6

TemplateField DataControlField DataControlField متناظر نيست،ي نوع كنترل استانداردبا هيچ ديگر، كه TemplateFieldةرد. است

TemplateField،براي نمايش محتواي دلخواه )custom (محتويات. طراحي شده استTemplateField،مي، توسط قالباز نامش پيداستطور كه همان از انواع قالب زير TemplateField.دنشو ها تعريف

:كند پشتيباني مي�AternatingItemTemplate �EditItemTemplate �FooterTemplate �HeaderTemplate �InsertItemTemplate �ItemTemplate و، در زمان طراحي، با استفاده از تكنيكTemplateFieldهاي قالب هاي استاندارد ويرايش قالب، ايجاد

مي. شوند پيكربندي مي بههاي جديدي از هر كدام از انواع فيلد توان نمونه در زمان اجرا، وجود كنترل.زود افFieldsةآورده، به مجموع

Microsoft ADO.NET 2.0 510گام به گام با

DetailsView به كنترل TemplateFieldافزودن

. را انتخاب كنيدAdd New Field به نمايش درآورده، dvCategoryDetails را براي Smart Tagمنوي.1Visual Web Designer قاب گفتگوي ،Add Fieldآورد را به نمايش درمي.

و فيلد را انتخChoose A Field ،TemplateFieldدر قاب فهرست.2 Sampleروي را برHeader Textاب،

Template Field تنظيم كنيد.. كليك كنيدOKرويبر.3

Visual Web Designer،به .كند اضافه ميDetailsView رديف را. را انتخاب كنيدEdit Templatesو سپس Smart Tag منوي مجدداً.4

Visual Web Designer ،ItemTemplateميبه متعلق .گذارد كنترل قالب جديد را به نمايش.به قالب اضافه كنيد را Sample كليك كرده، متن Item Templateدر.5

و سپس dvCategoryDetails را براي Smart Tag منوي مجدداً.6 ،End Template Editing را انتخاب .كنيد

Visual Web Designerم .گذاردي، متن را در رديف كنترل قالب به نمايش

هاي اعتبارسنجي درك كنترل

.NET Frameworkمي از شماري كنترل ها كند، كه جهت اعتبارسنجي داده هاي اعتبارسنجي پشتيبانينظ اند، پيچيده ذكر شده16-7هاي اعتبارسنجي فرم وب، كه در جدول كنترل. كاربرد دارند شانيراتر از

مي كه تنها پيامErrorProvider هاي كنترل-در فرم ويندوز . هستند-گذارد هاي خطا را به نمايشمي هاي فرم وب بررسي كنترل به هاي اعتبارسنجي را انجام داده، هر پيام خطايي را كه حاصل شود،

.گذارند نمايش مي

و اعتبارسنجي هاي مقيد به داده كنترل/ فصل شانزدهم 511 ها

هاي اعتبارسنجي كنترل16-7ل جدو

شرح كنترل

CompareValidator ث ابت يا محتويات كنترل محتويات كنترل درونداد را با يك مقدار.كند ديگري مقايسه مي

CustomValidator كند محتويات كنترل درونداد را براساس منطق دلخواه بررسي مي.

RangeValidator كند محتويات كنترل درونداد در بين حدود بااليي يا پاييني،ميچك.ها باشند، قرار گيرند ها، ارقام، يا تاريخ كه ممكن است نويسه

RegularExpressionValidatorكند محتويات كنترل درونداد با الگوي مشخص شده توسطميچك.يك عبارت معمول مطابقت داشته باشند

RequiredFieldValidator كند كنترل درونداد حاوي يك مقدار باشد تضمين مي.

ValidationSummary كند خطاها را خالصه مي.

تنها يك شرط را در يك كنترل، موسوم به كنترل درونداد، موردبررسي قرار،هر كنترل اعتبارسنجيمي. دهد مي توان چندين كنترل اعتبارسنجي را به يك كنترل درونداد واحد براي بررسي چندين شرط،

به وضع اغلب چنين است، به ويژه به اين دليل كه تمام كنترل. نسبت داد ، RequiredFieldValidatorءجزها،ميك .كنند نترل خالي را معتبر تلقي

هاي اعتبارسنجي، كه به كنترل درونداد معيني نسبت داده شرايط مشخص شده توسط كنترل شرايط بايد احراز شوند، واال كنترل نامعتبر تلقي همة-دشون منطقي تركيب ميANDاند، به كمك شده

توان از كنترلمي، طقي تركيب شوند منOR شرايط اعتبارسنجي با شوداگر الزم. خواهد شدCustomValidator كرد براي بررسي دستي مقدار استفاده.

مي پشتيباني كند، اعتبارسنجي در سمت سرويسDHTMLاگر مرورگر از و گيرنده صورت پذيرد،شدفرم وب، تا زماني ده گيرن چه اعتبارسنجي در سمت سرويس. كه شرايط احراز نشده، عرضه نخواهد

. دهنده رخ خواهد داد شود، در سمت سرويس پردازش ميClickكه رويداد رخ دهد يا خير، همواره، زمانيمي، براي اعتبارسنجي محتويات كنتهمچنين به رل با استفاده از كد، Validateصورت دستي متد توان

.متعلق به آن را فراخواندك ) هاي يا كنترل(نترل درونداد در اختيار كنترل پس از آنكه صفحه اعتبارسنجي شد، محتويات

بر متعلقIsValid property،اعتبارسنجي، كه محتويات را آزموده كنند، تنظيم ميFalseروي به كنترل را، نيز، Page متعلق به شيء IsValid propertyاگر كنترلي برروي صفحه نامعتبر باشد،. گيرندمير قرا

مي. شود تنظيم ميFalseبرروي كدتوانيم اين شرايط را ، هر اقدامي را كه الزم چك كرده به كمك.دانيم، در پيش گيريم مي

Microsoft ADO.NET 2.0 512گام به گام با

به صفحه RequiredFieldValidatorافزودن كنترل

ابزار به سطح طراحةبه جعب متعلقValidationة را، از زبانRequiredFieldValidatorيك كنترل.1.صفحه بكشيد

. بكشيدMessages راست قاب متنةكنترل را به باالي گوش.2

Missing Value ،ControlToValidate را برروي Properties ،ErrorMessage propertyةدر پنجر.3

property را بر روي tbMessages و ،ID propertyروي را برIsMissingتنظيم كنيد .بر يش صفحه در مرورگر پيشبراي نما.4 . فشار دهيدF5روي كليد گزيده،. كليك كنيدSubmitةروي دكمبر.5

ASP.NETگذارد پيام خطا را به نمايش مي.

.ورگر را ببنديدمر.6

و اعتبارسنجي هاي مقيد به داده كنترل/ فصل شانزدهم 513 ها

اگر اين كار مناسب سبك. تنظيم كرديمAbsolute را برروي CSS Positiongهاي در اين فصل، گزينه:تذكرمي تان نيست، نويسي برنامه HTMLة، باز كردن گرTools از منوي Optionsتوانيد، با انتخاب اكنون

Designer انتخاب ،CSS Positioning و پاك كردن قاب كنترل ،Change Positioningًآن را تنظيم، مجددا .كنيد

خالصه

ها طراحي، كه به ويژه براي مقيد شدن به دادهASP.NETوبةدهند هاي سرويس كنترلبادر اين فصل،و آن را مقيد ساختيم، قالبListBoxيك كنترل. آشنا شديماند، شده DataViewو DataListهاي را ايجاد

و فيلدهاي مقيد به. هاي جديدي اضافه نموديم به دادهرارا ويرايش كرديم، همچنين، نگاه سريعيو مثالي از ASP.NETهاي اعتبارسنجي مورد پشتيباني كنترل ، كه مانع RequiredFieldValidator انداختيم،. نموديممالحظهبران فيلدهاي خالي ارائه دهند، شود كار مي

پنجمبخش

NET.ADOهاو ديگر انواع داده:در اين بخش

و نوشتن: هفدهمفصل XMLخواندن XmlDataDocument: هجدهمفصل NET Framework. در ADOXو ADOكاربرد: نوزدهمفصل

هفدهمصلف

و نوشتن XMLخواندن:در پايان اين فصل، خواهيد توانست

. بازيابي كنيدDataSet را از XMLطرح�ازب� .وجود آوريد بهDataSet طرح،ReadXmlSchemaا استفاده. استنباط كنيدXMLطرحي را از يك سند�. را بارگذاري كنيدXMLهاي، دادهReadXmlبا استفاده از�.وجود آوريد بهXML، طرح WriteXmlSchemaبا استفاده از�. بنويسيدXMLها را برروي يك سند داده�

و ADO.NET خود از تعامل بين رسيدر اين فصل، بر Extensible Markup Language مايكروسافت)XML ( را، با نگاهي به ساختمان طرح)schema (XML و متدهايDataSet -و نوشتن كه از خواندن

مي-كنند پشتيباني ميXMLهاي ها از يك جريان داده داده .كنيم آغاز

با شتيباني گستردهپ، مايكروسافتNET Framework.:تذكر آورد، كه شرح به عمل ميXMLاي از كار DataSetو XMLدر اين فصل، تنها به بررسي واسط بين. اين كتاب استةبيشتر آن در خارج از حوصل

ADO.NETخواهيم پرداخت .

Microsoft ADO.NET 2.0 516گام به گام با

XMLهاي درك طرح

توان از طرحميهمچنين،. پردازد ميXMLهاي، سندي است كه به تعريف ساختمان دادهXMLطرحXML )براي اعتبارسنجي فايل) اطالعاتي دارد كه شباهت زيادي به طرح بانك XMLاستفاده نمود .

از،XMLطرح ، از لحاظ XSD. شود تعريف ميXML Schema Definition Language (XSD) با استفادهمي) layout( رونگار HTML، در حالي كه اما. داردHTMLساختماني، شباهت به XSDكند، سند را تعريف

و محتواي داده مي به تعريف ساختمان .پردازد ها

چنانآن–)World Wide Web Consortium)W3Cة با توصي،NET Framework. در XMLهاي طرح:تذكرا. سازگارند- آمدهhttp://www.w3.org/2001/XML Schemaكه در ين طرح كه براي پشتيباني عناصر ديگر

با طرح تعريف-هاDataRelationو DataSetمانند-شوند به كار گرفته ميNET Framework.ء اشيااز( سازگاري دارندurn:schemas-microsoft-com:xml-msdataدر شده W3Cة با توصيهاهاين الحاقي.

و از سازگارند، نيكنند، ها پشتيباني نمي كه از آنXMLهايگرلتحليآن دسته آنكاري .)ها ندارندز با

و خصوصيت،XMLهاي طرح مي) attributes(ها به زبان عناصر و. شوند تعريف عناصرو اغلب ها بسيار به يكديگر شبيه خصوصيت ميبهمترادف يكديگراند، روند، هر چند كه برخي كار

و تمايزها تفاوت :وجود دارندنيز هان عناصر مي� معنا كه اند، بدين ها همواره اتمي يز در بر گيرند؛ خصوصيتتوانند اقالم ديگري را

.توانند شامل اقالم ديگري باشند نميمي ها رخ دهند؛ خصوصيت بار در دادهتوانند چندين عناصر مي� .توانند يكبار رخ دهند ها تنها روينيمعيتواند تصريح كند كه عناصر بايد به ترتيب، ميxs:sequence>tag>ةطرح، با استفاد�

مي دهند؛ خصوصيت .توانند رخ دهند ها، به هر ترتيبييكه اينب(ها، كه عناصر غيرقابل جمع xs:choice>tag>توان در داخل تنها عناصر را مي� معنا كه

.سازند، جاي داد را مشخصمي) تواند روي دهدو تنها يك عنصر ميسو توان با استفاده از انواع تعريف عناصر را مي� هاي كاربر تعريف نمود؛ خصوصيتشده از

.هاي توكار هستند محدود به انواع دادهوهاي خام طبق قرارداد، عناصر براي داده استفاده مورد) metadata(ها ها جهت فراداده خصوصيت،

مياما. گيرنديمقرار مي بيشتر به هدف آنكهازتوانيم، .خورد، استفاده كنيم مانو خصو به صيتعناصر مي، دادهدخوةكه به نوب-صورت نوع ها سازد، كه عنصر هايي را مشخصمييا خصوصيت مذ آن كور به تواند مي-صورت معتبر در خود داشته باشدها را هاي طرح. شوند تعريف

XMLكنند از دو نوع پشتيباني مي:.Booleanساده، كه عبارت است از مقادير اتمي مانند رشته يا�و خصوصيتمركب،� .اند ديگر، با هر تركيبي، تشكيل شدهيها كه از عناصر

و نوشتن/ فصل هفدهم XML 517خواندن

و خصوصيت مي عناصر به ها، صورت اختياري، نامي را تعريف كنند كه معرف عنصر تعريف توانندبا نميXMLهاي عناصر نام. شده باشد شروع شوند، يا فضاهاي خالي XML يا حروف خود ارقامتوانند

myNameو MyName اسامي بنابراين است، XML ،case sensitiveه داشته باشيد كه توج. داشته باشندميكليبه .شوند متفاوت تلقي

ويژوال استوديو مايكروسافت. شوند ذخيره ميXSDهاي متني با پسوند در فايل،XMLهاي طرح، در اختيار XML Schema Editor، به نام XMLهاي يك واسط كاربر تصويري براي ايجاد طرح،2005براي اطالعات بيشتر. با نوشتن كد خواهيم پرداختXMLهاي در اين فصل، به كار با طرح. گذارد مي

.MSDN Help رجوع كنيد به XMLويرايشگر طرح دربارة

XMLو ADO.NETدرك

.NET Framework،و دادهة مجموع با كاملي از اسناد مي در اختXMLها را براي كار كردن . گذارد يارو ردهXmlWriterو XmlReaderءاشيا آن، و اعتبارسنجي هايي كه از اعقاب ها هستند، قابليت خواندن

هاآنةهاي مربوطو ردهXmlSchemaو XmlDocumentءاشيا. گذارند را در اختيار ميXMLاختياري رد هستند، درXMLنمايانگر خود Extensible Stylesheet Language از XslTransformationةحالي كه

(XSL) Transformation (XSLT)رد پشتيباني مي و XML Pathهاي در استعالمXPathNavigatorةكند،

Language (XPath)كاربرد دارد .باة، عالوه بر ارائXMLاستاندارد و سريالي XMLهاي داده قابليت كار ، نقش اساسي در انتقال

در داده) serialization(كردن صحنه در بيشتر موارد، اين اتفاقات در پشت. داردNET Framework.ها XMLهاي با استفاده از طرحADO.NETها در Typed DataSet پيش از اين ديديم كه امادهند، روي مي.شوند ارائه مي

. خواهيم پرداختXmlDataDocument دربارة، به بررسي18در فصل

و نوشتن دادهDataSet ADO.NETةرد و طرح، نيز، پشتيباني مستقيمي از خواندن به XMLهاي هادر رابطهDataSetو XMLهاي گاه كردن داده قابليت همXmlDataDocument. آورد عمل مي ADO.NETاي

از گذارد، كه امكان كار كردن با تنها يك مجموعه از داده را در اختيار مي و ابزارهاي XMLها، با استفادهمي رابطه .ها خواهيم پرداخت در اين فصل، به كنكاش در برخي از اين تكنيك. دهد اي، را به ما

DataSet XMLكاربرد متدهاي

.NET Frameworkهاي ها را، كه امكان كار كردن مستقيم با داده اي از رده مجموعهXMLدهد، را مير.ندك عرضه مي هاي سازي، فيلترگذاري يا بازيابي رديف اي مانند ذخيره ابطهاگر نيازمند انجام عمليات

ميه مكانيسم سادDataSetمرتبط هستيم، از مقيدسازي XMLهاي، ردههمچنين. گذارد تري را در اختيارها به كاربران را داريد، اگر قصد نمايش دادهبنابراينكنند، هاي ويندوز پشتيباني نمي ها در فرم به دادها . استفاده كنيدDataSet XMLز متدهاي بايد

Microsoft ADO.NET 2.0 518گام به گام با

و XMLهاي موجود در سلسله مراتب ها، به شكل داده معيني از دادهةخوشبختانه، پردازش مجموع ، در اين فصل در ادامهطور كه همان. نافي يكديگر نيستند،اي رابطهDataSetها به صورت پردازش آنمXmlDocumentخواهيم ديد، ةها را، با استفاده از يك يا هر دو مجموع اي از داده جموعه امكان كار با

.دهد ابزار، به ما مي

GetXmlSchemaو GetXmlمتدهاي

GetXmlSchemaو GetXmlشوند، پشتيباني ميDataSet، كه از سوي XMLترين متدهاي شايد سرراستنصورت مقدار را، بهXSD يا طرح XMLهاي هستند، كه تنها داده مي رشتهوعي از .دهند، بازپس

ويژوال : GetXmlSchema با استفاده از DataSet Schemaبازيابي

بيسيك

بر جديدي از ويژوال استودة را در نمونChapter 17 - Startةپروژ.1 و در صورت روي يو باز كرده،XmlForm.vb در Solution Explorerدوبار كليك كنيد .د،ويژوال استوديو .كند باز ميForm Designerر فرم را

. كليك كنيدF7براي نمايش ويرايشگر كد برروي كليد.2به.3 : اضافه كنيدbtnShowSchema_Click event handlerسطور پايين را

Dim xmlStr As String xmlStr = dsAdoSbs.GetXmlSchema()

و نوشتن/ فصل هفدهم XML 519خواندن

tbResults.Text = xmlStr

كلةبراي اجراي برنام.4 . فشار دهيدF5يد كاربردي، بررويمية اصلي برنامة پنجر،ويژوال استوديو .گذارد كاربردي را به نمايش

. كليك كنيدGetXmlبرروي.5.گذارد را به نمايش ميGetXml كاربردي فرمةبرنام

. كليك كنيدShow Schemaرويبر.6

Microsoft ADO.NET 2.0 520گام به گام با

.گذاردمي را در قاب متن به نمايش DataSet كاربردي، طرحةبرنام

. كاربردي را ببنديدةو برنامGetXmlفرم.7

ويژوال : GetXmlSchema با استفاده از DataSet Schemaبازيابي

شارپ سي

بر جديدي از ويژوال استودة را در نمونChapter 17 - Startةپروژ و در صورت لزوم، روي يو باز كرده،XmlForm.cs در Solution Explorerكنيد دوبار كليك .

در،ويژوال استوديو .كند باز ميForm Designer فرم را

و نوشتن/ فصل هفدهم XML 521خواندن

كد.8 . كليك كنيدF7روي كليدبر،براي نمايش ويرايشگربه.9 : اضافه كنيدbtnShowSchema_Click event handlerسطور پايين را

string xmlStr; xmlStr = dsAdoSbs.GetXmlSchema(); tbResults.Text = xmlStr;

. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.10 مية اصلي برنامة پنجر،ويژوال استوديو .گذارد كاربردي را به نمايش

Microsoft ADO.NET 2.0 522گام به گام با

. كليك كنيدGetXmlرويبر. 11.گذارد را به نمايش ميGetXml كاربردي فرمةبرنام

. كليك كنيدShow Schemaبرروي. 12.گذارد را در قاب متن به نمايش ميDataSet كاربردي، طرحةبرنام

. كاربردي را ببنديدةو برنامGetXmlفرم. 13

و نوشتن/ فصل هفدهم XML 523خواندن

ويژوال بيسيك : GetXml با استفاده از DataSetهاي بازيابي داده

به.1 : اضافه كنيدbtnShowData_Click event handlerدر ويرايشگر كد، سطور پايين را

Dim xmlStr As String taCategories.Fill(dsAdoSbs.Categories) xmlStr = dsAdoSbs.GetXml() tbResults.Text = xmlStr

برةبراي اجراي برنام.2 . فشار دهيدF5روي كليد كاربردي،. كليك كنيدGetXmlرويبر.3

.گذارد را به نمايش ميGetXml كاربردي، فرمةبرنام. كليك كنيدShow Dataبرروي.گذارد را در قاب متن به نمايش ميXMLهاي كاربردي، دادهةبرنام

و برنام.4 . كاربردي را ببنديدةفرم5.GetXml Form Designerويرايشگر كد را ببنديدةو پنجر .

Microsoft ADO.NET 2.0 524گام به گام با

سي: GetXml با استفاده از DataSetهاي بازيابي داده شارپ ويژوال

: اضافه كنيدbtnShowData_Click event handlerسطور پايين را به در ويرايشگر كد،.1

string xmlStr; taCategories.Fill(dsAdoSbs.Categories); xmlStr = dsAdoSbs.GetXml(); tbResults.Text = xmlStr;

برةبراي اجراي برنام.2 . فشار دهيدF5روي كليد كاربردي،. كليك كنيدGetXmlبرروي.3

.گذارد را به نمايش ميGetXml كاربردي، فرمةمبرنا. كليك كنيدShow Dataرويبر.4

.گذارد را در قاب متن به نمايش ميXMLهاي كاربردي، دادهةبرنام

و برنام.5 . كاربردي را ببنديدةفرم6.GetXml Form Designerويرايشگر كد را ببنديدةو پنجر .

و نوشتن/ فصل هفدهم XML 525خواندن

ReadXmlSchemaمتد

مير راباXML ياXSDتعريف طرحاز حاصل ReadXmlSchema ،DataSetمتد ، ReadXmlSchema. كند گذاريمي17-1مطابق تصوير را، رشته)stream(توان جريانمي. كند، از چهار روايت پشتيباني اي كه نام فايل

. را در اختيار متد قرار دادXmlReader يا شيء TextReaderيابد، مي ReadXmlSchema متد17-1تصوير

شرح متد

ReadXmlSchema(stream) يك طرحXML را، از شيء Streamخواند مشخص، مي.

ReadXmlSchema(string) يك طرحXMLشده در پارامتر را، از فايل مشخص.خواند رشته، مي

ReadXmlSchema(textReader) يك طرحXML را، از TextReaderخواند، مي.

ReadXmlSchema(xmlReder) يك طرحXML را، از XmlReaderخواند، مي.

ReadXmlSchemaو، ستونهاكند؛ بلكه تنها جدول اي را بارگذاري نمي، هيچ داده ها constraintهاو روابط( مي) كليدها حاوي اطالعات مربوط به طرح DataSet در حال حاضراگر. نمايد را بارگذاري

و، ستونهاهست، در صورت لزوم، جدول اگر. هاي جديد به طرح فعلي افزوده خواهند شدconstraintهاو تناقض باشد، متد DataSetاي در طرح در حال خوانده شدن با طرح شده شيء تعريف فعلي در تضاد

ReadXmlSchema خواهد كرد اعالم خطا.

طرح نيست، قرار گيرد،، كه حاوي اطالعات مربوط به XML در اختيار ReadXmlSchema متد اگر:تذكر.خواهد بوداستنباط متد از طرح براساس قواعد اشاره شده در بخش بعد

ويژوال : ReadXmlSchema با استفاده از DataSet Schemaايجاد

بيسيك

. دوبار كليك كنيدReadingWritingXml.vb، بر روي Solution Explorerدر.1در،ويژوال استوديو .گذارد به نمايش ميForm Designer فرم را

Microsoft ADO.NET 2.0 526گام به گام با

كد.2 . فشار دهيدF7 برروي كليد،براي نمايش ويرايشگربه.3 : اضافه كنيدbtnReadSchema_Click event handlerسطور پايين را

Dim newDS As DataSet newDS = New DataSet() newDS.ReadXmlSchema("masterSchema.xsd") daCategories.Fill(newDS.Tables("Categories")) daProducts.Fill(newDS.Tables("Products")) SetBindings(newDS)

يك را جديد بهUntyped DataSetاين بخش از كد، نخست با فراخواندن،وجود آورده، سپس طرح آنReadXmlSchema براساس طرح XSD كه در فايل masterSchemaمذكور،فايل. كند تعريف شده، تثبيت مي

پ دbin\Debugةوشدر از. داردجاييركتوري پروژها در هاي موجود براي data adapterآنگاه، روالدر بارگذاري داده را براي مقيد ساختن scaffolding (SetBindings( كمك گرفته، متد داربستي DataSetها

به كنترل .خواند جديد فراميDataSetهاي روي فرم. فشار دهيدF5برروي كليد كاربردي،ةبراي اجراي برنام.4. كليك كنيدRead Schemaبرروي.5

از كاربردي، دادهةبرنام مي جديد در كنترلDataSetها را .گذارد هاي فرم به نمايش

و نوشتن/ فصل هفدهم XML 527خواندن

. كاربردي را ببنديدةبرنام.6

ويژوال : ReadXmlSchema با استفاده از DataSet Schemaايجاد

شارپ سي

. دوبار كليك كنيدReadingWritingXml.cs، بر روي Solution Explorerدر.1در،ويژوال استوديو .گذارد به نمايش ميForm Designer فرم را

كد.2 . فشار دهيدF7 برروي كليد،براي نمايش ويرايشگربه.3 : اضافه كنيدbtnReadSchema_Click event handlerسطور پايين را

DataSet newDS; newDS = new DataSet(); newDS.ReadXmlSchema("masterSchema.xsd"); daCategories.Fill(newDS.Tables["Categories"]); daProducts.Fill(newDS.Tables["Products"]); SetBindings(newDS);

يك جديد به وجود آورده، سپس طرح آن را با فراخواندن Untyped DataSetاين بخش از كد، نخستReadXmlSchemaاساس طرح برXSD كه در فايل ،masterSchemaفايل. كند تعريف شده، تثبيت مي

دbin\Debugة در پوشمذكور، از. يركتوري پروژه قرار داردا در هاي موجود data adapterآنگاه، روال

Microsoft ADO.NET 2.0 528گام به گام با

در براي بارگذاري داده را براي مقيد scaffolding (SetBindings( كمك گرفته، متد داربستي DataSetهابه ساختن كنترل .خواند جديد فراميDataSetهاي روي فرم

. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام. كليك كنيدRead Schemaبرروي.4از كاربردي، دادهةبرنام.5 مي جديد در كنترلDataSetها را .گذارد هاي فرم به نمايش

. كاربردي را ببنديدةمرناب.6

InferXmlSchemaمتدرد متعلق،InferXmlSchemaمتد كه، استXMLهاي از ساختمان دادهDataSet حاصل طرح،DataSetةبهمي17-2طور كه در جدول همان. اند اختيار آن قرار گرفتهدر داراي InferXmlSchemaكنيد، مشاهده

اما، عالوه. ها اشاره كرديم است، كه در بخش گذشته به آنReadXmlSchemaهمان منابع دروندادي متدپذيرد، كه الزم است هنگام ايجاد طرح ها را نيز ميnamespaceهايي كه نمايانگر اي از رشته ها، آرايه بر آن

DataSetناديده گرفته شود . InferXmlSchema متد17-2جدول

شرح متد

InferXmlSchema(stream, nsArray) طرحي را ازStream مشخص، با ناديده گرفتن namespace ة رشتةشده در آراي هاي مشخصnsArray ،

.خواند مي

و نوشتن/ فصل هفدهم XML 529خواندن

شرح متد

InferXmlSchema(file, nsArray) فايل، با ناديدهةشده در رشت طرحي را از فايل مشخص ،nsArrayة رشتةدرآرايشده مشخصهايnamespaceگرفتن.خواند مي

InferXmlSchema(textReader, nsArray) طرحي را ازTextReader مشخص، با ناديده گرفتن namespaceة رشتةشده در آراي هاي مشخصnsArray ،

.خواند مي

InferXmlSchema(xmlReader, nsArray) طرحي را ازXmlReader مشخص، با ناديده گرفتن namespaceة رشتةشده در آراي هاي مشخصnsArray ،

.خواند مي

InferXmlSchema هنگام ايجاد طرح ،DataSetمية، از مجموع :كند ثابتي از قواعد پيرويدر اگر عنصر ريشه� كه در غير اين( داراي هيچ خصوصيت يا عناصر فرزند نباشد XMLاي

مي صورت، به شكل ستون به)شوند ها استنباط .شود استنباط ميDataSetصورت،بهعناصري كه داراي خصوصي� ميهاييصورت جدولت هستند، .شوند استنباطميهاييصورت جدولعناصري كه داراي عناصر فرزند هستند، به� .شوند استنباطبه عناصري كه تكرار مي� ميواحدصورت يك جدول شوند، .شوند استنباطبه خصوصيت� مي صورت ستونها .شوند ها استنباطو تكرار نميعناصري كه داراي هيچ خصوصيت يا عناصر� به فرزندي نيستند، صورت شوند،

مي ستون .شوند ها استنباطدي استنباط شدههاييصورت جدولاگر عناصري كه به� گري قرار گيرند، كه اند، در داخل عناصر

به آن يك استنباط شدههاييصورت جدولها نيز مي بين دو جدDataRelationاند، . شود ول ايجادبهييدجدةستون كليد اولي و توسط “ TableName_Id”، موسوم به هر دو جدول اضافه شده،

DataRelationمي به يك“TableName_Id”با استفاده از ستون. شود كار گرفته ،ForiegnKeyConstraintميبههاعنوان كليد خارجي بين جدول، به .آيد وجود

فاقد عناصر فرزند باشند، اما متن اند، حاوي استنباط شدههاييصورت جدولاگر عناصري كه به�بهةمتن هر يك از عناصر، يك ستون تازبراي ميبه“ TableName_Text” موسوم .آيد وجود

در نباط شده استهاييصورت جدولاگر عناصري كه به� و داراي حاضرحالاند، حاوي متن.شود عناصر فرزند باشند، متن ناديده گرفته مي

دا تنها داده:تذكر (nested(هاي ديگر خل در دادههاي يك) سلسله مراتبي) DataRelationمنجر به ايجادهاي داخل ايجاد شده، دادهDataSetبه متعلقWriteXml كه توسط متد XMLگزيده، طور پيشبه. شوند مي

و هاي ديگر ايجاد نمي در داده از كند، و برگشت منجر به طرح يكساني DataSetاز اين رو، هر بار رفت

Microsoft ADO.NET 2.0 530گام به گام با

ميليكن، همان. نخواهد شد به متعلقNested propertyتوان با تنظيم طور كه خواهيم ديد، اين رفتار را. كنترل نمودDataRelationشيء

ويژوال بيسيك : XMLاستنباط طرح سند

به.1 : اضافه كنيدbtnInferSchema_Click event handlerدر ويرايشگر كد، سطور زير را

Dim newDS As DataSet Dim nsStr(0) As String newDS = New DataSet() newDS.InferXmlSchema("dataOnly.xml", nsStr) daCategories.Fill(newDS.Tables("Categories")) daProducts.Fill(newDS.Tables("Products")) newDS.Relations.Add("CategoryProducts", _ newDS.Tables("Categories").Columns("CategoryID"), _ newDS.Tables("Products").Columns("CategoryID")) SetBindings(newDS)

ة نمون، درحالي كه دوتاي بعدي؛كنند را اعالم ميStringو DataSetةدو سطر نخست، متغيرهاي آراياز تازه و هر دو متغير را در اختيار متد DataSetاي . دهد قرار ميInferXmlSchema به وجود آورده،

و آن را پر ميDataSet جديدي را به DataRelation كد،ةباقيماند و سپس كاركرد ابزار جديد اضافه كند،SetBindingsبه خواند، كه كنترل را فرامي . مقيد سازدDataSetها فرم را

. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.2. كليك كنيدInfer Schemaبرروي.3

مي ها را در كنترل كاربردي، دادهةبرنام .گذارد هاي فرم به نمايش

و نوشتن/ فصل هفدهم XML 531خواندن

.اربردي را ببنديدكةبرنام.4

سي: XMLاستنباط طرح سند شارپ ويژوال

به.1 : اضافه كنيدbtnInferSchema_Click event handlerدر ويرايشگر كد، سطور زير را

DataSet newDS; string[] nsStr = new string[0]; newDS = new DataSet(); newDS.InferXmlSchema("dataOnly.xml", nsStr); daCategories.Fill(newDS.Tables["Categories"]); daProducts.Fill(newDS.Tables["Products"]); newDS.Relations.Add("CategoryProducts", newDS.Tables["Categories"].Columns["CategoryID"], newDS.Tables["Products"].Columns["CategoryID"]); SetBindings(newDS);

ة نمون، درحالي كه دوتاي بعدي؛كنند را اعالم ميStringو DataSetةدو سطر نخست، متغيرهاي آراي از تازه و هر دو متغير را در اختيار متد بهDataSetاي . دهد قرار ميInferXmlSchemaوجود آورده،

Microsoft ADO.NET 2.0 532گام به گام با

و آن را پر ميDataSet جديدي را به DataRelation كد،ةباقيماند و سپس كاركرد ابزار جديد اضافه كند،SetBindingsبه خواند، كه كنترل را فرامي . مقيد سازدDataSetها فرم را

بركاةبراي اجراي برنام.2 . فشار دهيدF5روي كليد ربردي،. كليك كنيدInfer Schemaبرروي.3

مي ها را در كنترل كاربردي، دادهةبرنام .ردگذا هاي فرم به نمايش

. كاربردي را ببنديدةبرنام.4

ReadXmlمتدرد متعلق،ReadXmlمتد طور كه همان. كند ميDataSet در XMLهاي، مبادرت به خواندن دادهDataSetةبه

كند، كه ديگر از همان منابع درونداد پشتيباني ميReadXml نشان داده شده، متد17-3در تصوير آن كه پيش از اين استDataSetبه متعلقXMLمتدهاي .آشنا شديمبا

ReadXml متدهاي17-3تصوير

شرح متد

ReadXml(stream) طرحXMLها را، از شيءو دادهStreamخواند مشخص، مي.

ReadXml(string) طرحXMLمي ها را، از فايل مشخصو داده .خواند شده درپارامتر رشته،

ReadXml(textReader) طرحXMLها را، از شيءو دادهTextReaderخواند مشخص، مي.

ReadXml(xmlReader) طرحXMLها را، از شيءو دادهXmlReaderخواند مشخص، مي.

و نوشتن/ فصل هفدهم XML 533خواندن

شرح متد

ReadXml(stream,

xmlReadMode) با مشخص، آنStreamها را، از شيءو دادهXMLطرح گونه كه

XmlReadModeخواند مشخص گرديده، مي.

ReadXml(file,

xmlReadMode) آن ها را، از فايل مشخصو دادهXMLطرح گونه شده در پارامتر رشته،.خواند مشخص گرديده، ميXmlReadModeكه با

ReadXml(textReader,

xmlReadMode) با مشخص، آنTextReaderها را، از شيءو دادهXMLطرح گونه كه

XmlReadModeخواند مشخص گرديده، مي.

ReadXml(xmlReader,

xmlReadMode) با مشخص، آنTextReaderها را، از شيءو دادهXMLطرح گونه كه

XmlReadModeخواند مشخص گرديده، مي.

مي عرضه ميXmlReadMode يك پارامتر اختياري به نام ReadXmlمتد XMLكند كند، كه مشخص.اند ذكر شده17-4ول در جدXmlReadModeمقادير احتمالي. چگونه تفسير شود

XmlReadMode برشماري17-4جدول

شرح مقدار

Auto يكReadMode براساس محتويات XMLكند انتخاب مي.

ReadSchema اي برنامه يك طرح درون)inline (و سپس داده ها را بارگذاري را خوانده،مي DataTableكرده، در صورت لزوم .كند ها را اضافه

InferSchema ها استنباط اي را ناديده گرفته، طرحي را از داده برنامهنوهر طرح درو داده مي نموده، .كند ها را بارگذاري

InferTypedSchema اي را ناديده گرفته، يك طرح برنامهونردهاي طرحةمهstrongly typed را از و داده داده مي ها استنباط نموده، .كند ها را بارگذاري

IgnoreSchema در داده طرح دربارة اطالعاتةهم موجود بارگذاري نموده، DataSetها رامي برنامه درون .گيرد اي را ناديده

DiffGram اطالعاتDiffGram را در DataSetخواند موجود مي.

Fragment قطعاتXML را، كه طرح DataSet موجود را با DataSetكند مطابقت مي ،را افزوده، آن ميهايي .گيرد كه مطابقت ندارند، ناديده

مي دادهReadModeمتد در خواند، با رديف هايي را كه كند، مگر ادغام نميDataSetهاي موجودرا،اگر متد مذكور. در اختيار آن قرار گيردDiffGram متعلق به XmlReadModeكه پارامتر زماني رديفي

.دخواهد نموموجود بخواند، اعالم خطا عنوان رديف با همان كليد اوليه به

Microsoft ADO.NET 2.0 534گام به گام با

DiffGram يك فرمت ،XMLو اصلي است، كه روايت بهي عنصرهرهاي فعلي همراه هر گونه خطاي،DataRowدر اينجا، ساختار اسمي. كند، را بسته ميDiffGramاست نشان داده شده :

<diffgr:diffgram xmlns:msdata=”urn:schemas-microsoft-com:xml-msdata” xmlns:diffgr=”urn:schemas-microsoft-com:XML-diffgram-v1” xmlns:xsd=”http://www.w3.org/2001/XMLSchema”>

<ElementName> </ElementName>

<diffgr:before> </diffgr:before>

<diffgr:errors> </diffgr:errors> </diffgr:diffgram>

<ElementName></ElementName>كه در اين مثال، به صورت( واقعي، نخستين بخش DiffGramدراين بخش، حاوي روايت فعلي. استDataRow معرف complex Typeداراي نام) نشان داده شده

هاي اصلي است، درحالي كه بخش حاوي روايت<diff:before>بخش. استDataRowمحتويات <diff:errors> حاوي اطالعات مربوط به خطا براي رديف است.

به در اختيار قرار گيرد، الزم است دادهXmlReadModeعنوان پارامتر را بهDiffGramبراي آن كه هاهاي استاندارد نوشته شده، در دادهXML، كه به فرمت XMLاگر الزم شود. باشندDiffGramفرمت

و سپس فراخواندن متد DataSetاد موجود ادغام گردد، ناچار به ايج جهت DataSetبه متعلقMerge جديد.ها هستيم ادغام نمودن دو مجموعه داده

ويژوال بيسيك : ReadXml با استفاده از XMLهاي بارگذاري داده

به.1 : اضافه كنيدbtnReadData_Click event handlerدر ويرايشگر كد، سطور زير را

Dim newDS As DataSet newDS = New DataSet()

و نوشتن/ فصل هفدهم XML 535خواندن

newDS.ReadXml("data.xml", XmlReadMode.ReadSchema) SetBindings(newDS)

از اين رو، كد باال، با قرار دادن. است) inline(اي برنامه حاوي يك تعريف طرح درون،data.xmlفايلميم DataSet، به ReadXml در اختيار متد Mode.ReadSchemaپارامتر كه قرر DataSet نخست طرح دارد

و سپس داده .ندكها را بارگذاري را ايجاد كرده،. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.2. كليك كنيدRead Dataبرروي.3

مي كاربردي، دادهةبرنام .كند ها را از فايل بازيابي

راةبرنام.4 .ببنديد كاربردي

سي: ReadXml با استفاده از XMLهاي بارگذاري داده شارپ ويژوال

به.1 : اضافه كنيدbtnReadData_Click event handlerدر ويرايشگر كد، سطور زير را

DataSet newDS; newDS = new DataSet(); newDS.ReadXml("data.xml", XmlReadMode.ReadSchema); SetBindings(newDS);

Microsoft ADO.NET 2.0 536گام به گام با

از اين رو، كد باال، با قرار دادن. است) inline(اي برنامه حاوي يك تعريف طرح درونdata.xmlفايل را DataSetدهد نخست طرح دستور ميDataSet، به ReadXml در اختيار متد Mode.ReadSchemaپارامتر

و سپس داده .ندكها را بارگذاري ايجاد كرده،برةبرنامبراي اجراي.2 . فشار دهيدF5روي كليد كاربردي،. كليك كنيدRead Dataرويبر.3

مي كاربردي، دادهةبرنام .كند ها را از فايل بازيابي

. كاربردي را ببنديدةبرنام.4

WriteXmlSchemaمتد

و، ستونهاله جدولجماز– DataSetآيد، طرح برمينامش، همان طور كه از WriteXmlSchemaمتد هاconstraintمي را در برونداد مشخص-ها هاي متد، كه جملگي همان پارامترهاي ساير روايت. يسدنو شده.اند ذكر شده17-5پذيرند، در جدول را ميXMLمتدهاي

WriteXmlSchema متد17-5جدول

شرح متد

WriteXmlSchema(stream) طرحXML را در شيء Streamنويسدمييخص مش.

WriteXmlSchema(string) طرحXMLمي را در فايل مشخص .نويسد شده در پارامتر رشته

WriteXmlSchema(textWriter)طرحXML را در شيء TextWriterنويسدميي مشخص.

WriteXmlSchema(xmlWriter)طرحXML را در شيء XmlWriterنويسدميي مشخص.

و نوشتن/ فصل هفدهم XML 537خواندن

از با اسXMLايجاد طرح ويژوال بيسيك : WriteXmlSchemaتفاده

به.1 : اضافه كنيدbtnWriteSchema_Click event handlerدر ويرايشگر كد، سطور زير را

dsAdoSbs.WriteXmlSchema("testSchema.xsd") MessageBox.Show("Finished", "WriteXmlSchema")

پروژهة مربوط به پوشbin\ فرعية، فايل در پوشاز آنجا كه هيچ مسيري در اختيار متد قرار نگرفته .شود نوشته مي

برةبراي اجراي برنام.2 . فشار دهيدF5روي كليد كاربردي،. كليك كنيدWrite Schemaبرروي.3

ميةبرنام .گذارد كاربردي، پس از نوشته شدن فايل يك قاب پيام را به نمايش

و سپس خود برنام.4 . كاربردي را نيز ببنديدةقاب پيام را بسته،5.Windows Explorerو به پوش روي پيمايش نموده، برChapter 17 - Start\bin\Debugة پروژة را باز

و سپس testSchema.xsdفايل . را انتخاب كنيدNotepad كليك راست كرده،.گذارد ويندوز فايل طرح را به نمايش مي

Microsoft ADO.NET 2.0 538گام به گام با

6.Microsoft Notepadو .يژوال استوديو بازگرديد را بسته، به

سي: WriteXmlSchema بااستفاده ازXMLايجاد طرح شارپ ويژوال

به.1 : اضافه كنيدbtnWriteSchema_Click event handlerدر ويرايشگر كد، سطور زير را

dsAdoSbs.WriteXmlSchema("testSchema.xsd"); MessageBox.Show("Finished", "WriteXmlSchema");

پروژهة مربوط به پوشbin\ فرعيةز آنجا كه هيچ مسيري در اختيار متد قرار نگرفته، فايل در پوشا .شود نوشته مي

. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.2. كليك كنيدWrite Schemaبرروي.3

مةبرنام .گذاردي كاربردي، پس از نوشته شدن فايل يك قاب پيام را به نمايش

و نوشتن/ فصل هفدهم XML 539خواندن

و سپس خود برنام.4 . كاربردي را نيز ببنديدةقاب پيام را بسته،5.Windows Explorerو به پوش پيمايش نموده، برروي Chapter 17 - Start\bin\Debugة پروژة را باز

و سپس testSchema.xsdفايل . را انتخاب كنيدNotepad كليك راست كرده،ميويندوز فايل طرح را به نماي .گذاردش

6.Microsoft Notepadرا بسته، به ويژوال استوديو بازگرديد .

Microsoft ADO.NET 2.0 540گام به گام با

WriteXmlمتد

صورت اختياري، و، بهDataSet ،XMLة متعلق به ردWriteXml آمده، متد17-6طور كه در جدول همانن كه ساختما،در بخش بعد خواهيم ديد. نويسد را در يك برونداد مشخص ميDataSetاطالعات طرح

XML حاصل از متد WriteXml،توسط تنظيمات property در DataSetشود كنترل مي. WriteXml متد17-6جدول

شرح متد

WriteXml(stream) و داده .نويسد مشخص ميStream را در شيء XMLهاي طرح

WriteXml(string) و داده پارامترةوسيل را، در فايل مشخص شده بهXMLهاي طرحميةرشت .نويسد فايل،

WriteXml(textWriter) و داده .نويسد مشخص ميTextWriter را در شيء XMLهاي طرح

WriteXml(xmlWriter) و داده .نويسد مشخص ميXmlWriter را در شيء XMLهاي طرح

WriteXml(stream,

xmlWriteMode) - مشخص، آنStream يا هر دو را در شيء،XMLهاي طرح يا داده

.نويسد مشخص شده، ميXmlWriteMode پارامترةچنان كه به وسيل

WriteXml(string,

xmlWriteMode) ة به وسيل يا هر دو را در فايل مشخص شده،XMLهاي طرح يا دادهآنةپارامتر رشت XmlWriteMode پارامترةچنان كه به وسيل فايل،

.نويسد مشخص شده، مي

WriteXml(textWriter,

xmlWriteMode) دو،XMLهاي طرح يا داده مشخص، TextWriter را در شيء، يا هر

بهآن مي مشخصXmlWriteMode پارامترةوسيلچنان كه .نويسد شده،

WriteXml(xmlWriter,

xmlWriteMode) دو،XMLهاي طرح يا داده XmlWriter را در در شيء، يا هربهچنانمشخص، آن مشخص XmlWriteModeوسيله پارامتر كه

.نويسد شده، مي

شود موجب ميDiffGramپارامتر. اند ذكر شده17-7 در جدول XmlWriteModeپارامترهاي معتبر مشخص نشده باشد، XmlWriteModeاگر هيچ پارامتر. نوشته شودDiffGramبرونداد به فرمت

WriteSchemaشود پذيرفته مي.

و نوشتن/ فصل هفدهم XML 541خواندن

XmlWriteMode برشماري17-7جدول

شرح مقدار

IgnoreSchema مي تنها داده .نويسد ها را

WriteSchema و يك طرح درون داده مي برنامه ها .نويسد اي را

DiffGram كلDataSet را به فرمت DiffGramنويسد مي.

ويژوال بيسيك : XMLها در يك فايل به فرمت نوشتن داده

به.1 : اضافه كنيدbtnWriteData_Click event handlerدر ويرايشگر كد، سطور زير را

daCategories.Fill(dsAdoSbs.Categories) daProducts.Fill(dsAdoSbs.Products) dsAdoSbs.WriteXml("newData.xml", XmlWriteMode.IgnoreSchema) MessageBox.Show("Finished", "WriteXml")

ميةبه پوش متعلقbin\ةفته، فايل درپوشازآنجا كه مسيري دراختيار متد قرارنگر .شود پروژه نوشته. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.2. كليك كنيدWrite Dataبرروي.3

ميةبرنام .گذارد كاربردي، پس از نوشته شدن فايل، قاب پيامي را به نمايش

Microsoft ADO.NET 2.0 542گام به گام با

و سپس خود برنام.4 .ردي را ببنديد كاربةقاب پيام را بسته،در.5 رفته، Chapter 17 - Start\bin\Debugة پروژة به پوشWindows Explorerدر صورت لزوم،

. دوبار كليك كنيدdata.xmlبرروي فايلمي در مرورگر پيشXMLفايل .شود گزيده باز

.مرورگر را بسته، به ويژوال استوديو بازگرديد.6

ف نوشتن داده سي: XMLرمت ها در يك فايل به شارپ ويژوال

به.1 : اضافه كنيدbtnWriteData_Click event handlerدر ويرايشگر كد، سطور زير را

daCategories.Fill(dsAdoSbs.Categories); daProducts.Fill(dsAdoSbs.Products); dsAdoSbs.WriteXml("newData.xml", XmlWriteMode.IgnoreSchema); MessageBox.Show("Finished", "WriteXml");

ميةبه پوش متعلقbin\ةازآنجا كه مسيري دراختيار متد قرارنگرفته، فايل درپوش .شود پروژه نوشته. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.2. كليك كنيدWrite Dataبرروي.3

و نوشتن/ فصل هفدهم XML 543خواندن

مي كاربردي، پس از نوشته شدن فايل، قاب پيامةبرنام .گذاردي را به نمايش

و سپس خود برنام.4 . كاربردي را ببنديدةقاب پيام را بسته،در.5 رفته، Chapter 17 - Start\bin\Debug پروژهة به پوشWindows Explorerدر صورت لزوم،

. دوبار كليك كنيدdata.xmlروي فايل برمي در مرورگر پيشXMLفايل .شود گزيده باز

ر.6 .ا بسته، به ويژوال استوديو بازگرديدمرورگر

Microsoft ADO.NET 2.0 544گام به گام با

XMLكنترل چگونه نوشته شدن

با طور پيش، بهWriteXmlمتد ها DataColumnو complex-Typeهاي داراي ساختار DataTableگزيده،آنبه مي بهXMLها، عنوان عناصر داخل همان بروندادي باشد كه اساساًاين، ممكن است. آورد وجود.خواهيد مي

در خواهيد داده اگر، براي مثال، مي - روابط صحيحي بهADO.NET بخوانيد، DataSetها را دوبارهها شرطي كه در بسياري موقعيت-وجود نخواهد آورد، مگر آن كه طرح وجود داشته باشد

به يا داده-غيرضروري است . گنجانده شوندXMLصورت سلسله مراتبي در هاي مرتبطبهدر مواق صورت عناصر، خصوصيات يا عي، نير، ممكن است الزم باشد كنترل كنيد اين يا آن ستون

براي مثال،. ها شويد بخواهيد مانع نوشتن برخي ستونمتن ساده نوشته شده يا خير، يا حتي اصالًميةها با برنام هنگامي كه به تبادل داده .پردازيد، وضع از اين قرار است كاربردي ديگري

Nested propertyبه متعلقDataRelation

گزيده رفتار پيش) overrides(كند كه برفراز را عرضه ميDataRelation ADO.NET ،Nested propertyةردWriteXmlشود قرار گرفته، موجب ميDataRow هاي فرزند در داخل والدين نوشته شده، ساختمانبهسلسله مرا يا را ميNested property. استReadXmlوجود آورند، كه موردنياز تبي توان در زمان اجرا

DataRelations، در قاب گفتگوي DataSet Designer در propertyاين. تنظيم نمودDataSet Designerدر .شود عرضه مي

ويژوال بيسيك : DataRelationبه متعلقNested propertyكاربرد

به.1 : اضافه كنيدbtnWriteNested_Click event handlerدر ويرايشگر كد، سطور زير را

daCategories.Fill(dsAdoSbs.Categories) daProducts.Fill(dsAdoSbs.Products) dsAdoSbs.Relations("CategoryProducts").Nested = True dsAdoSbs.WriteXml("nestedData.xml", XmlWriteMode.IgnoreSchema) MessageBox.Show("Finished", "WriteXml Nested")

كد .كند تنظيم ميTrue نوشتن آن در فايل، برروياز را، پيشNested property،اينبرةبراي اجراي برنام.2 . فشار دهيدF5روي كليد كاربردي،. كليك كنيدWrite Nestedرويبر.3

.آوردش درمي كاربردي، پس از نوشته شدن فايل، قاب پيامي را به نمايةبرنام

و نوشتن/ فصل هفدهم XML 545خواندن

و سپس خود برنام.4 . كاربردي را ببنديدةقاب پيام را بسته،5.Windows Explorerة پروژة را باز كرده، به پوشChapter 17 - Start\bin\Debug رفته، برروي فايل

nestedData.xmlدوبار كليك كنيد .مي در مرورگر پيش،XMLفايل .شود گزيده باز

. به ويژوال استوديو بازگرديدمرورگر را بسته،.6

Microsoft ADO.NET 2.0 546گام به گام با

سي: DataRelation متعلق بهNested propertyكاربرد شارپ ويژوال

به.1 : اضافه كنيدbtnWriteNested_Click event handlerدر ويرايشگر كد، سطور زير را

daCategories.Fill(dsAdoSbs.Categories); daProducts.Fill(dsAdoSbs.Products); dsAdoSbs.Relations["CategoryProducts"].Nested = true; dsAdoSbs.WriteXml("nestedData.xml", XmlWriteMode.IgnoreSchema); MessageBox.Show("Finished", "WriteXml");

كد براز را، پيشNested property،اين .كند تنظيم ميTrueروي نوشتن آن در فايل،بر كاربردةبراي اجراي برنام.2 . فشار دهيدF5روي كليد ي،. كليك كنيدWrite Nestedرويبر.3

.آورد كاربردي، پس از نوشته شدن فايل، قاب پيامي را به نمايش درميةبرنام

و سپس خود برنام.4 . كاربردي را ببنديدةقاب پيام را بسته،Windows Explorerة پروژة را باز كرده، به پوشChapter 17 - Start\bin\Debug ،روي فايلبر رفته

nestedData.xmlدوبار كليك كنيد .مي در مرورگر پيش،XMLفايل .شود گزيده باز

و نوشتن/ فصل هفدهم XML 547خواندن

.مرورگر را بسته، به ويژوال استوديو بازگرديد.5

كنترل نگاشت ستون

ColumnMapping property،رد متعلق را WriteXml چگونگي نوشتن ستون توسط متد،DataColumnةبه.اند آمده17-8 در جدول ColumnMappingمقادير احتمالي. كند كنترل مي

ColumnMapping property مقادير17-8جدول

شرح مقدار

Element ستون همچون يك عنصرXMLشود نوشته مي.

Attribute ستون همچون يك خصوصيتXMLشود نوشته مي.

SimpleContent متمحتويات ستون به ميصورت .شوندن نوشته

Hidden ستون در بروندادXMLگنجانده نخواهد شد .

Elementراةگزيد، مقدار پيش DataTable نمايانگر complexType عنصري در داخل عنوانبه، ستونكه؛نويسد مي را، Attribute درحالي ميعنوانبهستون طور، بهHiddenمقدار. نويسد يكي از خصوصيات

ميكلي مي. شود مانع از نوشته شدن ستون يك اين سه مقدار را درهم DataTableتوان آزادانه در داخل.آميخت

Microsoft ADO.NET 2.0 548گام به گام با

SimpleContentمي را، كه ستون را به كه توان با ستون نويسد، نمي صورت يك مقدار متني ساده هاييهم. شوند، تركيب نمود همچون عناصر يا خصوصيات نوشته مي يك متعلقNested propertyو اگر به

DataRelationدهد، برروي، كه به جدول ارجاع ميTrueتوان از آن استفاده نمود تنظيم شده باشد، نمي .

ويژوال بيسيك: ها همچون خصوصيات نوشتن ستون

به.1 : اضافه كنيدbtnAttributes_Click event handlerدر ويرايشگر كد، سطور زير را

daCategories.Fill(dsAdoSbs.Categories) With dsAdoSbs.Categories .Columns("CategoryID").ColumnMapping = MappingType.Attribute .Columns("CategoryName").ColumnMapping = MappingType.Attribute .Columns("Description").ColumnMapping = MappingType.Attribute End With dsAdoSbs.WriteXml("attributes.xml", XmlWriteMode.IgnoreSchema) MessageBox.Show("Finished", "Write Attributes")

و اجراي برنامه.2 . فشار دهيدF5، برروي كليد براي ذخيره كردن. كليك كنيدAttributesبرروي.3

بهةبرنام مي كاربردي، پس از نوشته شدن فايل، قاب پيامي را .گذارد نمايش

و نوشتن/ فصل هفدهم XML 549خواندن

و سپس خود برنام.4 . كاربردي را ببنديدةقاب پيام را بسته،روي فايل رفته، برChapter 17 - Start\bin\Debugة پروژة، به پوشWindows Explorerدر.5

attributes.xmlدوبار كليك كنيد .مي در مرورگر پيش،XMLفايل .شود گزيده باز

وي.6 .ژوال استوديو بازگرديدمرورگر را بسته، به

سي: ها همچون خصوصيات نوشتن ستون شارپ ويژوال

به.1 : اضافه كنيدbtnAttributes_Click event handlerدر ويرايشگر كد، سطور زير را

daCategories.Fill(dsAdoSbs.Categories); dsAdoSbs.Categories.Columns["CategoryID"].ColumnMapping = MappingType.Attribute; dsAdoSbs.Categories.Columns["CategoryName"].ColumnMapping = MappingType.Attribute; dsAdoSbs.Categories.Columns["Description"].ColumnMapping = MappingType.Attribute; dsAdoSbs.WriteXml("attributes.xml", XmlWriteMode.IgnoreSchema); MessageBox.Show("Finished", "Write Attributes");

Microsoft ADO.NET 2.0 550گام به گام با

و اجراي برنامه.2 ب براي ذخيره كردن . فشار دهيدF5روي كليدر،. كليك كنيدAttributesرويبر.3

ميةبرنام .گذارد كاربردي، پس از نوشته شدن فايل، قاب پيامي را به نمايش

و سپس خود برنامقا.4 . را ببنديد كاربرديةب پيام را بسته، attributes.xmlروي فايل رفته، برChapter 17 - Start\bin\Debugة پروژة، به پوشWindows Explorerدر.5

.دوبار كليك كنيدمي در مرورگر پيش،XMLفايل .شود گزيده باز

.مرورگر را بسته، به ويژوال استوديو بازگرديد.6

و نوشتن/ فصل هفدهم XML 551خواندن

خالصه

ة پيدا كرده، سپس نگاهي به متدهايي كه ردXML ساختار فايل طرحاب، آشنايي مختصريفصلدر اينDataSetو نوشت براي باز . كند، انداختيم عرضه ميXMLهايو طرحXMLهاي دادهةپس دادن، خواندن

مي را بازDataSet از XMLهاي، ارائهGetXmlSchemaو GetXmlديديم كه چگونه متدهاي . دهند پس)GetXml مي ها را باز داده تنها كه پس مي را بازXML طرح GetXmlSchemaدهد، درحالي .) دهد پس

آنمتدهاي خواندن متناظر ازها با مي بهDataSet، كه ReadXmlSchemaو ReadXml عبارتند آورند، وجودعرضه را InferXmlSchema، همچنين، DataSet. كنندميرگذاري باXMLها يا طرح يا آن را با جريان داده

، متدهاي سرانجام. كند استنباط ميXMLهاي بر اساس ساختمان دادهDataSetنمايد، كه يك طرح ميWriteXml وWriteXmlSchemaهاي، دادهXML يا يك طرح XML از DataSetمي را باز اين. دهند پس

در، دادهGetXmlSchemaو GetXmlمتدها، برخالف متدهاي يا Stream ،TextReader ،Fileهايشان راXmlReaderسازند ماندگار مي.

، كه Nested property:، آشنا شديمDataSet از XML ايجادةهمچنين، با دو متد، براي كنترل كردن نحوDataRow مي هاي فرزند را داخل اعالن و هاي عنصر والدشان ، كه ColumnMapping propertyگنجاند؛

آنةارائكنترل ظريفي را بر چگونگي .ندك اعمال ميDataColumn اين يايا،DataSet به عنوان XMLهاي، كه امكان كار كردن با دادهXmlDataDocumentدرفصل بعد، با

DataSetهاي عنوان داده بهXMLشد را مي در بدين ترتيب، بهترين. دهد، آشنا خواهيم هاي هر دو دنيا.اختيارتان خواهد بود

هجدهمفصلXmlDataDocument

:در پايان اين فصل، خواهيد توانست

.وجود آوريد بهDataSet ،XmlDataDocumentاز�.وجود آوريد بهXmlDataDocument،DataSetاز�. پيمايش كنيد XmlDataDocument، درXML Document Object Model (DOM)با استفاده از�. را اجرا كنيدXPathهايالم، استعXmlDataDocumentدر برابر�.وجود آوريد به XmlDataDocumentي در گره��DataRow ةگراز راXmlDataDocument بازيابي كنيد .. بازيابي كنيد،DataRowاز،XmlDataDocumentةگر�

شد، است XmlDocument، كه از اعقاب XmlDataDocumentدر اين فصل، با . آشنا خواهيمXmlDocument،نماي XMLدر هاي رابطه از داده .گذارد را در اختيار ميDataSetاي موجود

XmlDataDocumentدرك

با ولي مواقعي نيز وجود دارند، كه كاركردن با دادهاي بسيار كارآمد است، هاي رابطه اگرچه مدل داده ها Extensible Stylesheet Languge (XSL) ،XSLمانند-گذارد در اختيار ميXMLاستفاده از ابزارهايي كه

Transformations (XSLT) و ،XPath -از سوي ديگر، هرچند. تر است به مراتب آسانXML و راحتباماداراي عموميت است، تر اي آسان رابطهيهاه با استفاده از مدل دادXMLهاي دادها گاه كار كردن

و فيلتركردن راحت مرتب. است و كردن سازي مناسبات پيچيده در استفاده از مدل طور كلي، مدلهب،تراز. تر است اي به مراتب ساده رابطه ، روزآمدسازي اين XMLجاي بهDataSetحتي، در صورت استفاده.تر باشد تواند آسان ميDataColumnيا آن

XmlDataDocumentبه متعلق.NET Frameworkرا در اختيار دنيادو مايكروسافت بهترين امكانات هر ميما آيد، كه از اسمش نيز برميطور است، همان XmlDocument از اعقاب XmlDataDocument.هدد قراراز. در حافظه استXML از درخت سند NET Framework.ةارائ توان، مي XmlDataDocumentبا استفاده

از( از با مجموعه)XMLبا استفاده . سلسله مراتبي كار كرديا)DataSet مانند(اي رابطهيها دادهايXmlDataDocumentبه از دادهجديدة مجموع يك وجود نميها به ايجاد ميDataSetآورد، بلكه كند، كهها وجود دارد، از آنجا كه تنها يك مجموعه از داده. دهد ارجاع ميXMLهاي تمام يا بخشي از داده

د ميتغييرات صورت پذيرفته در منابع بدين ترتيب،.دنيابر يك نما، خود به خود در نماي ديگر بازتاب

Microsoft ADO.NET 2.0 554گام به گام با

شدجويي حافظه صرفه ، چه همان طور كه در تصوير پايين نشان داده شده، تنها برروي يك خواهدمي نسخه از داده .شود ها كار

كه:مهم و تنها داده XmlDataDocument توجه به اين نكته بسيار مهم است، را بازتاب DataSet نه طرح ها.كند ديگر سرايت نميءت اعمال شده در طرح شيء، به اشياتغييرا. دهد مي

ها XmlDataDocumentايجاد

و محتوايميراهايتان دادهة منابع اوليةبست - به XmlDataDocument يك DataSetتوانيد بر اساس طرح. ايجاد كنيد XmlDataDocumentمحتويات را براساس DataSetتوانيد وجود آوريد، يا مي

XmlDataDocumentة را دراختيارسازندDataSet موجود، DataSet براساس XmlDataDocumentايجادبراي

:دهيم، به اين صورت قرار مي

myXdd = New XmlDataDocument(myDS)

مي با همچنين، ا. وجودآورد بهDataSetو شروع كردXMLسندتوان ةگزيد پيشةين كار، ازسازندبرايXmlDataDocument استفاده كرده، سپس DataSet property به اين صورت، دهيممي آن را ارجاع:

myDS = New DataSet() ‘Create DataSet Schema myDS = myXDD.DataSet

مي كن را بهDataSetكنيد، بايد طرح اگر از اين متد استفاده ها براي آنكه داده.يدصورت دستي ايجاد DataColumnو DataTable در دسترس قرار گيرند، بايد اسامي DataSet از طريق XmlDataDocumentدر

. استcase-sensitiveاين مطابقت. مطابقت داشته باشند XmlDataDocumentبا اسمو DataTableتوان، با افزودن را ميDataSetطرح صورت دستي تنظيم نمود، يا ها بهDataColumnها

. خواندXSD از طرح ReadXmlSchemaآن را از با استفاده از متد پس داده توانيد از طرح باز موجود مطابقت داشته باشد، ميDataSet با يك DataSetخواهيد اگر مي

( استفاده كنيدGetXmlSchemaشده از سوي متد استفاده DataSet.Cloneتوان از متد سفانه، نميأمت.از.) استread-onlyصورت بهXmlDataDocument DataSetنمود، چه دشوار GetXmlSchemaاستفاده را در GetXmlSchema بازپس داده شده از سويةبايد رشت. نگارش آن تاحدي پيچيده استامانيست،به در اختيار قرار ميReadXmlSchemaصورت پارامتر قرار داد، كه سپس بهStringReaderاختيار گيرد،

:اين ترتيب

XmlDataDocument 555/ فصل هجدهم

myXdd.DataSet.ReadXmlSchema(New StringReader(myDataSet.GetXmlSchema()))

ومكاما گرچه اين متد سوم تا حدي نياز به كد بيشتر دارد، بيش انيسمي را براي ايجاد نمايي كمب. در اختيار مي گذاردXMLهاي اي از داده رابطه . نيستDataSet در XMLه كپي كردن كل طرح نيازيدر DataColumnها يا DataTableةهم به سادگي DataSet موجود نيستند، در طول عمليات DataSetها كه

.شوند ناديده گرفته ميمي داده ةهم.دكر، بارگذاري)synchronization(سازي توان در هر زمان، پيش يا پس از همگاه ها راجمله افزودن، حذف يا تغيير مقادير، خود به خود در شيء ديگرازت صورت گرفته در يك شيء، تغييرا

.يابد بازتاب مي

يك همXMLايجاد يك نماي ويژوال بيسيك : DataSetگاه شده از

و در صورت Chapter 18 - Startة، پروژ2005 جديدي از ويژوال استوديوةدر نمون.1 را باز كرده،. دوبار كليك كنيدSolution Explorer در XDD.vbلزوم برروي

.گذارد به نمايش ميForm Designerويژوال استوديو فرم را در

. كليك كنيدF7براي نمايش ويرايشگر كد، برروي كليد.2به.3 :د اضافه كنيbtnCreateFromDataSet_Click event handlerسطور زير را

Dim xddFromDataSet As XmlDataDocument

Microsoft ADO.NET 2.0 556گام به گام با

xddFromDataSet = New XmlDataDocument(dsAdoSbs) xddFromDataSet.Load("AdoSbs.xml")

يكده در اختيار سازنdsAdoSbs DataSetاين بخش از كد، با قرار دادن ،XmlDataDocument را اعالن مينموده به پروژه bin\Debugة واقع در پوشdsAdoSbs.xmlرا از فايلها سپس، داده. آورد وجود

.كند بارگذاري ميبرةي برنامبراي اجرا.4 . فشار دهيدF5روي كليد كاربردي،. كليك كنيدCreate From DataSetرويبر.5

مي كاربردي دادهةبرنام و آن را در فرم به نمايش .گذارد ها را بارگذاري كرده،

. كاربردي را ببنديدةبرنام.6

يك همXMLايجاد يك نماي سي: DataSetگاه شده از شارپ ويژوال

و در صورت Chapter 18 - Startة، پروژ2005 جديدي از ويژوال استوديوةدر نمون.1 را باز كرده،. دوبار كليك كنيدSolution Explorer در XDD.vbلزوم برروي

فر.2 .گذارد به نمايش ميForm Designerم را در ويژوال استوديو

XmlDataDocument 557/ فصل هجدهم

. كليك كنيدF7براي نمايش ويرايشگر كد، برروي كليد.3به.4 : اضافه كنيدbtnCreateFromDataSet_Click event handlerسطور زير را

XmlDataDocument xddFromDataSet; xddFromDataSet = new XmlDataDocument(dsAdoSbs); xddFromDataSet.Load("AdoSbs.xml");

را اعالن XmlDataDocument در اختيار سازنده، يك dsAdoSbs DataSetاين بخش از كد، با قرار دادن مينموده به پروژه bin\Debugة واقع در پوشdsAdoSbs.xmlها را از فايل سپس، داده. آورد وجود

.كند بارگذاري مي. فشار دهيدF5 برروي كليد كاربردي،ةبراي اجراي برنام.5. كليك كنيدCreate From DataSetرويبر.6

مي كاربردي دادهةبرنام و آن را در فرم به نمايش .گذارد ها را بارگذاري كرده،

Microsoft ADO.NET 2.0 558گام به گام با

. كاربردي را ببنديدةبرنام.7

ويژوال بيسيك : XMLهاي براساس داده DataSetايجاد يك

: اضافه كنيدbtnCreateFromXdd_Click event handler كد، سطور زير را به در ويرايشگر.1

Dim xddCreateDataSet As XmlDataDocument xddCreateDataSet = New XmlDataDocument() xddCreateDataSet.DataSet.ReadXmlSchema(New _ System.IO.StringReader(dsAdoSbs.GetXmlSchema())) xddCreateDataSet.Load("AdoSbs.xml") SetBindings(xddCreateDataSet.DataSet)

را اعالن XmlDataDocument در اختيار سازنده، يك dsAdoSbs DataSetاين بخش از كد، با قرار دادن بهو نمونه مياي از آن را بازپس داده شده از سوي متدةسپس، با قرار دادن رشت. آورد وجود

GetXmlSchemaبه متعلقdsAdoSbs DataSet در اختيار يك StringReaderدر اختيار متددخوة، كه به نوب ReadXMLSchemaگيرد، طرح قرار ميXmlDataDocument DataSetكند را تنظيم مي.

AdoSbs.xmlها را از فايل، دادهDataSetو تثبيت طرح XmlDataDocumentكد مذكور، پس از ايجادرا scaffolding (SetBindings( پروژه بارگذاري كرده، سپس روال داربستي bin\Debugةواقع در پوش

به براي مقيد ساختن كنترل .خواند فراميdsAdoSbs DataSetهاي فرم. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.2

XmlDataDocument 559/ فصل هجدهم

. كليك كنيدCreate From XDDبرروي.3آن كاربردي، دادهةبرنام و مي ها را بارگذاري نموده توجه داشته. گذارد ها را در فرم به نمايشبا دادهاگرچه نيست، dsAdoSbsهادر بارگذاري دادهبهنيازيباشيد كه .اند به اشتراكXmlDataDocumentها

. كاربردي را ببنديدةبرنام.4

سي: XMLايه براساس دادهDataSetايجاد يك شارپ ويژوال

به.1 : اضافه كنيدbtnCreateFromXdd_Click event handlerدر ويرايشگر كد، سطور زير را

XmlDataDocument xddCreateDataSet; xddCreateDataSet = new XmlDataDocument(); xddCreateDataSet.DataSet.ReadXmlSchema(new System.IO.StringReader(dsAdoSbs.GetXmlSchema())); xddCreateDataSet.Load("AdoSbs.xml");

SetBindings(xddCreateDataSet.DataSet); را اعالن XmlDataDocument در اختيار سازنده، يك dsAdoSbs DataSetاين بخش از كد، با قرار دادن

بهو نمونه مياي از آن را بازپس داده شده از سوي متدةرشتسپس، با قرار دادن. آورد وجودGetXmlSchemaبه متعلقdsAdoSbs DataSet در اختيار يك StringReaderدر اختيار متددخوةنوب، كه به

ReadXMLSchemaگيرد، طرح قرار ميXmlDataDocument DataSetكند را تنظيم مي.

Microsoft ADO.NET 2.0 560گام به گام با

AdoSbs.xmlها را از فايل، دادهDataSetو تثبيت طرح XmlDataDocumentكد مذكور، پس از ايجاد براي scaffolding (SetBindings( پروژه بارگذاري كرده، سپس روال داربستي bin\Debugةواقع در پوش

به مقيد ساختن كنترل .خواندمي را فراdsAdoSbs DataSetهاي فرم. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.2. كليك كنيدCreate From XDDرويبر.3

آن كاربردي، دادهةبرنام و به ها را بارگذاري نموده ميها را در فرم توجه داشته باشيد. گذارد نمايشدر به بارگذاري دادهنيازيكه با چه دادهاگر نيست، dsAdoSbsها .اند به اشتراك XmlDataDocumentها

راةبرنام.4 .ببنديد كاربردي

XMLپيمايش سند

W3C Document Object Model (DOM) Core Levels 1 and در حافظه با NET Framework. در XMLةارائ

از. خواني دارد هم2 و متدهاي propertyو XmlDataDocumentبا استفاده DataSet، پيمايش DOMها.پذير است امكان

اXML DOM دربارةبحث مفصل: تذكر در Helpبراي جزئيات بيشتر،. اين كتاب استةز حوصل خارج. را ببيندWorld Wide Web Consortium (W3C)سايت ويژوال استوديو يا وب

كه گره. گره استاي ،شيءپايهDOMدرداخل XmlDataDocumentساختارگره يك ها،مطابق تصويرپايينبه نشان ميAdoSbs DataSetرا براساس ددهد، .اند رخت سلسله مراتبي مرتب شدهصورت

XmlDataDocument 561/ فصل هجدهم

ميهمان ر طور كه NET Framework. در XmlDocument است، كه شيء Documentس درختأبينيد،و كه. از اعقاب مستقيم آن است XmlDataDocumentنمايانگر آن، DataSetيكة نمونDocumentهنگامي

ش ناميده ميxmlگيرد، فرزند اول قرار مي و . آيد ميDataSet است، كه پيش از اعالن XMLامل متن شود،. است-AdoSbsو در اين مورد- DataSetدومين فرزند، نمايانگر خود

هاي گرهةبقي. رديف استXSD است، كه حاوي متن طرح DataSet ،xs:schemaةنخستين فرزند گررءرزند نمايانگر اشياف - تنها حاوي دو جدول DataSet مورد، در اين. اندس سلسله مراتبأ جدول در

Categories وProducts-ذالبسيار دارند،-به-يكة است، كه رابطCategoriesر .س هرم جاي داردأ در. وجود داردCategories، يك گره Categories DataTable در DataRowبراي هرگر گره Productsو نيز Categories DataTableهاي DataColumn، نمايانگر Categoriesههاي فرزند هر

هر. هستندCategories DataRowهاي مرتبط با آن ، يك Category مرتبط با Productدر اين جا، نيز، براي. وجود داردProductsهگر

تنها حاويCategoriesهاي است، گرهDataTableجا كه مثال تصوير باال تنها داراي دو از آنDataColumn هايDataTableاگر. هستندDataTable مناسبات وجود داشتهةهاي ديگري در زنجير

.ها نشان خواهند داد باشند، خود را در اين سطح در گره DataSetاگر. نشان دادDOMتوان با درخت توجه داشته باشيد كه تنها يك سلسله مراتب را مي

هر ديگر در يك شبكه مرتبطهايي باشد، كه با يكDataTableداراي با چندين DataTableاند، طوري كهDataTableتوان آن را با اين مدل به نمايش درآورد ديگر رابطه دارد، به سادگي نمي.

DOM با استفاده از DataSetپيمايش

مي NET Framework ،property. در XmlNodeةرد كند كه پيمايش درخت گره آن را، هايي را عرضهمي18-1 جدول طابقم آن. سازد، ممكن كه( است XmlDocument از اعقاب XmlDataDocumentجا كه از

براي پيمايش XmlDataDocumentها در داخل property، اين)رود به شمار ميXmlNodeخود از اعقابDataSetموجودند .

XmlNode Navigationهاي 18property-1جدول

Property شرح

ChildNodes مي اي از گره مجموعه .دهد هاي فرزند را بازپس

FirstChild دهد نخستين گره فرزند را بازپس مي.

HasChildNodes هاي فرزند است يا خير حاوي گره موردنظر،دهد گره نشان مي.

Item(childNodeName) گره فرزندي را، كه دارايName propertyةشده به وسيل مشخصمي است، بازchildNodeNameرشته .دهد پس

LastChild مي آخرين گره فرزند را باز .دهد پس

Microsoft ADO.NET 2.0 562گام به گام با

Property شرح

NextSibling مي ها، را باز گره بعدي، در همان سطح در درخت گره .دهد پس

ParentNode دهد گره والد را بازپس مي.

PreviousSibling مي ها، را باز گره قبلي، در همان سطح در درخت گره .دهد پس

ويژوال بيسيك : XML DOM با استفاده از DataSetمايش پي

به.1 : اضافه كنيدbtnDOM_Click event handlerدر ويرايشگر كد، سطور زير را

Dim xdd As XmlDataDocument Dim str As String Dim catNode As XmlNode Dim prodNode As XmlNode xdd = New XmlDataDocument(dsAdoSbs) xdd.Load("AdoSbs.xml") catNode = xdd.Item("AdoSbsDataSet").LastChild str = "Category ID: " + catNode.Item("CategoryID").InnerText + vbCrLf For Each prodNode In catNode.ChildNodes If prodNode.Name = "Products" Then str += vbCrLf + "Product Name: " + _ prodNode.Item("ProductName").InnerText End IfNext MessageBox.Show(str, "Navigating the DOM")

وجود بهdsAdoSbs DataSet از XmlDataDocumentكد باال، پس از اعالن چند متغير محلي، يكو داده سپس، متغير. كند پروژه بارگذاري ميbin\Debugة واقع در پوشAdoSbs.xmlها را از فايل آورده،

catNodeگر را بر روي مقدار را برstr String تنظيم نموده، متغير AdoSbs DataSetةروي آخرين فرزند.كند تنظيم ميCategoryIDگره

XmlDataDocument 563/ فصل هجدهم

و اگر گره نمايانگر يكي از catNodeهاي فرزند از ميان گرهFor…Eachبخش DataRow تكرار شده،به ميstr را به متغير ProductName باشد، Productsهاي افزايد، كه در قاب پيامي در آخرين سطر روال

.آيد نمايش درمي. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.2. كليك كنيدNavigate the DOMرويبر.3

گرو فرآوردهCategoryID كاربردي،ةبرنام .آورد آخر را به نمايش درميCategoryةهاي مرتبط با

و سپس خود برنام.4 . كاربردي را ببنديدةقاب پيام

سي: XML DOM با استفاده از DataSetپيمايش شارپ ويژوال

به.1 : اضافه كنيدbtnDOM_Click event handlerدر ويرايشگر كد، سطور زير را

XmlDataDocument xdd; string str; XmlNode catNode; xdd = new XmlDataDocument(dsAdoSbs); xdd.Load("AdoSbs.xml"); catNode = xdd["AdoSbsDataSet"].LastChild; str = "Category ID: " + catNode["CategoryID"].InnerText + "\n";

Microsoft ADO.NET 2.0 564گام به گام با

foreach (XmlNode prodNode in catNode.ChildNodes) {

if (prodNode.Name == "Products") {

str += "\nProduct Name: " + prodNode["ProductName"].InnerText; }}MessageBox.Show(str, "Navigating the DOM");

يك وجود بهdsAdoSbs DataSet از XmlDataDocumentكد باال، پس از اعالن چند متغير محلي،و داده سپس، متغير. كند پروژه بارگذاري ميbin\Debugة واقع در پوشAdoSbs.xmlها را از فايل آورده،

catNodeة را برروي آخرين فرزند گرAdoSbs DataSet تنظيم نموده، متغير str String را برروي مقدار .كند تنظيم ميCategoryIDگره

و اگر گره نمايانگر يكي از catNodeهاي فرزند از ميان گرهFor…Eachبخش DataRow تكرار شده،به ميstr را به متغير ProductName باشد، Productsهاي افزايد، كه در قاب پيامي در آخرين سطر روال

.آيد نمايش درمي. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.2. كليك كنيدNavigate the DOMرويبر.3

گرو فرآوردهCategoryID كاربردي،ةبرنام .آورد آخر را به نمايش درميCategoryةهاي مرتبط با

و سپس خود برنام.4 . كاربردي را ببنديدةقاب پيام

XmlDataDocument 565/ فصل هجدهم

XPath با استفاده از DataSetپيمايش

Property هاي پيمايشXmlNode ،جزاما جملگي مفيدند ميء انجام هركاري به دتوان يك پيمايش سادهو طاقت XPathهاي، از استعالمNET Framework. از سوي XMLخوشبختانه، اجراي. فرسا باشد دشوار.كند نيز پشتيباني مي

XPath زبان استعالم )query ( است، كهW3Cو براي پيمايش سلسله هاي مراتب آن را تعريف كرده،XMLاز لحاظ كاركرد، بسيار شبيه زبان. طراحي شده استSQL است، هر چند با نگارشي به كلي

.متفاوت

بهبراي جزئيات بيشتر،. اين كتاب استة، خارج از حوصلDOM جزئيات مانند، XPath:تذكر نگاه كنيدHelp وب ويژوال و .W3Cسايت استوديو

XmlNode ،دومتد SelectNodes وSelectSingleNodeكند، كه عبارت، را عرضه ميXPath صورتبه را و حل- را XmlNamespaceManagerيك)طور اختياريبه(رشته، ها در داخل عبارت namespaceكه جهت

XPath مي به مي بازرا SelectNodes ،XmlNodeSetمتد. پذيردمي-شود كار گرفته دهد؛ درحالي كه، پسمي، تنها گره اولي را كه با عبارت مشخصSelectSingleNodeمتد .دهد شده مطابقت دارد، بازپس

ردك را نيز عرضه ميCreateNavigate، متد XmlDocument:تذكر ةند، كه نمونه جديدي ازXPathNavigatorچندين استعالم براي اجراي. دهد را بازپس مي XPath در برابر XmlDocument و نيز ،از، مي XPathتر پيمايش پيچيده .كرد استفاده XPathNavigatorتوان

ها بسيار شبيه عبارتي است كه براي پيمايش سلسله مراتب پوشه XPathنگارش عبارتباءگيرد، با اين استثنا مورداستفاده قرار مي )\(backslashجايبه)/(forward slash كه سلسله مراتب

مي،ها پيمايش در فهرست گرهسرتاسر. شود مشخص مي (گيرد نسبت به گره جاري صورت در مورد..) همواره گره جاري استDocument، گره SelectSingleNodesو SelectNodesمتدهاي هاي بانكةگزيد مسير نصب پيش،C:\Microsoft Press\ADO.NET 2.0 Step by Step\SampleDBs، مثالً

وةاطالعاتي نمون هاي حاوي عناصر مسير سطح درخت گره،AdoSbsDataSet/Categories/ اين فصل،Categoriesاست .

و همان در اين فصل، تنها از عبارات ساده استفاده مي ميكنيم، توان طور كه ديديم، پيمايش ساده رايكن، اگرچه مثال پاييبنابراين. عملي ساختXML DOMبا استفاده از مي از گيرد، عبارت ساده بهره

برةاش در اجراي انتخاب پيچيد در توانايي XPathخاطر داشته باشيد كه قدرت حقيقي به مبتنيو مناسبات گره .ها نهفته است معيارهاي متعدد

از DataRowانتخاب ويژوال بيسيك : XPathها با استفاده

به.1 : اضافه كنيدbtnXpath_Click event handlerدر ويرايشگر كد، سطور پايين را

Microsoft ADO.NET 2.0 566گام به گام با

Dim xdd As XmlDataDocument Dim qry, msg As String Dim selectedNodes As XmlNodeList Dim theNode As XmlNode taCategories.Fill(dsAdoSbs.Categories) taProducts.Fill(dsAdoSbs.Products) xdd = New XmlDataDocument(dsAdoSbs) qry = "*" selectedNodes = xdd.FirstChild.SelectNodes(qry) msg = "" For Each theNode In selectedNodes msg += vbCrLf + theNode.ChildNodes(1).InnerText Next MessageBox.Show(msg)

ازةغيرهاي محلي را اعالن نموده، نمونچند سطر نخست اين بخش از كد، مت جديديXmlDataDocument براساس dsAdoSbs DataSetمي به با استفاده از SelectNodesسپس، متد. آورد وجود

مي در نخستين سطح سلسله مراتب بازراها شود، كه تمام گره فراخوانده مي XPathيك عبارت . دهد پسمي بازپسCategory، نام سرانجام .شود داده شده در يك قاب پيام به نمايش گذاشته

. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.2. كليك كنيد XPath Queryبرروي.3

مي Categoryهاي كاربردي، نامةبرنام .گذارد را به نمايش

XmlDataDocument 567/ فصل هجدهم

و سپس خود برنام.4 .يد كاربردي را ببندةقاب پيام،

از DataRowانتخاب سي: XPathها با استفاده شارپ ويژوال

به.1 : اضافه كنيدbtnXpath_Click event handlerدر ويرايشگر كد، سطور پايين را

XmlDataDocument xdd; String qry; String msg; XmlNodeList selectedNodes; taCategories.Fill(dsAdoSbs.Categories); taProducts.Fill(dsAdoSbs.Products); xdd = new XmlDataDocument(dsAdoSbs); qry = "*"; selectedNodes = xdd.FirstChild.SelectNodes(qry); msg = ""; foreach(XmlNode theNode in selectedNodes) msg += "\n" + theNode.ChildNodes[1].InnerText; MessageBox.Show(msg);

Microsoft ADO.NET 2.0 568گام به گام با

ازةچند سطر نخست اين بخش از كد، متغيرهاي محلي را اعالن نموده، نمون جديديXmlDataDocument براساس dsAdoSbs DataSetسپس، متد. آورد به وجود ميSelectNodes با استفاده

سپ در نخستين سطح سلسله مراتب بازراها شود، كه تمام گره فراخوانده مي XPathاز يك عبارتمي بازCategory، نام سرانجام. دهد مي .شود پس داده شده در يك قاب پيام به نمايش گذاشته. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.2. كليك كنيد XPath Queryبرروي.3

مي Categoryهاي كاربردي، نامةبرنام .گذارد را به نمايش

پي.4 و سپس خود برنامقاب . كاربردي را ببنديدةام،

XmlDataDocumentكاربرد متدهاي

به ارث رسيده، به دو XmlNodeة يا ردXmlDocumentاز آنها، كه بيشتر XmlDataDocumentمتدهايو مورد استفاده قرار ميXmlNodeءهايي كه براي كار با اشياآن:ندشو گروه اوليه تقسيم مي گيرند،

. كاربرد دارندDataSetهاي DataRow با XmlDataDocumentهاي دهايي كه جهت هماهنگ ساختن گرهمت

XMLها به كمك DataRowكار با

و به ها را بهXmlNodeكه، XmlDataDocumentمتدهاي ترين مهم اضافه XmlDataDocumentوجود آورده،و از آن حذف مي .اند ذكر شده18-2كنند، در جدول نموده

XmlDataDocument 569/ فصل هجدهم

و كار با XmlDataDocument متدهاي18-2جدول XmlNode براي ايجاد

شرح متد

AppendChild(childNode)ChildNodeهاي فرزند گره جاري ضميمه را به انتهاي فهرست گره.سازد مي

Clone مييك نظير براي گره جاري به .آورد وجود

CloneNode(cloneDeep) ري و، اگر پارامتر يك نظير براي گره جاcloneDeepBooleanبه -بههاي باشد، گرهTrueصورت ميفرزند گره جاري .آورد وجود

CreateAttribute(name) يكXmlAttributeمي به .آورد، كه نام مشخصي دارد وجود

CreateElement(name) يكXmlElementمي به .آورد، كه نام مشخصي دارد وجود

CreateNode(name) يكXmlNodeمي به .آورد، كه نام مشخصي دارد وجود

CreateTextNode(Text) يكXmlTextمي به .آورد، كه نام مشخصي دارد وجود

InsertAfter(node) مي گره مشخص .كند شده را، بالفاصله پس از گره جاري، درج

InsertBefore(node) ميشده را، بالفاصله پيش از گره جاري، گره مشخص .كند درج

PrependChild(node) هاي فرزند گره جاري شده را، به آغاز فهرست گره گره مشخص.كند اضافه مي

RemoveAll مي تمام گره .كند هاي فرزند را حذف

RemoveChild(node) مي گره مشخص .كند شده را حذف

ReplaceChild(newNode,

oldNode) گزين گره فرزند مشخص جديد را جايةشد گره فرزند مشخص

ميةشد .سازد جاري

به اماشان معلوم است، طرز عمل بيشتر متدها از نام خاطر داشته باشيم، بسيار مهم است كهيك گره از برخالف جدول رابطه. شده هستند صورت فهرست مرتب به XmlDataDocumentهاي اي، كه

ت اي از رديف مجموعه و ترتيب ذاتاXMLًشكيل شده، عناصر ها بدون هيچ ترتيب ذاتي و داراي نظم اند،. مهم است غالباXMLًترتيب در دنياي

XmlDataDocument از طريق DataSetموضوع ديگري كه توجه به آن به هنگام كاركردن بر رويبر را پيش از هرDataSetبه متعلقEnforceConstraints propertyمهم است، اين است كه بايد روي اقدامي

Falseهميشه عمليات، تقريباًةپس از خاتم. تنظيم كنيم propertyروي مذكور را برTrueكنيم تنظيم مي.

ويژوال بيسيك : XML با استفاده از Categoryاضافه كردن

به.1 : اضافه كنيدbtnAddNode_Click event handlerدر ويرايشگر كد، سطور زير را

Microsoft ADO.NET 2.0 570گام به گام با

Dim xdd As XmlDataDocument Dim newNode As XmlElement Dim childNode As XmlNode Dim x As Integer xdd = New XmlDataDocument(dsAdoSbs) xdd.Load("AdoSbs.xml") dsAdoSbs.EnforceConstraints = False newNode = xdd.LastChild.LastChild.CloneNode(True) For x = newNode.ChildNodes.Count - 1 To 0 Step -1 childNode = newNode.ChildNodes(x) If childNode.Name = "Products" Then newNode.RemoveChild(childNode) End If Next newNode.ChildNodes(0).InnerText = 999 newNode.ChildNodes(1).InnerText = "New Category" xdd.LastChild.AppendChild(newNode) dsAdoSbs.EnforceConstraints = True

از مي بهXmlDataDocumentاين كد، نخست چند متغير محلي را اعالم نموده، يك نمونه و وجود آورد،آنگاه آخرين. كند تنظيم ميFalse را برروي DataSetبه متعلقEnforceConstraints propertyسپس

Categoryگر گرههمةو بهةهاي فرزند .دهد نسبت ميnewNode مذكور را كلون كرده، نتيجه را Categoryةگر) attributes(هاي را حذف نموده، خصوصيتProductsهاي فرعي، گرهFor…Nextةحلق

و سپس گر م، سرانجا. كند اضافه مي XmlDataDocument جديد را به Categoryةجديد را تنظيم كرده،EnforceConstraints propertyبه متعلقDataSetروي برTrueشود تنظيم مي.

. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.2. كليك كنيدAdd Nodeبرروي.3

.كند اضافه ميDataSet جديد را به Category كاربردي،ةبرنام

XmlDataDocument 571/ فصل هجدهم

رد.4 . كليك كنيدBindingNavigator در Move Lastةيف جديد، برروي دكمبراي به نمايش درآمدن

. كاربردي را ببنديدةبرنام.5

سي: XML با استفاده از Categoryاضافه كردن يك شارپ ويژوال

به.1 : اضافه كنيدbtnAddNode_Click event handlerدر ويرايشگر كد، سطور زير را

XmlDataDocument xdd; XmlNode newNode; XmlNode childNode; xdd = new XmlDataDocument(dsAdoSbs); xdd.Load("AdoSbs.xml"); dsAdoSbs.EnforceConstraints = false; newNode = xdd.LastChild.LastChild.CloneNode(true); for (int x = newNode.ChildNodes.Count - 1; x > 0; x--) {

childNode = newNode.ChildNodes[x]; if (childNode.Name == "Products")

Microsoft ADO.NET 2.0 572گام به گام با

newNode.RemoveChild(childNode); }

newNode.ChildNodes[0].InnerText = "999"; newNode.ChildNodes[1].InnerText = "New Category"; xdd.LastChild.AppendChild(newNode); dsAdoSbs.EnforceConstraints = true;

از مي بهXmlDataDocumentاين كد، نخست چند متغير محلي را اعالم نموده، يك نمونه و وجود آورد،آنگاه آخرين. كند تنظيم ميFalseروي را برDataSetبه متعلقEnforceConstraints propertyسپس

Category گر گرههمةو رةهاي فرزند به مذكور را كلون كرده، نتيجه .دهد نسبت ميnewNodeا Categoryةگر) attributes(هاي را حذف نموده، خصوصيتProductsهاي فرعي، گرهFor…Nextةحلق

و سپس گر سرانجام،. كند اضافه مي XmlDataDocument جديد را به Categoryةجديد را تنظيم كرده،EnforceConstraints propertyبه متعلقDataSetروي برTrueشود تنظيم مي.

. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.2. كليك كنيدAdd Nodeرويبر.3

.كند اضافه ميDataSet جديد را به Category كاربردي،ةبرنامدر.4 بربراي به نمايش .ليك كنيدكBindingNavigator در Move Lastةروي دكمآمدن رديف جديد،

. كاربردي را ببنديدةبرنام.5

XmlDataDocument 573/ فصل هجدهم

و عناصر DataRow هماهنگ ساختن XmlDataDocumentها

XmlDataDocument،دوproperty -GetNodeFromRow وGetRowFromNode-مي كند، كه براي عرضهمي DataRow به XMLهاي تبديل گره و بالعكس مورداستفاده قرار .گيرند ها

ويژوال بيسيك : DataRow از يك Nodeبازيابي

به.1 . اضافه كنيدbtnGetRow_Click event handlerدر ويرايشگر كد، كد زير را

Dim xdd As XmlDataDocument Dim theNode As XmlElement Dim theRow As DataRow Dim theCatRow As AdoSbsDataSet.CategoriesRow taCategories.Fill(dsAdoSbs.Categories) taProducts.Fill(dsAdoSbs.Products) xdd = New XmlDataDocument(dsAdoSbs) theNode = CType(xdd.DocumentElement.FirstChild, XmlElement) theRow = xdd.GetRowFromElement(theNode) theCatRow = CType(theRow, AdoSbsDataSet.CategoriesRow) MessageBox.Show("Category Name: " + theCatRow.CategoryName, _ "Get Row From Node")

برةبراي اجراي برنام.2 . فشار دهيدF5روي كليد كاربردي،. كليك كنيدGet Rowبرروي.3

.گذارد را در يك قاب پيام به نمايش ميCategory Name كاربردي،ةبرنام

Microsoft ADO.NET 2.0 574گام به گام با

.ربردي را ببنديدكاةمبرنا.4

سي: DataRow از يك Nodeبازيابي شارپ ويژوال

به.1 . اضافه كنيدbtnGetRow_Click event handlerدر ويرايشگر كد، كد زير را

XmlDataDocument xdd; XmlElement theNode; DataRow theRow; AdoSbsDataSet.CategoriesRow theCatRow; taCategories.Fill(dsAdoSbs.Categories); taProducts.Fill(dsAdoSbs.Products); xdd = new XmlDataDocument(dsAdoSbs); theNode = (XmlElement)xdd.DocumentElement.FirstChild; theRow = xdd.GetRowFromElement(theNode); theCatRow = (AdoSbsDataSet.CategoriesRow)theRow; MessageBox.Show("Category Name: " + theCatRow.CategoryName, "Get Row From Node");

XmlDataDocument 575/ فصل هجدهم

برةبراي اجراي برنام.2 . فشار دهيدF5روي كليد كاربردي،. كليك كنيدGet Rowرويبر.3

.گذارد را در يك قاب پيام به نمايش ميCategory Name كاربردي،ةبرنام

رةمبرنا.4 .ا ببنديد كاربردي

ويژوال بيسيك : Node از يك DataRowبازيابي يك

به.1 : اضافه كنيدbtnGetNode_Click event handlerدر ويرايشگر كد، كد زير را

Dim xdd As XmlDataDocument Dim theNode As XmlElement Dim theRow As AdoSbsDataSet.CategoriesRow taProducts.Fill(Me.dsAdoSbs.Products) taCategories.Fill(Me.dsAdoSbs.Categories) xdd = New XmlDataDocument(dsAdoSbs) theRow = dsAdoSbs.Categories.Rows(3) theNode = xdd.GetElementFromRow(theRow) MessageBox.Show("Category Name: " + theNode.ChildNodes(2).InnerText)

Microsoft ADO.NET 2.0 576گام به گام با

بر.2 بر كاربردةنامبراي اجراي . فشار دهيدF5روي كليد ي،. كليك كنيدGet Nodeرويبر.3

.آورد را در يك قاب پيام به نمايش درميCategory Name كاربردي،ةبرنام

. كاربردي را ببنديدةبرنام.4

سي: Node از يك DataRowبازيابي يك شارپ ويژوال

ز.1 : اضافه كنيدbtnGetNode_Click event handlerير را به در ويرايشگر كد، كد

XmlDataDocument xdd; XmlElement theNode; AdoSbsDataSet.CategoriesRow theRow; taProducts.Fill(dsAdoSbs.Products); taCategories.Fill(dsAdoSbs.Categories); xdd = new XmlDataDocument(dsAdoSbs); theRow = (AdoSbsDataSet.CategoriesRow)dsAdoSbs.Categories.Rows[3]; theNode = xdd.GetElementFromRow(theRow); MessageBox.Show("Category Name: " + theNode.ChildNodes[2].InnerText);

برةبراي اجراي برنام.2 . فشار دهيدF5روي كليد كاربردي،. كليك كنيدGet Nodeرويبر.3

XmlDataDocument 577/ فصل هجدهم

.آورد را در يك قاب پيام به نمايش درميCategory Name كاربردي،ةبرنام

. كاربردي را ببنديدةبرنام.4

خالصه

از هاي رابطه، كه مكانيسمي را براي كاركردن با داده XmlDataDocumentبادر اين فصل اي با استفادهXMLآشنا شديمگذارد، در اختيار مي .XmlDataDocument از را مي ، با قرار دادن آن در DataSetتوان

و XmlDataDocumentةاختيار سازند از را ميDataSet، به وجود آورد؛ ، با XmlDataDocumentتوانبDataSet propertyبهارجاع . وجود آورده آن،

در، كه XmlDataDocumentهاي propertyو XML DOMسپس، آشنايي مختصري با امكان پيمايش را، كه XPathهاي همچنين، ديديم كه چگونه استعالم. دهد، پيدا كرديم را ميDOMسلسله مراتب

و انتخاب گره و قدرتمندتري براي پيمايش در اختيار ما XmlDataDocumentهاي مكانيسم كارآمدترآنمي، كه mlDataDocumentنيز، كنكاشي در متدهاي.گذارد، اجرا كنيم مي ها ها، با افزودن گره توان ازدر، براي ايجاد رديف mlDataDocumentبه ، با متدهاي نهايتاً. استفاده نمود، به عمل آورديمDataSetها

GetRowFromNode وGetNodeFromRowآن آشنا شديم، كه مي هاي گرهةها براي ترجم توان ازXmlDataDocument به DataRow هايDataSetدنمو بالعكس استفادهو.

نوزدهمفصل

NET Framework. در ADOXو ADOكاربرد:در پايان اين فصل، خواهيد توانست

. برقرار كنيدADOXو ADOهاي ارجاعي به كتابخانه�. به وجود آوريدADO Connectionيك�از داده� . بازيابي كنيدADO Recordsetها را. اطالعاتي ايجاد كنيد يك بانك، ADOXبا استفاده از�ازب� . اطالعاتي اضافه كنيد يك جدول به بانك، ADOXا استفاده

در اين. مايكروسافت آشنا شديمADO.NETء در اشياXMLهاي در دو فصل گذشته، با كاربرد دادههاي اي كه با استفاده از روايت دادهء اشيا.ها خواهيم انداخت از دادهفصل، نظري به واسط نوع ديگري

.انده وجود آمدهبADOقبلي ء، كه توانايي ايجاد اشيا) DDL and Security)ADOXة براي كتابخانADO Extensionهمچنين، با

مي اطالعاتي تحت كنترل برنامه بانك شد نويسي را فراهم دري قابليتچنين. آورد، آشنا خواهيمADO.NETهاي توان گزاره وجود ندارد، هر چند كه ميData Definition Language (DDL) مانند ،CREAT

TABLEآن دهنده، را در سرويس مي هايي كه از .كنند، اجرا نمود ها پشتيباني

COM Interoperabilityدرك

NET. هدف اصلي طراحي Component Object Model (COM) اجزاي بين interoperabilityحفظ

Frameworkبا استفاده از توابع. مايكروسافت بود COM Interop كه ،.NET Framework در اختيارمان مي مي به گذارد، كء اشياهمةتوانيم و رويداهايي، COMء با ارجاع به آن توسط اشياه صرفاً، متدها

به COMءو اشياADOةهاي گذشت اين واقعيت، به روايت. شوند، دسترسي داشته باشيم عرضه ميميهاي مذكور، نيز، وجود آمده با روايت .يابد تسري

NET.هاي كنند، كه گويي از رده طوري رفتار ميCOMءر گرديد، اشياپس از آنكه ارجاع برقرا

Frameworkمي. هستند بهه. تر است، بسي پيچيدهدهد البته، آن چه در پشت صحنه روي نگامي كه ارجاعمي، ADOXو ADOجملهاز، COMءهر يك از اشيا interop assembly يكNET Framework.شود، اعالم

ميبه . را برعهده داردCOMو NET Framework.آورد، كه رسيدگي به ارتباط بين وجود

Microsoft ADO.NET 2.0 580گام به گام با

interop assembly ،آن مهماما چندين وظيفه برعهده دارد و COMهاي بين انواع دادهةها ترجم ترين.NET Framework است، فرآيندي كه تحت عنوان data type marshallingتبديل19-1جدول. شناسيم مي ،مي صورت ميCOM براي انواع مقدار interop assemblyانواع را، كه توسط .دهد گيرد، نشان

19COM Data Type Marshalling-1جدول

NET Framework.نوع COM نوع داده

bool Int32 char, small SByte

Short Int16 long, int Int32

hyper Int64 unsigned char, byte Byte

wchar_t, unsigned short UInt16 unsigned long, unsigned int UInt32

unsigned hyper UInt64 float Single

double Double VARIANT_BOOL Boolean

void* IntPtr HRESULT Int16 يا IntPtr

SCODE Int32 BSTR String

LPSTR String LPWSTR String

VARIANT Object DECIMAL Decimal

DATE DateTime GUID Guid

CURRENCY Decimal IUnknown* Object IDispatch* Object

SAFEARRAY(type) type[]

NET Framework 581. در ADOXو ADOكاربرد/ فصل نوزدهم

NET Framework. در ADOدرك

و COM interoperabilityعالوه بر براي NET Framework. عرضه شده ازسوي data type marshalling كلي، با COMءو اشيا ADOXو ADOهاي اي از كتابخانه پشتيباني ويژهCOM ،.NET Frameworkء اشياهمة

مي استفاده از آن .آورد ها، به عملهاي معادل. استADOهاي اصلي براي انواع دادهdata type marshallingاين پشتيباني اضافي شامل

.NET Frameworkهاي راي انواع اصلي دادهبADO البته، پس از برقراري. اند ذكر شده19-2 در جدول در دسترس قرار ADO از طريق جزء ADO Connectionو Recordset، انواع پيچيده مانند ADOارجاع به

.گيرند مي 19ADO Data Type Marshalling-2ول جد

NET Framework.نوع ADO نوع داده

adEmpty null adBoolean Int16 adTinInt SByte

adSmallInt Int16 adInteger Int32 adBigInt Int64

adUnsignedTinyInt Promoted to Int16 adUnsignedSmallInt Promoted to Int32

adUnsignedInt Promoted to Int64 adUnsignedBigInt Promoted to Decimal

adSingle Single adDouble Double

adCurrency Decimal adDecimal Decimal adNumeric Decimal

adDate DateTime adDBDate DateTime adDBTime DateTime

adDBTimeStamp DateTime adFileTime DateTime

adGUID GUID

Microsoft ADO.NET 2.0 582گام به گام با

NET Framework.نوع ADO نوع داده

adError ExternalException adIUnknown object adIDispatch object adVariant object

adPropVariant object adBinary Byte[] adChar string

adWChar string adBSTR string

adChapter شود پشتيباني نمي adUserDefined شود پشتيباني نمي adVarNumeric شود پشتيباني نمي

ADOبرقراري ارجاعي به

كه به يك روايت گذشته ارجاع COM، يا يك جزء ADOنخستين قدم در استفاده از يك روايت پيشينترين راحتاما وجود دارد، ADO جزءةچندين روش براي عرض. دهد، تنظيم ارجاع به جزء است مي.2005ها تنها عبارت است از اضافه كردن ارجاع در داخل ويژوال استوديو مايكروسافت آن

ويژوال: ADOXو ADOهاي اضافه كردن ارجاعات به كتابخانه

بيسيك

و در صورت لزوم، Chapter 19 - Startةاي از ويژوال استوديو، پروژ تازهةدر نمون.1 را باز كرده،. دوبار كليك كنيدSolution Explorer در ADOInterop.vbبرروي

.گذارد به نمايش ميForm Designerويژوال استوديو، فرم را در

NET Framework 583. در ADOXو ADOكاربرد/ فصل نوزدهم

به نمايش درآيد، My Projectsة دوبار كليك كنيد، تا پنجرMy Projectروي، برSolution Explorerدر.2. كليك كنيدReferencesةروي زبانو سپس بر

. كليك كنيدAddةروي دكمبر.3.آورد را به نمايش درميAdd Referencesويژوال استوديو، قاب گفتگوي

Microsoft ADO.NET 2.0 584گام به گام با

و جزء تحت عنوان COMةبرروي زبان.4 را Microsoft ActiveX Data Objects 2.8 Library كليك،.انتخاب كنيد

. كليك كنيدOKبرروي.5.كند ويژوال استوديو، جزء را به فهرست ارجاعات اضافه مي

. كليك كنيدAddةبرروي دكم.6.آورد را به نمايش درميAdd Referencesويژوال استوديو، قاب گفتگوي

و جزء تحت عنوان COMةروي زبانبر.7 را Microsoft ADO Ext. 2.8 For DDL And Security كليك،.انتخاب كنيد

. كليك كنيدOKرويبر.8.كند را به فهرست ارجاعات اضافه مي ADOXويژوال استوديو، جزء

. را ببنديدMy Projectةپنجر.9

ويژوال : ADOXو ADOهاي اضافه كردن ارجاعات به كتابخانه

شارپ سي

و در صورت لزوم، Chapter 19 - Startةاي از ويژوال استوديو، پروژ تازهةدر نمون.1 را باز كرده،. دوبار كليك كنيدSolution Explorer در ADOInterop.csبرروي

.گذارد به نمايش ميForm Designerدر ويژوال استوديو، فرم را

NET Framework 585. در ADOXو ADOكاربرد/ فصل نوزدهم

به نمايش درآيد، My Projectsة دوبار كليك كنيد، تا پنجرMy Project، بر روي Solution Explorerدر.2. كليك كنيدReferencesةو سپس برروي زبان

.آورد را به نمايش درميAdd Referenceويژوال استوديو، قاب گفتگويو جزء تحتCOMةروي زبانبر.3 را Microsoft ActiveX Data Objects 2.8 Libraryعنوان كليك،

.انتخاب كنيد

. كليك كنيدOKبرروي.4

Microsoft ADO.NET 2.0 586گام به گام با

.كند ويژوال استوديو، جزء را به فهرست ارجاعات اضافه مي

و كليReferences، بر روي گره Solution Explorerدر.5 . را انتخاب كنيدAdd Referenceك راست كرده،.آورد را به نمايش درميAdd Referencesويژوال استوديو قاب گفتگوي

و جزء تحتCOMةبرروي زبان.6 را Microsoft ADO Ext. 2.8 For DDL And Securityعنوان كليك،.انتخاب كنيد

. كليك كنيدOKبرروي.7. كند را به فهرست ارجاعات اضافه مي ADOXاستوديو، جزء ويژوال

ADOءايجاد اشيا

و مانند هر شيء ديگريADOءتوان اشيا، ميADOپس از اضافه كردن ارجاعات به اجزاي ، را ايجاد،property به هاي . تنظيم نمودNET Framework.ةردنة كتابخاةوسيلشان را

ADO ConnectionشيءADOانند، همADO.NET از شيء ،Connection براي نشان دادن يك نشست منحصر به فرد با منبع مي داده ، ADO.NET Connection، همچون ADO Connection در propertyترين مهم. كند ها استفاده

ConnectionString است، كه Data Providerو در صورت لزوم، اطالعات كاربر، اطالعات بانك اطالعاتي،.نمايد را مقرر مي

ويژوال بيسيك : ADO Connectionايجاد يك

كد.1 . فشار دهيدF7روي كليدبر،براي نمايش ويرايشگرو چنانچه فايل.2 شان نصب گزيده هاي تمرين را در مكان پيش سطور زير را، كه در صورت لزوم

ر را تغيير ميdsStrنكرده باشيد، مسير مقدار متن : اضافه كنيدCreateConnectionوال دهد، به

NET Framework 587. در ADOXو ADOكاربرد/ فصل نوزدهم

Dim dsStr As String Dim dsCn As String Dim cn As ADODB.Connection cn = New ADODB.Connection dsStr = "C:\Microsoft Press\ADO.NET 2.0 Step by Step\" + _ "SampleDBs\AdoStepByStep.mdb" dsCn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + dsStr + ";" cn.ConnectionString = dsCn Return cn

سي: ADO Connectionايجاد يك شارپ ويژوال

كد.1 . فشار دهيدF7روي كليدبر،براي نمايش ويرايشگرو چنانچه فايل.2 شان نصب گزيده هاي تمرين را در مكان پيش سطور زير را، كه در صورت لزوم: اضافه كنيدCreateConnectionدهد، به روال را تغيير ميdsStrرده باشيد، مسير مقدار متن نك

string dsStr; string dsCn; ADODB.Connection cn; cn = new ADODB.Connection(); dsStr = "C:\\Microsoft Press\\ADO.NET 2.0 Step by Step\\" + "SampleDBs\\AdoStepByStep.mdb"; dsCn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + dsStr + ";"; cn.ConnectionString = dsCn; return cn;

هاADO Recordset كاربرد

ADO براي سرراستي معادل DataSetشيء. نداردADO Recordset،معادل تقريبي DataTable در ADO.NETو شيء داده . استADOاي اوليه در مدل،

Microsoft ADO.NET 2.0 588گام به گام با

ها ADO Recordsetپركردن

OleDbDataAdapterهاي، عالوه بر پشتيباني از انواع دادهADOروايتي از متدة، با عرض Fill كه ADO

Recordsetمي را به از عنوان يك پارامتر . آورد ها به عمل ميADO Recordsetپذيرد، پشتيباني مستقيميدFillدو روايت از متد .اند ذكر شده19-3ر جدول وجود دارد، كه

OleDbDataAdapter Recordset Fill متدهاي19-3جدول

شرح متد

Fill(dataTable, recordset) هاي ها را، براي مطابقت دادن با رديف رديفRecordset .كند مشخص افزوده يا تجديد ميDataTableمشخص، به

Fill(dataset, recordset, dataTable) ر رديف Recordsetهاي ا، براي مطابقت دادن با رديفها مشخص DataSet مشخص در DataTableمشخص، به

.كند افزوده يا تجديد مي

وجود نداشته باشد، براساس طرح DataSet قرار گرفته، در Fill كه در اختيار متد DataTableاگرADO Recordsetمي به ADOهاي اوليه وجود نداشته باشد، رديفاگر اطالعات مربوط به كليد. آيد وجود

Recordsetًبه صرفاDataTableاگر اطالعات مربوط به كليد اوليه وجود نداشته باشد،. شوند افزوده ميدر رديف .شوند مطابقت دارند، در هم ادغام ميDataTableهاي كه با رديفADO Recordsetهايي

يك بازيابي داده ويژوال بيسيك : ADO Recordsetها از

به.1 : اضافه كنيدbtnOpen_Click event handlerدر ويرايشگر كد، سطور زير را

Dim rs As ADODB.Recordset Dim cnADO As ADODB.Connection Dim daTemp As New OleDbDataAdapter() rs = New ADODB.Recordset() cnADO = CreateConnection() cnADO.Open() rs.Open("SELECT * FROM CategoriesByName", cnADO) daTemp.Fill(dsCategories.CategoriesByName, rs)

NET Framework 589. در ADOXو ADOكاربرد/ فصل نوزدهم

cnADO.Close() SetBindings(dsCategories)

يك را اعالن OleDbDataAdapterو يك ADO Connection، يك ADO Recordsetسه سطر نخست ADO را، كه در تمرين گذشته براي ايجاد شيء CreateConnectionدو سطر بعدي، تابع. كنند مي

Connectionو سپس اتصال را باز مي .كند اضافه كرديم، فراخوانده رديف را بارگذاري كرده، DataAdapter را باز نموده، با استفاده از ADO Recordsetسه سطر بعدي

دا. بندد را ميADO Recordsetو سپس كه را فرامي) scaffolding(ربستي سطر آخر يك تابع خواند،به قاب .سازد مشخص مقيد ميDataSetهاي متن فرم رابرةبراي اجراي برنام.2 . فشار دهيدF5روي كليد كاربردي،. كليك كنيدOpen ADOبرروي.3

از كاربردي، دادهةبرنام ي متن فرم به نمايشها ها را در قاب بارگذاري نموده، آنADOها را.گذارد مي

. كاربردي را ببنديدةبرنام.4

يك بازيابي داده سي: ADO Recordsetها از شارپ ويژوال

به.1 : اضافه كنيدbtnOpen_Click event handlerدر ويرايشگر كد، سطور زير را

ADODB.Recordset rs; ADODB.Connection cnADO; OleDbDataAdapter daTemp; rs = new ADODB.Recordset(); cnADO = CreateConnection(); daTemp = new OleDbDataAdapter(); cnADO.Open("", "", "", 0); rs.Open("SELECT * FROM CategoriesByName", cnADO,

Microsoft ADO.NET 2.0 590گام به گام با

ADODB.CursorTypeEnum.adOpenForwardOnly, ADODB.LockTypeEnum.adLockReadOnly, 0); daTemp.Fill(dsCategories.CategoriesByName, rs); cnADO.Close(); SetBindings(dsCategories);)

يك را اعالن OleDbDataAdapterو يك ADO Connection، يك ADO Recordsetسه سطر نخست ADO را، كه در تمرين گذشته براي ايجاد شيء CreateConnectionدو سطر بعدي، تابع. كنند مي

Connectionو سپس اتصال را باز مي .كند اضافه كرديم، فراخوانده رديف را بارگذاري كرده، DataAdapter را باز نموده، با استفاده از ADO Recordsetسه سطر بعدي

كه را فرامي) scaffolding(سطر آخر يك تابع داربستي. بندد را ميADO Recordsetو سپس خواند،به قاب .سازد مشخص مقيد ميDataSetهاي متن فرم رابرةبراي اجراي برنام.2 . دهيد فشار F5روي كليد كاربردي،. كليك كنيدOpen ADOرويبر.3

از كاربردي، دادهةبرنام هاي متن فرم به نمايش ها را در قاب بارگذاري نموده، آنADOها را.گذارد مي

. كاربردي را ببنديدةبرنام.4

هاADO Recordset روزآمد ساختن

يك مكانيسم آساني براي بارگذاري داده، OleDbDataAdapterبه متعلق،Fillمتد به ADO Recordsetها از NET.. سفانه، اين ارتباط يك طرفه استأمت. گذارد در اختيار ميNET Framework. در DataTableيك

Framework متد مستقيمي براي روزآمد ساختن ADO Recordsetهاي براساس دادهADO.NETندارد . كار NET Framework. از داخل ADOهاي ختانه، روزآمد ساختن منبع دادهبا اين حال، خوشب

و سپس از توابع ذاتي كافي است مقادير داده. دشواري نيست براي ADOها را از منابع مربوطه كپي،.روزآمد ساختن استفاده كنيم

NET Framework 591. در ADOXو ADOكاربرد/ فصل نوزدهم

ويژوال بيسيك : ADO Recordsetروزآمدساختن

: اضافه كنيدbtnUpdate_Click event handlerرا به در ويرايشگر كد، سطور پايين.1

Dim rsADO As ADODB.Recordset Dim cnADO As ADODB.Connection rsADO = New ADODB.Recordset() cnADO = CreateConnection() cnADO.Open() rsADO.ActiveConnection = cnADO rsADO.Open("SELECT * FROM CategoriesByName", cnADO, _ ADODB.CursorTypeEnum.adOpenDynamic, _ ADODB.LockTypeEnum.adLockOptimistic) rsADO.AddNew() rsADO.Fields("CategoryName").Value = "Test" rsADO.Fields("Description").Value = "Description" rsADO.Update() MessageBox.Show("Finished", "ADO Update") rsADO.Delete(ADODB.AffectEnum.adAffectCurrent) rsADO.Close() cnADO.Close()

و سپس نمو يكةنچند سطر نخست، چند متغير محلي را اعالن نموده، و ADO Recordset جديدي ازADO Connectionو پيكربندي مي Updateو AddNewسپس، اين بخش از كد، از متدهاي. كند را ايجاد

و تنظيم مقاديرADOبه متعلق مي، براي ايجاد يك رديف جديد كه كار زماني. كند آن، استفادهسپس، اگر بخواهيد اين كد را چندين. آيد رسد، يك قاب پيام به نمايش درمي روزآمدسازي به پايان مي

.شوند بسته ميADO Connectionو Recordsetسرانجام،. شود بار اجرا كنيد، رديف جديد حذف مي. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.2

Microsoft ADO.NET 2.0 592گام به گام با

. كليك كنيدUpdate ADOرويبر.3بهةبرنام و سپس خاتمه يافتن اين عمل را در يك قاب پيام Recordset كاربردي، رديف را افزوده،.كند اعالم مي

و سپس برنام.4 .ردي را ببنديد كاربةقاب پيام

سي: ADO Recordsetروزآمدساختن شارپ ويژوال

به.1 : اضافه كنيدbtnUpdate_Click event handlerدر ويرايشگر كد، سطور پايين را

ADODB.Recordset rsADO; ADODB.Connection cnADO; rsADO = new ADODB.Recordset(); cnADO = CreateConnection(); cnADO.Open("", "", "", 0); rsADO.ActiveConnection = cnADO; rsADO.Open("Select * From CategoriesByName", cnADO, ADODB.CursorTypeEnum.adOpenDynamic, ADODB.LockTypeEnum.adLockOptimistic, 0); rsADO.AddNew(Type.Missing, Type.Missing); rsADO.Fields["CategoryName"].Value = "Test"; rsADO.Fields["Description"].Value = "Description"; rsADO.Update(Type.Missing, Type.Missing); MessageBox.Show("Finished", "ADO Update");

NET Framework 593. در ADOXو ADOكاربرد/ فصل نوزدهم

rsADO.Delete(ADODB.AffectEnum.adAffectCurrent); rsADO.Close(); cnADO.Close();

چن و سپس نموچند سطر نخست، يكةند متغير محلي را اعالن نموده، و ADO Recordset جديدي ازADO Connectionو پيكربندي مي Updateو AddNewسپس، اين بخش از كد، از متدهاي. كند را ايجاد

و تنظيم مقادير آن، استفاده ميADOبه متعلق كه كار زماني. كند، براي ايجاد يك رديف جديدب ميروزآمدسازي سپس، اگر بخواهيد اين كد را چندين. آيد رسد، يك قاب پيام به نمايش درميه پايان

.شوند بسته ميADO Connectionو Recordsetسرانجام،. شود بار اجرا كنيد، رديف جديد حذف ميبرةبراي اجراي برنام.2 . فشار دهيدF5روي كليد كاربردي،.يد كليك كنUpdate ADOرويبر.3

بهةبرنام و سپس خاتمه يافتن اين عمل را در يك قاب پيام Recordset كاربردي، رديف را افزوده،.كند اعالم مي

و سپس برنام.4 . كاربردي را ببنديدةقاب پيام

NET Framework. در ADOXدرك

ADOX و اجازنمايد، كه امك مدلي از شيء را عرضه مي و كارةان مي منبع دادهء با اشيا ايجاد . دهد ها راكه. در تصوير زير نشان داده شده است ADOXمدل شيء از منابع دادهةهمتوجه داشته باشيد، هاو تعيين كنندكنند مدل پشتيباني نمياينءتمام اشيا .است Data Provider خود آن،ة،

هميشه ها تقريباً اين منبع داده.ي خاص استها، معادل يك منبع دادهCatalogدر باالترين سطح، شيء. نندك متفاوتي را عرضهء ممكن است اشياOLE DB Data Provider اين يا آن اما اطالعاتي است، يك بانكمي، دسترسي به منابع دادهUsersو Groupsهاي مجموعه گذارند، هايي را كه اين نوع از ايمني را به اجرا.كنند كنترل مي

Columnsةهر جدول حاوي يك مجموع. اطالعاتي است داخل بانكهاي نمايانگر جدول،Tablesيءش:است، كه نمايانگر موارد زير است

Microsoft ADO.NET 2.0 594گام به گام با

فيلدهاي مختلف جدول�.هاي فيزيكي است، كه نمايانگر نمايهIndexesةيك مجموع�داستفاده قرار، كه براي تعريف كليدهاي منحصر به فرد اوليه وخارجي مورKeysةيك مجموع�

.گيرد ميو مجموع هاي ذخيره شده در منبع داده نمايانگر روال،Proceduresةمجموع نمايانگر نماها Viewsةها، Microsoftبراي مثال،. ها مطابقت ندارد مدل مذكور، هميشه با مدل شيء منبع داده. ها هستند يا استعالم

Jetهاي اساسي، منبع دادهMicrosoft Access نمايانگر ،Views وProceduresء همچون اشياQueryاست .مي هر استعالمي كه رديف آيد درمي ADOX Catalogكند، هنگامي كه به طرح ها را روزآمد ساخته يا درج

)mapped(همراه با هر استعالمي كه حاوي پارامترهاست، به طرح شيء ،Procedureآيد درمي .ا استعالم .آيند اند، به طرح نماها درمي تشكيل شدهSELECTهايز گزارههايي كه تنها

از بانكءايجاد اشيا ADOX اطالعاتي با استفاده

نويسي در اختيار ها به كمك برنامه منبع دادهء مكانيسمي را براي ايجاد اشيا ADOXطور كه ديديم، همانميالب. كند از اين قابليت پشتيباني نميADO.NET. گذارد مي از ته، Data Commandتوانيد با استفاده

ADO.NET،ة گزارCREATE<object>SQL ،هاي ها در ميان منابع داده نگارش تعريف دادهاما را اجرا كنيدبه راحت ADOXمختلف بسيار متفاوت است، طوري كه اغلب استفاده از و OLE DB Dataتر است،

Providerع اجازه مي .مليات بپردازددهد، كه به رسيدگي اطالعاتي جديد از آن استفاده نمود، توان براي ايجاد يك بانك، كه ميCreate از متد Catalogشيء

م ك پشتيباني ميAppend از متدهاي Columnsو Tablesهاي حالي كه، مجموعهدر. كنديپشتيباني ه كنند،كرءتوان از آن براي ايجاد اشيا مي .د جديد طرح استفاده

از ايجاد بانك ويژوال بيسيك : ADOX اطالعاتي با استفاده

به.1 اضافه كرده، در صورت btnMakeDB_Click event handlerدر ويرايشگر كد، سطور پايين را.لزوم، محل فايل را تغيير دهيد

Dim dsStr As String Dim dsCn As String Dim mdb As ADOX.Catalog mdb = New ADOX.Catalog() dsStr = "C:\Microsoft Press\ADO.NET 2.0 Step by Step\SampleDBs\Test.mdb"

NET Framework 595. در ADOXو ADOكاربرد/ فصل نوزدهم

If File.Exists(dsStr) Then File.Delete(dsStr) End If dsCn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + dsStr + ";" mdb.Create(dsCn) mdb.ActiveConnection.Close() MessageBox.Show("Finished", "Make DB")

. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.2 . كليك كنيدMake Databaseبرروي.3

و سپس قاب پيام را به نمايش Test.mdb با نام Jet اطالعاتي كاربردي، يك بانكةبرنام ايجاد كرده،.گذارد مي

و سپس برنام.4 . كاربردي را ببنديدةقاب پيام،بWindows Explorerدر.5 . ايجاد شده يا خيرTest.mdb اطالعاتي جديد ينيد بانكب،

از ايجاد بانك سي: ADOX اطالعاتي با استفاده شارپ ويژوال

به.1 اضافه كرده، در صورت btnMakeDB_Click event handlerدر ويرايشگر كد، سطور پايين را.لزوم، محل فايل را تغيير دهيد

string dsStr; string dsCn; ADOX.Catalog mdb; mdb = new ADOX.Catalog();

Microsoft ADO.NET 2.0 596گام به گام با

dsStr = "C:\\Microsoft Press\\ADO.NET 2.0 Step by Step\\" + "SampleDBs\\Test.mdb"; if (File.Exists(dsStr)) {

File.Delete(dsStr); }dsCn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + dsStr + ";"; mdb.Create(dsCn); ((ADODB.Connection)mdb.ActiveConnection).Close(); MessageBox.Show("Finished","Make DB");

برةبراي اجراي برنام.2 . فشار دهيدF5روي كليد كاربردي،. كليك كنيدMake Databaseرويبر.3

و سپس قاب پيام را به نمايش Test.mdb با نام Jet اطالعاتي كاربردي، يك بانكةبرنام ايجاد كرده،.گذارد مي

و سپس برنام.4 . كاربردي را ببنديدةقاب پيام،بWindows Explorerدر.5 . ايجاد شده يا خيرTest.mdb اطالعاتي جديد ينيد بانكب،

از افزودن يك جدول به بانك ويژوال : ADOX اطالعاتي با استفاده

بيسيك

به.1 : اضافه كنيدbtnMakeTable_Click event handlerدر ويرايشگر كد، سطور زير را

Dim dsStr As String Dim dsCn As String

NET Framework 597. در ADOXو ADOكاربرد/ فصل نوزدهم

Dim cnADO As ADODB.Connection Dim mdb As ADOX.Catalog Dim dt As ADOX.Table mdb = New ADOX.Catalog() cnADO = New ADODB.Connection() dsStr = "C:\Microsoft Press\ADO.NET 2.0 Step by Step\SampleDBs\Test.mdb" dsCn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + dsStr + ";" cnADO.ConnectionString = dsCn cnADO.Open() mdb.ActiveConnection = cnADO dt = New ADOX.Table() dt.Name = "New Table" dt.Columns.Append("TableID", ADOX.DataTypeEnum.adWChar, 5) dt.Columns.Append("Value", ADOX.DataTypeEnum.adWChar, 20) dt.Keys.Append("PK_NewTable", ADOX.KeyTypeEnum.adKeyPrimary, _ "TableID") mdb.Tables.Append(dt) cnADO.Close() MessageBox.Show("Finished", "Make Table")

. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.2ده، قاب افزوTest.mdb اطالعاتي كاربردي، جدول را به بانكةبرنام. كليك كنيدMake Tableبرروي.3

.گذارد پيام را به نمايش مي

Microsoft ADO.NET 2.0 598گام به گام با

و سپس خود برنام.4 . كاربردي را ببنديدةقاب پيام، را باز كرده، Test.mdb اطالعاتي بر روي كامپيوترتان نصب است، بانكMicrosoft Accessاگر.5

. اضافه شده استNew Tableتصديق كنيد جدولي به نام

ازكافزودن يك جدول به بان ويژوال : ADOX اطالعاتي با استفاده

شارپ سي

به.1 : اضافه كنيدbtnMakeTable_Click event handlerدر ويرايشگر كد، سطور زير را

string dsStr; string dsCn; ADODB.Connection cnADO; ADOX.Catalog mdb; ADOX.Table dt;

NET Framework 599. در ADOXو ADOكاربرد/ فصل نوزدهم

mdb = new ADOX.Catalog(); cnADO = new ADODB.Connection(); dsStr = "C:\\Microsoft Press\\ADO.NET 2.0 Step by Step\\" + "SampleDBs\\Test.mdb"; dsCn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + dsStr + ";"; cnADO.ConnectionString = dsCn; cnADO.Open("", "", "", 0); mdb.ActiveConnection = cnADO; dt = new ADOX.Table(); dt.Name = "NewTable"; dt.Columns.Append("TableID", ADOX.DataTypeEnum.adWChar, 5); dt.Columns.Append("Value", ADOX.DataTypeEnum.adWChar, 20); dt.Keys.Append("PK_NewTable", ADOX.KeyTypeEnum.adKeyPrimary, "TableID", "", ""); mdb.Tables.Append(dt); cnADO.Close(); MessageBox.Show("Finished", "Make Table");

. فشار دهيدF5 كاربردي، برروي كليدةبراي اجراي برنام.2 افزوده، قاب Test.mdb اطالعاتي كاربردي، جدول را به بانكةبرنام. كليك كنيدMake Tableبرروي.3

ميپيام را به نماي .گذاردش

و سپس خود برنام.4 . كاربردي را ببنديدةقاب پيام، تأييد را باز كرده، Test.mdb اطالعاتي روي كامپيوترتان نصب است، بانك برMicrosoft Accessاگر.5

. اضافه شده استNew Tableكنيد جدولي به نام

Microsoft ADO.NET 2.0 600گام به گام با

خالصه

NET Framework. از داخل ADOXو ADO در COMايه در فصل آخر كتاب، با استفاده از كتابخانهبه. آشنا شديم - بهADOهايو انواع داده،طور اعم بهCOMء براي اشياdata type marshalingبا نگاهي

را. پرداختيمNET Framework.و COM بين interoperablilityطور اخص، به بررسي سپس، توجه خودكه- ADO Connectionبا متدي براي ايجاد. نموديم ADOXو ADO هاي معطوف به كاربرد كتابخانه

و روزآمدسازي داده- استADO.NET Connectionبسيار شبيه ايجاد باو راهي براي بازيابي ها براي ايجاد ADOXةدر پايان، به بررسي كاربرد كتابخان. آشنا شديمADO Recordsetاستفاده از

.ها پرداختيمو ستونهاهاي اطالعاتي، جدول بانك