ªð¦^¦Cªí ¤W¤@¥DÃD µo©«

[Âà¶K] ´£°ªADO©Ê¯àªºÉ¬¨q经验

[Âà¶K] ´£°ªADO©Ê¯àªºÉ¬¨q经验

¤@¡B·§­z

¡@¡@¡§©Ê¯à¡¨这¤@术语¦³着¤LÏú¤£¦Pªº¡B®tÉÝ·L§®ªº§t义¡C当¤H们谈¨ì¬Y个东¦è©Ê¯à¦h¤Ö¦n时¡A¥L们·Q­nªí达ªº·N«ä¥i¯à´N¬O¦b¤@©wªº时间¤§内¥¦§¹¦¨¤F¦h¤Ö¤u§@¡C¨Ò¦p¡A¤@个©Ê¯à¦nªº发动Éó运¦æ°_来§ó稳©w¡A产¥Íªº动¤O§ó强¤j¡C对¤_开发¤p组¡A§A¦P样¤]¥i¯à应¥Î这个§P断标­ã¡G¤@个©Ê¯à¦nªº开发¤p组¤u§@时¤ñ较¦w静¡A¦Ó¥B¯à够¥Í产¥X¤j¶q°ª质¶qªº¥N码¡C对§Ú来说¡A©Ê¯à¦Ü¤Ö·N¨ý着两¥ó¨Æ±¡¡X¡X§Úªº¥N码运¦æ°_来¦³¦h¦n¡A§Úªº开发¤p组©M§Ú¥»¤H¤u§@®Ä²v«ç¤\样¡C无论­þ¤@¤è­±¡A¥»¤å¤¶绍ªº§Þ¥©³£将°_¨ì¤@©wªº帮§U§@¥Î¡G帮§U§A§ó§Ö¦a编写¥N码¡A帮§U§A编写§ó§Öªº¥N码¡X¡X¦w静¦a§¹¦¨这¤@¤Á¡A减¤Ö这样¨º样ªº错误¡C¥»¤å¤¶绍ªº§Þ¥©¥D­n­±¦VADO¡A¯S别¬O¦p¦ó³q过ADO访问SQL Server¡C¦ýÉO¦¹¦P时¡A§Ú还将¯A¤Î¤@¨ÇÓì¥Î­S围§ó广ªºCOM§Þ¥©¡A¥¦们Óì¥Î¤_§A©Ò编写ªº©Ò¦³Visual Basic¥N码¡C

