VFP ·R¥ÎªÌªÀ°Ï ­º­¶ VFP ·R¥ÎªÌªÀ°Ï
¥»°Q½×°Ï¬° Visual Foxpro ·R¥ÎªÌ¸gÅç¥æ¬yªº¦a¤è, ½Ð¦h¦h§Q¥Î"·j´M"ªº¥\¯à, ¥ý¬d¬Ý¬Ý¦³µL«e¨Ò¥i´`, ¦pªGÁÙ¦³¤£À´ªº¦Aµo°Ý. ³¡¥÷¥DÃD¦³ªþ¥[ÀÉ®×, ¶·¥ýµù¥U¦¨¬°ªÀ°Ï©~¥Á¤~¥i¥H¤U¸ü.
 
 ±`¨£°ÝÃD±`¨£°ÝÃD   ·j´M·j´M   ·|­û¦Cªí·|­û¦Cªí   ·|­û¸s²Õ·|­û¸s²Õ   ·|­ûµù¥U·|­ûµù¥U 
 ­Ó¤H¸ê®Æ­Ó¤H¸ê®Æ   µn¤JÀˬd±zªº¨p¤H°T®§µn¤JÀˬd±zªº¨p¤H°T®§   µn¤Jµn¤J

CursorAdapter °_¨B1(Âà¶K)

 
µoªí·s¥DÃD   ¦^ÂÐ¥DÃD    VFP ·R¥ÎªÌªÀ°Ï ­º­¶ -> VFP °Q½×°Ï
¤W¤@½g¥DÃD :: ¤U¤@½g¥DÃD  
µoªí¤H ¤º®e
Ruey



µù¥U®É¶¡: 2003-03-12
¤å³¹: 1698
¨Ó¦Û: tunglo

²Ä 1 ¼Ó

µoªíµoªí©ó: ¬P´Á¤­ ¤K¤ë 29, 2003 10:48 am    ¤å³¹¥DÃD: CursorAdapter °_¨B1(Âà¶K) ¤Þ¨¥¦^ÂÐ

CursorAdapter °_¨B(¤@)
§@ªÌ¡GDung Hennig
ĶªÌ¡Gfbilo

CursorAdapter Ãþ¬O VFP 8 ¤¤³Ì­«­nªº·s¥\¯à¤§¤@¡A¦]¬°¥¦´£¨Ñ¤F¤@ºØ²³æ©ö¥Î¡B¤¶­±²Î¤@ªº³X°Ý»·ºÝ¸ê®Æ·½¤è¦¡¡C¦b³o­Ó¤ëªº¤å³¹ùØ¡ADung Hennig ±N¦V§A®i¥Ü CursorAdapter ¤Î¥¦ªº¤u§@¤è¦¡¡C¤U­Ó¤ë¡A§Ú­Ì±N¦A¾Ç²ß¤@¨Ç°ª¯Åªº¥Îªk¡C
¥¿¤å
¶V¨Ó¶V¦hªº VFP µ{¦¡®v¶}©l§â¥L­Ìªº¸ê®ÆÀx¦s¨ì¶H SQL Server ©ÎªÌ Oracle ³o¼Ëªº VFP ªí¥H¥~ªº¸ê®Æ­Ü®w¤¤¥h¤F¡C¦³³\¦h­ì¦]¾É­P¤F³oºØ±¡ªp¡A¥]¬A VFP ªíªº¯Ü®z©Ê(¤£ºÞ¬O·Q¹³¤¤ªºÁÙ¬O½T¹ê¦p¦¹)¡B¦w¥þ©Ê¡B¸ê®Æ®wªº®e¶q¡B¥H¤Î³q¥Î©Êªº¼Ð·Çµ¥µ¥¡CMicroSoft ¤w¸g¦b¨C¤@­Óª©¥»¤¤³£¨Ï±o³X°Ý«D VFP ¸ê®Æ§ó¥[ªºÂ²³æ¡A¬°¤F¹ªÀy³oºØ­·®ð¡A¥¦¬Æ¦Ü¦b VFP 7 ¥úºÐ¤¤¦Û±a¤F MSDE(Microsoft Data Engine¡ASQL Server ªº¤@­Ó§K¶O¡B²¸Ëª©)¡C

¤£¹L¡A³X°Ý¤@­Ó«á»O¸ê®Æ®w±q¨Ó´N¤ñ¨Ï¥Î VFP ªí­n³Â·Ð¤@¨Ç¡A¦Ó§A¥i¥H¨Ï¥Îªº¾÷¨î«h¦h±oÀ~¤H¡G
• »·ºÝµø¹Ï¡A¥¦°ò©ó ODBC ³s±µ¡F
SQL Passthrough (SPT) ¨ç¼Æ¡A¨Ò¦p SQLCONNECT()¡BSQLEXEC() ©M SQLDISCONNECT()¡A¥¦­Ì¤]°ò©ó ODBC ³s±µ¡F
• ActiveX Data Objects¡A²ºÙ ADO¡A¥¦´£¨Ñ¤F¤@­Ó¹ï¦UºØ¸ê®Æ®w¤ÞÀºªº OLE Provider ªº¤@­Ó­±¹ïª«¥ó³X°Ý¤è¦¡¡F
• XML¡A¥¦¬O¤@­Ó¦Ð¶q¯Åªº¡B¥­»OµLÃöªº¸ê®Æ¶Ç¿é¾÷¨î¡C
¦pªG§A´¿¸g¥Î³o¨Ç¾÷¨î¤W¤u§@¹L¡A¦³¤@¥ó¨Æ±¡§A¥i¯à¤w¸gª`·N¨ì¤F¡G¥¦­Ì¤¤ªº¨C¤@ºØ³£¦U¤£¬Û¦P¡C³o¼Ëªº¸Ü¡A§A´N¥²¶·¤@­Ó­Óªº¾Ç¹L¨Ó¡AÁÙ­n§â¤@­Ó¤w¦³ªºÀ³¥Îµ{¦¡±q¤@ºØ¾÷¨îÂà´«¨ì¥t¤@ºØ¾÷¨î¡A³o¥i¤£¬O¤@¥ó²³æªº¤u§@¡C

¥Ñ©ó¦³¤F¤@­Ó·sªº°ò¦Ãþ CursorAdapter¡A¦b VFP 8 ¤¤³X°Ý»·ºÝ¸ê®Æ­n¤ñ¹L¥hªºª©¥»¤¤Â²³æªº¦h¡C¥H§Ú¤§¨£¡ACursorAdapter ¬O VFP 8 ³Ì­«­nªº·s¥\¯à¤§¤@¡C§Ú»{¬°¥¦³Ì´Îªº¦a¤è¬O¡G
• ¨Ï¥Î ODBC¡BADO¡BXML Åܱo«D±`®e©ö¡A§Y®É§A¤£¼ô±x³o¨Ç§Þ³N¡C
• ¤£ºÞ§A¿ï¾Ü¤F­þºØ»·ºÝ¸ê®Æ·½¾÷¨î¡A¥¦³£´£¨Ñ¤@ºØ²Î¤@ªº³X°Ý¤¶­±¡C
• ±q¤@ºØ¾÷¨îÂà´«¨ì¥t¤@ºØ¾÷¨îÅܱo«D±`ªº»´ÃP¡C
³oùجO¤W­±ªº³Ì«á¤@­ÓÆ[ÂIªº¨Ò¤l¡C°²³]§A¦³¤@­Ó¨Ï¥Î CursorAdapter ³q¹L ODBC ¨Ó³X°Ý SQL Server ¸ê®ÆªºÀ³¥Îµ{¦¡¡A¥Ñ©ó¬Y¨Ç­ì¦]§A·Q­n§ï¦¨¨Ï¥Î ADO ¤F¡C¹ï©ó³oºØ±¡ªp¡A§A¥u»Ý­n§ï°Ê CursorAdapter ªº DataSourceType ÄÝ©Ê¡B¨Ã§ïÅܹï«á»O¸ê®Æ®wªº³s±µ¡A´N¥þ³¡§¹¦¨¤F¡C§AªºÀ³¥Îµ{¦¡¤¤ªº¨ä¥L³¡¤À¤£»Ý­nª¾¹D¤]¤£»Ý­nÃö¤ß³o¨Ç¨Æ±¡¡F¥¦­Ì¬Ý¨ìªº¥u¬O¦P¤@­Ó Cursor ¦Ó¤£ºÞ¨Ï¥Î¤F­þ¤@ºØ¾÷¨î¡C
ÄÝ©Ê
§Ú­Ì¥ý±q¬d¬Ý CursorAdapter ªºÄÝ©Ê¡B¨Æ¥ó©M¤èªk¶}©l¨Ó¾Ç²ß¥¦¡C³oùؤ£·|°Q½×©Ò¦³ªºÄÝ©Ê¡A¥u½Í¤@¤U³Ì­«­nªº¨º¨Ç¡C
DataSourceType
³o­ÓÄݩʬO³Ì­«­nªº¡G¥¦¨M©w¤F³o­ÓÃþªºªí²{¡A¥H¤Î­n¦b¨ä¥L¤@¨ÇÄݩʤ¤­n«ç»ò³]¸m¡C¥i¥Îªº¿ï¶µ¦³¡§Native¡¨¡X¡X·N«ä¬O¨Ï¥Î VFP ªí¡X¡X©ÎªÌ¬O "ODBC"¡B"ADO" ©Î "XML"¡Aªí¥Ü§A­n¿ï¥Îªº³X°Ý»·ºÝ¸ê®Æ·½ªº¤è¦¡¡C
DataSource
³o¬O³X°Ý¸ê®Æªº¤â¬q¡C·í DataSourceType ³Q³]¸m¦¨¡§Native¡¨©ÎªÌ¡§XML¡¨ªº®É­Ô¡AVFP·|©¿²¤³o­ÓÄݩʪº³]¸m¡C¹ï©óODBC¡A½Ð§â³o­ÓÄݩʳ]¸m¬°¤@­Ó¦³®Äªº ODBC ³s±µ±±¨î½X(³o·N¨ýµÛ§A­n¦Û¤vºÞ²z³s±µ¤F)¡C¦bADOªº±¡ªp¤U¡ADataSource ¥²¶·¬O¤@­Ó ADO RecordSet¡A¦Ó¥B¥¦ªº ActiveConnection ª«¥ó¥²¶·³Q³]¸m¬°¤@­Ó¥´¶}ªº ADO Connection ª«¥ó(§A¤S­n¦Û¤vºÞ²z³o¨Ç¤F)¡C
UseDEDataSource
¦pªG³o­ÓÄݩʳQ³]¸m¦¨¤F .T.(Àq»{¬O .F.)¡A§A¥i¥H¤£ºÞ¥¦ªº DataSourceType ©M DataSource ÄÝ©Ê¡A¦]¬° CursorAdapter ±N¨Ï¥Î DataEnvironment ªºÄݩʨӥN´À( VFP 8 µ¹ DataEnvironment ¤]¼W¥[¤F DataSourceType ©M DataSource ÄÝ©Ê)¡CÁ|¨Ò¨Ó»¡¡A·í§A·QÅý¦b¤@­Ó¸ê®ÆÀô¹Ò¤¤ªº©Ò¦³ CursorAdapters °«¨Ï¥Î¦P¤@­Ó ODBC ³s±µªº®É­Ô¡A´N¥i¥H§â¥¦³]¸m¬° .T.¡C
SelectCmd
°£¤F XML ªº±¡ªp¥H¥~¡A³o¬O¤@­Ó¥Î¨Ó¨ú±o¸ê®Æªº SQL Select ©R¥O¡C¦b XML ªº±¡ªp¤U¡A¥¦¥i¥H©ÎªÌ¬O¤@­Ó¯à°÷³QÂà´«¬°¤@­Ó Cursor ªº¦³®Ä XML ¦r¦ê(¨Ï¥Î¤º³¡ªº XMLTOCURSOR() ½Õ¥Î)¡A©ÎªÌ¬O¤@­Ó¯à°÷ªð¦^¤@­Ó¦³®Äªº XML ¦r¦êªº¹Bºâ¦¡¡C
CursorSchema
³o­ÓÄÝ©ÊùØ«O¦sªº¬O Cursor ªº¸ê®Æµ²ºc¡A®æ¦¡´N¹³§A¦b¥Î CREATE CURSOR ©R¥Oªº®É­Ô¥Îªº¨º¼Ë¡C³o¬O¤@­Ó¨Ò¤l¡GCUST_ID C(6), COMPANY C(30), CONTACT C(30), CITY C(25)¡C¾¨ºÞ¤£³]¸m³o­ÓÄݩʦÓÅý CursorAdapter ¦b¦Û¤v«Ø¥ß Cursor ¥h¨M©w³o­Óµ²ºc¤]¬O¥i¥Hªº¡A¤£¹L¦pªG§A¦Û¤v¿é¤Jªº¸Ü¡A¥¦·|¤u§@ªº§ó¦n¡C¦pªG CursorSchema ¬OªÅªº©ÎªÌ¤£¥¿½T¡A¨º»ò·í§A¥´¶}¤@­Óªí³æªº¸ê®ÆÀô¹Òªº®É­Ô¡A´N·|­n»ò¼u¥X¤@­Ó¿ù»~¡A­n»ò´N¤£¯à³q¹L±q CursorAdapter ¤¤©ì©ñÄæ¦ì¨ìªí³æ¤W¨Ó«Ø¥ß±±¨î¶µ¡C©¯¹Bªº¬O¡AVFP ¦Û±aªº CursorAdapter ¥Í¦¨¾¹¥i¥H¬°§A¶ñ¥R³o­ÓÄÝ©Ê¡C
AllowDelete¡BAllowInsert¡BAllowUpdate ©M SendUpdates
³o¨ÇÄݩʪº¹w³]­È¬O .T.¡A¥¦­Ì¨M©w¤F¬O§_¥i¥H§R°£¡B´¡¤J©M§ó·s©M§ï°Ê¬O§_­n³Qµo°e¨ì¸ê®Æ·½¡C
KeyFieldList¡B Tables¡B UpdatableFieldList¡B©M UpdateNameList
³o¨ÇÄݩʪº¥Î³~¸ò CURSORSETPROP() ¤¤¥Î¨ìªº¨º¨Ç°Ñ¼Æªº¥Î³~¬O¤@¼Ëªº¡A¦pªG§A·QÅý VFP ¦Û°Ê±N¹ï Cursor ªº§ï°Ê´£¥æ¨ì¸ê®Æ·½¡A³o¨ÇÄÝ©Ê´N¬O¥²¶·ªº¡C
• KeyFieldList ¬O¤@­Ó¥Î³r¸¹¤À¹jªºÄæ¦ì¦Cªí(¤£±a§O¦W)¡A³o¨ÇÄæ¦ì²Õ¦¨ Cursor ªº¥DÃöÁä¦r¡CTables ¬O¤@­Ó¥Î³r¸¹¤À¹jªºªí¦W¦Cªí¡C
• UpdatableFieldList ¬O¤@­Ó¥Î³r¸¹¤À¹jªº¥i¥H³Q§ó·sªºÄæ¦ì¦W¦Cªí(¤£±a§O¦W)¡C
• UpdateNameList ¬O¤@­Ó¥Î³r¸¹¤À¹jªº¦Cªí¡A¥¦¥Î¨ÓÅý Cursor ¤¤ªºÄæ¦ì¦W»P¦bªí¤¤ªºÄæ¦ì¦W¬Û¤Ç°t¡CUpdateNameList ªº®æ¦¡´N¹³ ³o¼Ë¡GCURSORFIELDNAME1 TABLE.FIELDNAME1¡BCURSORFIELDNAME2 TABLE.FIELDNAME2 µ¥µ¥¡Cª`·N¡G¦pªG UpdatableFieldList ¤£¥]§tªíªº¥DÁäÄæ¦ìªº¦WºÙ(¤ñ¦p»¡§A¤£·QÅý¥Î¤á¥i¥H§ó·s³o­ÓÄæ¦ì)¡A¦b UpdateNameList ÁÙ¬O¥²¶·­n¦³³o­ÓÄæ¦ì¡A§_«h´N¤£¯à§ó·s¡C
¡@
Cmd¡B*CmdDataSource ©M *CmdDataSourceType
¦pªG§A·Q«ü©wÅý VFP «ç¼Ë¥h§R°£¡B´¡¤J©M§ó·s¸ê®Æ·½¤¤ªº°O¿ý¡A§A¥i¥Hµ¹³o¨ÇÄݩʳ]¸m¬ÛÀ³ªº­È¡X¡Xª`·N¡A* ªº¦ì¸m¬O Delete¡BInsert ©ÎªÌ Update¡C
CursorFill(UseCursorSchema, NoData, Options, Source)
³o­Ó¤èªk«Ø¥ß Cursor¡A¨Ã¥Î¨Ó¦Û¸ê®Æ·½ªº¸ê®Æ¶ñ¥R³o­Ó Cursor(§A¤]¥i¥Hµ¹ NoData °Ñ¼Æ¶Ç»¼¤@­Ó .T.¥H«Ø¥ß¤@­ÓªÅªº Cursor)¡Aµ¹²Ä¤@­Ó°Ñ¼Æ¶Ç»¼ .T. ¨Ó¨Ï¥Î©w¸q¦b CursorSchema ¤¤ªº´å¼Ð¸ê®Æµ²ºc¡A©ÎªÌ¶Ç»¼ .F. ¨Ó®Ú¾Ú¸ê®Æ·½¤¤ªºµ²ºc«Ø¥ß¤@­Ó¬ÛÀ³ªºµ²ºc¡CMULTILOCKS ¥²¶·³Q³]¸m¦¨ ON¡A§_«h³o­Ó¤èªk±N°õ¦æ¥¢±Ñ¡C¦pªG CursorFill ¥Ñ©ó¬Y¨Ç­ì¦]°õ¦æ¥¢±Ñ¡A¥¦¤£·|µo¥Í¤@­Ó¿ù»~¦Ó¬Oªð¦^ .F.¡A¤£¹L§AÁÙ¬O¥i¥H¥Î AERROR() ¨ÓÀˬdµo¥Í¤F¤°»ò¿ù»~(·Ç³Æ­W­W«õ±¸§a¡I³q±`§A±o¨ìªº¿ù»~¸ê°T³£¤£¨¬¥H§i¶D§A¨s³º°ÝÃD¦b­þ¨½)¡C
CursorRefresh()
³o­Ó¤èªkÃþ¦ü©ó Requery() ¨ç¼Æ¡G¥¦¨ê·s Cursor ªº¤º®e¡C
Before*() ©M After*()
CursorAdapter ªº´X¥G¨C­Ó¤èªk©M¨Æ¥ó³£¦³¤@®M before ©M After ¶}ÀYªº¡§hook¡¨¨Æ¥ó(hook³o­Óµü¤¤¤å¨S¦³«Ü¦nªº¹ïÀ³¡A«j±j§â¥¦Â½Ä¶¦¨¡§±¾鈎¡¨ÁÙ¤£¦p¤£Â½)¡A³o¼Ë§A´N¥i¥H¦Û©w¸q CursorAdapter ªº¦æ¬°¯S©Ê¤F¡C¨Ò¦p¡A§A¥i¥H¦b AfterCursorFill ¤¤¬° Cursor «Ø¥ß¯Á¤Þ¡C¦b Before ¨t¦C¨Æ¥ó¤¤§A¥i¥Hªð¦^¤@­Ó .F. ¨Ó¨¾¤îIJµo³Q hook ªº¨Æ¥óµo¥Í(Ãþ¦ü©ó¸ê®Æ®w¨Æ¥ó)¡C
¥Ü¨Ò
³oùجO¤@­Ó¥Ü¨Ò¨Ó¦Ûªþ±aªº¥Ü¨ÒÀÉ (CursorAdapterExample.prg)¡A¥¦¥Î©ó±q SQL Server ¦Û±aªº Northwind ¸ê®Æ®wªº Customers ªí¤¤¨ú±o¤Ú¦è«È¤áªº¬Y´X­ÓÄæ¦ì¸ê®Æ¡C²£¥Íªº Cursor ¬O¥i§ó·sªº¡A©Ò¥H¦pªG§A¹ï Cursor ¤¤ªº¸ê®Æ°µ¤F¬Y¨Ç§ï°Ê¡AµM«á¦A¦¸¹B¦æµ{¦¡¡A§A·|¬Ý¨ì­è¤~©Ò§@ªº§ï°Ê¤w¸g³Q«O¦s¦b«á»O¸ê®Æ®w¤¤¤F¡C

local lcConnString, ;
loCursor as CursorAdapter, ;
laErrors[1] lcConnString = 'driver=SQL Server;server=(local);' + ;
'database=Northwind;uid=sa;pwd=;trusted_connection=no'
* §â³oùتº±K½X§ï¦¨§A¦Û¤vªº¸ê®Æ®w¤¤±K½X

loCursor = createobject('CursorAdapter')
with loCursor
.Alias = 'Customers'
.DataSourceType = 'ODBC'
.DataSource = sqlstringconnect(lcConnString)
.SelectCmd = "select CUSTOMERID, " + ;
"COMPANYNAME, CONTACTNAME from CUSTOMERS " + ;
"where COUNTRY = 'Brazil'"
.KeyFieldList = 'CUSTOMERID'
.Tables = 'CUSTOMERS'
.UpdatableFieldList = 'CUSTOMERID, COMPANYNAME, ' + ;
'CONTACTNAME'
.UpdateNameList = ;
'CUSTOMERID CUSTOMERS.CUSTOMERID, ' + ;
'COMPANYNAME CUSTOMERS.COMPANYNAME, ' + ;
'CONTACTNAME CUSTOMERS.CONTACTNAME'
if .CursorFill()
browse
else
aerror(laErrors)
messagebox(laErrors[2])
endif
.CursorFill()
endwith
¸ê®ÆÀô¹Ò©Mªí³æªº¼W±j
¬°¤F¤ä´©·sªº CursorAdapter Ãþ¡A¹ïªí³æ©M¸ê®ÆÀô¹ÒÃþ¤]°µ¤F¤@¨Ç¼W±j¡C

­º¥ý¡A¶H§Ú«e­±´£¨ì¹Lªº¨º¼Ë¡ADataEnvironment Ãþ²{¦b¦³¤F DataSource ©M DataSourceType ÄÝ©Ê¡C¤£¹L¥¦¦Û¤v¨Ã¤£¨Ï¥Î³o¨ÇÄÝ©Ê¡A¦Ó¬Oµ¹¨º¨Ç¦b³o­Ó¸ê®ÆÀô¹Ò¤¤ªº¨º¨Ç UseDEDataSource ³Q³]¸m¦¨¤F .T. ªº CursorAdapter ¨Ï¥Îªº¡C¨ä¦¸¡A²{¦b§A¥i¥H¨Ï¥ÎÃþ³]­p¾¹¨Óµøı¤Æªº«Ø¥ß DataEnvironment ªº¤lÃþ¤F(«z¡I)¡C

¦Ó¹ï©óªí³æ¡A§A¥i¥H³q¹L³]¸m·sªº DEClass ©M DEClassLibrary Äݩʨӫü©w¨Ï¥Î¤@­Ó DataEnvironment ªº¤lÃþ¤F¡C¤£¹L³o»ò°µ¤@©w­n¶X¦­¡A¦]¬°¦b³o»ò·F¤F¥H«á¡A­ì¨Óªº¸ê®ÆÀô¹Ò¤¤©Ò¦³¤w¸g°µ¦nªºªF¦è(Cursor¡B¥N½Xµ¥µ¥)³£·|¥á¥¢¡AÁÙ¦n¨t²Î·|¥ýĵ§i§A¡Cªí³æªº¤@­Ó«Ü»Åªº·s¥\¯à¬O¥¦ªº BindControls ÄÝ©Ê¡X¡X§â³o­ÓÄݩʳ]¸m¬°.F.´N¥i¥HÅýªí³æ¦b INIT ªº®É­Ô¤£¹ï±±¨î¶µ¶i¦æ¸ê®Æ¸j©w¡A¦Ó¥u¦³·í BindControls ³Q³]¸m¬° .T. ªº®É­Ô¤~·|³o¼Ë¡C³o­Ó¥\¯à¦n¦b­þ¨½©O¡H§A´¿¸g¦h¤Ö¦¸¶A©G¹L³o¼Ëªº±¡ªp¡G°Ñ¼Æ¥²¶·³Q¶Ç»¼µ¹ªí³æªºINIT¨Æ¥ó¡A¦ÓINIT¨Æ¥ó«o­nµ¥¨ì©Ò¦³ªº±±¨î¶µ¤w¸gªì©l¤Æ¨Ã¤w¸g¸j©w¨ì¥¦­Ìªº¸ê®Æ·½¤F¥H«á¤~·|³QIJµo¡H­n¬O§A·Q¦V¸Óªí³æ¶Ç»¼¤@­Ó°Ñ¼Æ¨Ó§i¶Dªí³æ¥´¶}­þ­Óªí©ÎªÌ¨ä¥L·|¼vÅT ControlSources ªº¨Æ±¡ªº®É­Ô¸Ó«ç»ò¿ì¡H³o­Ó·sªºÄÝ©ÊÅý³o¨Ç¨Æ±¡Åܱo¶H¥´­Ó½OºÎ¨º»ò®e©ö¡C
ÀuÂI
¦³¤j¶qªº²z¥Ñ¤ä«ù§Ú­Ì¨Ï¥Î CursorAdapters ¨Ó¥N´À»·ºÝµø¹Ï¡BSPT¡BADO ©ÎªÌ XML¡G
• ¨C¤@ºØ¾÷¨î³£¦³¤@ºØ¤£¦Pªº¤¶­±¡C¹ï©ó»·ºÝµø¹Ï¡A§A¥Î USE ©R¥O¨Ó¥´¶}¥¦­Ì¡C¹ï©óSPT¡A§A­n¨Ï¥Î SQLCONNECT() ©M SQLEXEC() ¨Ó«Ø¥ß¤@­Ó Cursor¡C¹ï©ó ADO¡A§A¥²¶·¥ý«Ø¥ß ADO ªº Connection ª«¥ó©M Recordset ª«¥ó(®Ú¾Ú§A¨ú±o¸ê®Æ¤è¦¡ªº¤£¦P¡A¤]³\ÁÙ¥i¯à»Ý­n¤@­Ó Command ª«¥ó)ªº¹ê¨Ò¡A¨Ã½Õ¥Î¥¦­Ìªº Open ¤èªk¡C¹ï©ó XML¡A§A­º¥ý¥²¶·±q¤°»ò¦a¤èÀò±o¤@­Ó XML ¦r¦ê(¨Ò¦p¦b N ¼hÀ³¥Î¤¤³q¹L¤@­Ó COM ³¡¥ó¡A©ÎªÌ¦b SQL Server ¤¤³q¹L SQLXML)¡AµM«á¨Ï¥Î XMLTOCURSOR() ¨Ó§â³o­Ó¦r¦êÂà´«¦¨¤@­Ó VFP ªº Cursor¡C½s¼g¹ï«á»O¸ê®Æ·½¶i¦æ§ó·sªº¥N½X¤]¦U¤£¬Û¦P¡C©Ò¥H¡A·í§A±q¤@ºØ¾÷¨îÂà´«¨ì¥t¤@ºØ¾÷¨îªº®É­Ô¡A´N¥²¶·­n¥h¾Ç¤@ºØ·sªº§Þ³N¡AÁÙ¦³§A¥i¯à»Ý­n­«¼gªº¤j¶q¤w¦³ªº¥N½X¡C

¤£ºÞ§A¨Ï¥Î­þºØ¾÷¨î¨Ó¨ú±o¸ê®Æ¡ACursorAdapters ³£¨Ï¥Î¦P¤@­Ó²Î¤@ªº¤¶­±¡C³q¹L³]¸m¸Óª«¥óªº¤@¨ÇÄÝ©Ê¡AµM«á½Õ¥Î¥¦ªº CursorFill ¤èªk¨Ó¨ú±o¸ê®Æ¡A¹ï³o­Ó Cursor ¾Þ§@®É´N¹³¦b¾Þ§@¤@­Ó´¶³qªº VFP Cursor ¤@¼Ë¡AµM«á½Õ¥Î TABLEUPDATE() (©ÎªÌÅý VFP ¦Û°Ê¥h³B²z¥¦)¨Ó±N§ó·s´£¥æ¨ì«á»O¸ê®Æ·½¡C
• ¦b¹ê»Ú¶}µoªº®É­Ô¡A§A¸g±`·|»Ý­n±q©R¥Oµøµ¡¤¤¥´¶}¤@­Ó Cursor ¨Ó¬yÄý¥¦ªº¤º®e¡C¹ï©ó»·ºÝµø¹Ï¡A³o»ò°µ¬O«Ü²³æªº¡A¦ý¬O¹ï©ó SPT¡BADO ©M XML¡A´N¥i¯à­nªá¤W«Ü¦h¤O®ð¤F¡C

