|
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¸ü.
|
¤W¤@½g¥DÃD :: ¤U¤@½g¥DÃD |
µoªí¤H |
¤º®e |
Ruey
µù¥U®É¶¡: 2003-03-12 ¤å³¹: 1698 ¨Ó¦Û: tunglo
²Ä 1 ¼Ó
|
µ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·Qn§ï¦¨¨Ï¥Î 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ªí¥Ü§An¿ï¥Îªº³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¨ýµÛ§An¦Û¤vºÞ²z³s±µ¤F)¡C¦bADOªº±¡ªp¤U¡ADataSource ¥²¶·¬O¤@Ó ADO RecordSet¡A¦Ó¥B¥¦ªº ActiveConnection ª«¥ó¥²¶·³Q³]¸m¬°¤@Ó¥´¶}ªº ADO Connection ª«¥ó(§A¤Sn¦Û¤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¤@Ó¿ù»~¡An»ò´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¤°»ò¿ù»~(·Ç³ÆWW«õ±¸§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»ò°µ¤@©wn¶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¨Æ¥ó«onµ¥¨ì©Ò¦³ªº±±¨î¶µ¤w¸gªì©l¤Æ¨Ã¤w¸g¸j©w¨ì¥¦Ìªº¸ê®Æ·½¤F¥H«á¤~·|³QIJµo¡Hn¬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§An¨Ï¥Î 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¼Ë¥un¤@¨B´N¥i¥H§¹¦¨¾Þ§@¤F¡C
• ¹ï©ó»·ºÝµø¹Ï¨Ó»¡¡A¤É¾E¤@Ó¤w¦³ªºÀ³¥Îµ{¦¡·|¬Û¹ï®e©ö¤@¨Ç¡G§A¥un§â¸ê®ÆÀô¹Ò¤¤¥»¦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¥un²³æªº§â¸ê®ÆÀô¹Ò¤¤ªº 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¡An°µªº¤u§@´N¦hªº¦h¡A¦]¬°¨C¼ËªF¦è§A³£¥²¶·¦Û¤v¼g¥N½X¡G«Ø¥ß©MÃö³¬³s±µ¡Bn°õ¦æªº 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¤@¥ó§An¾Þ¤ßªº¨Æ±¡¡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§Ú̱Nn¦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¥un§â¥¦ªº 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·Qn¨Ï¥Î¤@ӰѼƤƬ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)¡Cnª`·Nªº¬O¡GSelectCMD ©M UpdateCMD ³£¬On½Õ¥Î UDF ªº¡C¦b SelectCMD ªº±¡ªp¤¤¡Anªð¦^¸ê®Æªº«È¤á½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¡CnÀò¨ú¸ê®Æªº 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Ì·Qn¤@Ó¥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·Qn«Ø¥ß¤@Ó¤£±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 «Ø¥ß·Qnªº¯Á¤Þ¡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ªGn¶ñ¥Rªº¸Ü¡A
* §ÚÌ´Nn§â«Ø¥ß¦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·Qn«Ø¥ßªº¯Á¤Þªº¸ê°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¥un²³æªº½Õ¥Î¤@¤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¥un²³æªº©ñ¤@Ó 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¡Anª`·Nªº¬O³oÓ Cursor ¹ï¥Iªº¬O Customers ªí¤¤©Ò¦³ªº°O¿ý¡C¥i¦³®ÉÔ¡A§A¤S¥u·Qn¤@ӫȤ᪺¸ê®Æ¡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 ¤@¼Ë¡An¤ñ¹ê»Ú¶}µ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()
* «Ø¥ß«È¤á©Mq³æªº 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¤~·|§ó¦³½ì~
############################# |
|
¦^³»ºÝ |
|
|
|
|
±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§@
|