¡@¡@为¤F¤F¸Ñ从­þ¨ÇSQL Server数Õu访问¥N码编写§Þ术¡B­þ¨ÇÊ^¨t¡B­þ¨Ç开发习惯¥i¥H±o¨ì³Ì¦nªº©Ê¯à¡A§Ú¤w经ªá¤F¤£¤Ö时间¡C¤@¨Ç±¡况¤U¡A对¤_应¥Îªº¾ãÊ^©Ê¯à来说¡A单¤@ªº§Þ术·N义«Ü¤p¡A°£«D§Ú们³q过´`环将©Ê¯àªº§ïµ½µ{«×¦¨­¿©ñ¤j¡C¨Ò¦p¡A¦b¤@个«È户Éó/ªA务¾¹应¥Î¤¤¡A当§Ú们¤£¬O³q过«ü©wODBC数Õu·½¡]DSN¡^ªº¤è¦¡连±µ数Õu库时¡A¤j约¯à够节¬Ù¤@¨ì¤G¬íªº时间¡C对¤_应¥Î¾ãÊ^ªºÓì¥Î©Ê©Î©Ê¯à来说¡A这³¡¤À节¬Ùªº时间©Ò产¥Íªº¼v响«Ü¤p¡C¦ý¬O¡A¦pªG§Ú们¦b¤@个¤¤间层组¥ó¤W应¥Î这Ïú§Þ术¡A这个组¥ó¨C¤À钟¡]©Î¨C¤p时¡A¨C¤Ñ¡^³£­n«Ø¥ß©M关闭数Õu库连±µ数¦Ê¡]¬Æ¦Ü数¤d¡^¦¸¡A¨º¤\¡A这Ïú§Þ术将显µÛ¦a¼v响¨t统ªº©Ê¯àªí现¡C¦]¦¹¡A对¤_§Ú¦b这¨½讨论ªº¨C¤@Ïú§Þ术¡A请务¥²¦Ò虑这个­¿数¦]¤l¡X¡X§Y¡A¦b¤@©wªº时间©P´Á内¡A§Aªº¨t统将执¦æ¦P¤@¬q¥N码¦h¤Ö¦¸¡C

¡@¡@当§A开©l寻¨D§ï进©Ê¯àªº¤è®×时¡A请¦Ò虑¤@¤U§Aªº应¥Î¡]组¥ó¡A©ÎªÌ¬OASP¥N码¡^¤j³¡¥÷ªºµ¥«Ý©M处²z时间ªá¦b¤°¤\¦a¤è¡C¦pªG§A发现应¥Îµ{§Ç§â¤j¶qªº时间ªá¦bµ¥«ÝOpen©ÎExecute¤èªk执¦æ§¹¦¨¡A¨º¤\¡A§A应该认¯u¦a检¬d¤@¤UªA务¾¹ºÝªº¬d询µ¦²¤¡C¥]¬AADO¦b内¡A©Ò¦³ªº数Õu访问±µ¤fµ¥«Ý¬d询结ªGªº时间³£¬Û¦P¡C¨Ò¦p¡A¦pªG§A¦³¤@个¬d询¡ASQL Server»Ý­n20¬í¤~¯à§¹¦¨¥¦¡A¤£论¥Î来执¦æ该¬d询ªº¬O¤°¤\±µ¤f¡A没¦³¤@Ïú±µ¤f¯à够¤ñ¨ä¥L±µ¤f¥H§ó§Öªº³t«×ªð¦^结ªG¡C虽µM¦³¨Ç±µ¤f¥´开连±µªº³t«×¤ñ较§Ö¡A¦³¨Ç±µ¤f处²z结ªG¶°ªº³t«×¤ñ较§Ö¡A¦ý没¦³¤@Ïú±µ¤f¯à够¼v响数Õu库¤ÞÀº编译©M执¦æ¬d询ªº³t«×¡C¦]¦¹¡A¦pªG§Aªº¬d询¨ã¦³¤Ó°ªªº¡§¬D战©Ê¡¨¡X¡X¨Ò¦p§A没¦³对¯Á¤Þ进¦æɬ¤Æ¡A§A没¦³¨Ï¥Î¦s储过µ{¡AªA务¾¹负载过­«¡A©ÎªÌ§A­n¨Dªð¦^ªº记录数¶q¤Ó¦h¡X¡X¨º¤\¡A¥@¬É¤W没¦³¤@ÏúADO§Þ术¯à够帮§U§A´£°ª©Ê¯à¡C°£«D§A¸Ñ决¤F这¨Ç°ò¥»ªº¬d询问题¡A§_则没¦³¤@Ïú©Ê¯à调¾ã§Þ术¯à够显µÛ¦a§ïµ½¾ãÊ^©Ê¯à¡CSQL ServerªºQuery Analyzer¬O¤@个¤ÀªR¬d询©Ê¯àªºÉ¬¨q¤u¨ã¡C¥¦¯à够¥Î图§Îªº¤è¦¡显¥Ü¬d询ªº执¦æ过µ{¡A¦}对§ï进©Ê¯àªº¤èªk´£¥X«Ø议¡C

¡@¡@¦pªG§A¯à够ÚÌ«H¬d询¨ã¦³较°ªªº®Ä²v¡A¨º¤\¡A§A¥i¥H¨Ï¥Î¥»¤å¤¶绍ªº§Þ术进¤@¨B调¾ãADO¥N码ªº©Ê¯à¡C这¨½¤¶绍ªº§Þ¥©将从¦U个¤è­±帮§U§A简¤Æ©M§ï进ADO编µ{¡A¥]¬A¡G«Ø¥ß©M维护连±µ¡AÌÛ³y©M´£¥æ执¦æ³t«×§ó§Öªº¬d询¡A´£°ª处²z¬d询结ªGªº®Ä²v¡Aµ¥µ¥¡C

¤G¡B«Ø¥ß连±µ

¡@¡@¦b¤@个«È户Éó/ªA务¾¹应¥Î¤¤¡A§Ú们¥i¥H¥Î¦n¤LÏú¤èªk§â«Ø¥ß©Mªì©l¤Æ数Õu库连±µ©Ò»Ý­nªº时间隐Âð_来¡A¨Ï±o应¥Îµ{§Ç¬J¯à够¥´开连±µ¡A¤S¤£»Ý­n¥Î户µ¥«Ý应¥Îµ{§Ç启动¡C­º¥ý¡A§Ú们¥i¥H尝试ÉݨB连±µ¡C¨Ï¥ÎÉݨB连±µ时¡AADO启动连±µ¾Þ§@¤§¦Z¡A¤£µ¥«Ý连±µ§¹¦¨´N§â±±¨î权ªð¦^给应¥Îµ{§Ç¡X¡X这样¡A应¥Îµ{§Ç´N¯à够±µ着执¦æ¤j³¡¥÷ªì©l¤Æ¾Þ§@¡A¥H§ó§Öªº³t«×§¹¦¨form_load¨Æ¥ó处²z¡C¦pªG关闭¦}­«·s«Ø¥ß连±µªº时间¤p¤_连±µ¦À释©ñ连±µªº时间¡A¨º¤\这个连±µ实际¤W¬O§Y时ªº¡C¦ý¦b许¦h±¡况¤U¡]¯S别¬O¥Î户数¶q¤£¦h时¡^¡A让连±µ«O«ù¥´开状态§ó¨ã¦³现实·N义¡C¦b¤¤间层组¥ó©ÎASP页­±内³¡¡A¦pªG数Õu库¬d询¦h¦¸­«Î`¥X现¡A§Ú«Ø议§A让Connection对¶H«O«ù¥´开状态¡C