¦Ó¥´¶}¥Ñ¤@­Ó CursorAdapter ªº¤lÃþ²£¥Íªº Cursor ´X¥G´N¹³¥´¶}¤@­Ó»·ºÝµø¹Ï¨º»ò®e©ö¡G§A¥u»Ý­n«Ø¥ß³o­Ó¤lÃþªº¹ê¨Ò¡AµM«á½Õ¥Î¥¦ªº CursorFill ¤èªk´N¦æ¤F¡C§A¬Æ¦Ü¥i¥Hª½±µ¦b¥¦ªº INIT ¤èªk¤¤¶i¦æ CursorFill¡A³o¼Ë¥u­n¤@¨B´N¥i¥H§¹¦¨¾Þ§@¤F¡C
• ¹ï©ó»·ºÝµø¹Ï¨Ó»¡¡A¤É¾E¤@­Ó¤w¦³ªºÀ³¥Îµ{¦¡·|¬Û¹ï®e©ö¤@¨Ç¡G§A¥u­n§â¸ê®ÆÀô¹Ò¤¤¥»¦aªí©Îµø¹ÏªºªF¦è´«¦¨¦P¦Wªº»·µ{µø¹Ï´N¦æ¤F¡C¦ý¬O¹ï©óSPT¡BADO ©Î XML¡A§A¥i¯à´N¥²¶·­n¥þ³¡­«¼g¾ã­Ó¸ê®Æ³X°Ý¤è®×¤F¡C

¦Ó¥Î CursorAdapters ¨Ó¤É¾E¤@­ÓÀ³¥Îµ{¦¡´N·|¶H¥Î »·ºÝµø¹Ï¨Ó¤É¾E¤@¼Ë»´ÃP¡X¡X¥u­n²³æªº§â¸ê®ÆÀô¹Ò¤¤ªº Cursor ª«¥ó´À´«¦¨ CursorAdapters ª«¥ó´N¦æ¤F¡C
• ¦bªí³æ©M³øªí³]­p¾¹¤¤¨Ï¥Î»·ºÝµø¹Ï¨Ó¤u§@¬O«Ü®e©öªº¡C§A¥i¥Hµ¹¸ê®ÆÀô¹Ò²K¥[¤@­Ó»·ºÝµø¹Ï¡AµM«á´N¯à§Q¥Î¨ì¸ê®ÆÀô¹Ò´£¨Ñªºµøı¤Æ³]­pªºÀu¶Õ¤F¡G©ì©ñÄæ¦ì¨Ó¦Û°Ê«Ø¥ß±±¨î¶µ¡B³q¹L¦bÄݩʵøµ¡¤¤ªº¤U©Ô¦¡¦C¥Ü¤è¶ô¤¤¿ï¾Ü¨Ó»´ÃPªº±N±±¨î¶µ¸j©w¨ì¤@­ÓÄæ¦ìµ¥µ¥¡CSPT¡BADO¡BXML ´N¤£¤ä´©µøı¤Æ³]­p¤è¦¡¤F¡C

CursorAdapters »P»·ºÝµø¹Ï¤@¼Ë¯à°÷¨É¨ü¨ì¦b¸ê®ÆÀô¹Ò¤¤µøı¤Æ³]­pªº¨º¨ÇÀuÂI¡C
• ¥Îµø¹Ï³]­p¾¹¥i¥H«Ü®e©öªº«Ø¥ß»·ºÝµø¹Ï¡C¾¨ºÞ¹L¥h¥¦¦³µÛ³\¦h­­¨î¡A¤×¨ä¬O¦b³B²z¦³¨â­Ó¥H¤Wªºªí¬Û¤¬³s±µªºµø¹Ïªº®É­Ô¡A¥i²{¦b¡AVFP 8 ¤w¸g­×¥¿³o¨Ç°ÝÃD¤¤ªº¤j¦h¼Æ¡A¨Ã¥B²K¥[¤F³\¦h·s¥\¯à¡A¨Ò¦pÂù¦V½s¿è¡G§A¥i¥H¦b SQL µøµ¡¤¤­×§ï¥N½X¡AµM«á´N¯à¬Ý¨ì³o¨Ç§ï°Ê³Q¤Ï¬M¨ìµø¹Ï³]­p¾¹ªºµøı¤Æ³¡¤À¤¤¤F¡C¦Ó¹ï©ó SPT¡BADO ©M XML¡A­n°µªº¤u§@´N¦hªº¦h¡A¦]¬°¨C¼ËªF¦è§A³£¥²¶·¦Û¤v¼g¥N½X¡G«Ø¥ß©MÃö³¬³s±µ¡B­n°õ¦æªº SQL Select »y¥yµ¥µ¥¡C