¡@¡@¥t¥~¤@个§ï进连±µ©Ê¯àªº办ªk¬O¡AÁקK¨Ï¥Î带¦³DSNªºODBC¡C¦bMicrosoft¡AODBC¤w经转¤J¤FQuick Fix Engineering¡]QFE¡A§Ö³t­×²z¤uµ{¡^状态¡A¥¦·N¨ý着¡G°£«D发现­«¤jBUG¡A该¤½¥q将¤£¦A¦bODBC©Î¥¦ªº驱动µ{§Ç¤Wªá时间¡C¥t¥~¡A¦Ò虑©Ê¯à©M³¡¸p问题时¡AODBC DSN¤]¬O¤@个¥²须关ª`ªº问题¡CDSN¥²须¦w装¨ì«È户¨t统¤W¡A­n¨D进¦æª`册ªí¬d§ä¡AÉOOLE DB连±µ¬Û¤ñ¡A¥¦«Ø¥ß连±µ©Ò»Ý­nªº时间§ó长¡X¡X¯S别¬O当§A¥Îª½±µ编码ªº¤è¦¡«ü©wConnectionString时¡A这¤@点¤×¨ä¬ð¥X¡C从实际®ÄªG来¬Ý¡AÁקK¨Ï¥ÎDSN­°§Cªº¨t统开销«Ü¦³­­¡G¦pªG§¹¥þ¨ú®ø连±µ«Ø¥ß过µ{¡A对¤_¨C个连±µ¡A§A¤]许¯à够³Ñ¤U¤G¨ì¤­¬í时间¡]°²设数Õu库连±µ¦À¤¤¤w经没¦³连±µ¡^¡CµM¦Ó¡A¦pªG§Aªº应¥Îµ{§Ç»Ý­n频Ác¦a«Ø¥ß连±µ¡A节¬Ùªº时间²Ö计°_来´N«Ü¥i观¤F¡C

¡@¡@«Ø¥ß数Õu库连±µªº时­Ô¡A§A­n选择¤@个数Õu´£¨ÑªÌ¡CMicrosoft«Ø议§Ú们¨Ï¥ÎOLE DB´£¨ÑªÌ´À¥NÀq认ªºODBC´£¨ÑªÌ¡C对¤ñ³Ì·sªºOLE DB¥»¦a´£¨ÑªÌ©M¥\¯à类¦ü¦ý较¦­ªºODBC´£¨ÑªÌ¡A§Ú·P¨ì«eªÌ¥O¤H¤£´r§Öªº·N¥~¤§¨Æ较¤Ö¡C¦ý无论¬O­þÏú±¡况¡A§A³£应该¦b决©w¨Ï¥Î¬Y个·sªº´£¨ÑªÌ¤§«e对应¥Î进¦æ§¹¾ã¦a测试¡X¡X¥N码ªº©Ê¯à¡B¤ä«ùªº¥\¯à¡B¦æ为¤è¦¡³£¦³¥i¯à发¥Í变¤Æ¡C

¡@¡@¦b¤¤间层©MASP¤¤¡A¦b«O«ù连±µ¥´开ªº±¡况¤U¡A§Ú们¤£¯à¡]从实践来¬Ý¡^创«Ø¥X¥i¦ù缩ªº组¥ó¡X¡X¦Ü¤Ö¦b¦h¦¸调¥Î¤§间¬O这样ªº¡C¤@¯ë¦a¡A当IIS¤Þ¥Î©M释©ñ组¥ó¡BASP页­±ªº实¨Ò时¡A组¥ó©MASP页­±³Q频Ác¦a装¤J¡B丢弃¡C¥Ñ¤_°ò¤_ADOªº¥N码¨C¦¸执¦æ时³£¥²须«Ø¥ß¡B¨Ï¥Î¡B释©ñ数Õu库连±µ¡A³Ì¤p¤Æ连±µÎ`杂µ{«×ªºµ¦²¤对©Ê¯àªº´£°ªµ{«×达¨ì¤F¥i©ú显测¶qªºµ{«×¡C¦b这¨Ç±¡§Î¤U¡A对¤_§Ú们连±µ数Õu库ªº³t«×来说¡A连±µ/会话¦À¦³着­«­nªº·N义¡C¦pªG§A为Command对¶HªºConnectionString属©Ê«ü©w¦XÓ쪺­È¡]§Y¡A¨C¦¸¨Ï¥Î¦P样ªºªA务¾¹¡Bªì©l¥Ø录¡Bµn录ID©M¨ä¥L参数¡^¡A¨º¤\¡A连±µ¤w经¥´开¥B处¤_¥i¥Î状态ªºÉó会«Ü¤j¡C¦pªG连±µ¦À¤¤¯à够§ä¨ì¤Ç°tªº连±µ¡A连±µ¡]©Î­«·s连±µ¡^ªº时间将±µªñ0¡]³q±`¤p¤_250 ms¡^¡C

¡@¡@µM¦Ó¡A¦pªGADO¡]©ÎVB¡^¥N码¤£释©ñConnection对¶H¡A©ÎªÌ¡A§Ú们¦b¤£¦Pªº实¨Ò¤§间§ï换¤FConnectionString¡AOLE DB¥²须¨C¦¸«Ø¥ß¤@个·sªº连±µ¡C¦pªG¥X现¤F这Ïú±¡况¡A§Ú们将«Ü§Ö¯Ó尽连±µ¦À内¥i¥Î连±µªº数¶q¡C­nÚÌ«O连±µ³Q释©ñ¡A§Ú们¥²须¦b关闭连±µ¤§¦Z§âConnection对¶H设¸m为Nothing¡C¥t¥~¡A¤£­n¦bRecordset Open¤èªk¤¤¨Ï¥ÎConnectionString¡A¦Ó¬O¥H独¥ßªº¤è¦¡¥´开Connection对¶H¡F这样¡A当§Ú们­n关闭Connection对¶H¥H¤Î­n§â¥¦设¸m¦¨Nothingªº时­Ô¡A¤Þ¥Î¥¦´N«Ü¤è«K¤F¡C
1

µû¤À¤H¼Æ

    • Hsieh: «Ü¦nªºÆ[©À¤À¨Éª÷¿ú + 4

¤T¡BÌÛ³y©M´£¥æ¬d询

¡@¡@¦bÌÛ³y¬d询ªº时­Ô¡A­n·d²M·¡为¤°¤\¥²须这¤\°µ¡B为¤°¤\¤£¯à¨º¤\°µ¬O¤@个«ÜÎ`杂ªº问题¡CµM¦Ó¡A¤@¨Ç°ò¥»ªº«ü导¤è针¯à够让ÌÛ³y°ª®Ä¬d询ªº过µ{§ó¥[¬y畅¡B轻ªQ¡C¤@¯ë¦a¡A§A¤£应该让¬d询®ö费ªA务¾¹时间¡C¤U­±¤L个§Þ¥©¯à够帮§U§AÌÛ³y¥X§ó¦n¡B§ó°ª®Äªº¬d询¡C

¡@¡@¤£­n强¨îSQL Server¨C¦¸执¦æ¬d询ªº时­Ô­«·s编译©MÌÛ³y¬d询执¦æ计¦E¡CÁקK这Ïú­«Î`¾Þ§@ªº¤@Ïú简单¤èªk¬O¨Ï¥Î带¦³参数ªº¦s储过µ{¡Cª`·N尽¶q¤£­n¨Ï¥ÎADO Command对¶HªºPrepare属©Ê¡X¡X¦³时¥¦¤£¯à¥¿Ṳ́u§@¡C¦pªG¨Ï¥Î¦s储过µ{¡A§A还¥i¥H³q过®ø°£¤£¥²­nªº¡§¨ü¼v响¦æ数¡¨ªð¦^­È进¤@¨B´£°ªADO©Ê¯à¡X¡X¥u»Ý¦b¦s储过µ{¤¤¥[¤JSET NOCOUNT ON´N¥i¥H¤F¡C

¡@¡@尽¶q减¤ÖÉOªA务¾¹ªº³q«H¦¸数¡C¦pªG§A¦³¤L个¬Û关ªº¾Þ§@­n执¦æ¡A请§â¥¦们¦X¦}为¤@个¦s储过µ{¡A©ÎªÌ¬O¤@个¥i¥H¦bªA务¾¹¤W§@为脚¥»执¦æªºÎ`¦X¬d询¡CÁקK¨Ï¥Î¤èªk¡]¤ñ¦pRefresh¡^©M¤£Óì当ªºParameters¶°¦X¤Þ¥Î¡A¥¦们会强¨îADO¼W¥[额¥~ªºªA务¾¹³q«H过µ{¡C

¡@¡@¦b«È户Éó/ªA务¾¹应¥Î¤¤¡A¥uÌÛ³yCommand对¶H¤@¦¸¡A¦Ó¤£¬O¨C¦¸¨Ï¥ÎCommand对¶Hªº时­Ô­«·sÌÛ³y¡C§A¥i¥H­«·s设¸mCommandªº参数­È¡AµM¦Z¦b»Ý­n时执¦æ¥¦¡C

¡@¡@当¬d询ªð¦^ªº¤£¬O¤@个记录¶°时¡AÚÌ«O¨Ï¥Î¤FadExecuteNoRecords选项¡A§i诉ADO¶V过©Ò¦³¨º¨Ç¥Î来±µ¦¬©MÌÛ³y记录¶°¡]Recordset®æ¦¡¡^ªº¥N码¡C§A¥i¥H§âadExecuteNoRecords选项传递给Execute¤èªk¡A©Î§â¥¦§@为Commandªº选项¡C

¡@¡@执¦æªð¦^简单记录¶°ªº¦s储过µ{时¡A¤£­n¨Ï¥ÎCommand对¶H¡C©Ò¦³ªº¦s储过µ{¡]¥H¤ÎCommand对¶H¡^¥i¥H§@为Connection对¶HªºCOM¤èªk¥X现¡C让¦s储过µ{§@为Connection对¶Hªº¤èªk¥X现¦³着显µÛªº©Ê¯àɬ势¡A¦P时¥¦¤]简¤Æ¤F¥N码¡C尽ºÞ这Ïú§Þ术对¤_¨º¨Ç¦³Return Status­È©ÎOutput参数ªº¦s储过µ{没¦³¤°¤\帮§U¡A¦ý对¤_动§@¬d询¡]INSERT¡BDELETEµ¥¡^¥H¤Î¨º¨Çªð¦^¤@个©Î¦h个记录ªº¬d询来说¡A这Ïú§Þ术«Ü¦³¥Î¡C§â¦s储过µ{§@为Connectionªº¤èªk¤§¦Z¡A§A¥i¥H¥Î¤èªk参数ªº§Î¦¡传¤J¦s储过µ{ªº输¤J参数¡F¦pªG调¥Î¦s储过µ{ªð¦^¤F¤@个记录¶°¡A§A¥i¥H³q过¤èªk调¥Î¤¤³Ì¦Z¤@个参数¤Þ¥Î该Recordset¡C¨Ò¦p¡A¤U­±ªºADO语¥y执¦æ¤@个¦W为¡§Fred¡¨ªº¦s储过µ{¡AFred¦s储过µ{¦³两个输¤J参数¡Aªð¦^¤@个Recordset¡G

MyConnection.Fred  "InputArg1", 2, myRecordset
¡@¡@编写¥N码ªº时­Ô¡A¤£­n±H§Æ±æ¤_VBªº¦Û动§¹¦¨¥\¯à会§â¦s储过µ{©ÎCommand对¶H¦W¦r视为¦XªkªºConnection对¶Hªº¤èªk¡C¦b¥¿¦¡运¦æ¤§«e¡ACOM¤£会¸ÑªR这类¦W¦r¡C

¡@¡@°£«D绝对¥²­n¡A§_则¤£­nªð¦^记录¶°¡C当¥¿¦b执¦æªº¬d询ªð¦^记录时¡AADO´N会ÌÛ³y¤@个Recordset对¶H¡CÌÛ³yRecordset对¶Hªº开销«Ü¤j¡A¦]¦¹§A应该尽¶qÁקK¨Ï¥ÎRecordset对¶H¡Cª`·N¦³时­Ô执¦æ¬d询虽µMªð¦^结ªG¡A¦ý¤£¬Oªð¦^记录¡C¨Ò¦p¡A§A¥i¥H³q过Return Status参数ªð¦^¾ã数­È¡C¥t¥~¡A§A¥i¥Hªð¦^Output参数来´À¥N»Ý­nÌÛ³yRecordset对¶Hªº记录¶°¡ASQL Server¤¹许ªð¦^ªºOutput参数¦h达1000个¡C

¡@¡@¥u­n¦³¥i¯à¡A请¥Î动§@¬d询¡]INSERT¡AUPDATE¡ADELETE©M执¦æ这¨Ç¾Þ§@ªº¦s储过µ{¡^´À¥N¥i§ó·sªºRecordset´å标¡C¦¹时¡A§A应该¨Ï¥ÎExecute¤èªk©M¥¦ªºadExecuteNoRecords选项¡AÚÌ«OADO¯à够ª¾¹D¬d询¤£»Ý­nÌÛ³yRecordset对¶H¡C

¡@¡@°£«D¥²­n¡A§_则¤£­n请¨DªA务¾¹进¦æ±Æ§Ç¡C¤j¦h数±¡况¤U¡A对¤_¤@个Óì«×¤j¤pªºRecordset对¶H¡A当¥¦³Q发°e¨ì«È户ºÝ¤§¦Z¡A±Æ§Ç³t«×将§ó§Ö¡C¥t¥~¡A¦pªG让ADO«È户µ{§Ç±Æ§ÇRecordset¤¤ªº记录¡A则«È户应¥Îµ{§Ç¯à够«ö·Ó¥Î户选择ªº¦¸§Ç±Æ§Ç¡A从¦Ó´£°ª¤F灵¬¡©Ê¡C

¡@¡@¦b编写¬d询¤§«e¤F¸Ñ¯Á¤Þªº结ÌÛ¡C创«Ø¦XÓ쪺¯Á¤Þ¡A调¾ã¬d询ªº语ªk¥H§Q¥Î这¨Ç¯Á¤Þ¡A§A将¯à够´£°ª记录´£¨úªº³t«×¡CQuery Analyzer¯à够帮§U§A决©w¬O§_¦³¥²­n²K¥[§ó¦hªº¯Á¤Þ¡C

¡@¡@¤£­n¤@¦¸©Êªð¦^¤Ó¦hªº记录¡C«Ü¦h时­Ô¡A®e¶q¤Ó¤jªº记录¶°会严­«¦a¼v响应¥Îµ{§Çªº©Ê¯à¡C¥uªð¦^¨º¨Ç当«e§A»Ý­nªº记录¡A¦pªG«È户µ{§Ç»Ý­n§ó¦hªº记录¡A则¥H¦Z随时´£¨ú¡C³q过带¦³参数ªºWHERE¤l¥y¡A©ÎªÌ灵¬¡¦a运¥ÎTOP N¬d询¡A­­¨î¬d询ªº­S围¡C

¡@¡@¤£­nªð¦^¤Ó¦hªº¦C¡CÁקK¨Ï¥ÎSELECT *¡CSELECT *语¥y§i诉SQL Serverªð¦^©Ò¦³ªº¦C¡A¤£ºÞ实际¦s¦bªº¦C¦³¦h¤Ö¡C¥u选择¨º¨Ç§A»Ý­nªº¦C¡A这样¡A当¦³¤H为ªí¼W¥[¤F§ó¦hªº¦C时¡A§A¤£会±o¨ì¤j±o¥X©_ªº结ªG¶°¡C

¡@¡@ÁקK¨Ï¥Î´å标¡C¦pªG§A¥²须¨Ï¥Î´å标¡A¨º¤\¤£­n¨Ï¥Î¨º¨Ç©Ò»Ý资·½数¶q¶W过¥²­nªº´å标类«¬¡C¦pªG没¦³¥²­n¡A¤£­n­n¨D´å标´£¨Ñ滚动¡B§ó·s©M数Õu缓冲¯à¤O¡C

¡@¡@详细¦a§i诉ADO§A·Q­n¥¦°µ¨Ç¤°¤\¡C¥´开Recordset©ÎªÌÌÛ³yCommand对¶H时¡A¤£­n§Ñ¤F设¸mCommandType选项¡C¥¦ÁקK¤FADO¡§²q测¡¨§Aªº·N图¡A§A将¯à够减¤ÖÉOªA务¾¹ªº³q«H¡A¦Ó¥B¨Ï±o¥N码§ó¥[稳©w¡C

¡@¡@¥t¥~¡A学习¨Ï¥Î诊断¤u¨ã¡A测©w运¦æ¦bªA务¾¹¤Wªº¥N码©M应¥Îµ{§Çªº¥N码¥e¥Î¤F¦h¤Ö时间¡X¡X¥H¤Î这¨Ç时间ªá¦b­þ¨½¡C¦b这¤è­±¡ASQL Server Profiler¬O¤@个宝贵ªº¤u¨ã¡C¥¦¯à够阐©ú§Aªº¥N码¦b­n¨DªA务¾¹°µ¨Ç¤°¤\¡A¯à够¦b¯ó²vÌÛ³yªº¬d询¤¤©Î对¤_错误选择ªº©R¥O属©Ê¬ð¥X显¥Ü¡C¥t¥~¡AQuery Analyzer还¯à够¥Î图¥Üªº¤è¦¡显¥Ü¥XSQL Server将¦p¦ó执¦æ¬d询¡A´£¥X§ï进¬d询ªº«Ø议¡A帮§U§A调¾ã¬d询¡CQuery Analyzer¬Æ¦Ü还¯à够执¦æ¥¦´£¥Xªº«Ø议¡]¨Ò¦p¡A²K¥[©ÎªÌ删°£¯Á¤Þ¡^¡A§A¥u»Ý点击¤@¤U«ö钮´N¥i¥H§¹¦¨¡C

TOP

¥»©«³Ì«á¥Ñ Hsieh ©ó 2010-9-14 10:20 ½s¿è

¥|¡B处²z¬d询结ªG

¡@¡@¬d询结ªG记录发°e¨ì«È户ºÝ¤§¦Z¡A«È户ºÝ应¥Îµ{§Ç¥i¯à»Ý­n¬Û当¥i观ªº时间¥h处²z结ªG¶°¡C¨C¤@ÏúÊ^¨t¡]«È户Éó/ªA务¾¹¡A¦h层Ê^¨t¤¤ªº¤¤间层¡A¥H¤ÎASP¡^³£为ɬ¤Æ这个阶¬qªº¥N码´£¨Ñ¤F¬Û应ªº§Þ术¡C¤U­±¬O¤L个¯à够显µÛ§ïµ½©Ê¯àªº§Þ¥©¡C

¡@¡@§Ú¦b¥N码¤¤¬Ý¨ì³Ì¦hªº错误¤§¤@¬O¡G¦b¤Þ¥ÎRecordset Field.Valueªº时­Ô¡A¨Ï¥Î©µ迟绑©w¡]Late Binding¡^¡C¥Ñ¤_¥N码»Ý­n频Ác¦a¤Þ¥ÎValue属©Ê¡A¦Ó¥B³q±`­n¤Þ¥ÎªºField对¶H¦³«Ü¦h¡A¥»¤å«e­±´£¨ìªº­¿数¦]¤l将°_¨ì­«­n¼v响¡X¡X¦]¦¹¡A©Ò¦³这¨½¤¶绍ªº§Þ¥©¯à够显µÛ¦a§ïµ½©Ê¯à¡C¤@¨Ç开发ªÌ¨Ï¥Î©µ迟绑©w§Þ术ªº­ì¦]¦b¤_¡A¥L们·Q­n©úÚ̦a标识¥XSELECT语¥y选择¤F­þ¨Ç¦æ¡C为¤F这个¥Ø标¡A许¦h¤H¨Ï¥Î¤F¥Î¤Þ号¥]围¦r²Å¦êªº°µªk¡C¨Ò¦p¡A为¤F¤Þ¥Î记录¶°RS¦r¬q¶°¦X¤¤ªº¡§Cows¡¨¦r¬q¡A§A¥i¯à¨Ï¥Î¡G

RS("Cows")©ÎªÌ¡GRS.Fields("Cows").Value

¡@¡@¦Z­±这Ïú¤èªk显¦¡¦a¤Þ¥Î¤F记录¶°内Fields¶°¦X¤¤«ü©w¦¨员ªºValue属©Ê¡C这Ïú¤èªk­nµy·L§Ö¤@点¡A¦Ó¥B当§A§â这¨Ç¥N码¦VVisual Basic.NET迁²¾时¡A¥¦ªº¦V¤W­Ý®e©Ê¤]­n¦n¤@¨Ç¡C¤W­z¤èªkªº¤@Ïú变¤Æ¬O¨Ï¥Î·P叹号¡]!¡^¾Þ§@²Å¡GRS!Cows
¡@¡@ÉO¥ý¦æ绑©w¡]Early-Binding¡^¬Û¤ñ¡Aªö¥Î¤W­z¤èªk时COM进¦æ¸ÑªRªº时间­n长±o¦h¡A这¬O¦]为¥¦们强¨îCOM¦b运¦æ时¡]¦Ó¤£¬O¦b编译时¡^¸ÑªR对Value属©Êªº¤Þ¥Î¡A¨C¤@¦¸对该对¶Hªº¤Þ¥Î³£­n¨D¦³¤@¨t¦C类¦üªº¡B¦Z¥x进¦æªº¬d§ä过µ{¡C
¡@¡@µM¦Ó¡A¨Ï¥Î©µ迟绑©w时¡A¤£¦s¦b¥N码¤Þ¥Îªº¬O­þ¤@个¦C这类问题¡C¦pªG§A§¹¥þ«ö·Ó¤U¦C¤è¦¡编写¥N码¡GRS(0) '' «ü¦V²Ä¤@个¦C¡]Fields¶°¦Xªº¦¨员¡^