VFP 8 ¥]§t¤F¤@­Ó CursorAdapters ¥Í¦¨¾¹¡A¥Î¤F¥¦¡A¥i¥H¥u»Ý­n«Ü¤Öªº¤u§@´N¥i¥H³]¸m¦n¨º¨Ç¹ï©ó¨ú±o©M§ó·s¸ê®Æ¨Ó»¡¬Û·í­«­nªºÄÝ©Ê¡C¥¦¬Æ¦ÜÁÙ¥]§t¤F¤@­Ó SelectCmd ¥Í¦¨¾¹¡A³o­Ó¥Í¦¨¾¹ªºµøı¤Æµ{«×´N¹³¬Oµø¹Ï³]­p¾¹¤@¼Ë¡A¥¦Åý§A¥i¥H³q¹L¨Ï¥Î¤@­Ó¡§mover¡¨±±¨î¶µ¨Ó¿ï¾ÜÀ³¸Ó±q»·ºÝªí¤¤¨ú±o¨º¨ÇÄæ¦ì¡C
• ±N»·ºÝµø¹Ï©MADO °O¿ý¶°¤¤ªº§ó·s´£¥æ¨ì«á»O¸ê®Æ®w¬O¬Û·í²³æªº¡C°²©wµø¹ÏªºÄݩʤw¸g³Q³]¸m¥¿½T¤F¡A¨º»ò§A¥u»Ý­n½Õ¥Î TABLEUPDATE() ´N¥i¥H¤F¡C¦b ADO ªº±¡ªp¤U¡A«h½Õ¥Î RecordSet.Update() ©ÎªÌ UpdateBatch()¡C¹ï©ó SPT ©M XML¡A§A´N¥²¶·¤â¤uªº°µ¤j¶q¤u§@¨Ó§â§ó·s´£¥æ¨ì«á»O¡C

¶H§Ú­Ì«e­±¬Ý¨ìªº¨º¼Ë¡A¥Î CursorAdapter ¨Ó´£¥æ§ó·s¥u»Ý­n³]¸m´X­ÓÄÝ©Ê¡AµM«á´N¥i¥H¥þ³¡¥æµ¹ VFP ¥h°µ¨ä¥L©Ò¦³ªº¤u§@¡A©ÎªÌ§A¤]¥i¥H«Ü¤è«Kªº³q¹L«ü©w«ç»ò§R°£¡B´¡¤J©M§ó·s¨ÓÀò±o§ó¤jªºÆF¬¡©Ê¡C
• ¥Ñ©ó»·ºÝµø¹Ï©M SPT «Ø¥ßªºµ²ªG¶°¬O VFP ªº Cursor¡A©Ò¥H§A¥i¥H¦bVFP¤¤ªº¥ô¦ó¦a¤è¨Ï¥Î¥¦­Ì¡Gªí®æ¡B³øªí¡B¥Î Scan ¨Ó¹M¾äµ¥µ¥¡C¦Ó¥t¤@¤è­±ªº ADO ©M XML¡A¦b¨Ï¥Î¤§«e´N¥²¶·¥ý§â¥¦­ÌÂà´«¦¨ Cursor¡A³o·|µ¹§AªºÀ³¥Îµ{¦¡¼W¥[ÃB¥~ªº½ÆÂø©Ê©M³B²z¥¦­Ìªº®É¶¡¡C

CursorAdapter ªºµ²ªG¶°¬O¤@­Ó VFP Cursor¡A©Ò¥H¥¦¦³µÛ»P»·ºÝµø¹Ï©MSPT¦P¼ËªºÀu¶Õ¡C¦Ó§ó´Îªº¬O¡A§Y¨Ï¸ê®Æ·½¬O ADO ©M XML §A¤]¯à±o¨ì¤@­Ó VFP ªº Cursor¡A¦]¬° CursorAdapter ·|¦Û°Ê¬°§A³B²z¦nÂà´«ªº¨Æ±¡¨Ã¬°§A§Î¦¨¤@­Ó Cursor¡C
• ¥Ñ©ó¤@­Ó»·ºÝµø¹Ïªº SQL Select »y¥y¬O¹w¥ý©w¸q¦nªº¡A©Ò¥H§AµLªk°ÊºA¥h­×§ï¥¦¡C¾¨ºÞ¹ï©ó¨º¨Ç¨å«¬ªº¸ê®Æµn¿ýªí³æ¨Ó»¡³o¤w¸g¨¬°÷¤F¡A¦ý¬O¹ï©ó¬d¸ß©M³øªí¨Ó»¡«h¤£µM¡C¥i¯à§A¥²¶·­n«Ø¥ß¦n´X­Ó±q¦P¤@­Óªí¤¤¨ú±o¸ê®Æªºµø¹Ï¡A¨C¤@­Ó·|¿ï¾Ü¤£¦PªºÄæ¦ì¡B¨Ï¥Î¤£¦Pªº WHERE ¤l¥yµ²ºcµ¥µ¥¡C¹ï©ó SPT¡BADO ©Î XML ¨Ó»¡¡A³o¤£¬O¤@­Ó°ÝÃD¡C

CursorAdapters ¤£·|¨ü³o­Ó°ÝÃDªº§é¿i¡X¡X§A¥i¥H«Ü»´ÃPªº³q¹L§ï°Ê SelectCmd ÄݩʨӧïÅܨú±o¤°»ò¸ê®Æ¥H¤Î«ç»ò¨ú±o¸ê®Æ¡C
• §A¤£¯à±q¤@­Ó»·ºÝµø¹Ï¤¤½Õ¥Î¦sÀx¹Lµ{¡A©Ò¥H»·ºÝµø¹Ï»Ý­nª½±µ³X°Ý«á»Oªºªí¡C¹ï©ó§AªºÀ³¥Îµ{¦¡ªº¸ê®Æ®wºÞ²z­û¨Ó»¡¡A³o¥i¯à¬O¤@­Ó°ÝÃD¡X¡X¬Y¨Ç¸ê®Æ®wºÞ²z­û»{¬°¡A°ò©ó¦w¥þªº©ÎªÌ¤°»ò¨ä¥L­ì¦]¡A©Ò¦³ªº¸ê®Æ³X°ÝÀ³¸Ó¥u³q¹L¦sÀx¹Lµ{¨Ó¶i¦æ¡C¦Ó¥B¡A¥Ñ©ó¦sÀx¹Lµ{¬O¦b«á»O¹w½sĶªº¡A©Ò¥H¥¦°õ¦æ°_¨Ó³q±`­n¤ñ SQL Select »y¥y§Ö±o¦h¡C¦b SPT¡BADO ©M XML ªº±¡ªp¤U¡A§A¥i¥H®Ú¾Ú»Ý­n¨Ó½Õ¥Î¦sÀx¹Lµ{¡C

³q¹L²³æªº³]¸m SelectCmd ÄÝ©Ê¡ACursorAdapters ¤]¥i¥H¨Ï¥Î¦sÀx¹Lµ{¡C
• »·ºÝµø¹Ï«O¦s¦b¤@­Ó¸ê®Æ®w®e¾¹¤¤¡A©Ò¥HÁÙ¦³¤@®M§A¥²¶·ºûÅ@©M¦w¸Ë¨ì«È¤á¨t²Î¤WªºÀÉ¡C¦¹¥~¡A·í§A¥´¶}¤@­Óµø¹Ïªº®É­Ô¡AVFP ·|¸Õ¹Ï¥hÂê©w¦b DBC ¤¤ªºµø¹Ïªº°O¿ý¡AÁöµM³o¥u»Ý­n«Üµuªº®É¶¡¡C¦b¤@­Ó¦£¸Lªº¨t²Î¤¤¡A·í´X­Ó¥Î¤á¸Õ¹Ï¦P®É¥´¶}¤@­Óªí³æªº®É­Ô¡A³o¥i¯à·|³y¦¨½Ä¬ð¡C¾¨ºÞ¤]¦³¤@¨ÇÅܳqªº³B²z¿ìªk(§âDBC«þ¨©¨ì¥»¦a¤u§@¯¸¤W¡B©ÎªÌ¨Ï¥Î¦b VFP 7 ¥H¤Wª©¥»¤¤ªº SET REPROCESS SYSTEM ¨Ó´î¤ÖÂê©wªº®É¶¡)¡A³oÁ`¬O¤@¥ó§A­n¾Þ¤ßªº¨Æ±¡¡CÁÙ¦³¤@­Ó°ÝÃD¬O¡G¦pªG§A¨Ï¥Î¤@­Ó SELECT * ªºµø¹Ï¨Ó±q¤@­Ó«ü©wªºªí¨ú±o¸ê®Æ¡B¦Ó¨º­Óªíªºµ²ºc¤S¦b«á»O³Q§ï°Ê¹L¤F¡A¨º»ò³o­Óµø¹Ï´N·|ÅܱoµL®Ä¦Ó¥B¥²¶·­n­««Ø¤~¯à¸Ñ¨M¡C¹ï©ó SPT¡BADO ©M XML ¨Ó»¡¡A¥Ñ©ó¥¦­Ì»P DBC µLÃö¡A¦]¦¹¥¦­Ì³£¨S¦³³o¨Ç°ÝÃD¡C

¦]¬°¥¦­Ì³£¤£¦b DBC ùØ­±¡A©Ò¥H CursorAdapters ´N¤]¨S³o¨Ç°ÝÃD¤F¡C
• ¥Ñ©ó»·ºÝµø¹Ï©M SPT ¬O³q¹L ODBC ¨Ó¤u§@ªº¡A¦]¦¹¥¦­Ì¥u¯à¥Î©óª½±µ¸ê®Æ³s±µªº¡§«È¤á¡X¦øªA¾¹¡¨¼Ò¦¡¡C¦ÓADO©MXML¦³µÛ¦b¤@­Ó N¡Ð¼hÀ³¥Îµ{¦¡¤¤ªº¦h­Ó¼h¤§¶¡¶Ç»¼¸ê®Æªº¾÷¨î¥i¨Ñ¿ï¾Ü¡C
¥Ñ©ó CursorAdapters ¥i¥H«Ø¥ß¨Ó¦Û ADO ©ÎªÌ XML ¸ê®Æªº VFP Cursor¡A¦]¦¹¥¦¹ï©ó¦b¤@­Ó N-¼hÀ³¥Îµ{¦¡¤¤³Q¥Î©ó¥Î¤á¤¶­±¼h¨Ó»¡¬O²z·Qªº¡C
Á`µ²

§Ú»{¬° CursorAdapters ¬O VFP 8 ¤¤³Ì­«­n¡B³Ì¥O¤H¿³¾Äªº¼W±j¤§¤@¡A¦]¬°¥¦´£¨Ñ¤F¤@­Ó¹ï©ó»·ºÝ¸ê®Æ·½ªº²Î¤@¦Ó¤S®e©ö¨Ï¥Îªº¤¶­±¡A¦¹¥~¡A¶H§Ú­Ì±N­n¦b¥H«áªº¤å³¹¤¤Á¿­zªº¨º¼Ë¡A¥¦ÁÙ¤¹³\§Ú­Ì«Ø¥ß¥i­«¥Îªº¸ê®ÆÃþ¡C¤U­Ó¤ë§Ú­Ì±N±´°Q¤@¤U³X°Ý¥»¦a¸ê®Æ©ÎªÌ¨Ï¥Î ODBC¡BADO©MXML¨Ó³X°Ý»·ºÝ¸ê®Æªº²Ó¸`¡C¦A¤U­Ó¤ë¡A§Ú­Ì±N±´°Q¤@¤U«Ø¥ß¥i­«¥Î¸ê®ÆÃþ¡B¥H¤Î«ç¼Ë¦b³øªí¤¤¨Ï¥Î CursorAdapters¡C

¡iĶªÌª`¡j
ªþ±aªº¥Ü¨ÒÀɬO¤@­ÓPRG¡A¹ê¦b¤Ó²³æ¤F¡A§Ú´Nª½±µ§â¤º®e¶K¦b³oùؤF¡C

local lcConnString, ;
loCursor as CursorAdapter, ;
laErrors[1]
lcConnString = 'driver=SQL Server;server=(local);database=Northwind;' + ;
'uid=sa;pwd=;trusted_connection=no'
* change password to appropriate value for your database
loCursor = createobject('CursorAdapter')
with loCursor
.Alias = 'Customers'
.DataSourceType = 'ODBC'
.DataSource = sqlstringconnect(lcConnString)
.SelectCmd = "select CUSTOMERID, COMPANYNAME, CONTACTNAME " + ;
"from CUSTOMERS where COUNTRY = 'Brazil'"
.KeyFieldList = 'CUSTOMERID'
.Tables = 'CUSTOMERS'
.UpdatableFieldList = 'CUSTOMERID, COMPANYNAME, CONTACTNAME'
.UpdateNameList = 'CUSTOMERID CUSTOMERS.CUSTOMERID, ' + ;
'COMPANYNAME CUSTOMERS.COMPANYNAME, CONTACTNAME CUSTOMERS.CONTACTNAME'
if .CursorFill()
browse
else
aerror(laErrors)
messagebox(laErrors[2])
endif .CursorFill()
endwith
CursorAdapter °_¨B(¤G)¥Î CursorAdapter ¨Ó¨ú±o©M§ó·s¸ê®Æ
§@ªÌ¡GDung Hennig
ĶªÌ¡Gfbilo

¦b VFP8 ¤¤·s¼Wªº CursorAdapter °òÃþ´£¨Ñ¤@­Ó²Î¤@¡B©ö¥Îªº¸ê®Æ¤¶­±¡CDoug Hennig ¦b³o­Ó¤ëªº¤å³¹¤¤ºt¥Ü¤F«ç¼Ë¨Ï¥Î CursorAdapter ¨Ó³X°Ý¥»¦a¸ê®Æ©M ODBC¡BADO©MXML³o¼Ëªº»·ºÝ¸ê®Æ¡X¡X°Q½×¤F¨Ï¥Î¦UºØ¸ê®Æ·½¬ÛÀ³ªº¯S®í­n¨D©M¹ê²{³~®|¡C
¥¿¤å¡G
¦p§Ú¦b¤W¤@½g¤å³¹¤¤©Ò´£¨ìªº¨º¼Ë¡A¦bVFP8¤¤¤@­Ó³Ì­«­nªº¡B¤]¬O³Ìºë±mªº·s¥\¯à¬O·sªº CursorAdapter °òÃþ¡C¦b¨º½g¤å³¹¤¤¡A§Ú­Ì¬ã¨s¤F¤@¤U CursorAdapter ªºÄÝ©Ê¡B¨Æ¥ó©M¤èªk¡A¨Ã°Q½×¤F¥¦¬Û¹ï¤_»·µ{µø¹Ï¡BSQL PassThrough(SPT)¡BADO©MXMLªºÀu¶Õ¡C

¦b¶}©l¨Ï¥Î CursorAdapter ¤§«e¡A§A»Ý­n®Ú¾Ú­n³X°Ýªº¬O¥»¦a¸ê®ÆÁÙ¬O³q¹LODBC¡BADO©ÎªÌXMLªº»·ºÝ¸ê®Æ·½ªº¤£¦P¡Aª`·N³o­ÓÃþ©Ò¬ÛÀ³ªº¤£¦Pªº¯S®í­n¨D¡C³o­Ó¤ëªº¤å³¹´NÁ¿­z¤F¨Ï¥Î¦UºØ¸ê®Æ·½ªº²Ó¸`¡C
¨Ï¥Î¥»¦a¸ê®Æ·½
¾¨ºÞ§Ú­Ì«Ü²M·¡ CursorAdapter ¬O¸Õ¹Ï¥Î¨Ó¼Ð·Ç¤Æ©M²¤Æ¹ï«DVFP¸ê®Æªº³X°Ý¤è¦¡ªº¡A¤£¹L§AÁÙ¬O¥i¥H§â¥¦·í§@¬O Cursor ªº¥N´À«~¥Î¥¦¨Ó³X°ÝVFP¸ê®Æ¡G¥u­n§â¥¦ªº DataSourceType Äݩʳ]¸m¦¨ "Native"¡C¬°¤°»ò­n³o»ò°µ©O¡H¦]¬°§AªºÀ³¥Îµ{¦¡±N¨Ó¥i¯à·|»Ý­n¤É¾E¡X¡X¨º®É­Ô§A´N¥i¥H§â DataSourceType Äݩʳ]¸m¦¨¨ä¥L´X­Ó¿ï¶µ¤§¤@(·íµM¥i¯àÁٻݭn­×§ï¨ä¥L´X­ÓÄÝ©Ê¡A¨Ò¦p³]¸m³s±µ¸ê°Tµ¥µ¥)¡A´N¯à»´ÃPªº¤Á´«¨ì¥t¤@ºØ¸ê®Æ®w¤ÞÀº¡A¨Ò¦pSQL Server¡C

·í DataSourceType Äݩʪº³]¸m¬° "Native" ªº®É­Ô¡AVFP ·|©¿²¤¥¦ªº DataSource ÄÝ©Ê¡CSelectCmd ÄÝ©Ê¥²¶·¬O¤@­Ó SQL Select »y¥y(¦Ó¤£¬O¤@­Ó USE ©R¥O©Î¹Bºâ¦¡)¡A³o´N·N¨ýµÛ§A¥Î CursorAdapter ¤£¬Oª½±µ¾Þ§@¥»¦aªí¦Ó¬O¾Þ§@¤@­ÓÃþ¦ü©ó¥»¦aµø¹Ï¨º¼ËªºªF¦è¡C§AÁÙ¥²¶·½T«OVFP¯à°÷§ä¨ì¥X²{¦b¨º­Ó Select »y¥y¤¤ªº¥ô¦óªí¡A¦]¦¹¡A¦pªG³o¨Çªí¤£¦b·í«e¸ô®|¤¤¡A¨º»ò§A´N»Ý­n³]¸m¤@¤U¸ô®|©ÎªÌ¥´¶}³o¨Çªí©ÒÄݪº¸ê®Æ®w¡C¦¹¥~¡A´N¸ò¥Îµø¹Ï¤@¼Ë¡A¦pªG§A·QÅý³o­Ó Cursor ¬O¥i§ó·sªº¡A§AÁÙ¥²¶·³]¸m¦n¨º¨Ç»P§ó·s¬ÛÃöªºÄÝ©Ê(KeyFieldList¡BTables¡BUpdatableFieldlist ©M UpdateNameList)¡C

¤U­±ªº¨Ò¤l(¤å³¹ªþ¥ó NativeExample.prg)·|¥Î VFP ¥Ü¨Ò¸ê®Æ®w¤¤ªº Customer ªí«Ø¥ß¤@­Ó¥i§ó·sªº Cursor¡G

local loCursor as CursorAdapter, laErrors[1]
Open database (_samples + 'data\testdata')
with loCursor
.Alias = 'customercursor'
.DataSourceType = 'Native'
.SelectCmd = "Select CUST_ID, COMPANY, CONTACT FROM CUSTOMER " + ;
"WHERE COUNTRY = 'Brazil'"
.KeyFieldList = 'CUST_ID'
.Tables = 'CUSTOMER'
.UpdatableFieldList = 'CUST_ID, COMPANY, CONTACT'
.UpdateNamelist = 'CUST_ID CUSTOMER.CUST_ID, '+ ;
'COMPANY CUSTOMER.COMPANY, CONTACT CUSTOMER.CONTACT'

if .CursorFill()
browse
tableupdate(1)
else
aerror(laErrors)
messagebox(laErrors[2])
endif .CursorFill()
endwith

close databases all
¨Ï¥Î ODBC
ODBC ¬O DataSourceType ÄÝ©Ê¥|ºØ³]¸m¤¤³Ì²³æªº¤@ºØ¡C§â DataSource ³]¸m¬°¤@­Ó¥´¶}¤Fªº ODBC ³s±µ±±¨î½X¡B³]¸m¤@¤U±`¥ÎªºÄÝ©Ê¡BµM«á½Õ¥Î CursorFill ¨Ó¨ú±o¸ê®Æ¡C¦pªG§A³]¦n¤F KeyFieldList¡BTables¡BUpdatableFieldList ©M UpdateNameList ÄÝ©Ê¡AVFP ·|¦Û°Ê§â§A¹ï¸ê®Æªº¥ô¦ó§ï°ÊÂà´«¦¨¬ÛÀ³ªº UPDATE¡BINSERT¡B©M DELETE »y¥y¨Ó§â§ï°Ê´£¥æ¨ì«á»O¸ê®Æ·½¡C¦pªG§A·Q¥Îªº¬O¤@­Ó¦sÀx¹Lµ{¡A¨º»ò­n¬ÛÀ³ªº³]¸m *Cmd¡B*CmdDataSource ©M *CmdDataSourceType ÄÝ©Ê(* ¥Nªí ¡§Delete¡¨¡B¡§Insert¡¨©Î¡§Update¡¨)¡C