¡@¡@这时¡ACOM¯à够¦b编译时¸ÑªRValue属©Ê¦a§}¡A¥N码ªº运¦æ³t«×将¥[§Ö¡C¦ý¬O¡A¥u¦³¨º¨Ç¤F¸Ñ¬d询©Òªð¦^ªº¦C¥H¤Îªð¦^¦¸§Çªº¤H¯à够²z¸Ñ这¦æ¥N码¨ì©³«ü¦V¤F­þ¤@个¦C¡C¦pªG开发ªÌ¤£¨ã备±±¨î¬d询数Õu·½ªº权­­¡]这¬O«Ü±`见ªº±¡况¡^¡A这Ïú¤èªk¥i¯à带来问题¡C为¤FÚÌ©wRS(0)¤Þ¥Î¤F­þ¤@个SELECT¦C¡A§A¥²须§ä¥X¥Í¦¨该Recordsetªº¬O­þ¤@个SELECT语¥y¡B·d²M·¡SELECT语¥y©Òªð¦^ªº¦U个¦C¡C

¡@¡@µM¦Ó¡A¦³¤LÏú§Þ术¤¹许§A¬J¯à够实现§Ö³t¦a运¦æ时¤Þ¥Î¡A¦P时«O证¥N码ªº¥i读©Ê¡C¨ä¤¤¤@Ïú¤èªkªº­n¨D¦p¤U¡G开发ªÌ¥²须创«Ø¤@个¬d询©Òªð¦^¦CªºªT举¦Cªí¡C¦pªG¬d询³Q§ï变¡A¤ñ¦pªð¦^§ó¦hªº¦C¡A©ÎªÌ¦Cªº¦¸§Ç发¥Í变¤Æ¡A开发ªÌ¥²须­×§ï©M­«·s³¡¸pªT举¦Cªí¡C遗¾Ñªº¬O¡A­n«O«ùªT举¦CªíÉO¬d询ªº¤Ç°t¡A对¤_ºÞ²zªÌ来说¬O¤@个¦³¨Ç§x难ªº¥ô务¡C¨Ò¦p¡A为¤F§Ö³t¡B©ú¥Õ¦a标识¥XADO¥N码¤Þ¥Îªº¬O­þ¤@个¦C¡A§A¥i¥H结¦X¤U­±ªºSELECT语¥y©MªT举¦Cªí¡G

SELECT CatName, CatType, CatSize from Cats Where...Enum enuCatsQuery  CatName  CatType  CatSizeEnd Enum

¡@¡@ª`·N¡ASELECT语¥yªð¦^ªº¦CÉOªT举¦Cªí¤¤声©úªº¦C§¹¥þ¤Ç°t¡C¦¹¦Z¡A当§A»Ý­n¤Þ¥ÎRecordsetªºFields¶°¦X时¡A¥i¥H¨Ï¥Î¤U­±ªº¥N码¡G