³oùجOªþ¥ó ODBCExample.prg ¤¤ªº¤@­Ó¨Ò¤l¡A¥¦½Õ¥Î Sql Server ¦Û±aªº NorthWind ¸ê®Æ®w¤¤ªº CustOrderHist ¦sÀx¹Lµ{¨Ó¨ú±o¾P°âµ¹¬Y­Ó«È¤áªº³æ¦ì²£«~Á`¼Æ¡C

local lcConnString, loCursor as CursorAdapter, laErrors[1]

lcConnString = 'driver=SQL Server;server=(local);database=Northwind;uid=sa;pwd=;"+ ;
"trusted_connection=no'

** §â¤W­±³s±µ¦r¦ê¤¤ªº±K½X§ï¦¨§AªºSQL Server µn¿ýªº±K½X

loCursor = createobject('CursorAdapter')
with loCursor
.Alias = 'Customerhistory'
.DataSourceType = 'ODBC'
.DataSource = SQLStringConnect(lcConnString)
.SelectCmd = "exec CustOrderhist 'ALFKI'"

if .CursorFill()
browse
else
aerror(laErrors)
messagebox(laErrors[2])
endif .CursorFill()
endwith
¨Ï¥Î ADO
»P¨Ï¥Î ODBC ¬Û¤ñ¡A¨Ï¥Î ADO ­n¦h¤@¨Ç»Ý­n¾Þ¤ßªº¨Æ±¡¡G
• DataSource ¥²¶·³Q³]¸m¦¨¤@­Ó ADO RecordSet¡A¦Ó¥B³o­Ó RecordSet ªº ActiveConnection Äݩʻݭn³Q³]¸m¦¨¤@­Ó¥´¶}¤Fªº ADO Connection ª«¥ó¡C
• ¦pªG§A·Q­n¨Ï¥Î¤@­Ó°Ñ¼Æ¤Æ¬d¸ß(»P¤U¸ü¥þ³¡¸ê®Æ¬Û¤ñ¡A³o¥i¯à¬O§ó±`¥Îªº¤è¦¡)¡A§A¥²¶·§â¤@­Ó ADO Command ª«¥ó§@¬°²Ä¥|­Ó°Ñ¼Æ¶Ç»¼µ¹ CursorFill ¤èªk¡A¦Ó¥B³o­Ó Command ª«¥óªº ActiveConnection Äݩʻݭn³Q³]¸m¦¨¤@­Ó¥´¶}¤Fªº ADO Connection ª«¥ó¡CVFP ·|¬°§A·ÓÅU¦n¶ñ¥R Command ª«¥óªº°Ñ¼Æ¤Æ¶°¦Xªº¨Æ±¡(¥¦³q¹L¤ÀªR SelectCmd ¨Ó§ä¥X°Ñ¼Æ)¡A¤£¹L°Ñ¼Æ©Ò¥]§tªº­È·íµMÁÙ¬O¥²¶·¦b¦³®Ä¨ú­È½d³ò¤ºªº¡C
• ¦b¸ê®ÆÀô¹Ò¤¤¥u¦³¤@­Ó¨Ï¥Î¤F ADO ªº CursorAdapter ³o¼Ëªº±¡ªp¬O¤ñ¸û²³æªº¡G¦pªG»Ý­nªº¸Ü¡A§A¥i¥H§â UseDEDataSource Äݩʳ]¸m¦¨ .T.¡AµM«á®Ú¾Ú§Aªº»Ý­n§â¸ê®ÆÀô¹Òªº DataSource ©M DataSourceType Äݩʳ]¸m¦¨ CursorAdapter¡C¤£¹L¡A¦pªG¸ê®ÆÀô¹Ò¤¤¦³¦h­Ó CursorAdapter ªº¸Ü¡A³oºØ¿ìªk´NµL®Ä¤F¡C­ì¦]¬O DataEnvironment.DataSource ©Ò¤Þ¥Îªº ADO RecordSet ¥u¯à¥]§t¤@­Ó CursorAdapter ªº¸ê®Æ¡F·í§A¬°²Ä¤G­Ó CursorAdapter ½Õ¥Î CursorFill ¤èªkªº®É­Ô¡A·|¥X²{ ¡§RecordSet is already open (RecordSet °O¿ý¶°¤w¸g¥´¶})¡¨ªº¿ù»~¡C©Ò¥H¡A¦pªG§Aªº¸ê®ÆÀô¹Ò¤¤¦³¶W¹L¤@­Óªº CursorAdapter¡A§A¥²¶·­n§â UseDEDataSource ³]¸m¦¨ .F.¡A¨Ã¦Û¦æºÞ²z¨C­Ó CursorAdapter ªº DataSource ©M DataSourceType ÄÝ©Ê(©ÎªÌ§A¥i¥H¨Ï¥Î¤@­Ó¯à°÷ºÞ²z³oºØ±¡ªpªº DataEnvironment ªº¤lÃþ)¡C

ªþ¥ó ADOExample.prg ¤¤ªº¥Ü¨Ò¥N½Xºt¥Ü¤F«ç¼Ë­É§U¤@­Ó ADO Command ª«¥ó¨Ó¨ú±o¸ê®Æ¡C³o­Ó¥Ü¨ÒÁÙºt¥Ü¤F¨Ï¥Î VFP8 ¤¤·sªºµ²ºc¤Æ¿ù»~³B²zªº¥\¯à¡C¹ï ADO Connection ª«¥óªº Open ¤èªkªº½Õ¥Î³Q«Ê¸Ë¦b¤@­Ó TRY...CATCH...ENDTRY »y¥y¤¤¡A¥H®·®»½Õ¥Î³o­Ó¤èªk¥¢±Ñªº®É­Ô±N·|¥X²{ªº COM ¿ù»~¡C

local loConn as ADODB.Connection, ;
loCommand as ADODB.Command, ;
loException as Exception, ;
loCursor as CursorAdapter, ;
lcCountry, ;
laErrors[1]
loConn = createobject('ADODB.Connection')
with loConn
.ConnectionString = 'provider=SQLOLEDB.1;data source=(local);' + ;
'initial catalog=Northwind;uid=sa;pwd=dhennig;trusted_connection=no'
&& §â¤W­±³s±µ¦r¦ê¤¤ªº±K½X§ï¦¨§AªºSQL Server µn¿ýªº±K½X
try
.Open()
catch to loException
messagebox(loException.Message)
cancel
endtry
endwith
loCommand = createobject('ADODB.Command')
loCursor = createobject('CursorAdapter')
with loCursor
.Alias = 'Customers'
.DataSourceType = 'ADO'
.DataSource = createobject('ADODB.RecordSet')
.SelectCmd = 'select * from customers where country=?lcCountry'
lcCountry = 'Brazil'
.DataSource.ActiveConnection = loConn
loCommand.ActiveConnection = loConn
if .CursorFill(.F., .F., 0, loCommand)
browse
else
aerror(laErrors)
messagebox(laErrors[2])
endif .CursorFill(.F., .F., 0, loCommand)
endwith
¨Ï¥Î XML
¥Î CursorAdapter ¨Ó¾Þ§@ XML »Ý­n¤@¨Ç¯S®íªº³]¸m¡C¤U­±¬O³o¨Ç°ÝÃD¡G
• DataSource ÄݩʳQ©¿²¤¡F
• CursorSchema ÄÝ©Ê¥²¶·³Q¶ñ¥R¦n¡X¡X§Y¨Ï§Aµ¹ CursorFill ¶Ç»¼ªº²Ä¤@­Ó°Ñ¼Æ¬O .F. ¤]¤@¼Ë¡X¡X§_«h±N·|¥X¿ù¡C
• SelectCmd ¥²¶·³Q³]¸m¦¨¤@­Ó¹Bºâ¦¡¡A¨Ò¦p¤@­Ó¥Î¤á¦Û©w¸q¨ç¼Æ(UDF)©ÎªÌª«¥ó¤èªk¦W¡A¸Ó¹Bºâ¦¡¯à°÷¬° Cursor ªð¦^ XML¡C
• ¹ï Cursor ªº§ï°Ê·|³QÂà´«¦¨¤@­Ó DiffGram,¥¦¬O¡§¥]§tµÛ³Q§ï°Ê¤FªºÄæ¦ì©ÎªÌ°O¿ý¡A¦b³Q§ï°Ê¤§«e¡B³Q§ï°Ê¤§«áªº­È¡¨ªºXML¡A·í»Ý­n§ó·sªº®É­Ô¡A¥¦³Q©ñ¦b DiffGram Äݩʤ¤¡C
• ¬°¤F§â¸ê®Æ§ó°Ê¦^¼g¨ì¸ê®Æ·½¤¤¥h¡AUpdateCmdDataSourceType ÄÝ©Ê¥²¶·³Q³]¸m¬°¡§XML¡¨¡A¨Ã¥B UpdateCmd ¥²¶·³Q³]¸m¦¨¤@­Ó¯à°÷³B²z´£¥æ§ó·s¥ô°Èªº¹Bºâ¦¡(¶H«e­±¤@¼Ë¡A³o­Ó¹Bºâ¦¡¤]¬O¶H¤@­Ó UDF ©ÎªÌª«¥óªº¤èªk)¡C§A¥i¯à·|»Ý­n§â ¡§This.DiffGram¡¨¶Ç»¼µ¹¨º­Ó UDF¡A³o¼Ë¥¦´N¥i¥H§â§ó·s´£¥æµ¹«á»O¸ê®Æ·½¡C
³o­Ó Cursor ©Ò¨Ï¥Îªº XML ­ì©lÀÉ®×¥i¯à¨Ó¦Û¦UºØ¤£¦Pªº¦a¤è¡C¨Ò¦p¡A§A¥i¥H½Õ¥Î³o¼Ë¤@­ÓUDF¡G¥¦¯à¥Î CursorToXML()¨Ó§â¤@­ÓVFP Cursor Âà´«¦¨ XML¡A¨Ãªð¦^µ²ªG¡G

use CUSTOMERS
cursortoxml('customers', 'lcXML', 1, 8, 0, '1')
Return lcXML

UDF ¥i¥H½Õ¥Î¤@­Ó Web Service¡A³o­Ó Web Service «hªð¦^¤@­Ó XML µ²ªG¶°¡C³oùجO¤@­Ó¨Ò¤l¡A§Ú«Ø¥ß¤F¤@­Ó Web Service ¨Ãµù¥U¦b§Ú¦Û¤vªº¨t²Î¤W¡A ¦Ó´¼¼z·Pª¾«h¬°§Ú¥Í¦¨¤F¤U­±ªº¥N½X(¨ãÅ骺²Ó¸`¨Ã¤£­«­n¡A¥¦¥u¬Oºt¥Ü¤F¤@­Ó Web Service ªº¨Ò¤l)¡G

loWS = newobject("WSclient', home() + 'ffc\_webservices.vcx')
loWS.cWSName = 'dataserver web service'
loWS = loWS.SetupClient('http://localhost/' + ;
'SQDataServer/dataserver.WSDL', 'dataserver', ;
'dataserverSoapPort')
lcXML = loWS.GetCustomers()
Return lcXML

¥¦¯à°÷¦b¤@­Ó Web Server ¤W¨Ï¥Î SQLXML 3.0 ¥h°õ¦æ¤@­Ó¦sÀx¦b¤@­Ó¼È¦sÀɮפ¤ªº SQL Server 2000 ¬d¸ß(­nÁA¸ÑÃö©ó SQLXML §ó¦hªº¸ê°T¡A½Ð³X°Ý http://msdn.microsoft.com/¨Ã¬d§ä SQLXML)¡C¤U­±ªº¥N½X¨Ï¥Î¤@­Ó MSXML2.XMLHTTP ª«¥ó³q¹L HTTP ±q Northwind ¸ê®Æ®wªº Customers ªí¨Ó¨ú±o©Ò¦³ªº°O¿ý¡Aµy«á§Ú­Ì±N°µ§ó¶i¤@¨Bªº¸ÑÄÀ¡C

local loXML as MSXML2.XMLHTTP
loXML = createobject('MSXML2.XMLHTTP')
loXML.open('POST', 'http://localhost/northwind/' + ;
'template/getallcustomers.xml, .F.)
loXML.setRequestHeader('Content-type', 'text/xml')
loXML.send()
return loXML.responseText

³B²z§ó·sªº¨Æ±¡­n§ó½ÆÂø¤@ÂI¡C¸ê®Æ·½¥²¶·©ÎªÌ¯à°÷±µ¨ü¨Ã³B²z¤@­Ó DiffGram (¤ñ¦p SQL Server 2000 ªº±¡ªp)¡A©ÎªÌ§A¥²¶·¦Û¤v¥h§Ë²M·¡©Ò¦³ªº§ï°Ê¡B°õ¦æ¤@¨t¦Cªº SQL »y¥y(UPDATE¡BINSERT ©M DELETE)¥h´£¥æ§ó·s¡C

³oùجO­Ó¨Ï¥Î¤F±a XML ¸ê®Æ·½ªº CursorAdapter ªº¨Ò¤l(XMLExample.prg)¡C­nª`·Nªº¬O¡GSelectCMD ©M UpdateCMD ³£¬O­n½Õ¥Î UDF ªº¡C¦b SelectCMD ªº±¡ªp¤¤¡A­nªð¦^¸ê®Æªº«È¤á½s¸¹³Q¶Ç»¼µ¹¤@­Ó¥s°µ GetNEWustomers ªº UDF¡A³o­Ó§Ú­Ìµy«á¦A´£¡C¦b UpdateCmd ªº±¡ªp¤¤¡AVFP §â DiffGram Äݩʶǻ¼µ¹ SendNWXML¡A³o­Ó§Ú­Ì¤]µy«á¦A´£¡C

local loCustomers as CursorAdapter, ;
laErrors[1]
loCustomers = createobject('CursorAdapter')
with loCustomers
.Alias = 'Customers'
.CursorSchema = 'CUSTOMERID C(5), COMPANYNAME C(40), ' + ;
'CONTACTNAME C(30), CONTACTTITLE C(30), ADDRESS C(60), ' + ;
'CITY C(15), REGION C(15), POSTALCODE C(10), COUNTRY C(15), ' + ;
'PHONE C(24), FAX C(24)'
.DataSourceType = 'XML'
.KeyFieldList = 'CUSTOMERID'
.SelectCmd = 'GetNWCustomers([ALFKI])'
.Tables = 'CUSTOMERS'
.UpdatableFieldList = 'CUSTOMERID, COMPANYNAME, CONTACTNAME, ' + ;
'CONTACTTITLE, ADDRESS, CITY, REGION, POSTALCODE, COUNTRY, PHONE, FAX'
.UpdateCmdDataSourceType = 'XML'
.UpdateCmd = 'SendNWXML(This.DiffGram)'
.UpdateNameList = 'CUSTOMERID CUSTOMERS.CUSTOMERID, ' + ;
'COMPANYNAME CUSTOMERS.COMPANYNAME, ' + ;
'CONTACTNAME CUSTOMERS.CONTACTNAME, ' + ;
'CONTACTTITLE CUSTOMERS.CONTACTTITLE, ' + ;
'ADDRESS CUSTOMERS.ADDRESS, ' + ;
'CITY CUSTOMERS.CITY, ' + ;
'REGION CUSTOMERS.REGION, ' + ;
'POSTALCODE CUSTOMERS.POSTALCODE, ' + ;
'COUNTRY CUSTOMERS.COUNTRY, ' + ;
'PHONE CUSTOMERS.PHONE, ' + ;
'FAX CUSTOMERS.FAX'
if .CursorFill(.T.)
browse
else
aerror(laErrors)
messagebox(laErrors[2])
endif .CursorFill(.T.)
endwith


³oùجO GetNWCustomers ªº¥N½X¡C¥¦¨Ï¥Î¤F¤@­Ó MSXML2.XMLHTTP ª«¥ó¨Ó³X°Ý¤@­Ó¦ì©ó¤@­ÓWeb Server ¤Wªº¦W¥s CustomersByID.xml ªº SQL Server 2000 XML ½d¥»¡A¨Ãªð¦^µ²ªG¡C­nÀò¨ú¸ê®Æªº Customer ID ³Q§@¬°¤@­Ó°Ñ¼Æ¶Ç»¼µ¹³o¬q¥N½X¡G

lparameters tcCustID
local loXML as MSXML2.XMLHTTP
loXML = createobject('MSXML2.XMLHTTP')
loXML.open('POST', "http://localhost/northwind/template/customersbyid.xml?"; + ;
"customerid=" + tcCustID, .F.)
loXML.setRequestHeader('Content-type', 'text/xml')
loXML.send()
return loXML.responseText

³o¬q¥N½XùؤޥΪº¦W¬° CustomersByID.XML ªº XML ½d¥»ªº¤º®e¦p¤U¡G

<root xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<sql:header>
<sql:param name="customerid">
</sql:param>
</sql:header>
<sql:query client-side-xml="0">
SELECT *
FROM Customers
WHERE CustomerID = @customerid
FOR XML AUTO
</sql:query>
</root>

§â³o­ÓÀÉ©ñ¦b¥Î©ó Northwind ¸ê®Æ®wªº¤@­ÓµêÀÀ¥Ø¿ý¤¤(°Ñ¨£¸É¥R¤åÀÉ¡m³]¸m SQL Server 2000 XML ³X°Ý¡n¥HÁA¸Ñ§ó¦hÃö©ó¬° SQL Server 2000 ³]¸m IIS ªº¤º®e¡B¥H¤Î³o½g¤å³¹©Ò»Ý­nªº¯S®í²Ó¸`¡C)

SendNWXML ªº¤º®e¬Ý°_¨Ó»P GetNWCustomers Ãþ¦ü¡A°£¤F¥¦±µ¦¬ªº°Ñ¼Æ¬O¤@­Ó DiffGram¡AµM«á¥¦§â³o­Ó DiffGram ¸ü¤J¨ì¤@­Ó MSXML2.DOMDocumnet ª«¥ó¤¤¡A¨Ã§â³o­Óª«¥ó¶Ç»¼µ¹ Web Server¡A¸Ó Web Server ·|³q¹L SQLXML §â³o­Óª«¥ó¶Ç»¼µ¹ SQL Server 2000 ¥h³B²z¡C

lparameters tcDiffGram
local loDOM as MSXML2.DOMDocument, ;
loXML as MSXML2.XMLHTTP
loDOM = createobject('MSXML2.DOMDocument')
loDOM.async = .F.
loDOM.loadXML(tcDiffGram)
loXML = createobject('MSXML2.XMLHTTP')
loXML.open('POST', 'http://localhost/northwind/', .F.)
loXML.setRequestHeader('Content-type', 'text/xml')
loXML.send(loDOM)

¹B¦æ XMLExample.prg ¨Ó¬Ý¬Ý¥¦¬O«ç»ò¤u§@ªº¡C§A±N·|¦b Browse µøµ¡¤¤¬Ý¨ì¤@¥x°O¿ý(«È¤á ALFKI)¡C¸ÕµÛ§ï°Ê´X­ÓÄæ¦ìªº­È¡AµM«áÃö³¬³o­Óµøµ¡¡A¦A¹B¦æ PRG ¤@¹M¡C§A·|¬Ý¨ì§Aªº§ï°Ê¤w¸g³Q¼g¤J¨ì«á»O¸ê®Æ·½¤¤¤F¡C
Á`µ²
¾¨ºÞ CursorAdapter °òÃþ´£¨Ñ¤F¤@ºØ¹ï»·ºÝ¸ê®Æ·½ªº²Î¤@ªºµ²ºc¡A¦Ó¤£ºÞ§A¨Ï¥Îªº¬O ODBC¡BADOÁÙ¬OXML¡X¡X¦ý¬O¡A®Ú¾Ú§A¿ï¾Üªº¸ê®Æ³X°Ý¾÷¨îªº¤£¦P¡A¹ï CursorAdapter ªº³]¸m¤]¦³¤@¨Ç°Ï§O¡C³o¨Ç°Ï§O¨ú¨M©ó¸ê®Æ³X°Ý¾÷¨îªº¥»¨­¡C

¤U­Ó¤ë¡A§Ú±N³q¹L«Ø¥ß¤@¨Ç¥i­«¥Îªº¸ê®ÆÃþ¡B¨Ã°Q½×«ç¼Ë¦b³øªí¤¤¨Ï¥Î CursorAdapter ¨Óµ²§ô³o­Ó¨t¦Cªº±MÃD¡C
¸É¥R¤åÀÉ¡G
¡m³]¸m SQL Server 2000 XML ³X°Ý¡n

¬°¤F¯à°÷¦b¤@­Ó¬yÄý¾¹©ÎªÌ¨ä¥L HTTP ¥Î¤áºÝ¥Î¤@­Ó URL ¨Ó³X°Ý SQL Server 2000¡A§A»Ý­n°µ¤@¨Ç¤u§@¡C­º¥ý¡A§A»Ý­n±q MSDN ºô¯¸(http://msdn.microsoft.com/¡X¡X¬d¸ß¤@¤U¡§SQLXML¡¨¡AµM«á¿ï¾Ü¤U¸ü)¥h¤U¸ü©M¦w¸Ë SQLXML 3.0¡C

±µµÛ¡A§A»Ý­n³]¸m¤@­Ó IIS µêÀÀ¥Ø¿ý¡C¨BÆJ¦p¤U¡G±q¶}©l¥\¯àªí|µ{¦¡|SQLXML 3.0Àɧ¨¤¤³æÀ»¡§Configure IIS Support(³]¸m IIS ¤ä´©)¡¨¡C®i¶}§Aªº¦øªA¾¹¸`ÂI¡A¿ï¾Ü­n¨Ï¥Îªº Web ¯¸ÂI¡AµM«á³æÀ»·Æ¹«¥kÁä¡A¿ï¾Ü ¡§·s«Ø|µêÀÀ¥Ø¿ý¡¨¡A¦b¥X²{ªº¹ï¸Ü¤è¶ôªº¡§±`³W¡¨­¶¤¤¿é¤JµêÀÀ¥Ø¿ýªº¦WºÙ©M¥¦ªºª«²z¸ô®|¡C¦b³oùØ¡A§Ú­Ì¨Ï¥Î¡§Northwind¡¨§@¬°µêÀÀ¥Ø¿ý¦W¡B¡§NorthwindTemplates¡¨§@¬°ª«²z¸ô®|¡C¨Ï¥Î Windows ¸ê·½ºÞ²z¾¹¦b§Aªº¨t²Î¤Wªº¤°»ò¦a¤è«Ø¥ß³o­Óª«²z¥Ø¿ý¡AµM«áµ¹¥¦«Ø¤@­Ó¦W¬° ¡§Template¡¨ªº¤l¥Ø¿ý(µy«á§Ú­Ì±N·|¥Î¨ì³o­Ó¤l¥Ø¿ý)¡C§âªþ¥ó¤¤ªº¨â­Ó½d¥»ÀÉ GetAllCustomers.xml ©M CustomersByID.xml «þ¨©¨ì³o­Ó¤l¥Ø¿ý¤¤¡C

¦b¡§¦w¥þ¡¨­¶¤¤¡A¿é¤J³X°Ý SQL Server ªº¬ÛÀ³ªº¸ê°T¡A¨Ò¦p¥Î¤á¦W©M±K½X©ÎªÌ§A·Q±Ä¥Îªº¯S©wªºÅçÃÒ¾÷¨î¡C¦b¡§¸ê®Æ·½¡¨­¶¤W¡A¿ï¾Ü SQL Server¡A¦pªG»Ý­nªº¸Ü¡AÁÙ­n¿ï¾Ü­n¨Ï¥Îªº¸ê®Æ®w¡C¦b³oùاڭ̿ï¾Ü Northwind ¸ê®Æ®w¡C¦b¡§³]¸m¡¨­¶¤W¿ï¾Ü§Æ±æªº³]¸m¡A¦Ü¤Ö­n¿ï¤W¡§¤¹³\½d¥»¬d¸ß¡¨©M¡§¤¹³\ Post¡¨¡C

¦b¡§µêÀÀ¦WºÙ¡¨­¶¤¤¡A±qÃþ«¬¤U©Ô¦¡¦C¥Ü¤è¶ô¤¤¿ï¾Ü¡§½d¥»¡¨¡A¨Ã¿é¤J¤@­ÓµêÀÀ¦WºÙ(¦b³oùاڭ̨ϥΡ§template¡¨)©Mª«²z¸ô®|(¥¦À³¸Ó¬OµêÀÀ¥Ø¿ýªº¤@­Ó¤l¥Ø¿ý¡A¦b³oùØ´N¬O "Template"¤l¥Ø¿ý)¡A³o¬O¨Ï¥Î½d¥»ªº»Ý­n¡C¦n¡A³æÀ»¡§½T©w¡¨¡C

²{¦b§Ú­Ì´ú¸Õ¤@¤U¬O§_¨C¼ËªF¦è³£³]¸m¥¿½T¤F¡A§Ú­Ì±N³q¹L¨Ï¥Î§A«þ¨©¨ì Template ¤l¥Ø¿ý¤¤¥h±o GetAllCustomers.xml¨Ó³X°Ý SQL Server¡C¥¦ªº¤º®e¦p¤U¡G

<root xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<sql:query client-side-xml="0">
SELECT *
FROM Customers
FOR XML AUTO
</sql:query>
</root>

¬°¤F´ú¸Õªº¥Øªº¡A¥´¶}§Aªº¬yÄý¾¹¡A¨Ã¿é¤J³o­ÓURL:http://localhost/northwind/template/getallcustomers.xml¡A§A´N·|¦b¬yÄý¾¹¤¤¬Ý¨ìXML§Î¦¡ªº Northwind Customers ªíªº¤º®e¤F¡C

<root xmlns:sql='urns:schemas-micorsoft-com:xml-sql">
<Customers CustomerID="ALFKI" CompanyName="Alfreds Futterkiste" ContactName = "Maria Anders"
ContactTitle="Sales Represendative"
Address="Obere Str. 57" City="Berlin" PostalCode="12209"
Country="Germany" Phone="030-0074321"
Fax="999-999-9999" />