StrMyName = Rs(enuCatsQuery.CatName)
¡@¡@«ö·Ó这Ïú¤èªk¡A¥N码¤£仅¨ã¦³较¦nªº¥i读©Ê¡A¦Ó¥B¥¦¤´旧¬O编译时绑©w¡A¥N码ªº运¦æ³t«×©ú显¥[§Ö¡C

¡@¡@µM¦Ó¡A­nÁקK©µ迟绑©w¡A§A还¥i¥H¨Ï¥Î¥t¥~¤@Ïú¤èªk¡C[email protected]¦CªíªA务¤W¤@场长时间ªº讨论±o¥X¤F¤@Ïú§Ú称¤§为预¥ý绑©w¡]Prebinding¡^ªº¤èªk¡A¥¦结¦X¤F两Ïú§Þ术¡C当§A¥u»Ý¤Þ¥ÎField对¶H¤@¦¸时¡A这Ïú§Þ术没¦³¤°¤\帮§U¡F¦ý¦b«È户Éó/ªA务¾¹应¥Î¤¤¡A预¥ý绑©w¤èªk«D±`²z·Q¡C¨Ï¥Î这Ïú¤èªk时¡A§A­n创«Ø¦h个独¥ßªº¡B©R¦WªºField对¶H¡A¦}§â这¨Ç对¶H设¸m为Recordset对¶HFields¶°¦X¤¤ªº¦¨员¡C编写¥N码ªº时­Ô¡A§A­º¥ý­n为¨C¤@个·Q­n¨Ï¥Îªº¦r¬q创«Ø¤@个©R¦WªºField对¶H¡A¨Ò¦p¡G

Dim fldName as ADODB.FieldDim fldType as ADODB.FieldDim fldSize as ADODB.Field ¡@¡@创«Ø这¨ÇField对¶H»Ý­n¤@©wªº开销¡CµM¦Ó¡A§A应该¦ô¶q¤@¤U¡A这¬O¤@¦¸©Êªº开销¡A¦ý¥¦却¯à够戏剧©Ê¦a§ïµ½©Ê¯à¡C

¡@¡@¥´开Recordset¤§¦Z¡A§A¥u»Ý¤@¦¸©Ê¦a§â这¨Ç©R¦WªºField对¶H设¸m为SELECT¬d询选择¥X来ªº¦C¡G

If fldName is Nothing thenSet fldName = RS!CatNameSet fldType = RS!CatTypeSet fldSize = RS!CatSize End if

¡@¡@§A¥i¥H¦b这¨½¥Î¤Þ号¥]围¦r²Å¦êªº¤èªk¤Þ¥Î¦C¡A¬Æ¦Ü¤]¥i¥H¨Ï¥Î·P叹号¾Þ§@²Å¡C¥Ñ¤_这¨½ªº¥N码¥u运¦æ¤@¦¸¡A¤£论¨Ï¥Î¤°¤\¤èªk¡A©Ê¯àªº®tÉݳ£¤£¤j¡C±µ¤U来¡A当§A»Ý­n¤Þ¥ÎField对¶H¡]¬d询¤§¦Z¡^时¡A¥u»Ý¨Ï¥Î预¥ý绑©wªº变¶q§Y¥i¡G

strName = fldNamestrType = fldTypestrSize = fldSize
¡@¡@这Ïú预¥ý绑©w¤èªkªº©Ê¯à¬Æ¦Ü¤ñ§Ç数¤Þ¥Î¤è¦¡¡]¨Ò¦pRS(0)¡^³£­n¦n¡C

¤­¡B«È户Éó/ªA务¾¹¡B¤¤间层©MASPµ¦²¤

¡@¡@¦b编写¥N码ªº时­Ô¡A§A还¥²须¦Ò虑¨ì¨ä¥L¤@¨Ç¼v响©Ê¯àªº¦]¯À¡C¨ä¤¤¤@¨Ç¦]¯ÀÉOADO没¦³¤°¤\关¨t¡X¡X¥¦们ÉOCOM¦³关¡CMicrosoft³Ìªñªº¤@¥÷¥Õ¥Ö书«ü¥X¡A¦bWindows 2000 ASP页­±¤¤执¦æADO¾Þ§@¡]连±µ¡A¬d询¡A处²z¡^­n¤ñ调¥ÎCOM组¥ó执¦æ¦P样ªº¥N码§ó§Ö¡C这个结论¦}¤£¥O¤H©_©Ç¡G当§Ú们从VB调¥Î¤@个¥~³¡COM组¥ó¡]处¤_当«e进µ{¤§¥~ªº¤@¨Ç¥N码¡^¡A访问COM组¥ó¥H¤Î§â±±¨î传递给¥¦时¦b¦Z¥x进¦æªº¾Þ§@Î`杂±o¥X©_¡A¦Ó¥B³t«×«ÜºC¡C虽µM§Ú们没¦³¥²­n¨è·NÁקK调¥ÎCOM组¥ó¥h运¦æADO¥N码¡C¦ý¬O¡A§Ú们¤£应该简单¦a§â¦h个独¥ßªºADO¾Þ§@«Ê装¦¨¤j¶qªº¤p«¬COM组¥ó¡AµM¦Z¦b»Ý­nªº时­Ô¨C¦¸³£¥h调¥Î¥¦们¡C¬Û¤Ï¡A§Ú们应该尽¶q§â¥þ³¡逻辑«Ê装¨ì¤@个COM组¥ó¨½­±¡A¨Ï±oµ{§Ç¥u»Ý¤@¦¸调¥Î¡ACOM´N¯à够§¹¦¨¤j¦h数¡]¦pªG¤£¬O¥þ³¡¡^¾Þ§@¡C§Ú¬Û«H¡A§A¤w经发现运¦æ¤G进¨î§Î¦¡ªº¡]¨Ò¦pCOM组¥ó¡^ADO¥N码­n¤ñ运¦æASP¤§类ªº¸Ñ释执¦æ¥N码­n§Ö¡C¦]¦¹¡A§A应该寻§ä¤@¨Ç¤èªk¡A减¤Ö进¤JCOM组¥ó©M从COM组¥óªð¦^©Ò»Ý­nªº©ù贵开销¡C