²{¦b§A´N¤w¸g°µ¦n¹B¦æ³o½g¤å³¹ªº SQLXML ¥Ü¨Òªº·Ç³Æ¤F¡C

¥Ü¨Ò¤å¥ó¡G

ÂIÀ»¬yÄý¸ÓÀÉ
CursorAdapter °_¨B(¤T)¥i­«¥Î¸ê®ÆÃþ
§@ªÌ¡GDoug Hennig
ĶªÌ¡Gfbilo

VFP ªºµ{¦¡®v­Ì·Q­n¤@­Ó¥i­«¥Îªº¸ê®ÆÃþ¤w¸g«Ü¤[¤F¡C¾¨ºÞ¦b¹L¥hªºª©¥»¤¤¤]¦³³\¦h¸Ñ¨M³o­Ó°ÝÃDªº¿ìªk¡A¤£¹LÁ`¬O¦³ÂI¬ü¤¤¤£¨¬¡C²{¦b¦b VFP 8ùØ¡A§Ú­Ì¦³¤F¯u¥¿ªº¥i­«¥Î¸ê®ÆÃþ¡C³o­Ó¤ë¡ADoug ¬°§Ú­Ìºt¥Ü¤F«ç¼Ë³q¹L«Ø¥ß CursorAdapter ©M DataEnvironment ªº¤lÃþ¨Ó«Ø¥ß¥i­«¥Îªº¸ê®ÆÃþ¡B¥H¤Î«ç¼Ë¦bªí³æ©M³øªí¤¤¨Ï¥Î¥¦­Ì¡C
¥¿¤å
¦b¹L¥hªº¨â´ÁÂø»x¤¤¡A§Ú­Ì°Q½×¤F¦b VFP 8 ¤¤·s¼Wªº CursorAdapter °ò¦Ãþ¡C§Ú­Ó¤HªºÆ[ÂI¬O¡A³o¬O VFP 8 ¤¤³Ì­«­nªº§ï°Ê¤§¤@¡A¦]¬°¥¦¦V§Ú­Ì´£¨Ñ¤F¤@­Óª«¥óSQL Server³o¼Ëªº«DVFP¸ê®Æ·½ªºÂ²³æ©ö¥Î¡B²Î¤@ªº¤¶­±¡C¦¹¥~¡A¦p§A¥»¤ë©Ò¯à¨£¨ìªº¨º¼Ë¡A¥¦­ÌÁ٧Φ¨¤F¥i­«¥Î¸ê®ÆÃþªº°ò¦¡C

¦bÁ¿­z¥i­«¥Î¸ê®ÆÃþ¤§«e¡AÅý§Ú­Ì¥ý¨Ó¬Ý¤@¤U§Ú«Ø¥ßªº¤@¨Ç CursorAdapter ©M DataEnvironment ªº¤lÃþ¡A§Úµ¹¥¦­Ì¼W¥[¤F¤@¨ÇÃB¥~ªº¥\¯à¡A¥¦­Ì±N¦¨¬°§Ú­Ìªº¥i­«¥Î¸ê®ÆÃþªº°_ÂI¡C
SFCursorAdapter
SFCursorAdapter (¦bªþ¥ó SFDataClasses.vcx ¤¤) ¬O CursorAdapter ªº¤@­Ó¤lÃþ¡A¥¦¾Ö¦³¤@¨ÇÃB¥~¼W¥[ªº¥\¯à¡A¦p¤U¡G
• ¥¦¥i¥H¦Û°Ê³B²z°Ñ¼Æ¤Æ¬d¸ß¡G§A¥i¥HÀRºA(¤@­Ó±`¶q)¤]¥i¥H°ÊºA(¤@­Ó¹Bºâ¦¡¡A¨Ò¦p¡§¡×Thisform.txtName.value¡¨¡A·í Cursor ³Q¥´¶}©ÎªÌ¨ê·sªº®É­Ô¡A³o­Ó¹Bºâ¦¡·|³Q¹Bºâ)ªº©w¸q¤@­Ó°Ñ¼Æ­È¡C
• ¥¦¥i¥H¦b Cursor ³Q¥´¶}¥H«á¦Û°Ê¦b¸Ó Cursor ¤W«Ø¥ß¯Á¤Þ¡C
• ¹ï©ó ADO¡A¥¦ÁÙ·|°õ¦æ¤@¨Ç¯S®íªº¤u§@¡A¨Ò¦p§â DataSource Äݩʳ]¸m¬°¤@­Ó ADO RecordSet¡A§â³o­Ó RecordSet ªº ActiveConnection Äݩʳ]¸m¬°¤@­Ó ADO Connection ª«¥ó¡A·í¥Î¨ì¤@­Ó°Ñ¼Æ¤Æ¬d¸ßªº®É­Ô¡A¥¦ÁÙ·|«Ø¥ß¤@­Ó ADO Command ª«¥ó¨Ã§â³o­Óª«¥ó¶Ç»¼µ¹ CursorFill ¤èªk¡C
• ¥¦´£¨Ñ¤F²³æªº¿ù»~³B²z(cErrorMessage ÄÝ©ÊùØ·|¦³¿ù»~ªº¸ê°T)¡C
• ¥¦ÁÙ¦³ CursorAdapter ¤¤¯Ê¤Öªº Update ©M Release ¤èªk¡C
³o­ÓÃþªº INIT ¤èªk«Ø¥ß¨â­Ó¶°¦X(¨Ï¥Î·sªº Collection °ò¦Ãþ¡A¥¦¬OºûÅ@¬Y¨ÇªF¦èªº¶°¦X¥Îªº)¡A¤@­Ó¬O¬° SelectCmd ÄÝ©Ê¥i¯à·|¥Î¨ìªº°Ñ¼Æ¦Ó·Ç³Æªº¡A¥t¤@­Ó¬O¥Î©ó¦b Cursor ³Q¥´¶}¥H«áÀ³¸Ó¦Û°Ê«Ø¥ßªº¼Ð°O¡C¥¦ÁÙ·| SET MULTILOCK ON¡A¦]¬°³o¬O CursorAdapter Cursor ªº»Ý¨D¡C

This.oParameters = CreateObject('Collection')
This.oTags = CreateObject('Collection')
Set multilocks on

AddParameter ¤èªk¶H parameters ¶°¦X²K¥[¤@­Ó°Ñ¼Æ¡Cµ¹³o­Ó¤èªk¶Ç»¼°Ñ¼Æªº¦WºÙ(³o­Ó¦WºÙÀ³¸Ó»P¸Ó°Ñ¼Æ¥X²{¦b SelectCmd Äݩʤ¤ªº¨º­Ó¦WºÙ¬Û¤@­P)¡A®Ú¾Ú»Ý­n¤]¥i¥H¥I¤W°Ñ¼Æªº­È(¦pªG§A²{¦b¤£µ¹¥¦¶Ç»¼°Ñ¼Æªº­È¡A¤]¥i¥H¥H«á¦A½Õ¥Î Getparameter ¤èªk¨Ó¶Ç»¼)¡C³o¬q¥N½Xºt¥Ü¤F¤@¹ï VFP 8 ¤¤ªº·s¥\¯à¡G·sªº empty °ò¦Ãþ¡A¥¦¨S¦³¥ô¦óÄÝ©Ê¡B¨Æ¥ó©ÎªÌ¤èªk¡A¦]¦¹¬O«Ø¥ß¤@­Ó¦Ð¶q¯Åªºª«¥óªº²z·Q¿ï¾Ü¡FÁÙ¦³ AddProperty() ¨ç¼Æ¡A¥¦ªº§@¥Î¸ò AddProperty ¤èªkÃþ¦ü¡A°Ï§O¬O¥¦¥Î©ó¨º¨Ç¨S¦³³o­Ó¤èªkªºª«¥ó¡C

lparameters tcName, tuvalue
local loParameter
loParameter = createobject('Empty')
addproperty(loParmeter, 'Name', tcName)
addproperty(loParmeter, 'value', tuvalue)
This.oParameters.Add(loParameter, tcName)

¨Ï¥Î GetParmeter ¤èªk¨Óªð¦^¤@­Ó¯S®íªº parameter ª«¥ó¡X¡X³q±`¬O¥Î¦b»Ý­n³]¸m¥Î©ó°Ñ¼Æªº­Èªº®É­Ô¡C

lparameters tcName
local loParameter
loParameter = This.oParameters.Item(tcName)
return loParameter

SetConnection ¤èªk¥Î©ó±N DataSource Äݩʳ]¸m¬°§Æ±æªº³s±µ¡C¦pªG DataSourceType ¬O ¡§ODBC¡¨¡A´Nµ¹³o­Ó¤èªk¶Ç»¼¤@­Ó³s±µ±±¨î½X¡F¦pªG¬O¡§ADO¡¨¡ADataSource ¥²¶·¬O¤@­ÓADO Recordset ª«¥ó¡A¦Ó¥B¸Óª«¥óªº ActiveConnection ÄÝ©Ê¥²¶·­n³]¸m¬°¤@­Ó¬¡°Ê ADO Connection ª«¥ó¡A©Ò¥H¡A§Ú­Ì»Ý­n¦V SetConnection ¤èªk¶Ç»¼³o­Ó ADO Connection ª«¥ó¡A SetConnection ·|«Ø¥ß¤@­Ó RecordSet¡A¨Ã¥B§â³o­Ó RecordSet ªº ActiveConnection ³]¸m¬°³Q¶Ç»¼ªº ADO Connection ª«¥ó¡C

lparameters tuConnection
with this
do case
case .DataSourceType = 'ODBC'
.DataSource = tuConnection
case .DataSourceType = 'ADO'
.DataSource = Createobject('ADODB.RecordSet')
.DataSource.ActiveConnection = tuConnection
endcase
endwith

¬°¤F«Ø¥ß Cursor¡A§Ú­Ì½Õ¥Î GetData ¤èªk¦Ó¤£¬O CursorFill ¤èªk¡A¦]¬° GetData ¯à°÷¦Û°Ê³B²z°Ñ¼Æ©M¿ù»~¡C¦pªG§A·Q­n«Ø¥ß¤@­Ó¤£±a¸ê®Æªº Cursor¡A¨º»ò´Nµ¹ GetData ¤èªk¶Ç»¼¤@­Ó .T.¡C³o­Ó¤èªk«Ø¥ßªº²Ä¤@¼ËªF¦è¡A¬O»P©w¸q¦b parameters ¶°¦X¤¤ªº°Ñ¼Æ­Ì¦P¦Wªº¨p¦³ÅܼÆ(¦b³oùؽեΤF GetParametervalue ¤èªk¡A¸Ó¤èªk·|ªð¦^°Ñ¼Æª«¥óªº­È¡A¦pªG¸Óª«¥óªº­È¬O¤@­Ó¥H¡§¡×¡¨¶}ÀYªº¹Bºâ¦¡¡A¨º»òªð¦^ªº±N¬O¹Bºâ¸Ó¹Bºâ¦¡¤§«á©ÒÀò±oªº­È¡C)¤U¤@¨B¡A¦pªG§Ú­Ì¬O¦b¨Ï¥Î ADO ¨Ã¥B¤w¸g¦³¤F¤@¨Ç°Ñ¼Æ¡A³o¬q¥N½X·|«Ø¥ß¤@­Ó ADO Command ª«¥ó¡A¨Ã§â¸Óª«¥óªº ActiveConnection Äݩʳ]¸m¬° Connection ª«¥ó¡AµM«á§â³o­Ó Connection ª«¥ó¶Ç»¼µ¹ CursorFill ¤èªk¡X¡X³o¬O CursorAdapter ³B²z ADO °Ñ¼Æ¤Æ¬d¸ßªº»Ý­n¡C¦pªG§Ú­Ì¤£¬O¦b¥Î ADO ¡B©ÎªÌ¨S¦³¥ô¦ó°Ñ¼Æ¡A¨º»ò¥N½X·|²³æªº½Õ¥Î CursorFill ¨Ó¶ñ¥R Cursor¡Cª`·N¡A¦pªGµ¹ GetData ¤èªk¶Ç»¼¤F .T.¡A¨Ã¥B CursorSchema ¤w¸g³Q¶ñ¼g¦n¤F¡A¨º»ò´N¬O§i¶D GetData ¤èªk¥h¨Ï¥Î CursorSchema(³o¤]¬O§Ú·QÅý CursorAdapter °òÃþ¾Ö¦³ªº¥\¯à)¡C²{¦b¦pªG Cursor ³Q«Ø¥ß°_¨Ó¤F¡A¥N½X·|½Õ¥Î GreateTags ¤èªk¨Ó¬°¸Ó Cursor «Ø¥ß·Q­nªº¯Á¤Þ¡F¦pªG Cursor ¨S¦³³Q«Ø¦n¡A¨º»ò¥¦·|½Õ¥Î HandleError ¤èªk¨Ó³B²z¥ô¦óµo¥Í¤Fªº¿ù»~¡C

lparameters tlNoData
local loParameter, ;
lcName, ;
luvalue, ;
llUseSchema, ;
loCommand, ;
llReturn
with This

* tlNoData°Ñ¼Æ«ü©w¬O§_­n¦V Cursor ¤¤¶ñ¥R¸ê®Æ¡A¦pªG­n¶ñ¥Rªº¸Ü¡A
* §Ú­Ì´N­n§â«Ø¥ß¦sÀx©Ò¦³°Ñ¼ÆªºÅܼƪº¬¡¦b³oùØ´N°µ±¼¦Ó¤£¬O©ñ¨ì¤@­Ó¨ä¥Lªº¤èªk¤¤¥h¡C
* ¦]¬°§Ú­Ì§Æ±æ³o¨ÇÅܼƪº¦³®Ä½d³ò¬O¨p¦³ªº¡C

if not tlNoData
for each loParameter in .oParameters
lcName = loParameter.Name
luvalue = .GetParametervalue(loParameter)
store luvalue to (lcName)
next loParameter
endif not tlNoData

* ¦pªG§Ú­Ì¥¿¦b¨Ï¥Î ADO¡A¨Ã¥B¦³¤F¤@¨Ç°Ñ¼Æ¡A¨º»ò´N»Ý­n¦³¤@­Ó³B²z³o¨Ç°Ñ¼Æªº Commandª«¥ó

llUseSchema = not empty(.CursorSchema)
if '?' $ .SelectCmd and (.DataSourceType = 'ADO' or (.UseDEDataSource and ;
.Parent.DataSourceType = 'ADO'))
loCommand = createobject('ADODB.Command')
loCommand.ActiveConnection = iif(.UseDEDataSource, ;
.Parent.DataSource.ActiveConnection, .DataSource.ActiveConnection)
llReturn = .CursorFill(llUseSchema, tlNoData, .nOptions, loCommand)
else

* ¶ñ¥R³o­Ó cursor.

llReturn = .CursorFill(llUseSchema, tlNoData, .nOptions)
endif '?' $ .SelectCmd ...

* ¦pªG Cursor «Ø¥ß¦¨¥\¡A«h¬°¤§©w¸q©Ò¦³ªº Tag¡A§_«h«h³B²zµo¥Íªº¿ù»~¡C

if llReturn
.CreateTags()
else
.HandleError()
endif llReturn
endwith
return llReturn