¡@¡@¦pªG§AÖä£开Command对¶H¡A©ÎªÌ¤£¯à预¥ý绑©wField对¶H¦}¦b¥²­n时­«¥Î¡A¨º¤\§A应该¦Ò虑ÁקK¦h§Eªº对¶H创«Ø¾Þ§@ªº§Þ术¡C¦b这Ïú±¡况¤U¡A§â¦s储过µ{§@为Connection对¶Hªº¤èªk调¥Î¦³着§ó­«­nªº·N义¡C¥t¥~¡A¥Î¥ý¦æ绑©wªº¤è¦¡¤Þ¥ÎField属©Ê¤]¦³§U¤_§ïµ½©Ê¯à¡C记¦í¾Þ§@§¹¦¨¦Z¥²须进¦æªº²M²z¤u§@¡G关闭Connection©MRecordset对¶H¡AµM¦Z§â¥¦们设¸m¦¨Nothing¡C

¡@¡@为¤F让¥N码©M¥N码编写ªÌ³£ªí现¥X³Ì¦nªº©Ê¯à¡A请记¦í¥H¤U°ò¥»规则¡G§Q¥Î连±µ¦À©MÉݨB连±µ¡F减¤ÖADO¥N码©M数Õu库ªA务¾¹³q«Hªº¦¸数¡F选¥Î¤@ÏúCOM-¥ý¦æ绑©w§Þ术¡F°£«D¥²­n¡A尽¶qÁקK¨Ï¥Î¥Nɲ©ù贵ªºADO对¶H¡A¨Ò¦pRecordset©MCommand对¶H¡F¦p¦³¥i¯à¡A¥ÎReturn Status©MOutput参数´À¥N记录¶°¡C尽¥i¯à¦a´£°ª¬d询ªº®Ä²v¡A¦p¦³¥i¯à¡A¤£­n§Ñ¤F§Q¥Î¦s储过µ{¡C详细¦a§i诉ADO§A·Q­n¥¦°µ¨Ç¤°¤\¡AÁקK让ADO²q测§Aªº·N图¡X¡X显¦¡¦a«ü©wADO CommandType¡A¨Ï¥ÎadExecuteNoRecords¤§类ªº选项¡C


¡@¡@对¤_¥»¤å©Ò¤¶绍ªº©Ò¦³§Þ¥©©M¨ä¥L¤å³¹´£¥Xªº编µ{©¾§i¡A§Ú«Ø议§A¥H审视ªº¥Ø¥ú¬Ý«Ý¥¦们¡C§Ú们©Ò°µªº¤u§@¡B©Ò编写ªº¥N码¡B©ÒÌÛ³yªº¨t统¡A³£属¤_«D±`Î`杂ªº东¦è¡A许¦h¤£断变¤Æªº¦]¯À¼v响着¥¦们¡C²z¸Ñ¤F这¤@点¤§¦Z¡A¦pªG§A对¥»¤å©Ò讨论ªº¬Y¤@项§Þ术·P兴½ì¡A¥i¥H¥ý进¦æ¤@¤U试验¡C¦pªG¥¦ÚÌ实¦³®Ä¡A¨º¤\´N¥¿¦¡实现¥¦¡AµM¦Z¦A进¦æ测试¡C¦pªG这时¥¦¤´旧¦³®Ä¡A¨º¤\®¥³ß§A¡C¦pªG¥¦¤£¦A¦³®Ä¡A§A±o¬Ý¬Ý¬O§_违¤Ï¤F应¥Î该§Þ术ªº¥²­n条¥ó¡C
´£°ªADO©Ê¯àªºÀu¨q¸gÅç.rar (13.35 KB) Ác¤¤ª©wordÀÉ®×

TOP

Åwªï et ª©¥D,¤S¦h¤F­Ó°ª¤â¡I
¦³ªÅ½Ð¦h¨Ó«ü±Ð¡C

TOP

        ÀR«ä¦Û¦b : ±o²z­nÄǤH¡A²zª½­n®ð©M¡C
ªð¦^¦Cªí ¤W¤@¥DÃD