ÁÙ¦³¤@¨Ç¤èªk³oùاڭ̴N¤£»¡¤F¡A§A¥i¥H¦Û¤v¥h¬ã¨s¥¦­Ì¡CHandleError ¤èªk¨Ï¥Î Aerror() ¨Ó§PÂ_µo¥Í¤F¤°»ò¿ù»~¡A¨Ã§â¿ù»~°}¦Cªº²Ä¤G­Ó¤¸¯À©ñ¨ì cErrorMessage Äݩʤ¤¥h¡CRequery ¤èªk»P GetData Ãþ¦ü¡A¤£¹L¥¦¬O¥Î¨Ó¨ê·s Cursor ¤¤ªº¸ê®Æ¡C½Õ¥Î³o­Ó¤èªk¦Ó¤£¬O CursorRefresh ¤èªkªº­ì¦]´N¶H GetData ¤@¼Ë¡G¥¦¯à°÷³B²z°Ñ¼Æ©M¿ù»~¡CUpdate ¤èªk«Ü²³æ¡G¥¦´N¬O½Õ¥Î TableUpdate() ¨Ó´£¥æ·í«e¸ê®Æ·½ªº§ó·s¡A¦pªG´£¥æ§ó·s¥¢±Ñ¡A«h½Õ¥Î HandleError ¤èªk¨Ó³B²z¿ù»~¡CAddTag ¥Î©ó¦b Cursor ³Q«Ø¥ß«á±N§A·Q­n«Ø¥ßªº¯Á¤Þªº¸ê°T²K¥[¨ì Tags ¶°¦X¤¤¡A¦Ó GetData ¤èªk·|½Õ¥Îªº CreateTags ¤èªk«h·|¦b¦Û¤vªº Index ON »y¥y¤¤¥Î¨ì³o­Ó¶°¦X¤¤ªº¸ê°T¡C

³oùجO¨Ï¥Î³o­ÓÃþªº¤@­Ó¨Ò¤l¡A¬O±qªþ¥ó¤¤ªº TestCursorAdapter.prg ¤¤®³¨Óªº¡C¥¦±q SQL Server ¦Û±aªº Northwind ¸ê®Æ®wªº Customers ªí¤¤¨ú±o¸ê®Æ¡C¥¦ªº SelectCmd ÄÝ©ÊùجO¤@­Ó°Ñ¼Æ¤Æ¬d¸ßªº Select »y¥y¡A¦V§Aºt¥Ü¤F«ç¼Ë¥Î AddParameter ¤èªk¨Ó³B²z°Ñ¼Æ¡A¥H¤Î«ç¼Ë¥Î AddTag ¤èªk¨Ó¦Û°Ê¦a¬° Cursor «Ø¥ß¯Á¤Þ¼ÐÃÑ¡C

local loCursor as SFCursorAdapter of SFCursorAdapter, ;
loConnMgr as SFConnectionMgrODBC of SFRemote, ;
loParameter as Empty
lnHandle = sqlstringconnect('driver=SQL Server;server=(local);' + ;
'database=Northwind;uid=sa;pwd=;trusted_connection=no')
&& change password to appropriate value for your database
loCursor = newobject('SFCursorAdapter', 'SFDataClasses')
with loCursor
.DataSourceType = 'ODBC'
.Alias = 'Customers'
.SelectCmd = 'select * from customers where country = ?pcountry'
.SetConnection(lnHandle)
.AddParameter('pcountry', 'Brazil')
.AddTag('CustomerID', 'CustomerID')
.AddTag('Company', 'upper(CompanyName)')
.AddTag('Contact', 'upper(ContactName)')
if .GetData()
messagebox('Brazilian customers in CustomerID order')
set order to CustomerID
go top
browse
messagebox('Brazilian customers in Contact order')
set order to Contact
go top
browse
messagebox('Canadian customers')
loParameter = .GetParameter('pcountry')
loParameter.value = 'Canada'
.Requery()
browse
else
messagebox('Could not get the data. The error message was:' + ;
chr(13) + chr(13) + .cErrorMessage)
endif .GetData()

* Now try to do an invalid SELECT statement.

.SelectCmd = 'select * from customersx'
if .GetData()
browse
else
messagebox('Could not get the data. The error message was:' + ;
chr(13) + chr(13) + .cErrorMessage)
endif .GetData()
endwith
sqldisconnect(lnHandle)
SFDataEnvironment
¦bªþ¥ó SFDataClasses.vcx ¤¤ªº³o­Ó¸ê®Æ©MÀô¹ÒÃþ­n¤ñ SFCursorAdapter ²³æªº¦h¡C¦ý¥¦¼W¥[¤F¤@¨Ç«D±`¦³¥Îªº¥\¯à¡G
• GetData ¤èªk·|½Õ¥Î©Ò¦³¦b³o­Ó¸ê®ÆÀô¹ÒÃþùØ­±ªº SFCursorAdapter ¦¨­ûÃþªº GetData ¤èªk¡A³o¼Ë§A´N¤£»Ý­n¦Û¤v¥h¤@­Ó­Óªº½Õ¥Î¥¦­Ì¡C»P¦¹Ãþ¦üªº¬O¡ARequery ¤èªk©M Update ¤èªk¤]·|½Õ¥Î¨C­Ó SFCursorAdapter ¦¨­ûÃþªº Requery ©M Update ¤èªk¡C
• ¶H SFCursorAdapter ¤@¼Ë¡ASetConnection ¤èªk·|§â DataSource ³]¸m¬°¤@­Ó ADO Recordset¡A¨Ã§â³o­Ó Recordset ªº ActiveConnection Äݩʳ]¸m¬°¤@­Ó ADO Connection ª«¥ó¡C¤£¹L¡A¥¦ÁÙ·|½Õ¥Î©Ò¦³ UseDEDataSource ÄݩʳQ³]¸m¬° .F. ªº SFCursorAdapter ¦¨­ûÃþªº SetConnection ¤èªk¡C
• ¥¦´£¨Ñ¤F¤@¨Ç²³æªº¿ù»~³B²z(cErrorMessage ÄÝ©Ê·|³Q¶ñ¤J¿ù»~¸ê°T)
• ¥¦¦³¤@­Ó Release ¤èªk¡C
²{¦b§Ú­Ì¬Ý¬Ý³o­ÓÃþªº¤@¹ï¤èªk¡CGetData «D±`²³æ¡G¦pªG³o­Ó¸ê®ÆÀô¹ÒÃþªº¥ô¦ó¦¨­ûª«¥ó¾Ö¦³ GetData ¤èªk¡A«h½Õ¥Î¸Ó¤èªk¡G

lparameters tlNoData
local loCursor, ;
llReturn
for each loCursor in This.Objects
if pemstatus(loCursor, 'GetData', 5)
llReturn = loCursor.GetData(tlNoData)
if not llReturn
This.cErrorMessage = loCursor.cErrorMessage
exit
endif not llReturn
endif pemstatus(loCursor, 'GetData', 5)
next loCursor
return llReturn

SetConnection ¤èªkµy·L½ÆÂø¤@ÂI¡G¦pªG¥¦ªº¥ô¦ó¦¨­ûª«¥ó¦³ SetConnection ¤èªk¡B¨Ã¥B¸Ó¦¨­ûª«¥óªº UseDEDataSource ÄݩʳQ³]¸m¬° .F.¡A«h½Õ¥Î¸Ó¦¨­ûª«¥óªº SetConnection ¤èªk¡FµM«á¡A¦pªG¦³¥ô¦ó¤@­Ó CursorAdapter ª«¥óªº UseDEDataSource ÄݩʳQ³]¸m¬°¤F .T.¡A«h¨Ï¥ÎÃþ¦ü©ó SFCusrorAdapter ¤¤ªº¨º¼Ëªº¥N½X¨Ó³]¸m¦Û¤vªº DataSource¡G

lparameters tuConnection
local llSetOurs, ;
loCursor, ;
llReturn
with This

* Call the SetConnection method of any CursorAdapter that isn't using our
* DataSource.

llSetOurs = .F.
for each loCursor in .Objects
do case
case upper(loCursor.BaseClass) <> 'CURSORADAPTER'
case loCursor.UseDEDataSource
llSetOurs = .T.
case pemstatus(loCursor, 'SetConnection', 5)
loCursor.SetConnection(tuConnection)
endcase
next loCursor

* If we found any CursorAdapters that are using our DataSource, we'll need to
* set our own DataSource.

if llSetOurs
do case
case .DataSourceType = 'ODBC'
.DataSource = tuConnection
case .DataSourceType = 'ADO'
.DataSource = createobject('ADODB.RecordSet')
.DataSource.ActiveConnection = tuConnection
endcase
endif llSetOurs
endwith

TestDE.prg °µ¤F¤@­Óºt¥Ü¡A¥¦¨Ï¥Î SFDataEnvironment §@¬°®e¾¹¡A¸Ó®e¾¹¤¤¦³¤@¹ï SFCursorAdapter Ãþ¡C¦]¬°³o­Ó¨Ò¤l¥Îªº¬O ADO¡A©Ò¥H¨C­Ó SFCursorAdapter ³£»Ý­n¥¦¦Û¤vªº DataSource¡A¦]¦¹¥¦­Ìªº UseDEDataSource Äݩʳ£³Q³]¸m¦¨¤F .F.(Àq»{³]¸m)¡Cª`·N¡G¥u­n²³æªº½Õ¥Î¤@¤U SFDataEnvironment ªº SetConnection ¤èªk´N¯à·d©w¬°¨C­Ó CursorAdapter ³]¸m¦n DataSource Äݩʪº¨Æ±¡¡C

local loConn as ADODB.Connection
loConn = createobject('ADODB.Connection')
loConn.ConnectionString = 'provider=SQLOLEDB.1;data source=(local);' + ;
'database=Northwind;uid=sa;pwd='
&& change password to appropriate value for your database
loConn.Open()
set classlib to SFDataClasses
loDE = createobject('SFDataEnvironment')
with loDE
.AddObject('CustomersCursor', 'SFCursorAdapter')
with .CustomersCursor
.Alias = 'Customers'
.SelectCmd = 'select * from customers'
.DataSourceType = 'ADO'
endwith
.AddObject('OrdersCursor', 'SFCursorAdapter')
with .OrdersCursor
.Alias = 'Orders'
.SelectCmd = 'select * from orders'
.DataSourceType = 'ADO'
endwith
.SetConnection(loConn)
if .GetData()
select Customers
browse nowait
select Orders
browse
else
messagebox('Could not get the data. The error message was:' + ;
chr(13) + chr(13) + .cErrorMessage)
endif .GetData()
endwith
loConn.Close()
¥i­«¥Î¸ê®ÆÃþ
²{¦b§Ú­Ì¤w¸g¦³¤F¥i¥Îªº CursorAdapter ©M DataEnvironment ªº¤lÃþ¡AÅý§Ú­Ì¨Ó½Í½Í¥i­«¥Î¸ê®ÆÃþªº¨Æ±¡¡C

¤@¥ó VFP µ{¦¡®v­Ì¤w¸g¦V Microsoft ­n¨D¤F«Ü¤[ªº¨Æ±¡¬O¥i­«¥Î¸ê®ÆÃþ¡C¨Ò¦p¡A§A¥i¯à¦³¤@­Óªí³æ©M¤@­Ó³øªí¡A¥¦­Ì¨Ï¥Îªº¬O§¹¥þ¬Û¦Pªº¤@®M¸ê®Æ¡AµM¦Ó§A«o¤£±o¤£­«½Æªº¥h¤â°Ê¦V¸ê®ÆÀô¹Ò¤¤²K¥[¤@­Ó­Óªí©ÎªÌµø¹Ï¡X¡X¦]¬°¸ê®ÆÀô¹Ò¬O¤£¥i­«¥Îªº¡C¬Y¨Çµ{¦¡®v(¥H¤Î´X¥G©Ò¦³ªºÀ³¥Îµ{¦¡®Ø¬[´£¨Ñ°Ó)±Ä¥Î¤F³q¹L¥N½X¨Ó«Ø¥ß¥i­«¥Î¸ê®ÆÀô¹Ò(¨º®É­Ô¸ê®ÆÀô¹Ò¬O¤£¯àµøı¤Æªº«Ø¥ß¤lÃþªº)ªº¤èªk¡A¨Ã¥B¦bªí³æ¤W¨Ï¥Î¤@­Ó ¡§loader¡¨ª«¥ó¨Ó«Ø¥ß DataEnvironment ¤lÃþªº¹ê¨Ò¡C¤£ºÞ«ç»ò»¡¡A³oºØ¤èªkÁ`¤£¬O¨º»ò¥¿³W¡A¨Ã¥BµLªk¥Î©ó³øªí¡C

²{¦b¡A¦b VFP8 ùØ¡A§Ú­Ì¤£¶È¾Ö¦³¤F«Ø¥ß¡§¯à°÷¦V¥ô¦ó»Ý­n¸ê®Æªºª«¥ó´£¨Ñ¨Ó¦Û¥ô¦ó¸ê®Æ·½ªº¸ê®Æ¡¨ªº¥i­«¥Î¸ê®ÆÃþªº¯à¤O¡AÁÙ¦³¤F«Ø¥ß¡§¯à°÷±H±J¸ê®ÆÃþªº¡¨¸ê®ÆÀô¹ÒÃþªº¯à¤O¡C¦b§Ú¼g³o½g¤å³¹ªº®É­Ô¡A§AÁÙ¤£¯à¦b³øªí¤¤¨Ï¥Î CursorAdapter ©ÎªÌ DataEnvironment ªº¤lÃþ¡A¤£¹L§A¥i¥H½sµ{ªº²K¥[ CursorAdapter ¤lÃþ(¨Ò¦p§â³o¨Ç¥N½X¼g¦b DataEnvironment ªº INIT ¤èªk¤¤)¨Ó§Q¥Î¥i­«¥ÎÃþªºÀuÂI¡C

Åý§Ú­Ì¬° Northwind ¸ê®Æ®wªº Customers ©M Orders ªí«Ø¥ß¤@¨Ç¸ê®ÆÃþ¡CCustomersCursor (¦b NorthwindDataClasses.vcx ¤¤)¬O SFCursorAdapter ªº¤@­Ó¤lÃþ¡A¨äÄݩʦpªí1¡G

ªí 1. CustomersCursor ªºÄÝ©Ê
ÄÝ©Ê ­È
Alias Customers
CursorSchema CUSTOMERID C(5), COMPANYNAME C(40), CONTACTNAME C(30), CONTACTTITLE C(30), ADDRESS C(60),
CITY C(15), REGION C(15), POSTALCODE C(10), COUNTRY C(15), PHONE C(24), FAX C(24)
KeyFieldList CUSTOMERID
SelectCmd select * from customers
Tables CUSTOMERS
UpdatableFieldList CUSTOMERID, COMPANYNAME, CONTACTNAME, CONTACTTITLE, ADDRESS, CITY, REGION, POSTALCODE, COUNTRY, PHONE, FAX
UpdateNameList CUSTOMERID CUSTOMERS.CUSTOMERID, COMPANYNAME CUSTOMERS.COMPANYNAME, CONTACTNAME CUSTOMERS.CONTACTNAME, CONTACTTITLE CUSTOMERS.CONTACTTITLE, ADDRESS CUSTOMERS.ADDRESS, CITY CUSTOMERS.CITY, REGION CUSTOMERS.REGION, POSTALCODE CUSTOMERS.POSTALCODE, COUNTRY CUSTOMERS.COUNTRY, PHONE CUSTOMERS.PHONE, FAX, CUSTOMERS.FAX

§A¤£·|¥H¬°§Ú·|¬O¤â°Ê¦bÄݩʵøµ¡¤¤¿é¤J©Ò¦³³o¨ÇÄݩʪº­È§a¡H·íµM¤£¬O¡I§Ú¬O¥Î CursorAdapter ªº¥Í¦¨¾¹¨Ó·Fªº¡C³oùتº§Þ¥©¬O¥´¶}¡§Use connection settings in builder only(¥u¨Ï¥Î¦b¥Í¦¨¾¹¤¤ªº³s±µ³]¸m)¡¨¡A¶ñ¤J³s±µ¸ê°T¥HÀò±o¤@­Ó¬¡°Ê³s±µ¡A¦A¶ñ¦n SelectCMD ¥H«á¡A³Ì«á¦A¥Î¥Í¦¨¾¹¨Ó¥Í¦¨¨ä¥LªºÄݩʳ]¸m¡C

²{¦b¡A¥ô¦ó®É­Ô§A»Ý­n Northwind ªº Customers ªí¤¤ªº¸ê®Æ¡A¥u­n²³æªº©ñ¤@­Ó CustomersCursor Ãþ´N°÷¤F¡C·íµM¡A§Ú­ÌÁÙ¨S¦³©w¸q¥ô¦ó³s±µ¸ê°T¡A¤£¹L°µ¨ì³o¼Ë´N¤w¸g«Ü¤£¿ù¤F¡A¦³¤F³o­ÓÃþ´N¤£»Ý­n¾á¤ß«ç»òÀò±o¸ê®Æ(ODBC¡BXML¡BADO)¡B¨Ï¥Î­þºØ¸ê®Æ¤ÞÀº(¤ñ¦p SQL Server¡BAccess ¥H¤Î VFP 8¤¤³£¦³ Northwind ¸ê®Æ®w)¤§Ãþªº¨Æ±¡¤F¡C

¤£¹L¡A­nª`·Nªº¬O³o­Ó Cursor ¹ï¥Iªº¬O Customers ªí¤¤©Ò¦³ªº°O¿ý¡C¥i¦³®É­Ô¡A§A¤S¥u·Q­n¤@­Ó«È¤áªº¸ê®Æ¡C¨º»ò¡ACustomerByIDCursor ¬O CustomersCursor ªº¤@­Ó¤lÃþ¡A¥¦ªº SelectCmd ¤w¸g³Q§ï¦¨ ¡§Select * from customers where customerid = ?pcustomerid¡¨¡AÁÙ¦³¤U­±¼W¥[ªº INIT ¤èªkªº¥N½X¡G

lparameters tcCustomerID
dodefault()
This.AddParmeter('pCustomerID', tcCustomerID)

³o¬q¥N½X·|«Ø¥ß¤@­Ó¥s°µ pCustomerID ªº°Ñ¼Æ(¥¦¸ò¦b SelectCmd ¤¤«ü©wªº¬O¦P¤@­Ó)¡A¨Ã¥B³Q³]¸m¦¨¶Ç»¼¶i¨Óªº¥ô¦ó­È¡C¦pªG¨S¦³­È³Q¶Ç»¼¶i¨Óªº¸Ü¡A¨º»ò¨Ï¥Î GetParameter ¤èªk¨Ó¬°³o­Ó°Ñ¼Æªð¦^¤@­Óª«¥ó¡A¨Ã¦b½Õ¥Î GetData ¤§«e³]¸m¥¦ªº value ÄÝ©Ê¡C

OrdersCursor ÃþÃþ¦ü©ó CustomersCursor¡A¥u¬O¥¦ªð¦^ªº¬O Orders ªí¤¤ªº©Ò¦³¸ê®Æ¡A¦Ó OrdersForCustomerCursor ¬O¥¦ªº¤@­Ó¤lÃþ¡A¥Î©óªð¦^¤@­Ó«ü©w«È¤áªº©Ò¦³­q³æ¡C

­n´ú¸Õ¤@¤Uªº¸Ü¡A½Ð¹B¦æ TestCustomersCursor.prg¡A¥¦·|±q SQL Server ª©¥»ªº Northwind ¸ê®Æ®w¤¤ Customers ªíªº¤@­Ó«È¤á¡AµM«á°µ¨ì Access ª©¥»ªº Northwind ¸ê®Æ®w©Ò°µªº¦P¼Ëªº¨Æ±¡¡C³o­Ó¥Ü¨Òºt¥Ü¤F«ç¼Ë¤£¬°Ãþ«ü©w³s±µ¸ê°T¡A³o­ÓÃþ¦Û¤v´N¯àÆF¬¡ªº§¹¦¨¥ô°È¡A¦]¦¹¡A¥¦ªº¥i­«¥Î©Ê¬O«Ü±jªº¡C
¥Ü¨Ò¡Gªí³æ
²{¦b§Ú­Ì¤w¸g¦³¤F¤@¨Ç¥i­«¥ÎÃþ¡AÅý§Ú­Ì¨Ó¥Î¥Î¥¦­Ì¡C­º¥ý¡A§Ú­Ì¨Ó«Ø¥ß SFDataEnvironment ªº¤@­Ó¤lÃþ CustomersAndOrdersDataEnvironment («¢«¢¡A¦W¦r¥i¦³°÷ªøªº¡AD.HµP¦B¿}¸¬Äª¡I)¡A¥¦¥]§tµÛ¤@­Ó CustomerByIDCursor Ãþ©M¤@­Ó OrdersForCustomerCursor Ãþ¡C¥Ñ©ó§Ú­Ì§Æ±æ¦b¥´¶}ªí¤§«e³]¸m³s±µ¸ê°T¡A¦]¦¹§â¥¦ªº AutoOpenTables Äݩʳ]¸m¬°¤F .F.¡A¦Ó¥B§â«e­±¨â­Ó CursorAdapter ªº UseDEDataSource Äݩʳ£³]¸m¬°¤F .T.¡C²{¦b¡A³o­Ó¸ê®ÆÀô¹ÒÃþ¤w¸g¥i¥H³Q¥Î¨Ó¦b¬Y­Óªí³æ¤¤Åã¥ÜÃö©ó¤@­Ó«ü©w«È¤áªº¸ê°T¥H¤Î¥Lªº­q³æ¤F¡C

Åý§Ú­Ì¨Ó«Ø¥ß³o»ò¤@­Óªí³æ¡Cªþ¥ó¤¤ªº CustomerOrders.scx ªí³æªº DEClass ©M DEClassLibrary Äݩʤw¸g³Q³]¸m¬°¤FCustomersAndOrdersDataEnvironment ©M NorthwindDataClasses.vcx¡A³o¼Ë´N¥Î¤W¤F§Ú­Ìªº¥i­«¥Î¸ê®ÆÀô¹ÒÃþ¡C³o­Óªí³æªº Load ¤èªkùØ­±ªº¥N½X¦³ÂI¦h¡A¤£¹L³o¬O¦]¬°¥¦­n¤ä«ù ADO¡BODBC¡B¥H¤Î XML ¸ê®Æ·½¡A¨Ã¥B¥¦ÁÙ­n«Ø¥ß¦Û¤vªº³s±µ¡A©Ò¥H¤j¦h¼Æ¥N½X³£¬O³B²z³o¨Ç°ÝÃDªº¡C¦pªG¥¦¥u¤ä´©¤@ºØ¸ê®Æ·½ªº¸Ü¡A¤ñ¦p¥u¥Î ODBC¡A¦A¤ñ¦p¥Ñ¥t¤@­Óª«¥ó¨ÓºÞ²z³s±µ(¹ê»ÚªºÀ³¥Îµ{¦¡¶}µo¤¤±`±`´N¬O³o¼Ëªº)¡A¥N½X´N·|²³æ¦h¤F¡G

with This.CustomersAndOrdersDataEnvironment
* Àò±o³s±µ
lnHandle = oApp.oConnectionMgr.GetConnectionHandle()
.SetConnection(lnHandle)

* «ü©w±q CustomerID ¤å¥»®Ø¤¤¨ú±o cursor °Ñ¼Æªº­È
loParameter = ;
.CustomerByIDCursor.GetParameter('pCustomerID')
loParameter.value = '=Thisform.txtCustomerID.value'
loParameter = ;
.OrdersForCustomerCursor.GetParameter('pCustomerID')
loParameter.value = '=Thisform.txtCustomerID.value'

* «Ø¥ß¤@­ÓªÅªº cursor¡A¦pªG¥¢±Ñªº¸Ü«hÅã¥Ü¿ù»~¸ê°T

if not .GetData(.T.)
messagebox(.cErrorMessage)
return .F.
endif not .GetData(.T.)
endwith

³o¬q¥N½X¥Î¤W¤F¨º¨â­Ó CursorAdapter ª«¥óªº GetParameter ¤èªk¨Ó§â pCustomerID °Ñ¼Æ³]¸m¬°ªí³æ¤W¤@­Ó¤å¥»®Ø¤¤ªº­È¡Cª`·N¦b­ÈùØ­±¥Î¨ìªº'='¡A¥¦ªí¥Ü¦b§A»Ý­n value Äݩʪº®É­Ô¦A¥h¹Bºâ¥¦ªº­È¡A©Ò¥H§Ú­Ì¹ê»Ú¤W¦³¤F¤@­Ó°ÊºAªº°Ñ¼Æ(³o¼Ë´N¶¶À³¤F·í¥Î¤á¦b¤å¥»®Ø¤¤¿é¤J¤F·sªº­È¥H«á­n±N§ï°Ê¤ÏÀ³¨ì°Ñ¼Æ¤¤¥hªº»Ý­n)¡C½Õ¥Î GetData ¤èªk¬O¬°¤F«Ø¥ß¤@­ÓªÅªº Cursor¡A³o¼Ë¤~¯à¦w¹y¨º¨Ç¸ê®Æ¸j©wªº±±¨î¶µ¡C

txtCustomerID ¤å¥»®Ø¨S¦³¸j©w¤°»ò¸ê®Æ¡C¥¦ªº Valid ¤èªk¥ý½Õ¥Î¸ê®ÆÀô¹Òªº Requery ¤èªk¡AµM«á¦A½Õ¥Îªí³æªº Refresh ¤èªk¡C³o¼Ë¡A·í¥Î¤á¿é¤J¤@­Ó·sªº«È¤áIDªº®É­Ô¡A´N¯à°÷ Requery ¨º­Ó Cursor¡A±µµÛªí³æ¤W¨ä¥L±±¨î¶µ¤]·|³Q¨ê·s¡Cªí³æ¤Wªº¨ä¥L¤å¥»®Ø³Q¸j©w¨ì¥Ñ CustomersByIDCursor ª«¥ó«Ø¥ßªº Customers cursor ªºÄæ¦ì¤¤¡C¨º­Ó Grid ³Q¸j©w¨ì¥Ñ OrdersForCustomerCursor ª«¥ó«Ø¥ßªº Orders Cursor¡C

¹B¦æ³o­Óªí³æ¡A¨Ã¿é¤J¤@­Ó Customer ID ¬°¡§ALFKI¡¨(¨£¹Ï1)¡C·í§A«ö¤U Tab Áä¸õ¥X³o­Ó¤å¥»®Øªº®É­Ô¡A§A·|¬Ý¨ì¸Ó«È¤áªº¦ì§}¸ê°T¥H¤Î¥Lªº­q³æ´N¥X²{¤F¡C¸ÕµÛ§ï°Ê¤@¨Ç³o­Ó«È¤áªº¸ê®Æ©ÎªÌ­q³æ¸ê®Æ¡AµM«áÃö³¬ªí³æ¦A¥´¶}¡A¦A¿é¤J¤@¦¸¡§ALFKI¡¨¡A§A·|¬Ý¨ì§A¨S°µ¤°»ò¤u§@³o¨Ç§ï°Ê´N³£¤w¸g³Q¼g¨ì«á»O¸ê®Æ®w¤¤¤F¡C




¹Ï1¡B

»Å§a¡A¶â¡H¸ò«Ø¥ß¤@­Ó°ò©ó¥»¦aªí©ÎªÌµø¹Ïªºªí³æ¬Û¤ñ¡A¨Ã¨S¦h¦h¤Ö¤u§@¡C§ó´Îªº¬O¡G¸Õ¸Õ§â©w¸q¦b Load ¤èªk¤¤ªº ccDATASOURCETYPE ±`¶q§ïÅܬ° ¡§ADO¡¨©ÎªÌ¡§XML¡¨¡AµM«á³o­Óªí³æµL½×¬O¬Ý°_¨ÓÁÙ¬O¹ê»Ú¤u§@°_¨Ó³£¸ò¨S§ï¹L¤§«e¤@ºN¤@¼Ë(¦pªG§A·Q¥Î XML¡A§A»Ý­n¶H¤W­Ó¤ëªº¤å³¹¤¤©Ò»¡ªº¨º¼Ë¬° Northwind ¸ê®Æ®w³]¸m¤@­Ó SQLXML µêÀÀ¥Ø¿ý¡A¨Ã§â¥»¤ëªþ¥ó¤¤ªº XML ½d¥»ÀÉ«þ¨©¨ì¨º­Ó¥Ø¿ýùØ)¡C
¥Ü¨Ò¡G³øªí
§Ú­Ì¨Ó¸Õ¸Õ³øªí¡C³oùس̤jªº°ÝÃD¬O¡G»Pªí³æ¤£¦P¡A§Ú­Ì¬J¤£¯à§i¶D³øªí¥h¨Ï¥Î¤@­Ó¸ê®ÆÀô¹Ò¤lÃþ¡A¤]¤£¯à©ì©ñ¤@­Ó CursorAdapter ¤lÃþ¨ì¸ê®ÆÀô¹Ò¤¤¥h¡C©Ò¥H§Ú­Ì¤£±o¤£¦V³øªí©ñ¤J¤@¨Ç¥N½X¥H±N CursorAdapter ²K¥[¨ì¸ê®ÆÀô¹Ò¡C¾¨ºÞ±qÅÞ¿è¤W¨Ó¬ÝÀ³¸Ó§â³o¨Ç¥N½X©ñ¨ì³øªí¸ê®ÆÀô¹Òªº BeforeOpernTables ¨Æ¥ó¤¤¥h¡A¤£¹L¨Æ¹ê¤W³o¼Ë°µ«o¬O¦æ¤£³qªº¡A¦]¬°¡X¡X¥Ñ©ó¬Y¨Ç§Ú¤£¯à²z¸Ñªº­ì¦]¡X¡X BeforeOpenTables ¨Æ¥ó¥u·|¦b§A¹wÄý³øªíªº¨C¤@­¶ªº®É­Ô¤~·|IJµo¡C©Ò¥H¡A§Ú­Ì¥u¦n§â¥N½X©ñ¦b Init ¤èªkùØ¡C¦]¬°ºt¥Üªº»Ý­n¡A³øªí CustomerOrders.frx ¸òªí³æ CustomerOrders.scx ¤@¼Ë¡A­n¤ñ¹ê»Ú¶}µoªº±¡ªp¤U·|¥Î¨ìªº¥N½X§ó½ÆÂø¤@¨Ç¡C¦pªG¨S¦³³o¨Çºt¥Üªº»Ý¨Dªº¸Ü¡A¹ê»Ú¤W¥i¥H²¤Æ¨ì¤U­±³o¼Ë¡G

with This
set safety off

* Àò±o³s±µ

.DataSource = oApp.oConnectionMgr.GetConnectionHandle()

* «Ø¥ß«È¤á©M­q³æªº CursorAdapter ª«¥ó

.NewObject('CustomersCursor', 'CustomersCursor', ;
'NorthwindDataClasses')
.CustomersCursor.AddTag('CustomerID', 'CustomerID')
.CustomersCursor.UseDEDataSource = .T.
.NewObject('OrdersCursor', 'OrdersCursor', ;
'NorthwindDataClasses')
.OrdersCursor.AddTag('CustomerID', 'CustomerID')
.OrdersCursor.UseDEDataSource = .T.

* ¨ú±o¸ê®Æ¡A¦pªG¥¢±Ñ¡A«hÅã¥Ü¿ù»~¸ê°T

if not .CustomersCursor.GetData()
messagebox(.CustomersCursor.cErrorMessage)
return .F.
endif not .CustomersCursor.GetData()

if not .OrdersCursor.GetData()
messagebox(.OrdersCursor.cErrorMessage)
return .F.
endif not .OrdersCursor.GetData()

* ±q Customers ³]¸m¤@­Ó»P Orders ªºÃö«Y
set relation to CustomerID into Customers
endwith

³oùتº¥N½X¤ñªí³æ¥Ü¨Òªº­n¦h¤@¨Ç¡A³o¬O¦]¬°§Ú­Ì¤£¯à¨Ï¥Î¦Û©w¸qªº¸ê®ÆÀô¹ÒÃþ¾É­P¤£±o¤£¦Û¤v¤â°Ê½s½X¨Ó¥N´À¡C

²{¦b¡A§Ú­Ì«ç¼Ë¤~¯àºÉ¥i¯à²³æªº´N§â¨º¨ÇÄæ¦ì©ñ¨ì³øªí¤W¥h©O¡H¥Ñ©ó CursorAdapter ª«¥ó¬O§Ú­Ì¥Î¥N½X¦b¹B¦æ®É¤~²K¥[¨ì¸ê®ÆÀô¹Ò¤¤¥hªº¡A¦b³]­p®É´N¨S¿ìªk¨É¨ü¨ì©ì©ñÄæ¦ì¨ì³øªí¤Wªº¤è«K¤F¡C³oùئ³­Ó¤p§Þ¥©¡G«Ø¥ß¤@­Ó·|«Ø¥ß³o¨Ç Cursor ªº PRGÀÉ¡A¨ÃÅý³o¨Ç Cursor ³B©ó¦³®Ä½d³ò¤º(¥i¥H±Ä¥Î±¾°_ PRG ªº¹B¦æ©ÎªÌ§â CursorAdapter ª«¥óÁn©ú¦¨ Public ªº¿ìªk)¡AµM«á¨Ï¥Î§Ö³t³øªí¥\¯à¨Ó§â¨º¨ÇÄæ¦ì©ñ¨ì³øªí¤W¡A³o¼Ë³øªí±±¨î¶µªº¤j¤p¤]³]¸m¦n¤F¡C

¹Ï2®i¥Ü¤F·í§A¹wÄý³øªíªº®É­Ô¸Ó³øªíªº±¡ªp¡C¦pªGµ²¦Xªí³æ¤@°_¨Ï¥Îªº¸Ü¡A§A¥i¥H¸Õ¸Õ§ï°Êªí³æ¼Æ¾ÚÀô¹Ò¤¤ªº #DEFINE »y¥y¨Ó´«¥Î¨ä¥LÃþ«¬ªº¸ê®Æ·½¡C

¡@
Á`µ²
§Ú­Ì¹ï·sªº CursorAdapter °ò¦Ãþªº¬ã¨s´N¨ì³oùؤF¡C§Ú­Ó¤H¹ï CursorAdapter ªº¥X²{·P¨ì«D±`ªº¿³¾Ä¡A¨Ã­pµeµ¹§ÚªºÀ³¥Îµ{¦¡®Ø¬[¤¤ªº¸ê®Æ³B²z³¡¥ó¤É¤É¯Å¥H§ó¥R¤Àªº§Q¥Î¥¦ªºÀuÂI¡C

¤U­Ó¤ë¡A§Ú­Ì±N¬ã¨s¤@¤U¦b VFP 8 ¤¤³q¹L Try ... Catch ... Finally ... EndTry ©R¥O¤j¤j¼W±j¤Fªº¿ù»~³B²z¤è¦¡¥H¤Î·sªº Exception °ò¦Ãþ¡C

_________________
#############################
§Ö¼Ö¶ý«}¨t¦C©¯ºÖ¦v°t,³Ü¤Q¥þÂû´ö~­ì¨Ó©¯ºÖ¨º»ò²³æ!!

¾Ç·|VFP¨Ï¥ÎªÌªÀ°Ïªº·j´M,Code¤~·|§ó¦³½ì~
#############################
¦^³»ºÝ
À˵ø·|­û­Ó¤H¸ê®Æ µo°e¨p¤H°T®§
±q¤§«eªº¤å³¹¶}©lÅã¥Ü:   
µoªí·s¥DÃD   ¦^ÂÐ¥DÃD    VFP ·R¥ÎªÌªÀ°Ï ­º­¶ -> VFP °Q½×°Ï ©Ò¦³ªº®É¶¡§¡¬° ¥x¥_®É¶¡ (GMT + 8 ¤p®É)
²Ä1­¶(¦@1­¶)

 
«e©¹:  
±z µLªk ¦b³o­Óª©­±µoªí¤å³¹
±z µLªk ¦b³o­Óª©­±¦^ÂФ峹
±z µLªk ¦b³o­Óª©­±½s¿è¤å³¹
±z µLªk ¦b³o­Óª©­±§R°£¤å³¹
±z µLªk ¦b³o­Óª©­±¶i¦æ§ë²¼
±z µLªk ¦b³o­Óª©­±ªþ¥[ÀÉ®×
±z µLªk ¦b³o­Óª©­±¤U¸üÀÉ®×


Powered by phpBB © 2001, 2005 phpBB Group
¥¿Å餤¤å»y¨t¥Ñ phpbb-tw ºûÅ@»s§@