MSDN ­º­¶ 

.NET ¸ê®Æ¦s¨ú¬[ºc¾ÉÄý

Patterns and Practices home

¬ÛÃö³sµ²

¼Ë¥»»P¹ê¨Ò¯Á¤Þ

.NET À³¥Îµ{¦¡¬[ºc : ³]­pÀ³¥Îµ{¦¡»PªA°È

Alex Mackman¡AChris Brooks¡A Steve Busby¡AEd Jezierski¡AJason Hogg¡ARoberta Leibovitz (¼Ò²Õ¤Æ­pºâ ) ©M Colin Campbell (¼Ò²Õ¤Æ­pºâ )

Microsoft Corporation

2001 ¦~ 10¤ë

2003 ¦~ 6 ¤ë §ó·s

¾A¥Î©ó :
SQL Server 2005 Analysis Services

ºK­n : ³o¥÷¤å¥ó»¡©ú¦p¦ó¦b¦h¼h¦¡ .NETÀ³¥Îµ{¦¡¤¤¨Ï¥Î ADO.NET ¹ê§@¸ê®Æ¦s¨ú¼h¡C¤º®eµÛ­«©ó¤@¯ëªº¸ê®Æ¦s¨ú¤u§@¤Î¨ä¤è®×¡A¥H¤Î«ü¾É§A¿ï¾Ü³Ì¾A¦Xªº¸Ñ¨M¤èªk»P§Þ³N¡C

¥»­¶¤º®e
²¤¶Â²¤¶
²¤¶ ADO.NET²¤¶ ADO.NET
¿ù»~³B¸Ì¿ù»~³B¸Ì
®Ä¯à®Ä¯à
³z¹L¨¾¤õÀð³sµ²³z¹L¨¾¤õÀð³sµ²
³B²z BLOB³B²z BLOB
¥Î DataSet ¨Ó¶i¦æ¸ê®Æ®w§ó·s ¥Î DataSet ¨Ó¶i¦æ¸ê®Æ®w§ó·s
¨Ï¥Î±j«¬§ODataSetª«¥ó ¨Ï¥Î±j«¬§ODataSetª«¥ó
³B²z Null ¸ê®ÆÄæ¦ì ³B²z Null ¸ê®ÆÄæ¦ì
¥æ©ö ¥æ©ö
¸ê®Æ¤À­¶¸ê®Æ¤À­¶
ªþ¿ýªþ¿ý

²¤¶

¦pªG§A·Q¬° .NET À³¥Îµ{¦¡³]­p¸ê®Æ¦s¨ú¼h¡A§AÀ³¸Ó­n¨Ï¥Î Microsoft ªº ADO.NET §@¬°¸ê®Æ¦s¨ú¼Ò¦¡¡C ADO.NET ¥\¯à±j¤j¦Ó¥B¥i¥H¤ä´©ÃP´²Ã¦X¡Aºô¸ôÀ³¥Îµ{¦¡¡A ¥H¤Î Web service ªº¸ê®Æ¦s¨ú»Ý¨D¡C ¸ò¨ä¥L¥\¯à±j¤jªºª«¥ó¼Ò²Õ¤@¼Ë¡AADO.NET ¥i¥H¬°³æ¤@¯S©w°ÝÃD´£¨Ñ²³¦hªº¸Ñ¨M¤è®×¡C

¥»¤å¤º§tªº¸ê°T¥i¥HÀ°§U§A¿ï¾Ü³Ì¦X¾Aªº¸ê®Æ¦s¨ú¤è¦¡¡C¸Ì­±¤¶²Ð¤F¤j³¡¤Àªº¸ê®Æ¦s¨ú¤è®×¡AÃö©ó®Ä¯à´£ª@ªº³Z¬¡A¥H¤Î¬ÛÃöªº³Ì¨Î¹ê¨Ò¡C ¥»¤å¤¤¤]¸Ñµª¤F¤@¨Ç±`¨£ªº°ÝÃD¡A¦p : ¸ê®Æ®w³s±µ¦r¦êÀ³¸Ó¦w¸m¦b­þ¸Ì³Ì¦n ? §ÚÀ³¸Ó¦p¦ó¹ê§@³s±µ¦@¥Î ? §ÚÀ³¸Ó¦p¦ó³B²z¥æ©ö ? §ÚÀ³¸Ó¦p¦ó»s§@¤À­¶¥\¯à¦nÅý¨Ï¥ÎªÌ¯à±²°ÊÂsÄý¤j¶q¬ö¿ý ?

¥»¤å¤º®eµÛ­«©ó¦p¦ó¨Ï¥Î ADO.NET ¤Î¨äÀHªþªºSQL Server .NET data provider ¨Ó¦s¨ú Microsoft SQL Server 2000¡C¥»¤å±N·|¯S§O¼Ð©ú·í§A¨Ï¥Î OLE DB .NET data provider t ¥h¦s¨ú¨ä¥L OLE DB-aware ¸ê®Æ¨Ó·½®ÉÀ³¸Ó­nª`·Nªº¨Æ¶µ¡C

¦pªG·Q¨ú±o«ö·Ó¥»¤å¤º®e¸ò¹ê¨Ò¶}µo¥Xªº¸ê®Æ¦s¨ú¤¸¥ó¤§¨ãÅé¹ê§@¡A½Ð°Ñ¦Ò Data Access Application Block¡C Data Access Application Block ªº¤º®e¥]§t­ì©l½XÅý§A¥i¥Hª½±µ¦b .NET À³¥Îµ{¦¡¤¤¨Ï¥Î¡C

½ÖÀ³¸Ó¾\Ū³o¥÷¤å¥ó

¥»¤å¥ó¬°À³¥Îµ{¦¡¬[ºc¥H¤Î·Q«Ø¸m .NET À³¥Îµ{¦¡¶}µo¤H­û´£¨Ñ¤F¨}¦n¤¶²Ð¡C ¦p§A·Q­n³]­p¤Î¶}µo¦h¼h¦¡ªº .NET À³¥Îµ{¦¡¡A½Ð¾\Ū¦¹¥÷¤å¥ó¡C

¨Ï¥Î¶·ª¾

·Q¨Ï¥Î¥»¤å¥ó¨Ó«Ø¸m .NETÀ³¥Îµ{¦¡¡A§A¥²¶·­n¦³¨Ï¥Î ActiveX Data Objects (ADO) ©Î¬O OLE DB ¡A¥H¤Î SQL Server ¨Ó¼¶¼g¸ê®Æ¦s¨úµ{¦¡½Xªº¸gÅç¡C§A¥²¶·¤F¸Ñ¦p¦ó¨Ï¥Î .NET ¥­¥x¶}µoºÞ²zµ{¦¡½X¡A¥H¤Î¤F¸Ñ ADO.NET ¸ê®Æ¦s¨ú¼Ò²Õªº°ò¥»¬[ºc¤W¦³¤°»ò¼Ëªº§ïÅÜ¡C§ó¦h.NET ¶}µo¬ÛÃö¸ê°T¡A½Ð¦Ü http://msdn.microsoft.com/net¡C

§ó·s¬ö¿ý

¥»¤å§ó·sªº³¹¸`¥]¬A ¶i¦æ¸ê®Æ®w§ó·s¡A¨Ï¥Î«¬§O¸ê®Æ¶°¥H¤Î¨Ï¥Î Null ¸ê®ÆÄæ¦ì¡C

¥¿¦p«e­±©Ò­z¡A¥»¤åªº³¡¤À¤º®e¶È¾A¥Î©ó Microsoft Visual Studio 2003 development system ¤Î .NET Framework SDK version 1.1¡C

¤U¸ü .NET ¸ê®Æ¦s¨ú¬[ºc¾ÉÄý

ÂIÀ»³sµ²¥H¤U¸ü¥»¤å MS.com ¤U¸ü¤¤¤ß

¦^¨ì­¶­º¦^¨ì­¶­º

²¤¶ ADO.NET

ADO.NET ¬O .NET À³¥Îµ{¦¡¤¤ªº¸ê®Æ¦s¨ú¼Ò²Õ¡C¥¦¬O¥Î¨Ó¦s¨úÃöÁp¦¡¸ê®Æ®w¨t²Î¡A¦p : SQL Server 2000¡A Oracle¡A and ¥H¤Î¨ä¥L³\¦h¬O OLE DB ©Î¬O ODBC provider ªº¸ê®Æ¨Ó·½¡C´N¬YºØ¼h­±¦Ó¨¥¡AADO.NET ¥Nªí¤F ADO §Þ³Nªº³Ì·sÅÜ­²¡CµM¦Ó¡AADO.NET ¬OµÛ²´©óÃP´²½¢¦X¡X³q±`¬OÂ÷½uª¬ºA¡Xªººô¸ôÀ³¥Îµ{¦¡¡A¦Ó§@¤F³\¦h­«¤jªº§ïÅÜ»P­²·s¡C¦³Ãö ADO and ADO.NET ªº¤ñ¸û¡A ¸Ô¨£ MSDN ªº¤å³¹ "ADO.NET for the ADO Programmer" ¦b¥H¤U³sµ² http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dndotnet/html/adonetprogmsdn.asp¡C

ADO.NET ªº­«¤jÅÜ­²¤§¤@¡A´N¬O±N ADO ¤¤ªº Recordset ª«¥óªº¥\¯à¤À°tµ¹ DataTable¡A DataSet¡A DataAdapter¡A»P DataReader ª«¥ó¡C DataTable ¥Nªíªº¬O±q³æ¤@¸ê®Æªí¤¤¦Ó¨Óªº¸ê®Æ¦C¶°¦X¡A ¦Ó´N³o¤è­±¦Ó¨¥«Ü¹³ Recordset¡CDataSet ¥Nªíªº¬O DataTable ª«¥óªº¶°¦X¡A ¥Î¨ä¤¤ªºÃöÁp©Ê¤Î¬ù§ô©Ê±N¸ê®Æªí²Ó¸`¦b¤@°_¡C ´N¥\¯à¤W¨Ó»¡¡AtDataSet ¬O¤@­Ó¦ì©ó°O¾ÐÅ餤¾Ö¦³ XML ¥\¯àªºÃöÁp¦¡µ²ºc¡C

DataSet ªº­«¤j¯S¦â¤§¤@´N¬O°ò¦¸ê®Æ¨Ó·½ªº¸ê°T¥i¯à±q¨Ó¨S¦³¶ñ¤J¨ä¤¤¡C¥¦¬O¤@­Ó¥Î¨Ó¥Nªí¸ê®Æ¶°¦XªºÂ÷½u¿W¥ß¹êÅé¡A¦Ó¥B¥i¥H¦b¦h¼h¦¡À³¥Îµ{¦¡ªº²³¦h¼h­±ªº¤¸¥ó¤¤¤¬¬Û¶Ç»¼¡C¥¦ÁÙ¥i¥H³Q§Ç¦C¤Æ¬° XML ¸ê®Æ¬y¡A©Ò¥H¥¦¤]«Ü¾A¦X¶i¦æ²§½è¥­¥x¶¡ªº¸ê®Æ¶Ç¿é¡CADO.NET ¨Ï¥Î DataAdapter ª«¥ó¨Ó¤Þ¾É¸ê®Æ¶i¥X DataSet ¥H¤Î°ò¦¸ê®Æ¨Ó·½¡CDataAdapter ª«¥ó¤]¥i¥H´£¨Ñ¥H«e Recordset ªº§å¦¸§ó·s¥\¯à¡C

¹Ï 1 Åã¥Ü DataSet ª«¥ó¼Ò²Õ¡C

Figure 1.1. DataSet object model

Figure 1.1 DataSet ª«¥ó¼Ò²Õ

.NET Data Providers

ADO.NET ¥²¶·¦³ .NET data providers ªº¨ó§U¡C.NET data providers ´£¨Ñ¹ï°ò¦¸ê®Æ¨Ó·½ªº¦s¨ú¡A¨ä¬O¥Ñ¥|­Ó¥D­nª«¥óºc¦¨ (Connection¡A Command¡A DataReader¡A¥H¤Î DataAdapter)¡C

¥Ø«e ADO.NET ÀHªþ¤F¨âºØ providers : bridge providers and native providers¡C Bridge providers¡A¬O¥Ñ OLE DB ©M ODBC µ¥´£¨Ñªº¡A Åý§A¥i¥H¨Ï¥Î¦­´Á¸ê®Æ¦s¨ú§Þ³Nªº¨ç¦¡®w¡C Native providers¡A¹³¬O SQL Server ©M Oracle providers¡A ³q±`¬O¬°¤F®Ä¯àªº§ïµ½¦Ó±N©â¶H¼h´î¤Ö¡C

SQL Server .NET Data Provider¡CMicrosoft SQL Server 7.0 ªº provider ©M¸û·sªº¸ê®Æ®w¡C¥¦¹ï¦s¨ú SQL Server¡A¥H¤Î¨Ï¥Î SQL Servery ªº¸ê®Æ¶Ç¿é¨ó©w¨Ó»P SQL Server ·¾³qªº¥\¯à³£¶i¦æ¤F³Ì¨Î¤Æ¡C¥Ã»·¨Ï¥Î provider ¨Ó³sµ² SQL Server 7.0 ©Î SQL Server 2000¡C

Oracle .NET Data Provider¡C¥Î©ó Oracle ªº .NET Framework Data Provider ¯à³z¹L Oracle ¥Î¤áºÝ³sµ²³nÅé¨Ó¦s¨ú Oracle ªº¸ê®Æ¨Ó·½¡C³o­Ó data provider ¤ä´© Oracle ¥Î¤áºÝ³sµ²³nÅé 8.1.7 ª©¤Î¤§«áªºª©¥»¡C

OLE DB .NET Data Provider¡C ³o¬O¤@­Ó OLE DB ¸ê®Æ¨Ó·½ managed provider¡C¥¦ªº®Ä²v¤ñ SQL Server .NET Data Provider ²¤®t¡A¦]¬°¥¦¬O³z¹L OLE DB ¼h¨Ó»P¸ê®Æ®w·¾³q¡C»Ý­nª`·Nªº¬O¡A³o­Ó provider ¤£¤ä´© ODBC¡A MSDASQL ªº OLE DB provider ¡C¹ï ODBC ¸ê®Æ¨Ó·½¡A­n¥Î ODBC .NET Data Provider ( ®e«á´y­z ) ¨Ó¨ú¥N ¡C¦p©ó¨ú±o¬Û®e©ó ADO.NET ªº OLE DB providers ²M³æ¡A½Ð¦Ü http://msdn.microsoft.com/library/en-us/cpguidnf/html/cpconadonetproviders.asp¡C

¨ä¥L©|¦b´ú¸Õ¤¤ªº .NET data providers ¥]¬A :

ODBC .NET Data Provider¡CODBC ªº .NET Framework Data Provider ¨Ï¥Î ODBC ÅX°Êµ{¦¡ºÞ²z­û (DM) ³z¹L COM ªº¤¬¬Û§@¥Î¨Ó¦s¨ú¸ê®Æ¡C

¤@­Ó managed provider ¥Î¨Ó±q SQL Server 2000 ¤¤Â^¨ú XML¡C XML for SQL Server Web update 2 ( ¥Ø«e©|¦b´ú¸Õ¤¤ ) ¥]§t¤@­Ó managed provider ¯S§O¥Î¨Ó±q SQL Server 2000 ¤¤Â^¨ú XML¡C¦p±ýÀò±o§ó¦h¬ÛÃö¸ê°T¡A½Ð¦Ü¥H¤Uºô§} http://msdn.microsoft.com/library/default.asp?url=/nhp/default.asp?contentid=28001300¡C

¦pªG·QÀò±o§ó¸ÔºÉ data provider ªº¸ê°T¡A½Ð°Ñ¾\¦b .NET Framework ¶}µo¤H­û«ü«n¤¤ªº ".NET Framework Data Providers"¡A¥iÂI¥H¤U³sµ²¶i¤J http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconadonetproviders.asp¡C

©R¦WªÅ¶¡²Õ´

Ãö©ó¨C¤@­Ó .NET data provider ªº«¬ºA ( classes¡A structs¡A enums¡Aµ¥µ¥ ) ³£¦b¤U¦Cªº©R¦WªÅ¶¡¤¤ :

System.Data.SqlClient¡C¥]§t SQL Server .NET Data Provider ªº«¬ºA¡C

System.Data.OracleClient¡C¥]§t Oracle .NET Data Provider ªº«¬ºA¡C

System.Data.OleDb¡C¥]§t OLE DB .NET Data Provider ªº«¬ºA¡C

System.Data.Odbc¡C¥]§t ODBC .NET Data Provider ªº«¬ºA¡C

System.Data¡C¥]§t»P provider µLÃöªº«¬ºA¡A¦p DataSet ©M DataTable¡C

¦b¬ÛÃöªº©R¦WªÅ¶¡¤¤¡A¨C¤@­Ó provider ´£¨Ñ¤FÃö©ó Connection¡A Command¡A DataReader¡A ¥H¤Î DataAdapter ªºª«¥ó¹ê§@¡CSqlClient ¹ê§@¶}ÀY³£¬O¥Î"Sql" ¦Ó OleDb ªº¹ê§@¶}ÀY³£¬O¥Î "OleDb" ¡CÁ|¨Ò¨Ó»¡¡ASqlClient ¹ê§@ Connection ª«¥óªº¬O SqlConnection¡A¦Ó¦b OleDb ¤¤«h¬O OleDbConnection¡C¥H¦¹Ãþ±À ¡A ¦b³o¨â­Ó¤jÃþ¤¤ªº DataAdapter ª«¥óÀ³¸Ó¬O SqlDataAdapter ©M OleDbDataAdapter¡C

¦b¥»¤å¤¤¡A³o¨Ç½d¨Ò³£¬O±q SQL Server ª«¥ó¼Ò²Õ¦Ó¨Ó¡CÁöµM¦b³o¸Ì¨Ã¨S¦³Á|¨Ò¡A¤£¹LÃþ¦üªº±¡ªp¤]¥X²{¦b Oracle/OLEDB ©M ODBC¡C

ªx¥Îµ{¦¡³]­p

¦pªG§A¥i¯à·|¨Ï¥Î¨ì¤£¦Pªº¸ê®Æ¨Ó·½¨Ã¥B§Æ±æ§Aªºµ{¦¡½X¥i¥H¦b¨ä¤¤¦Û¥Ñ®M¥Î¡A¦Ò¼{¨Ï¥Î¦b System.Data ©R¦WªÅ¶¡¤¤ªº IDbConnection¡A IDbCommand¡A IDataReader¡A©M IDbDataAdapter ¤¶­±¡C©Ò¦³¹ê§@ Connection¡A Command¡A DataReader¡A©M DataAdapter ªºª«¥ó¤@©w¤ä´©³o¨Ç¤¶­±¡C

¦p±ý¨ú±o§ó¦hÃö©ó .NET data providers ¹ê§@ªº¬ÛÃö¸ê°T¡A½Ð¦Ü¥H¤Uºô§} http://msdn.microsoft.com/library/en-us/cpguidnf/html/cpconimplementingnetdataprovider.asp¡C

ÁÙ¦³¤@­Ó­È±oª`·Nªº´N¬O¡A¦pªGÀ³¥Îµ{¦¡·Q¨Ï¥Î¤@­Óª«¥ó¼Ò²Õ¥h¦s¨ú½Æ¼Æ­Ó¸ê®Æ®w ¡AOLE DB ©M ODBC bridging provider ¬O­Ó¤£¿ùªº¿ï¾Ü¡C¦b³oºØª¬ªp¤U¡A¤ñ°_À³¥Îµ{¦¡ªº®Ä¯à¡A§óÀ³¸Ó«ä¦ÒÀ³¥Îµ{¦¡ªºÆF¬¡©Ê¡A¥H¤Î¸ê®Æ®w©Ò»Ý¥\¯àªº½dÃ¥¡C

¹Ï 2 ¥H¸ê®Æ¦s¨ú°ïÅ|¨Ó»¡©ú ADO.NET »P¨ä¥L¸ê®Æ¦s¨ú§Þ³N¶¡ªºÃöÁp¡A¥]¬A ADO ©M OLE DB¡C¥¦¤]®i¥Ü¥X³o¨â­Ó managed provider s and the principal objects within the ADO.NET model¡C

Figure 1.2. Data access stack

¹Ï 1.2. ¸ê®Æ¦s¨ú°ïÅ|

¦pªG·Qª¾¹D§ó¦hÃö©ó ADO ¨ì ADO.NET ¤§¶¡ªº§ïÅÜ¡A ½Ð¾\Ū 2000¦~ 11¤ë¸¹ªº MSDN Âø»x¤¤ªº "Introducing ADO+: Data Access Services for the Microsoft .NET Framework" ¡A ¸Ó¤å¦ì©ó¥H¤Uºô§} http://msdn.microsoft.com/msdnmag/issues/1100/adoplus/default.aspx¡C

·U¦sµ{§Ç vs. ª½±µ¨Ï¥Î SQL

¦b¥»¤å¤¤©Ò¥X²{ªºµ{¦¡½X°Ï¶ô¨Ï¥Î SqlCommand ª«¥ó©I¥s¹w¦sµ{§Ç¨Ó¶i¦æ¸ê®Æ®w¾Þ§@¡C¦b¬Y¨Çª¬ªp¤U¡A§A¤£·|¬Ý¨ì SqlCommand ª«¥ó¦]¬°¹w¦sµ{§Çªº¦WºÙ¤w¸gª½±µ¾É SqlDataAdapter ª«¥ó¡C¦b¤º³¡¹B§@¤¤¡A¨ÌµMÁÙ¬O·|³Ð«Ø¤@­Ó SqlCommand ª«¥ó¡C

¥H¤U¬OÃö©ó¬°¦óÀ³¸Ó¨Ï¥Î¹w¦sµ{§Ç¨Ó¨ú¥N´O¤Jªº SQL ±Ô­zªº´X­Ó²z¥Ñ :

1.

¦]¬°¸ê®Æ®w¥i¥H³z¹L§Ö¨ú¤Î­«½Æ¨Ï¥Î¹w¦sµ{§Ç¨Ó¶i¦æ¸ê®Æ¦s¨ú³Ì¨Î¤Æ¡A©Ò¥H¹w¦sµ{§Ç³q±`¥i¥H§ïµ½®Ä¯à¡C

2.

¦b¸ê®Æ®w¤¤¹w¦sµ{§Ç¥i¥Hºû«ù­Ó§Oªº¦w¥þ©Ê¡C ¥Î¤á¥i¥H³Q±ÂÅv°õ¦æ¹w¦sµ{§Ç«o¤£¥²¾Ö¦³¥ô¦óª½±µ¦s¨ú¸ê®ÆªºÅv­­¡C

3.

­×§ï¹w¦sµ{§Ç³q±`¬O¤ñ­×§ï¼g¦º¦b¤¸¥ó¤¤ªº SQL ±Ô­z¨Ó±o®e©öªº¡A©Ò¥H¹w¦sµ{§Ç¥i¥H´î»´ºûÅ@ªº­t¾á¡C

4.

¹w¦sµ{§Ç¬°°ò¦ªº¸ê®Æ®wµ²ºc´y­z¼W¥[¤F¤@­Ó·sªº©â¶H¼h¡C¹w¦sµ{§Çªº¥Î¤á¬O»P¸ò¹w¦sµ{§Çªº¹ê§@²Ó¸`¤Î°ò¦ªºµ²ºc´y­z¹j¶}ªº¡C

5.

¦]¬°¦b¹w¦sµ{§Ç¥i¥H§å¦¸°õ¦æ¤£¥²¤ÏÂжi¦æ¦h¦¸ªº¶Ç°e¡A©Ò¥H¹w¦sµ{§Ç¥i¥H´î§Cºô¸ô¬y¶q­t¾á¡C

SQL Server ½u¤W»¡©ú¤å¥ó±j¯P«ØÄ³¤£­n¥Î "sp_" §@¬°§A¹w¦sµ{§Ç¦WºÙªº¶}ÀY¦]¬°³o¼Ëªº¦WºÙ¤w¸g«O¯dµ¹¨t²Î¹w¦sµ{§Ç¤F¡C SQL Server ·|«ö·Ó¦p¤Uªº¶¶§Ç±q sp_ ¶}ÀYªº¹w¦sµ{§Ç¶}©l·j´M¡G

1.

§ä´M¥D­n¸ê®Æ®w¤¤ªº¹w¦sµ{§Ç¡C

2.

§ä´M¥Ñ¿ëÃѲŸ¹ ( ¸ê®Æ®w¦WºÙ©Î©Ò¦³ªÌ ) ´£¨Ñªº¹w¦sµ{§Ç¡C

3.

¦pªG¨S¦³«ü©w©Ò¦³ªÌ¡A «h¥H dbo ¬°©Ò¦³ªÌ¨Ó§ä´M¹w¦sµ{§Ç¡C

ÄÝ©Ê vs. «Øºc¨ç¦¡¤Þ¼Æ

§A¥i¥H³z¹L«Øºc¨ç¦¡¤Þ¼Æ©Î¬Oª½±µ³]©w¨Ó³]©w ADO.NET ª«¥óªºÄݩʭȡCÁ|¨Ò¨Ó»¡¡A¤U¦Cµ{¦¡½X¦b¥\¥Î¤W¬O¬Ûµ¥ªº¡C

// Use constructor arguments to configure command object
SqlCommand cmd = new SqlCommand( "SELECT * FROM PRODUCTS"¡A conn );

// The above line is functionally equivalent to the following
// three lines which set properties explicitly
sqlCommand cmd = new SqlCommand();
cmd¡CConnection = conn;
cmd¡CCommandText = "SELECT * FROM PRODUCTS";

´N®Ä¯àªºÆ[ÂI¦Ó¨¥¡A³o¨âºØ¤èªkªº®t¶Z·L¤£¨¬¹D¡C¦]¬°¨ú±o¤Î³]©w .NET ª«¥óÄÝ©Ê ³q±`¬O¤ñ COM ª«¥ó¨Ó±o¦³®Ä²v¡C

¦Ü©ó­n¿ï­þ¤@­Ó°ò¥»¤W¬O¨Ì­Ó¤H³ß¦n¤Îµ{¦¡½X­·®æ¡C µM¦Ó¡A¹ïÄݩʭȶi¦æª½±µ³]©w¡A³q±`Åýµ{¦¡½X§ó®e©ö¸ÑŪ ( ¯S§O¬O·í§A¹ï ADO.NET ª«¥ó¼Ò²Õ¤£¤Ó¼ô±xªº®É­Ô) ¦Ó¥B§ó¤è«K°£¿ù¡C

ªþ¿ý : ¦b¹L¥h¡AMicrosoft Visual Basic ªº¶}µo¤H­û¶}µo¨t²Î®É¡A³q±`¬O§Æ±æÁ×§K¨Ï¥Î "Dim x As New¡K" ³o¼Ëªº±Ô­z¨Ó³Ð«Øª«¥ó¡C¦b COM ªº¥@¬É¤¤¡A ³o¼Ëªºµ{¦¡¶Ü·|³y¦¨¤@­Ó COM ª«¥ó³Ð«Øªº¤p°j¸ô¡A ²£¥Í¤@¨Ç«Ü²Ó·L©Î¤£²Ó·Lªº¿ù»~¡CµM¦Ó¡A¦b .NET ªº¥@¬É¤¤¡A³o±N¤£¦A¬O­Ó°ÝÃD¡C

ºÞ²z¸ê®Æ®w³sµ²

¸ê®Æ®w³sµ²¥Nªíªº¬O¤@­Ó­«­n¡A©ù¶Q¡A¦Ó¥B¬Û·í¦³­­ªº¸ê·½¡A ¤×¨ä¬O¦b¦h¼h¦¡ºô¸ôÀ³¥Îµ{¦¡·í¤¤¡CIt is ¥¿½T¦aºÞ²z§Aªº³sµ²¬O¶Õ¦b¥²¦æªº¡A¦]¬°§A©Ò±Ä¥Îªº¤èªk±N·|ÄY­«¦a¼vÅTÀ³¥Îµ{¦¡ªº¥i½Õ¾ã©Ê¡C ·íµM¡A­nÂÔ·V«ä¦Ò¦b¦ó³BÀx¦s§Aªº³sµ²¦r¦ê¡C§A»Ý­nªº¬O¤@­Ó¦³½Õ¾ã©Ê¤S¦w¥þªº¦a¤è¡C

·í§A­nºÞ²z¸ê®Æ®w³sµ²»P³sµ²¦r¦ê®É¡A§AÀ³¸Ó­nÅU¼{¨ì :

¬°¤F¼W¥[À³¥Îµ{¦¡ªº©µ®i©Ê¡AÀ³¸Ó«Ø¥ß¸ê®Æ®w³sµ²¦@¥Î¥H¨Ñ¦h­Ó¨Ï¥ÎªÌ¨Ï¥Î¡C

±Ä¥Î¥i½Õ¾ã¤Î°ª®Ä¯àªº¦@¥Î³sµ²µ¦²¤¡C

¦s¨ú SQL Server ®É¨Ï¥Î Windows ÅçÃÒ¡C

¤£­n¦b¤¤¶¡¼h¶i¦æ¼ÒÀÀ¡C

±N³sµ²¦r¦ê¦w¥þ¦s©ñ¡C

¾¨±ß¶}±Ò¸ê®Æ®w³sµ²¾¨¦­Ãö±¼¡C

¥»³¹¸`°Q½×³sµ²¦@¥Î¥H¤ÎÀ°§A¿ï¾Ü³Ì¦X¾Aªº³sµ²¦@¥Îµ¦²¤¡C¥»³¹¸`¤]¥æ·|§A¦p¦óºÞ²z¡AÀx¦s¡A¥H¤ÎºÞ²z¸ê®Æ®w³sµ²¦r¦ê¡C³Ì«á¡A¥»³¹¸`´£¨Ñ¨â­Óµ{¦¡½X¼Ë¥»Åý§A¥i¥H½T©w³sµ²¥¿½Tµ²§ô¨Ã¦^¨ì³sµ²¶°¦X¤¤¡C

¨Ï¥Î³sµ²¦@¥Î

¸ê®Æ®w³sµ²¦@¥ÎÅýÀ³¥Îµ{¦¡±q¤@­Ó³sµ²¶°¦X¤¤¨Ï¥Î¤w¦s¦bªº³sµ²¡A¦Ó¤£¥²­«½Æ¦a»P¸ê®Æ®w«Ø¥ß·s³sµ²¡C ³o­Ó§Þ³N¤j´T¦a¼W¥[¤FÀ³¥Îµ{¦¡ªº©µ®i©Ê¡A¦]¬°¸ê®Æ®wªº³s½u¤W­­Åܱo¤j¦h¤F¡C³o­Ó§Þ³N¤]§ïµ½¤F®Ä¯à¡A ¦]¬°¸`¬Ù¤F³\¦h­ì¥»¥Î¨Ó«Ø¥ß³sµ²ªº®É¶¡³Q¡C

¸ê®Æ¦s¨ú§Þ³N¹³¬O ODBC ©M OLE DB ³£´£¨Ñ¤F¦hºØ³sµ²¦@¥Î ¡A³£¬O¥i¥H«ö·Ó¦UºØµ{«×¨Ó§@½Õ¾ã¡C ¨âºØ¤èªk¹ï¸ê®Æ®w¥Î¤áºÝ¨Ó»¡³£¤Ó³z©ú¤F¡C OLE DB ³sµ²¦@¥Î ³q±`¬O³Q¨Ó·í§@ session ©Î¬O¸ê·½¦@¥Î¡C

·Q¨ú±o§ó¦hÃö©ó Microsoft Data Access Components (MDAC) ªº¦@¥ÎijÃD°Q½×¡A½Ð¬Ý "Pooling in the Microsoft Data Access Components" ³o½g¤å³¹¡Aºô§}¦p¤U http://msdn.microsoft.com/library/en-us/dnmdac/html/pooling2.asp¡C

ADO.NET data providers provide ´£¨Ñ¤F²M´·ªº³sµ²¦@¥Î¡A ¨ä¤º³¡ªº¾÷¨î¬O¨Ì¨C­Ó provider ¦Ó¤£¦P¡C¥»³¹¸`©Ò°Q½×ªº³sµ²¦@¥Î¬OÃö©ó¦³ :

SQL Server .NET Data Provider

Oracle .NET Data Provider

OLE DB .NET Data Provider

ODBC .NET Data Provider

SQL Server .NET Data Provider ¶i¦æ¦@¥Î

¦pªG§A¨Ï¥Î SQL Server .NET Data Provider¡A½Ð¨Ï¥Î¥¦©Ò´£¨Ñªº³sµ²¦@¥Î¡C ¦b provider ªº¤º³¡ªººÞ²z°¨¦³¹ê§@°ª®Ä²vªº¦@¥Î¾÷¨î¡C³sµ²¶°¦X¬O¨Ì¨C­ÓÀ³¥Îµ{¦¡©w¸q°ì¨Ó³Ð«Øªº¡AÀ³¥Îµ{¦¡©w¸q°ìµ²§ô¥H«e³sµ²¶°¦X³£·|¦s¦b¡C

§A¥i¨Ï¥Î¥¦©Ò¤ºªþªº³sµ²¦@¥Î¡A ¦ý¬O§AÁÙ¬OÀ³¸Ó¤F¸Ñ¨ä¤¤ªº¦@¥Î¾÷¨î¦b¦U¦¡¦U¼Ëªº³]©w¤U¬O¦p¦ó¹B§@¡A¥H¶i¦æ³sµ²¦@¥Îªº·L½Õ¡C

¦b³\¦h±¡ªp¤U¡A§AªºÀ³¥Îµ{¦¡¤¤¨Ï¥Î SQL Server .NET data provider ªº³sµ²¦@¥Î¹w³]³]©w¥i¯à¤w¸g´N°÷¦n¤F¡C¦b¶}µo¤Î´ú¸Õ .NETÀ³¥Îµ{¦¡®É¡A«ØÄ³§A¼ÒÀÀ¤@¤U§¹¦¨«áªº¸ê°T¥æ¬y±¡¹Ò¥H¨M©w¬O§_À³¸Ó­×§ï³sµ²¦@¥Îªº¤j¤p¡C

¶}µo¤H­û¬°¤F¯à«Ø¸m¨ã©µ®i©Ê¡A °ª®Ä¯àªºÀ³¥Îµ{¦¡¡AÀ³¸ÓºÉ¥i¯àÁYµuºû«ù³s½uªº®É¶¡¡A¥u¦³¦A¨ú±o©Î§ó·s¸ê®Æ®É¤~¶i¦æ³s½u¡C ·í³s½uÃö³¬®É¡AÀ³¸Ó±N¨ä¶Ç¦^³sµ²¦@¥Î¶°¦XÅý³o­Ó³sµ²¥i¥H¦A§Q¥Î¡C¦b³oºØª¬ªp¤U¡A»P¸ê®Æ®wªº¹ê»Ú³sµ²¨Ã¨S¦³¤¤Â_ ; µM¦Ó¡A¦pªG³sµ²¦@¥ÎÃö³¬¤F¡A»P¸ê®Æ®wªº¹ê»Ú³sµ²¤]´N³£Ãö³¬¤F ¡C

¶}µo¤H­ûÀ³¸Ó­n¤p¤ß¤£­n¨Ì¿à¨t²Î¨ÓÄÀ©ñ³sµ²¦]¬°·í³sµ²¨Ï¥Îµ²§ô¥H«á¤£¨£±o¤@©w·|³QÃö³¬¡C³o³q±`·|³y¦¨³sµ²ªº¿òº|¡A¨Ï±o«Ø¥ß·s³sµ²®É²£¥Í¿ù»~¡C

³]©wSQL Server .NET Data Provider ³sµ²¦@¥Î

§A¥i¥H¨Ï¥Î¦WºÙ­È²Õ¨Ó³]©w³sµ²¦@¥Î¡A³o´£¨Ñ¤F³sµ²¦r¦êªº¥\¯à¡CÁ|¨Ò¨Ó»¡¡A§A¥i¥H³]©w¬O§_¨Ï¥Î¦@¥Î¶°¦X ( ¹w³]¬O¨Ï¥Î )¡A¦@¥Î¶°¦X¤j¤pªº³Ì¤j»P¹ï¤p­È¡A ¥H¤Î¶}±Ò³sµ²©Ò»Ýªºµ¥«Ý®É¶¡©Îµ¥«Ýªº¤u§@¼Æ¡C ¤U­±¬O¤@­Ó³sµ²¦r¦êªº½d¨Ò¥Î¥H½Õ¾ã¦@¥Î¶°¦X¤j¤pªº³Ì¤j»P¹ï¤p­È¡C

"Server=(local); Integrated Security=SSPI; Database=Northwind; 
Max Pool Size=75; Min Pool Size=5"

·í³sµ²¶}±Ò¦Ó¦@¥Î¶°¦X¤]«Ø¦n«á¡A ³\¦h³sµ²´N·|¥[¤J³sµ²¦@¥Î¥H¹F¨ì¦@¥Î¶°¦X¤j¤pªº³Ì¤p³]©w­È¡C ¦Ó¨t²Î¥i¥H«ùÄò¦@¥Î¶°¦X¤j¤pªº¤W­­¡C·í¦@¥Î¶°¦X¤w¹F¤W­­®É¡A«Ø¥ß·s³sµ²ªº­n¨D´N·|¥ý¦æÀÁ¸m¡C

¿ï¾Ü¦@¥Î¶°¦Xªº¤j¤p

¹ï¤j³W¼Òªº¨t²Î¦Ó¨¥«Ø¥ß¤@­Ó³Ì¤jÁ{¬É«ü¼Ð¬O«Ü­«­nªº¡A³o¼Ë¤~·|¤è«KºÞ¨t²Î¤¤ªº¤u§@ÁÙ¦³¦¨¤d¤W¸Uªº¥Î¤á¡C§A¥²¶·­nºÊ±±À³¥Îµ{¦¡¤¤³sµ²¦@¥Îªº®Ä¯à¡A¤~¯à¬°§Aªº¨t²Î¿ï¾Ü³Ì¨Îªº³sµ²¦@¥Î¤j¤p¡C³o­Ó³Ì¨Î¤j¤p¤]·|°õ¦æ SQL Server ªºµwÅ骺¼vÅT¡C

¦b¶}µo¹Lµ{¤¤¡A§A¥i¯à»ÝÁY¤p¦@¥Î¶°¦Xªº¹w³]³Ì¤j­È ( ¥Ø«e¬O 100 ) ¨Ó¦³®Äªºµoı³sµ²¿òº|¡C

¦pªG§A¬°³sµ²¦@¥Î³]©w¤F³Ì¤p­È¡A§A¥i¯à·|¦b³sµ²¦@¥Îªì©l®É¡A¬°¤F­n¹F¦¨¦@¥Î³sµ²ªº³Ì¤p­È³y¦¨»´·Lªº®Ä¯à®ö¶O¡AÁöµM³o¹ï­è¶}©l¨Ï¥Î³sµ²ªº¥Î¤á¨Ó»¡¬O«Ü¦nªº¡C­È±o¤@´£ªº¬O³Ð«Ø·s³sµ²ªº°Ê§@¬O§Ç¦C¤Æªº¡A³o¥Nªí»¡§A¦øªA¾¹¤£·|¦]¬°³sµ²¦@¥Îªºªì©l¤Æ¦Ó³y¦¨¨t²ÎµLªk­t¾á¤j¶qªº§Y®É³sµ²»Ý¨D¡C

¦pªG·Q¨ú±o§ó¦hÃö©óºÊ±±³sµ²¦@¥Îªº¸ê°T¡A½Ð¦Ü¥»¤å¤¤ºÊ±±³sµ²¦@¥Îªº³¹¸`¡C¦pªG·Q¨ú±o³sµ²¦@¥Î¤¤³sµ²¦r¦êÃöÁä¦rªº§¹¾ã¸ê°T¡A½Ð°Ñ¾\¦b .NET Framework Developer's Guide ¤¤ªº "Connection Pooling for the .NET Framework Data Provider for SQL Server" ¤@¤å¡Aºô§}¦p¤U http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconconnectionpoolingforsqlservernetdataprovider.asp¡C

§ó¦h¬ÛÃö¸ê°T

·í§A¨Ï¥Î SQL Server .NET Data Provider ³sµ²¦@¥Î®É¡A ½Ðª`·N¤U¦Cª¬ªp:

³sµ²¬O³z¹L³sµ²¦r¦êªººë½T¤ñ¹ï¨Ó©ñ¤J³sµ²¶°¦X¤¤ªº¡C ¬Æ¦Ü¦WºÙ­È²Õ¤¤ªºªÅ¥Õ¦r¤¸¤]·|¦¹³sµ²¦@¥Îªº¾÷¨î³y¦¨¼vÅT¡CÁ|¨Ò¨Ó»¡¡A ¤U¦Cªº¨â­Ó³sµ²¦r¦ê·|³y¦¨¨â­Ó¤£¦P­Ó¦@¥Î¶°¦X¡A¦]¬°²Ä¤G­Ó¦h¥X¤F¤@­ÓÃB¥~ªºªÅ¥Õ¦r¤¸¡C

SqlConnection conn = new SqlConnection(
         "Integrated Security=SSPI;Database=Northwind");
conn¡COpen(); // Pool A is created

SqlConmection conn = new SqlConnection(
         "Integrated Security=SSPI ; Database=Northwind");
conn¡COpen(); // Pool B is created (extra spaces in string)

¦@¥Î³sµ²¬O«ö·Ó¥æ©ö³Q¤À¦¨¦n´X­Ó¦@¥Î¶°¦X¡A ÁÙ¦³¤@­Ó¶°¦X¥Î¨Ó¦s©ñ¬°¤F¦]À³¥æ©ö¦Ó§Y®É²£¥Íªº³sµ²¡C ÀHµÛ¥æ©ö©Ò¶i¦æªº¹B§@¤£¦P¡A·|±q¾A¦Xªº¶°¦X¤¤¨ú±o³sµ² (¥]§t¬°¤F¥æ©ö¦Ó§Y®É²£¥Íªº³sµ² )¡C ³oÅý§Ú­Ì¥i¥H¦b¥æ©ö¤¤§Y®Éªº²£¥Í³sµ²¡C

¥Î OLE DB .NET Data Provider ¶i¦æ³sµ²¦@¥Î

OLE DB .NET Data Provider ªº³sµ²¦@¥Î¬O³z¹L OLE DB ¦a¼hªº¸ê·½¦@¥Î¨Ó¶i¦æ¡C §A¦³¤U¦C´X­Ó¿ï¶µ¥i¥H¦b¸ê·½¦@¥Î¤¤³]©w :

§A¥i¥H¨Ï¥Î³sµ²¦r¦ê¨Ó½Õ¾ã¡A±Ò¥Î©Î¬OÃö³¬¸ê·½¦@¥Î¡C

§A¥i¥H¨Ï¥Î¨t²Îµn¿ý¡C

§A¥i¥H¥Îµ{¦¡½X¨Ó½Õ¾ã¸ê·½¦@¥Î¡C

¬°¤FÁ×§K¾D¹J¨t²Îµn¿ý¬ÛÃöªº¶}µo°ÝÃD¡A ½Ð¤£­n¨Ï¥Î¨t²Îµn¿ý¨Ó½Õ¾ã OLE DB ¸ê·½¶°°Ï¡C

¦pªG·Qª¾¹D OLE DB ¸ê·½¶°°Ïªº¸Ô±¡¡A ½Ð°Ñ¾\ OLE DB Programmer's Reference ¤¤ªº "Resource Pooling"¡A"OLE DB Services"¡Aºô§}¦p¤U http://msdn.microsoft.com/library/default.asp?url=/library/en-us/oledb/htm/olprcore_chapter19.asp¡C

¨Ï¥Î¶°°Ïª«¥ó¨ÓºÞ²z¦@¥Î³sµ²

¨­¬° Windows DNA ¶}µo¤H­û¡A§A·|³Q«ØÄ³©ñ±ó¨Ï¥Î OLE DB ¸ê·½ºÞ²z ©Î¬O ODBC ³sµ²¦@¥Î ¦Ó¨Ï¥Î COM+ ª«¥ó¶°°Ï¨Ó¶i¦æ¸ê®Æ®w³sµ²¦@¥Î¡C³o¥D¦³¨â­Ó²z¥Ñ :

¦@¥Î¶°¦Xªº¤j¤p»P¤W­­¥i¥H³Qºë·Ç¦a±±¨î (¦b COM+ Ãþ§O¤¤)¡C

®Ä¯àªº§ïµ½¡C¶°°Ïª«¥óªº°µªk¥i¥H¤ñª½±µ¶i¦æ´£°ª¤@¥bªº®Ä¯à¡C

µM¦Ó¡A¦]¬° SQL Server .NET Data Provider ¬O¦b¤º³¡¶i¦æ¶°°Ï¡A§A¤£»Ý­n¦A¥h¶}µo¦Û¤vªº¶°°Ïª«¥ó ( ·í§A¨Ï¥Î³o­Ó provider ªº®É­Ô )¡C §A¥i¥H¤£¥²²z·|³o­Ó½ÆÂøªº¹B§@¾÷¨î¡C

¦ý¦pªG§A¨Ï¥Î OLE DB .NET Data Provider ¦Ó¤S¶i¦æ§ó¶i¤@¨Bªº½Õ¾ã¤Î§ïµ½®Ä¯àªº¸Ü¡A­þ§A¥i¥H¦Ò¼{¨Ï¥Î COM+ ª«¥ó¶°°Ï¨Ó¶i¦æ¡C¦pªG§A¨Ï¥Î¤F¶°°Ïª«¥ó¨Ó¶i¦æ¡A ¨º§A¤@©w­nÃö³¬ OLE DB ¸ê·½¶°°Ï ©M ©M¦Û°Ê¥æ©ö½s¦C ( Á|¨Ò¨Ó»¡¡A ¦b³sµ²¦r¦ê¤¤¥[¤J "OLE DB Services=-4" )¡C §A¥²¶·­n¥Î¦Û¦æ³]­pªº¶°°Ïª«¥ó¨Ó§@¥æ©ö½s¦C¡C

ºÊ±±³sµ²¦@¥Î

¬°¤FºÊ±±§AªºÀ³¥Îµ{¦¡¹ï³sµ²¦@¥Îªº¨Ï¥Î¡A§A¥i¨Ï¥Î SQL Server ¤¤·f¸üªº Profiler ¤u¨ã¡A©Î¬O Microsoft Windows 2000 ªº Performance Monitor ¤u¨ã ¡C

¥Î SQL Server Profiler ºÊ±±³sµ²¦@¥Î

ÂIÀ» Start¡A ¿ï¾Ü Programs¡A ¿ï¾Ü MicrosoftSQLServer¡A µM«áÂIÀ» Profiler ¥H±Ò°Ê Profiler¡C

¦b File ¿ï³æ¤W¡A ¿ï¾Ü New¡A ¨Ã¥B«ö Trace¡C

´£¨ÑÃö©ó³sµ²ªº²Ó¸`¡A µM«áÂIÀ»OK¡C

¦b Traceªº Properties ¹ï¸Ü¤è¶ô¤¤¡A¿ï¾Ü Events ¼ÐÅÒ­¶­±¡C

¦b Selected event classes ²M³æ¤¤¡A ½T»{ AuditLogin ÁÙ¦³ AuditLogout ¦b SecurityAuditªº¶µ¥Ø¤U¡C ¬°¤F¯à°÷Åý³o­Ó°lÂÜ´£¨Ñ§óºë·Çªº¸ê°T¡A½Ð²¾°£²M³æ¤¤ªº¨ä¥L¨Æ¥ó¡C

ÂIÀ» Run ¨Ó¶}©l°lÂÜ¡C·í³sµ²«Ø¥ß®É¡A§A±N·|¬Ý¨£ Audit Login ¨Æ¥ó ¡A¦Ó·í³sµ²Ãö³¬®É«h·|¥X²{ Audit Logout ¨Æ¥ó¡C

¥Î Performance Monitor ºÊ±±³sµ²¦@¥Î

ÂIÀ» Start¡A ¿ï¾Ü Programs¡A ¿ï¾Ü AdministrativeTools¡A µM«áÂIÀ» Performance¶}©l Performance Monitor¡C

¦b­I´ºÂIÀ»¥kÁä¡A µM«áÂIÀ» Add Counters¡C

¦b Performanceobject ªº¤U©Ô¦¡¿ï³æ¤¤¡AÂIÀ» SQL Server: General Statistics¡C

¦b¥X²{ªº¿ï³æ¤¤¡AÂIÀ» User Connections¡C

ÂIÀ» Add¡AµM«áÂIÀ» Close¡C

¦w¥þ©ÊºÞ²z

ÁöµM¸ê®Æ®w³sµ²¦@¥Î¶È¶È¬O§ïµ½¤F§AÀ³¥Îµ{¦¡ªº¥þ­±©µ®i©Ê¡A¦ý³o·N¨ýªÌ§A¤£¥²¦A¥h¶i¦æ¸ê®Æ®wªº¦w¥þºÞ²z¡C³o¬O¦]¬°¬°¤F¤ä´©³sµ²¦@¥Î¡A©Ò¥H³sµ²¦r¦ê¥²¶·³£¬O¤£¦Pªº¡C¦pªG§A»Ý­n¥H¨C¤@¨Ï¥ÎªÌ¬°°ò¦¨Ó°lÂÜ¸ê®Æ®wªº¹B§@¡A¨º´N¥i¥H¦Ò¼{¥[¤J¤@­Ó°Ñ¼Æ¡A§A¥i¥H³z¹L³o­Ó°Ñ¼Æ¨Ó¬ö¿ý¨Ï¥ÎªÌ¦b¸ê®Æ®w¤¤ªº¹B§@¡C§A¥²¶·¦b¨C¦V¾Þ§@¤¤³£¥[¤J³o­Ó°Ñ¼Æ¡C

·í§A³sµ²¨ì SQL Server ®ÉÀ³¸Ó¨Ï¥Î Windows ÅçÃÒ¡A³o¼Ë°µªº¦n³B¦p¤U :

¸ê°T¦w¥þÅܱo©ö©óºÞ²z¡C¦]¬°§A¦b³æ¤@ªº (Windows) ¦w¥þ¼Ò¦¡¤U¤u§@¦Ó¤£¬O¦b¤À¶}ªº SQL Server ¦w¥þ¼Ò¦¡¤U¡C

§A¤£¥²¦b³sµ²¦r¦ê¤¤¼g¤J¨Ï¥ÎªÌ¦WºÙ»P±K½X¡C

¨Ï¥ÎªÌ¦WºÙ»P±K½X¤£¥²¥H©ú¤åªº¤è¦¡¶i¦æºô¸ô¶Ç¿é¡C

³z¹L±K½X¨Ï¥Î´Á­­¡A³Ìµuªø«×¡A¥H¤Î¼Æ¦¸µL®Äµn¤J«á¶i¦æ±b¸¹Âê©wµ¥¥\¯à¨Ó´£°ªµn¤Jªº¦w¥þ©Ê¡C

§ó¦h¬ÛÃö¸ê°T

·í§A¨Ï¥Î Windows ÅçÃÒ¨Ó¦s¨ú SQL Server ®É¡A ½Ðª`·N¥H¤U¨Æ¶µ :

Ãö©ó®Ä¯àªºÅv¿Å¡C®Ä¯à´ú¸ÕÃÒ©ú¡A¦b¨Ï¥Î³sµ²¦@¥Î®É¡AÀ³¸Ó­n¨Ï¥ÎWindows ÅçÃÒ­n¤ñ¨Ï¥Î SQL Server ÅçÃÒ¨Ó±oºC¡C.NET runtime 1.1 ª©¤¤¤w¸g¼W¥[ SQL Server Ãö©ó Windows ÅçÃÒªº¯S§O³B²z¡A¦ý SQL Server ÅçÃÒÁÙ¬O¤ñ¸û§Ö¡CµM¦Ó¡A ¾¨ºÞ Windows ÅçÃÒ¬O®Ä²v¸û®t¡A ¦ý¨ä®Ä¯àªº®t²§¦b¤@¯ëªº©R¥O©Î¬O¹w¦sµ{§Ç¤¤¬O·Pı¤£¥X¨Óªº¡C¦]¦¹¡A¦b¤j¦h¼Æªºª¬ªp¤U¬O¹ç¥i¨Ï¥Î Windows ÅçÃÒ¥H®Ä¯àªº¨Ç·L¤U­°¨Ó¥æ´«¦w¥þ©Ê¡C¦b³o·í¤¤ªº¨ú±Ë¡A¥D­n¬O¥H§AÀ³¥Îµ{¦¡ªº®Ä¯à¬°¥D¦Ò¶q¡C

Á×§K¤¤¤¶¼hªº¼ÒÀÀ¡CWindows ÅçÃһݭn¦³ Windows ±b¸¹¤~¯à¦s¨ú¸ê®Æ®w¡C ÁöµM³o¦ü¥G¬O­n¶i¦æ¤¤¤¶¼h¤Wªº¼ÒÀÀ¡A ¦ý½ÐºÉ¤OÁ×§K³o¼Ëªº±¡ªpµo¥Í¡C¦]¬°³o·|³y¦¨³sµ²¦@¥Îªº¥¢±Ñ¤ÎÀ³¥Îµ{¦¡©µ®i©Êªº­«¤j¼vÅT¡C­n³B²z³o­Ó°ÝÃD¡A½Ð¼ÒÀÀ¦³­­¼Æ¥Øªº Windows ±b¸¹¦Ó¨C­Ó±b¸¹³£¥Nªí¤@­Ó¯S§Oªº¨­¥÷¡C
Á|¨Ò¨Ó»¡¡A§A¥i¥H¨Ï¥Î¦p¤U¤èªk:

1.

«Ø¦Ü¨â­Ó Windows ±b¸¹¡A ¤@­Ó¶i¦æÅª¨ú¾Þ§@¦Ó¥t¤@­Ó¶i¦æ¼g¤J¾Þ§@¡C( ©Î¬O¡A§A¥i¥H±N¨â­Ó±b¸¹¤À§O§@¬°À³¥Îµ{¦¡ªº¯S§O¾Þ§@¡C¨Ò¦p¡A§A¥i¯à¨Ï¥Î¤@­Ó±b¸¹§@¬°ºô»Úºô¸ô¨Ï¥ÎªÌ¥t¤@­Ó«h§@¬°¤º³¡¾Þ§@©ÎºÞ²z­û¡C

2.

±N¨C­Ó±b¸¹³£¹ïÀ³¨ì¤@­Ó SQL Server ¸ê®Æ®w¨Ï¥ÎªÌ¨­¥÷¡AµM«á¬°¨C­Ó¨­¤À«Ø¥ß¬ÛÀ³ªºÅv­­¡C

3.

¦b§Aªº¸ê®Æ¦s¨ú¼h¤¤¨Ï¥ÎÀ³¥Îµ{¦¡ÅÞ¿è¨Ó¨M©w¡A¦b°õ¦æ¸ê®Æ®w¾Þ§@«e¦ó®É­n¥Î Windows ±b¸¹¨Ó¼ÒÀÀ ¡C
ªþ¿ý : ¨C­Ó±b¸¹³£¥²¶·¬O Internet Information Services (IIS) ªººô°ì±b¤á ¦Ó¥B SQL Server ¥²¶·¦b¦P¼Ëªººô°ì©Î¨ü«H¥ôªººô°ì¤¤¡C©Î¬O¡A§A¥i³Ð«Ø¨C­Ó¬Û¹ïÀ³ªº±b¸¹ ( ¥Î¦P¼Ëªº¨Ï¥ÎªÌ¦WºÙ»P±K½X ) ¦b¨C¥x¹q¸£¤W¡C

¦b§Aªººô¸ô¨ç¦¡®w¨Ï¥Î TCP/IP ¡CSQL Server 7.0 ¥H¤Î·s¤ä´© Windows Åç¾ãªº©Ò¦³ºô¸ô¨ç¦¡®w¡C¨Ï¥Î TCP/IP ¨Ó¨ÓÀò±o½Õ¾ã¡A °õ¦æ¡A ¥H¤Î©µ®i©ÊªºÀuÂI¡C Ãö©ó§ó¦h¨Ï¥Î TCP/IP ªº¸ê°T¡A ½Ð°Ñ¾\¥»¤å³z¹L¨¾¤õÀð³sµ²³¹¸`¡C

¹ï©ó¶}µo¦w¥þªº ASP.NET ¤Îºô¸ôÀ³¥Îµ{¦¡¡A ½Ð°Ñ¦Ò¤U¦C Microsoft ¼Ë¥»»P¹ê¨Ò ªº¾ÉÄý:

Volume I¡A Building Secure ASP.NET Applications: Authentication¡A Authorization¡A and Secure Communication¡A ¦ì©ó¥H¤Uºô§}http://www.microsoft.com/practices

Volume II¡A Improving Web Application Security: Threats and Countermeasures¡A¦ì©ó¥H¤Uºô§} http://www.microsoft.com/practices

Àx¦s³sµ²¦r¦ê

¬°¤FÀx¦s³sµ²¦r¦ê¡A §A¦³³\¦h¤£¦P¼h¯Åªº ÆF¬¡«×¤Î¦w¥þ©Ê³]©w¥i¥H¿ï¾Ü¡C ÁöµMª½±µ¨Ï¥Î­ì©l½X¶i¦æ³sµ²¦r¦êªºµw¦¡½s½X¾Ö¦³³Ì¨Îªº®Ä¯à¡A¦ÓÀɮרt²Î§Ö¨ú¥i¥HÅý¦]¬°±N³sµ²¦r¦ê¶i¦æ¥~³¡Àx¦s©Ò³y¦¨ªº®Ä¯à¸¨®t´X¥G·P¨ü¤£¨ì¡C¥~³¡ªº³sµ²¦r¦êÁÙ¥i¥H´£¨ÑÃB¥~ªºÆF¬¡«×¡A ¦b´X¥G©Ò¦³ªºª¬ºA¤U³£¤ä´©ºÞ²zªÌ²ÕºA¡C

·í§A¿ï¾ÜÀx¦s³sµ²¦r¦êªº¤èªkªº®É­Ô¡A³Ì­«­nªº¦Ò¶q²ö¹L©ó¦w¥þ©Ê»P©ö©ó½Õ¾ã¡Aºò±µµÛ¤~¬O®Ä¯à¡C

§A¥i¥H¦b¤U¦C¦ì¸m¤¤¿ï¾Ü¦s©ñ¸ê®Æ®w³sµ²¦r¦ê :

¦bÀ³¥Îµ{¦¡ªº³]©wÀɤ¤ ; ¨Ò¦p¡AASP.NET ºô¸ôÀ³¥Îµ{¦¡ªº¤¤ Web.config

¦b Universal Data Link ( UDL ) Àɮפ¤ (¥u¦³ OLE DB .NET Data Provider ¤ä´©)

¦b Windows ¨t²Îµn¿ýÀɤ¤

¦Û­qÀÉ®×

COM+ Ãþ§O¤¤¡A¨Ï¥Î«Øºc¦r¦ê¨Ó¶i¦æ (¥u¦³¦b¬ÛÃö¤¸¥ó¤¤)

ÂǥѨϥΠWindows ÅçÃÒ¨Ó¦s¨ú SQL Server¡A§A¥i¥H¤£¥²¦b³sµ²¦r¦ê¤¤Àx¦s¨Ï¥ÎªÌ¦WºÙ»P±K½X¡C¦pªG§A¦³§ó°ªµ¥¯Åªº¦w¥þ©Ê»Ý¨D¡A¥i¥H¦Ò¼{¥Î¥[±K¼Ò¦¡Àx¦s³sµ²¦r¦ê¡C

´N ASP.NET ºô¸ôÀ³¥Îµ{¦¡¦Ó¨¥¡A ¦b Web.config Àɮפ¤Àx¦s¥[±K«áªº³sµ²¦r¦ê¬O¤@­Ó¦w¥þ¤S©ö©ó½Õ¾ãªº¸Ñ¨M¤è®×¡C

ªþ¿ý : §A¥i¥H¦b SqlConnection ©Î OleDbConnection ª«¥ó¦^¶ÇªºConnectionStringÄݩʤ¤¡A¹ï³sµ²¦r¦ê¤¤³]©w Persist Security Info ªº­È¬° false ¥HÁ×§K¬ªº|¸ê°T¦w¥þ¬ÛÃö­«­n°T®§¬ªº|¡A¦p±K½X¤@Ãþ¡A s¡C

±µ¤U¨Óªº¬q¸¨±N­n°Q½×¦p¦ó¨Ï¥Î¦UºØ¤èªk¨ÓÀx¦s³sµ²¦r¦ê¡A ¨ä¤¤ÁÙ¬°¨C­Ó¤èªkªºÀuÂI©M¯ÊÂI§@¤F­åªR¡C ¯à°÷Åý§A¨Ì·ÓÀ³¥Îµ{¦¡ª¬ªpªº¤£¦P¦Ó§@¥X³Ì¦nªº¿ï¾Ü¡C

ªþ¿ý : Configuration Application Management °Ï¶ô¯à°÷Åý§AºÞ²z±q ²³æ¸ê®Æ®w³sµ²¨ì½ÆÂøªº¶¥¼h¦¡¸ê®Æªº²ÕºA³]©w¡C ¦pªG·Q¤F¸Ñ§ó¦h¡A½Ð¦Ü¥H¤Uºô§} http://msdn.microsoft.com/practices¡C

¨Ï¥Î XML À³¥Îµ{¦¡²ÕºAÀÉ®×

§A¥i¥H¨Ï¥ÎÀ³¥Îµ{¦¡²ÕºAÀɮפ¤¦Û­q³]©wªº <appSettings> ¶µ¥Ø¨ÓÀx¦s¸ê®Æ®w³sµ²¦r¦ê¡C ¸Ó¶µ¥Ø¤ä´©t supports arbitrary key-value pairs¡A´N¦p¦P¥H¤U°Ï¶ôªº½d¨Ò:

<configuration>
 <appSettings>
  <add key="DBConnStr"
     value="server=(local);Integrated Security=SSPI;database=northwind"/>
 </appSettings>
</configuration>
  

ªþµù : <appSettings> ¶µ¥Ø¬O¦b <configuration> ¶µ¥Ø¤U ¦Ó¤£¬O¦b <system.web>¶µ¥Ø¤U¡C

ÀuÂI

¶}µo®e©ö ³sµ²¦r¦ê³z¹L¥¿³W .NET xcopy ¦Ó¦b²ÕºAÀɨӶ}µo

µ{¦¡¦s¨ú®e©ö ³z¹L¦b ConfigurationSettings Ãþ§O¤¤ªºAppSettingsÄݩʨϱo°õ¦æ®ÉŪ¨ú¸ê®Æ®w³sµ²¦r¦ê²ÕºA®e©ö¤£¤Ö¡C

¤ä´©°ÊºA§ó·s( ¥u¦³¦b ASP.NET )¡C ¦pªGºÞ²zªÌ§ó·s¤F Web.config Àɮפ¤ªº¸ê®Æ®w³sµ²¦r¦ê¡A ³o­Ó§ïÅܱN·|¦b¤U¦¸¦s¨úªº®É­Ô¥ß§Y¥Í®Ä¡C

¯ÊÂI

¦w¥þ©Ê ÁöµM ASP.NET Internet Server Application Programming Interface (ISAPI) dynamic-link library (DLL) ¸T¤î¥Î¤áºÝª½±µ¦s¨ú .config ®æ¦¡ªºÀɮצӥB¦b NTFS ¥i¥H§ó¶i¤@¨B¦a­­¨î¦s¨ú¡A§AÁÙ¬O¥i¯à·|¤£·Q§â¸ê®Æ¥H©ú¤å¤è¦¡¦s¦b«eºÝªººô¸ô¦øªA¾¹¤W¡C¬°¤F¼W¥[¦w¥þ©Ê¡AÀ³¸Ó­n¥H¥[±K¤è¦¡±N³sµ²¦r¦êÀx¦s¦b²ÕºAÀɤ¤¡C

§ó¦h¬ÛÃö¸ê°T

§A¥i¥H¨Ï¥Î System.Configuration.ConfigurationSettings Ãþ§O¤¤ªº AppSettings ÄݩʨӶi¦æ¦Û­qÀ³¥Îµ{¦¡ªº³]©w¡C ´N¦p¤U¥H¤Uµ{¦¡½Xªº½d¨Ò¡A(¥ý°²³]¦³¦Û­qªºÁä­È DBConnStr):

using System.Configuration;
private string GetDBaseConnectionString()
{
  return ConfigurationSettings¡CAppSettings["DBConnStr"];
}
  

¦pªG·Q±oª¾§ó¦hÃö©ó .NET Framework À³¥Îµ{¦¡ªº²ÕºA³]©w¬ÛÃö¸ê°T¡A ½Ð¦Ü¥H¤Uºô§} http://msdn.microsoft.com/library/en-us/cpguidnf/html/cpconconfiguringnetframeworkapplications.asp¡C

¨Ï¥Î UDL ÀÉ®×

OLE DB .NET Data Provider ¤ä´© Universal Data Link (UDL) Àɮ׮榡¨ÓÀx¦s³sµ²¦r¦ê¡C §A¥i¥H¨Ï¥Î OleDbConnection ª«¥óªº«Øºc¦¡¤Þ¼Æ¨Ó¶Ç»¼³sµ²¦r¦ê¡A©Î¬O§A¥i¥H§Q¥Îª«¥óªº ConnectionString ªºÄݩʪ½±µ³]©w¡C

ªþµù : SQL Server .NET Data Provider ¨Ã¤£¤ä´©¥Î UDL ÀɮרӦs©ñ³sµ²¦r¦ê¡C ¦]¦¹¡A³o­Ó¤èªk¥u¦³¦b§A¨Ï¥Î OLE DB .NET Data Provider ®É¤~¯à¨Ï¥Î¡C

¦b OLE DB provider ¤¤¡A ¨Ï¥Î UDL ÀɮרÓÀò±o³sµ²¦r¦ê¡A ¥u­n¨Ï¥Î¹³³o¼Ëªº«ü¥O "File Name=name.udl."

ÀuÂI

¼Ð·Ç®æ¦¡¡C §A¥i¯à¤w¸g¦b¨Ï¥Î UDL ÀÉ®×§@¬°³sµ²¦r¦êªººÞ²z¤F¡C

¯ÊÂI

®Ä¯à¡C ¨C¦¸¶}±Ò³sµ²ªº®É­Ô ³£­n¶}±Ò UDLÀɮ׸ÑŪ³sµ²¦r¦ê¡C

«ö¥þ©Ê¡C UDL Àɮ׬O¥H©ú¤åÀx¦s¡C §A¥i¥H¨Ï¥Î NTFS ªºÀÉ®×Åv­­ºÞ²z¨Ó¼W¥[¦w¥þ©Ê¡A¦ý³o¬O¸ò .config Àɮפ@¼Ëªº°ÝÃD¡C

SqlClient ¤£¤ä´© UDL ÀɮסC ¥Î¨Ó¦s¨úSQL Server 7.0 ¤Î§ó·sª©¥»ªº SQL Server .NET Data Provider¨Ã¤£¤ä´© UDL¡C

§ó¦h¬ÛÃö¸ê°T

¬°¤F¯à§ó¦³®ÄªººÞ²z¡A­n¥ý½T»{ºÞ²zªÌ¦³Åª¼g UDL ÀɮתºÅv­­¥H¤ÎÀ³¥Îµ{¦¡¥u¦³Åª¨úÅv­­¡C ¦b ASP.NET ºô¸ôÀ³¥Îµ{¦¡¤¤¡A À³¥Îµ{¦¡ªº¤u§@µ{§Ç¹w³]¬O¥H SYSTEM ±b¸¹¹B§@¡AÁöµM§A¥i¥H³z¹L ¥þ¾÷¾¹²ÕºA³]©wÀÉ (Machine.config)¤¤ªº<processModel> ¶µ¥Ø¨Ó§ï¼g¡C §A¤]¥i¥H ¿ï¾Ü¥Î Web.config Àɮפ¤ªº<identity>¶µ¥Ø¨Ó¼ÒÀÀ«ü©w±b¸¹¡C

¦bºô¸ôÀ³¥Îµ{¦¡¤¤¡A ½T»{§A¨S¦³§â UDL Àɮשñ¦bµêÀÀ¥Ø¿ý¤U¡A ³o·|³y¦¨¸ÓÀÉ®×¥i¥H³z¹Lºô¸ô¤U¸ü¡C

¦pªG·Q¨ú±o§ó¦hÃö©ó ASP.NET ¥\¯àªº¸ê°T¦w¥þ¬ÛÃö¸ê°T¡A½Ð°Ñ¾\ "Authentication in ASP.NET: .NET Security Guidance¡A" ºô§}¦p¤Uhttp://msdn.microsoft.com/library/en-us/dnbda/html/authaspdotnet.asp¡C

¨Ï¥Î¦b Windows ¨t²Îµn¿ýÀÉ

§A¥i¥H¦b Windows ¨t²Îµn¿ýÀɤ¤¨Ï¥Î¦Û­qÁä­È¨ÓÀx¦s³sµ²¦r¦ê¡A ¤£¹L¦]¬°·|³y¦¨¶}µo¤Wªº°ÝÃD©Ò¥H¨Ã¤£±ÀÂ˳oºØ¤èªk¡C

¦w¥þ©Ê§A¥i¥H¨Ï¥Î access control lists (ACLs) ¨Ó¦s¨ú¿ï©wªº¨t²Îµn¿ýÀÉ¡C³o¾Ö¦³§ó°ª«×ªº¦w¥þ©Ê¤]¥i¥H¹ï¸ê®Æ¥[±K¡C

µ{¦¡³]­p¦s¨ú²¤Æ .NET Ãþ§O¤¤¦³¤ä´©Åª¨úµn¿ýÀɪº¥\¯à¡C

¯ÊÂI

³¡¸p¡C ¬ÛÃöªºµn¿ý¨t²Î³]©w¥²¶·ÀHµÛ§AªºÀ³¥Îµ{¦¡²¾°Ê¡A¥¢¥h¨Ï¥Î xcopy ªºÀuÂI¡C

¨Ï¥Î¦Û­qÀÉ®×

§A¥i¥H¨Ï¥Î¦Û­qÀɮרÓÀx¦s³sµ²¦r¦ê¡C µM¦Ó¡A ³oºØ§@ªk¨Ã¨S¦³¥ô¦óÀuÂI©Ò¥H¤]¤£±ÀÂË¡C

ÀuÂI

µL¡C

¯ÊÂI

ÃB¥~ªºµ{¦¡½X¼¶¼g³o­Ó¤èªk¥²¶·¼¶¼gÃB¥~ªºµ{¦¡½X¦Ó¥BÅý¨Ï¥ÎªÌ³B²z¦P®É°õ¦æªº°ÝÃD¡C

³¡¸p³oºØÀÉ®×¥²¶·ÀHµÛ ASP.NET À³¥Îµ{¦¡Àɮפ@°_½Æ»s¡C¤£¥i±N³oºØÀɮשñ¸m¦b ASP.NET À³¥Îµ{¦¡ªº¥Ø¿ý©Î¬O¤l¥Ø¿ý¤¤¥H§Kª½±µ±qºô¸ô¤W³Q¤U¸ü¡C

¨Ï¥Î«Øºc¦¡¤Þ­z¸ò COM+ Ãþ§O

§A¥i¥H±N¸ê®Æ®w³sµ²¦r¦êÀx¦s¦b COM+ Ãþ§O¤¤¨Ã¥B³z¹Lª«¥ó«Øºc¦¡¦r¦ê±N¥¦¶Ç»¼¦Üª«¥ó¤¤¡C COM+ ¦bªì©l¤Æª«¥ó«á·|©I¥sª«¥óªº Construct ¤èªk¡A±µ¦¬ª«¥ó«Øºc¦¡¦r¦ê¡C

ªþµù : ³oºØ¤èªk¥u¯à¦b¬Y¨ÇªA°È¤¸¥ó¤¤¨Ï¥Î¡C©Ò¥H¥u¯à¦b§AªººÞ²z¤¸¥ó¨Ï¥Î¨ä¥LªA°È®É¨Ï¥Î¡A¹³¬O¤À´²¦¡¥æ©ö¤ä´©©Î¬Oª«¥ó¶°°Ï¡C

ÀuÂI

ºÞ²zºÞ²zªÌ¥i¥H¨Ï¥Î Component Services MMC snap-in »´ÃP­×§ï³sµ²¦r¦ê¡C

¯ÊÂI

¦w¥þ©Ê COM+ Ãþ§O¬O¤@­Ó¤£¦w¥þªºÀx¦s°Ï°ì ( ÁöµM§A¥i¥H¥Î COM+ ¨­¤À­­¨î¦s¨ú) ©Ò¥H¦]¦¹¤£¯à±N³sµ²¦r¦ê¥Î©ú¤åÀx¦s¡C

³¡¸p COM+ Ãþ§O¤¤ªºªº¶µ¥Ø³£¥²¶·ÀHµÛ .NETÀ³¥Îµ{¦¡ÅܰʡC I¦pªG§A¨Ï¥Î¤F¨ä¥L¥ø·~ªA°È¡A¹³¬O¤À´²¦¡¥æ©ö©Îª«¥ó¶°°Ï¡A ¨Ï¥Î³o­Ó¤èªk´N¨S¦³¤°»ò¶}µo¤WªºÀu¶Õ¡A¦]¬° COM+ Ãþ§O¥²¶·­n¥Î¨Ó¤ä´©¨ä¥LªA°È¡C

¥²¶·¬OªA°È¤¸¥ó§A¥u¯à¦bªA°È°|¥ó¤¤¨Ï¥Î«Øºc¦¡¦r¦ê¡C§A¤£À³¸Ó¥u¬°¤F¯à¨Ï¥Î«Øºc¦¡¦r¦ê´N¥Î ServicedComponent ¬°°ò¦¨Ó¶}µo¤¸¥óÃþ§O¡C

­«ÂI´£¥Ü : ºûÅ@³sµ²¦r¦êªº¦w¥þ¬O«Ü­«­nªº¡C¨Ï¥Î SQL ÅçÃÒ¡A ³sµ²·|¥]§t¨Ï¥ÎªÌ¦WºÙ¸ò±K½X¡C ¦pªG§ðÀ»ªÌÁA¸Ñºô¸ô¦øªA¾¹¤¤ªº®zÂI¥Î¥H¨ú±o¬ÛÃö­ì©l½X©Î¬O²ÕºA¦s©ñªº¦ì¸m¡A ¸ê®Æ®w´N·|¹¡¨ü«Â¯Ù¡C¬°¤F¨¾½d¥¼µM¡A³sµ²¦r¦êÀ³¸Ó­n±µ¨ü¥[±Kµ{§Ç¡C¦pªG·Q­n²`¤J¤F¸Ñ¦UºØ¦b³sµ²¦r¦ê¤W¥[±Kªº¤èªk¡A½Ð°Ñ¾\ Improving Web Application Security: Threats and Countermeasures¡A½Ð¦Ü¥H¤Uºô§}¾\Äý http://www.microsoft.com/practices¡C

§ó¦h¬ÛÃö¸ê°T

¦pªG·Q¨ú±o§ó¦h¦³Ãö.NET Ãþ§Oªºª«¥ó«Øºc¦¡ªº³]©wªº¸ê°T¡A ½Ð°Ñ¾\ªþ¿ý¤¤ªº¦p¦ó¦b .NET Ãþ§O¤¤±Ò¥Îª«¥ó«Øºc¦¡¡C

¦pªG·Q¨ú±o§ó¦h¦³Ãö³¡¸pªA°È¤¸¥óªº¸ê°T¡A ½Ð¦Ü¥H¤Uºô§} http://msdn.microsoft.com/library/en-us/cpguidnf/html/cpconwritingservicedcomponents.asp¡C

·Qª¾¹D¦p¦ó¶}µo¦w¥þªº ASP.NET ©Mºô¸ôÀ³¥Îµ{¦¡¡A½Ð°Ñ¦Ò¤U¦Cªº Microsoft ¼Ë¥»»P¹ê¤O ¯Á¤Þ:

Volume I¡A Building Secure ASP.NET Applications: Authentication¡A Authorization¡A and Secure Communication¡A ¥i©ó¤U¦Cºô§}¨ú±o http://www.microsoft.com/practices

Volume II¡A Improving Web Application Security: Threats and Countermeasures¡A ¥i©ó¤U¦Cºô§}¨ú±o http://www.microsoft.com/practices

³sµ²¨Ï¥Î½d¨Ò

¤£½×§A¨Ï¥Îªº¬O­þ¤@ºØ .NET data provider¡A§A³£¤@©w­n«ö·Ó¥H¤U­ì«h¶i¦æ :

¶È¥i¯à±ßÂI¶}±Ò¸ê®Æ®w³sµ²¡C

¨Ï¥Î³sµ²ªº®É¶¡ºÉ¥i¯àªºµu¡C

¾¨§ÖªºÃö³¬³sµ²¡C³sµ²¦pªG¨S¦³³Q Close ©Î Dispose ¤èªkÃö³¬¬O¤£·|¦^¶Çµ¹¦@¥Î¶°¦Xªº¡C´Nºâ§A°»´ú¨ì³sµ²¤w¸g¤¤Â_ÁÙ¬OÀ³¸Ó¶i¦æÃö³¬ªº°Ê§@¡C³o¦^Åý¥¦¶Ç¦^¦@¥Î¶°¦X¨Ã½T»{¥¢®Ä¡C¦@¥Î¶°¦X·|©w®Éªº¶i¦æ±½´y½T»{ª«¥ó¬O§_¤w¸g¥¢®Ä¡C

¬°¤F½T«O¦b¤èªk¦^¶Ç«e³sµ²´N¤w¸gÃö³¬¡A½Ð°Ñ¦Ò¦p¤Uªº¨â­Ó½d¨Ò¡C²Ä¤@­Ó¨Ï¥Î finally µ{¦¡°Ï¶ô¡C²Ä¤G­Ó¨Ï¥Î C# ªº using ±Ô­z¡A¥Î¥H½T«Oª«¥óªº Dispose ¤èªk¦³³Q©I¥s¡C

¤U­±ªºµ{¦¡½X¤¤ finally µ{¦¡°Ï¶ô½T»{³sµ²¦³³QÃö³¬¡C­È±o¤@´£ªº¬O³o­Ó¤èªk¥u¯à¦b¤ä´©µ²ºc¨Ò¥~³B²zªº Visual Basic .NET ©M C# ¤¤¨Ï¥Î¡C

public void DoSomeWork()
{
  SqlConnection conn = new SqlConnection(connectionString);
  SqlCommand cmd = new SqlCommand("CommandProc"¡A conn );
  cmd¡CCommandType = CommandType¡CStoredProcedure;

  try
  {
    conn¡COpen();
    cmd¡CExecuteNonQuery();
  }
  catch (Exception e)
  {
    // Handle and log error
  }
  finally
  {
    conn¡CClose();
  }
}

¤U­±ªºµ{¦¡½X¬O¥t¥~¤@ºØ¨Ï¥Î C# using ±Ô­zªº¤èªk¡C­È±o¤@´£ªº¬O Visual Basic .NET ¨Ã¤£´£¨Ñ using ±Ô­z©Î¬O¬Û¦Pªº¥\¯à¡C

public void DoSomeWork()
{
  // using guarantees that Dispose is called on conn¡A which will
  // close the connection¡C
  using (SqlConnection conn = new SqlConnection(connectionString))
  {
    SqlCommand cmd = new SqlCommand("CommandProc"¡A conn);
    fcmd¡CCommandType = CommandType¡CStoredProcedure;
    conn¡COpen();
    cmd¡CExecuteQuery();
  }
}

§A¥i¥H§â³o­Ó½d¨Ò®M¥Î¦b¨ä¥Lªºª«¥ó¤W¡A¨Ò¦p ¡A SqlDataReader ©Î OleDbDataReader ¦b¹ï²{¦³³sµ²¶i¦æ¥ô¦ó³B²z¤§«e³£¥²¶·¥ýÃö³¬³sµ²¡C

¦^¨ì­¶­º¦^¨ì­¶­º

¿ù»~³B¸Ì

ADO.NET ªº¿ù»~¬O³z¹L .NET Framework °ò¦µ²ºc¤¤ªºªº¨Ò¥~³B²z¥\¯à¦Ó²£¥Íªº¡C¦]¦¹¡A§A¦b¸ê®Æ¦s¨úµ{¦¡½X¤¤¶i¦æ¿ù»~³B²z¸ò¦bÀ³¥Îµ{¦¡ªº¨ä¥L³¡¤À¶i¦æ¿ù»~³B²zªº¤èªk³£¬O¤@¼Ëªº¡C³z¹L¼Ð·Çªº .NET ¨Ò¥~³B²z»yªk¸ò§Þ³N¡A¨Ò¥~¥i¥H«Ü¶¶§Q¦a³Q°»´ú¤Î³B²z¡C

³o­Ó³¹¸`§i¶D§A¦p¦ó¶}µo¥\¯à±j¤jªº¸ê®Æ¦s¨úµ{¦¡¶Ü¨Ã¸ÑÄÀ¨ä¤¤¦p¦ó³B²z¸ê®Æ¦s¨úªº¿ù»~¡CÁÙ´£¨Ñ¤FÃö©ó SQL Server .NET Data Provider ¿ù»~³B²z¥\¯àªº¾ÉÄý¡C

.NET ªº¨Ò¥~

.NET data providers ±N¸ê®Æ®wªº¿ù»~Âà´«¦¨¼Ð·Çªº¨Ò¥~«¬ºA¡A ©Ò¥H§A¥i¥H¦b¸ê®Æ¦s¨úµ{¦¡½X¤¤ª½±µ³B²z¡C ¸ê®Æ®wªº¿ù»~²Ó¸`§A¥i¥H³z¹L¬ÛÃöªº¨Ò¥~ª«¥óÄݩʦӱoª¾ ¡C

©Ò¦³ªº .NET¨Ò¥~«¬ºA ³£¬O¥ÑSystem©R¦WªÅ¶¡¤Uªº°ò¥» Exception Ãþ§O­l¥Í¦Ó¨Ó¡C .NET data providers ¶Ç¦^ provider ªº¯S©w¿ù»~«¬ºA¡C Á|¨Ò¨Ó»¡¡A·íSQL Server ¶Ç¦^¿ù»~°T®§¡ASQL Server .NET Data Provider·|¶Ç¦^ SqlException ª«¥ó ¡C¦P¼Ë¦a¡A OLE DB .NET Data Provider ¤]·|¶Ç¦^ OleDbException §ÎºAªº¨Ò¥~ ¡A ¸Ì­±¥]§t¤FOLE DB provider©³¼hªº¿ù»~²Ó¸`¡C

¹Ï 3 Åã¥Ü¥X .NET data provider ªº¨Ò¥~¶¥¼h¬[ºc¡C ª`·N¨ä¤¤ OleDbException Ãþ§O¬OÄ~©ÓExternalExceptionÃþ§O¡A ¦Ó¨º¬O©Ò¦³ COM Interop ¨Ò¥~ªº°ò¦Ãþ§O¡C ¦¹ª«¥óªºErrorCode ÄÝ©ÊÀx¦s¤F¥Ñ OLE DB ²£¥Íªº COM HRESULT¡C

Figure 1.3. .NET Data Provider exception hierarchy

¹Ï 1.3. .NET Data Provider ¨Ò¥~¶¥¼h

®·®»»P³B²z .NET ¨Ò¥~

¬°¤F³B²z¸ê®Æ¦s¨úªº¨Ò¥~¡A½Ð±N§Aªº¸ê®Æ¦s¨úµ{¦¡½X©ñ¦b try µ{¦¡°Ï©Ç¤¤¨Ã¨Ï¥Î catch µ{¦¡°Ï¶ô©ñ¦Ü¨Ò¥~³B²zµ{¦¡½X¡A·íµM½Ð§O§Ñ¤F¥[¤W¦X¾Aªº¨Ò¥~«¬ºA¨Ó¹LÂo¡CÁ|¨Ò¨Ó»¡¡A¨Ï¥Î SQL Server .NET Data Provider ¼¶¼g¸ê®Æ¦s¨úµ{¦¡½Xªº®É­Ô¡A§AÀ³¸Ó®·®» SqlException «¬ºAªº¿ù»~¡A´N¦p¦P¤U¤èªºµ{¦¡½X¤@¯ë :

try
{
  // Data access code
}
catch (SqlException sqlex) // more specific
{
}
catch (Exception ex) // less specific
{
}

¦pªG§A¼¶¼g¤F¶W¹L¤@­Óªº catch ±Ô­z¨Ã¨Ï¥Î¤F¤£¦Pªº¿ù»~«¬ºA¹LÂo¡A½Ð°O±o¨Ìµo¥Íªº¾÷²v«ö¶¶§Ç±Æ¦n¡C³o¼Ëªº°µªk¡A·|Åý³Ì±`µo¥Íªº¿ù»~«¬ºAªº catch °Ï¶ô¦b©Ò¦³ªº¨Ò¥~«¬ºA³£·|°õ¦æ¡C

¦Ó SqlException Ãþ§OªºÄݩʤ¤¥]§t¤F¨Ò¥~ª¬ªpªº²Ó¸`¡C³o¸Ì­±¥]¬A :

Message Äݩʤº®e¬O¿ù»~ªº¤å¦r±Ô­z¡C

Number Äݩʤº®e¬O¿ù»~¥N½X¡A³o¬O¥Î¨Ó¿ë§O¿ù»~ªº«¬ºA¥Îªº¡C

State Äݩʤº®e¬O¤Þµo¿ù»~ªºª¬ªp¤§¬ÛÃö¸ê°T¡C³o³q±`³£¬O¥Î¨Ó«ü¥X¯S©w¿ù»~ªºµo¥Í¦ì¸m¡CÁ|¨Ò¨Ó»¡¡A ¤@­Ó¹w¦sµ{§Ç¥i¯à¤£¥u¤@¦æ¤Þµo¤F¦P¼Ëªº¿ù»~¡A³o®É state ÄݩʴN¯àÀ°¦£«ü¥X¿ù»~ªº¦ì¸m¡C

Errors¶°¦X¡A ³o¸Ì¸Ì­±¥]§t¤F SQL Server ¶Ç¦^¿ù»~ªº¸Ô²Ó¸ê°T¡CErrors ¶°¦X¸Ì­±¦Ü¤Ö·|¦³¤@­Ó«¬ºA¬°SqlError ªºª«¥ó¡C

¤U­±ªºµ{¦¡½X°Ï¶ô¬O¥Î¨Ó»¡©ú¥Î SQL Server .NET Data Provider ¦p¦ó³B²z SQL Server ¿ù»~ :

using System.Data;
using System.Data.SqlClient;
using System.Diagnostics;

// Method exposed by a Data Access Layer (DAL) Component
public string GetProductName( int ProductID )
{
  SqlConnection conn = null;
  // Enclose all data access code within a try block
  try
  {
    conn = new SqlConnection(
        "server=(local);Integrated Security=SSPI;database=northwind");
    conn.Open();
    SqlCommand cmd = new SqlCommand("LookupProductName"¡A conn );
    cmd.CommandType = CommandType.StoredProcedure;

    cmd.Parameters.Add("@ProductID"¡A ProductID );
    SqlParameter paramPN = 
         cmd.Parameters.Add("@ProductName"¡A SqlDbType.VarChar¡A 40 );
    paramPN.Direction = ParameterDirection.Output;

    cmd.ExecuteNonQuery();
    // The finally code is executed before the method returns
    return paramPN.Value.ToString();  
  }
  catch (SqlException sqlex)
  {
    // Handle data access exception condition
    // Log specific exception details
    LogException(sqlex);
    // Wrap the current exception in a more relevant
    // outer exception and re-throw the new exception
    throw new DALException(
                  "Unknown ProductID: " + ProductID.ToString()¡A sqlex );
  }
  catch (Exception ex)
  {
    // Handle generic exception condition . . .
    throw ex;
  }
  finally
  {
    if(conn != null) conn.Close(); // Ensures connection is closed
  }
}

// Helper routine that logs SqlException details to the 
// Application event log
private void LogException( SqlException sqlex )
{
  EventLog el = new EventLog();
  el.Source = "CustomAppLog";
  string strMessage;
  strMessage = "Exception Number : " + sqlex.Number + 
               "(" + sqlex.Message + ") has occurred";
  el.WriteEntry( strMessage );

  foreach (SqlError sqle in sqlex.Errors)
  {
    strMessage = "Message: " + sqle.Message +
                 " Number: " + sqle.Number +
                 " Procedure: " + sqle.Procedure +
                 " Server: " + sqle.Server +
                 " Source: " + sqle.Source +
                 " State: " + sqle.State +
                 " Severity: " + sqle.Class +
                 " LineNumber: " + sqle.LineNumber;
    el.WriteEntry( strMessage );
  }
}

¦b SqlExceptioncatch µ{¦¡°Ï¶ô¤¤¡A µ{¦¡½X¤@¶}©l¨Ï¥Î LogException ¨ó§Uµ{¦¡¨ç¦¡¨Ó¬ö¿ý¨Ò¥~ªº²Ó¸`¡C ³o­Ó¨ç¦¡¨Ï¥Î¤F¤@­Ó foreach ±Ô­z¨Ó¦CÁ| provider¯S©wªºErrors¶°¦Xªº²Ó¸`¨Ã¥B±N¿ù»~ªº²Ó¸`¬ö¿ý¦b¿ù»~¬ö¿ýÀɤ¤ ¡C¦b catch µ{¦¡°Ï¶ô¤¤ªºµ{¦¡½X¥ÎDALExceptionªº¨Ò¥~«¬ºA¨Ó¥]¸Ë SQL Server ªº¯S©w¨Ò¥~ ¡A ¨Ï³o­Ó°T®§¦b GetProductName ¤èªk¤¤§ó¨ã¦³·N¸q¡C ¨Ò¥~³B²z±`¦¡¤¤¨Ï¥Î¤F throw ³o­ÓÃöÁä¦r¨Ó¨Ó§â¨Ò¥~¶Ç¦^µ¹©I¥sªÌ¡C

§ó¦h¬ÛÃö¸ê°T

·Q¤F¸Ñ SqlException Ãþ§Oªº¤º®e²Ó¸`¡A½Ð¦Ü¥H¤Uºô§} http://msdn.microsoft.com/library/en-us/cpref/html/frlrfSystemDataSqlClientSqlExceptionMembersTopic.asp¡C

¦pªG·Qª¾¹D¦p¦ó§ó¶i¤@¨B¶}µo¦Û©w¨Ò¥~¡A ¬ö¿ý§Y¥]¸Ë .NET ¨Ò¥~¡A ¥H¤Î¨Ï¥Î§ó¦hºØ¤è¦¡¨Ó¶i¦æ¨Ò¥~¶Ç¼½¡A ½Ð¦Ü¥H¤Uºô§}http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnbda/html/exceptdotnet.asp¡C

¹w¦sµ{§Ç­l¥Íªº¿ù»~

Transact-SQL ( T-SQL ) ´£¨Ñ¤F¤@­Ó RAISERROR ( ª`·N«÷ªk )¨ç¦¡¡A§A¥i¥H¥Î¥¦¨Ó²£¥Í¦Û©w¿ù»~¨Ã¶Ç¦^µ¹¥Î¤áºÝ¡C ¹ï ADO.NET ªº¥Î¤á¦Ó¨¥¡ASQL Server .NET Data Provider ÄdºI³o¨Ç¸ê®Æ®w¿ù»~¨Ã±N¥¦­ÌÂà´«¦¨ SqlError ª«¥ó¡C

¨Ï¥Î RAISERROR ¨ç¦¡³Ì²³æªº¿ìªk´N¬O§â¶Ç¦^°T®§¤º®e§@¬° ¨ä²Ä¤@­Ó°Ñ¼Æ¡A µM«á±µ¤U¨Ó«ü©wÄY­«µ{«×¸òª¬ºAªº°Ñ¼Æ¡A¦p¦P¤U­±ªºµ{¦¡°Ï¶ô©Ò¥Ü¡C

RAISERROR( 'Unknown Product ID: %s', 16, 1, @ProductID )

¦b³o­Ó½d¨Ò¤¤¡A §Ú­Ì¶Ç¦^¤F¤@­Ó´À¥N°Ñ¼ÆȄ²{¦bªº product ID §@¬°¿ù»~°T®§ªº¤@³¡¤À ¡C ²Ä¤G­Ó°Ñ¼Æ¬OÃö©óÄY­«µ{«×ªº°T®§¡A ²Ä¤G­Ó°Ñ¼Æ¬OÃö©óª¬ºAªº°T®§¡C

§ó¦h¬ÛÃö¸ê°T

¬°¤FÁ×§K±N¿ù»~°T®§¶i¦æµw¦¡½s½X¡A§A¥i¥H¥Î sp_addmessage ³o­Ó¨t²Î¹w¦sµ{§Ç¡A ©Î¬O¥Î SQL Server Enterprise Manager ±N³o°T®§¥[¤Jsysmessages¸ê®Æªí¡C µM«á±N³o­Ó°T®§ªºÃѧO½X¶Ç¤J RAISERROR ¨ç¦¡¡C¦Ó§A©Ò©w¸qªº³o­ÓÃѧO½X¥²¶·¤ñ 50000 ¤j¡A ´N¦p¦P¥H¤Uªºµ{¦¡½X°Ï¶ô©Ò¥Ü¡C

RAISERROR( 50001, 16, 1, @ProductID )

¦pªG·Qª¾¹D RAISERROR ªº¨ä¥L¬ÛÃö²Ó¸`¡A ½Ð¦bSQL Server ½u¤W»¡©ú¤å¥ó¯Á¤Þ¤¤·j´M RAISERROR ¡C

¦p¦ó¾A·íªº´y­zÄY­«µ{«×

¥²¶··V¿ï¿ù»~ªºÄY­«µ{«×¨Ã¤F¸Ñ¨ä©Ò±a¨Óªº¼vÅT ¡C ¿ù»~ÄY­«µ{«×ªº½d³ò¬O±q 0 ¨ì 25 ¬O¥Î¨Ó«ü¥X SQL Server 2000 ©Ò¾D¹J¨ìªº°ÝÃD¡C ¦b¥Î¤áºÝªºµ{¦¡½X¤¤¡AÀ³¸Ó¥i¥H¦b SqlException Ãþ§O¤¤ªº Errors ¶°¦X¸Ìªº SqlError ª«¥ó¤¤ Class Äݩʸ̧ä¨ìÃö©ó¿ù»~ÄY­«µ{«×ªº°T®§¡Cªí®æ 1 ¦C¥X¤F¦UºØ¿ù»~ÄY­«µ{«×ªº·N¸q¸ò¼vÅT¡C

ªí®æ 1. ¿ù»~ÄY­«µ{«×·N¸q¸ò¼vÅT

ÄY­«µ{«×³sµ²¬O§_Ãö³¬²£¥Í SqlException·N¸q

10 ©Î¥H¤U

§_

§_

¦^³ø¸ê°T°T®§¤£¤@©w¬O¿ù»~ª¬ªp¡C

11-16

§_

¬O

¥i¥H³Q¨Ï¥ÎªÌ§ó¥¿ªº¿ù»~¡A¨Ò¦p : ­«½Æ¾Þ§@¤w­×§ïªº¿é¤J¸ê®Æ¡C

17-19

§_

¬O

¸ê·½©Î¬O¨t²Î¿ù»~¡C

20-25

¬O

¬O

ÄY­«ªº¨t²Î¿ù»~ (¥]¬AµwÅé¿ù»~)¡C¥Î¤áºÝ³sµ²Ãö³¬¡C

±±¨î¦Û°Ê¥æ©ö

SQL Server .NET Data Provider ·í¥ô¦ó¿ù»~ÄY­«µ{«×¤j©ó 10 ®É¡A³£·|¶Ç¦^ SqlException¡C ·í¤¸¥ó¬O°»´ú¨ì SqlExceptionªº¦Û°Ê ( COM+ ) ¥æ©öªº¤@³¡¤À®É¡A¤¸¥ó¥²¶·½T»{¬O¦A¤¤¤î¥æ©ö transaction¡C³o¥i¯à¬O¦Û°Ê¤Æªºµ{§Ç¤]¥i¯à¤£¬O¡A¥D­n¬O¬Ý¤èªk¬O§_¦³¼Ð©ú AutoCompleteÄݩʡC

¦pªG·Q¨ú±o§ó¦hÃö©ó¦Û°Ê¤Æ¥æ©ö¦p¦ó³B²z SqlExceptionªº¸ê°T¡A ½Ð¦Ü¥»¤å¤¤ªº¨M©w¥æ©öµ²ªG³¹¸`¬d¾\¡C

¨ú±o¸ê°T°T®§

ÄY­«µ{«× 10 ©Î¬O¥H¤U ³q±`³£¬O¥Nªí¸ê°T°T®§¦Ó¤£·|¤Þµo SqlException ¡C

¦p¦ó¨ú±o¸ê°T°T®§:

«Ø¸m¤@­Ó¨Æ¥ó³B²z±`¦¡¥Î¨Ó³B²z SqlConnection ª«¥óªº InfoMessage¨Æ¥ó¡C¨Æ¥óªº¶Ç»¼¥¿¦p¥H¤Uµ{¦¡½X°Ï¶ô©Ò­z

public delegate void SqlInfoMessageEventHandler( object sender¡A 
                                                     SqlInfoMessageEventArgs e );

°T®§¸ê®Æ¥i¥H³z¹L SqlInfoMessageEventArgs ª«¥ó¶Ç»¼¨ì§Aªº¨Æ¥ó³B²z±`¦¡¡C ³o­Óª«¥ó¦³Errors ÄݩʡA ¤º®e¥]§t¤@­Ó SqlError ª«¥óªº¶°¦X¡X¤@­Óª«¥ó¹ïÀ³¤@­Ó¸ê°T°T®§¡C ¥H¤Uªºµ{¦¡½X°Ï¶ô»¡©ú¦p¦óµù¥U¤@­Ó¨Æ¥ó³B²z±`¦¡¥Î¨Ó¬ö¿ý¸ê°T°T®§ ¡C

public string GetProductName( int ProductID )
{
  SqlConnection conn = null;
  try
  {
    conn = new SqlConnection(
        "server=(local);Integrated Security=SSPI;database=northwind");
    // Register a message event handler
    conn.InfoMessage += new SqlInfoMessageEventHandler( MessageEventHandler );
    conn.Open();
    // Setup command object and execute it
    . . .
  }
  catch (SqlException sqlex)
  {
    // log and handle exception
    . . .
  }
  finally
  {
    if(conn != null) conn.Close();
  }
}
// message event handler
void MessageEventHandler( object sender, SqlInfoMessageEventArgs e )
{
  foreach( SqlError sqle in e.Errors )
  {
    // Log SqlError properties
    . . .
  }
}
¦^¨ì­¶­º¦^¨ì­¶­º

®Ä¯à

³o­Ó³¹¸`¤¶²Ð¤@¨Ç¸ê®Æ¦s¨úªº®×¨Ò¡A¦Ó¹ï¨C¤@­Ó®×¨Ò¡A§Ú­Ì³£·|¸Ô²Ó¤¶²Ð¥¦¨Ï¥Î ADO.NET ¸ê®Æ¦s¨úµ{¦¡½X¼¶¼gªº¡A¨ã½Õ¾ã©Ê¦Ó¥B®Ä¯à´£¤É¨ì·¥­Pªº¸Ñ¨M¤è®×¡C¨Ã¥B¤ñ¸û¨ä¤¤ªº¾A¦X«×¡A ®Ä¯à\¤½¦@¯à©Ê¡A¥H¤Î¶}µo©Ò»Ýªº¤@¤Á¡C³o­Ó³¹¸`¥D¬O­n¤¶²Ð¤U¦C´Xªº¤è®×¡G

Â^¨úµ²ªG¶°¦X¨Ã¥B¥H¨ä¤¤ªº¸ê®Æ¦C¶i¦æ­pºâ¡C

¨Ï¥Î¯S©wªº¥D¯Á¤ÞŲÂ^¨ú³æ¦C¸ê®Æ¡C

±q¯S©w¸ê®Æ¦C¤¤Â^¨ú³æ¤@¶µ¥Ø¡C

Àˬd¨ã¦³¯S©w¥D¯Á¤ÞÁ䪺¸ê®Æ¦C¬O§_¦s¦b¡C ³o¬O¤@­Ó³æ¤@¶µ¥Ø¬d§ä¤è®×ªºÅܤƥu­n¶Ç¦^¥¬ªL­È§Y¥i¡C

Â^¨ú¦h¦C¸ê®Æ

¦b¦¹®×¨Ò¤¤¡A §A·Q­nÂ^¨ú¥X¤@­Óªí®æ¤Æªº¸ê®Æ¶°¦XµM«á­pºâÂ^¨ú¥Xªº¸ê®Æ¦C¨Ó¶i¦æ¾Þ§@¡CÁ|¨Ò¨Ó»¡¡A ¥i¯à·QÂ^¨ú¥X¤@­Ó¸ê®Æ¶°¦X¡A¦bÂ÷½uª¬ºA¤U³B²z¥¦¡A¨Ã¥B§â¥¦·í¦¨ XML ¤å¥ó ( ©Î¬O³z¹L Web service) ¨Ó¶Ç»¼µ¹¥Î¤áºÝÀ³¥Îµ{¦¡¡C©ÎªÌ¡A§A¥i¯à·Q§â¸ê®Æ¥Î HTML ªºªí®æ±N¨ä§e²{¥X¨Ó¡C

¬°¤FÀ°§U§A¤F¸Ñ¤°»ò¬O³Ì¾A¦Xªº¸ê®Æ¦s¨ú¤èªk¡A¦Ò¼{§A»Ý­nªº¨s³º¬O°ªÆF¬¡«×ªº ( Â÷½u ) DataSet ª«¥ó¡A©Î¬O´£¨Ñ­ì©l®Ä¯àªº SqlDataReader ª«¥ó¡A ­þ¤@­Ó¤~¬O³Ì¾A¦X¦b business-to consumer (B2C) ºô¸ôÀ³¥Îµ{¦¡¤¤§@¸ê®Æ§e²{¡C ¹Ï 4 ®i¥Ü¥X¨â­Ó°ò¥»®×¨Ò¡C

ªþµù : SqlDataAdapter¥Î¨Ó¶ñ¤J¦b DataSet ¤º³¡¡A¥H¨Ï¥Î SqlDataReader ¨Ó¦s¨ú¸ê®Æ¡C

Figure 1.4. Multiple row data access scenarios

¹Ï 1.4. ¦h¦C¸ê®Æ¦s¨ú®×¨Ò

¤ñ¸û¥i¨Ñ¿ï¾Üªº¤è®×

·í§A·Q­n±q¸ê®Æ¨Ó·½Â^¨ú¥X¦h­Ó¸ê®Æ¦C¡AÁ`¦@¦³¥H¤U´XºØ¿ï¾Ü :

¨Ï¥Î SqlDataAdapterª«¥ó¨Ó²£¥Í DataSet ©Î¬O DataTable¡C

¨Ï¥Î SqlDataReader ¨Ó´£¨Ñ¤@­Ó°ßŪªº¡A ¶¶¦VÃþ«¬¸ê®Æ¬y¡C

¨Ï¥Î XmlReader t¨Ó´£¨Ñ¤@­Ó°ßŪªº¡A ¶¶¦VÃþ«¬XML¸ê®Æ¬y¡C

¦b SqlDataReader ©M DataSet/DataTable¤§¶¡ªº¿ï¾Ü¬O­Ó«Ü°ò¥»ªº ®Ä¯à¹ï¥\¯à©Êªº§à¾Ü¡C SqlDataReader ´£¨Ñ¤F³Ì¨Î®Ä¯à ; DataSet ´£¨Ñ¤FÃB¥~ªº¥\¯à¤ÎÅܰʩʡC

¸ê®ÆÃ´µ²

³o¤T­Óª«¥ó¹ï¸ê®ÆÃ´µ²±±¨î¶µ³£¦Ó¨¥³£¬O¸ê®Æ¨Ó·½¡A ÁöµM¥i¥H¥ÎDataSet ©M DataTable §@¬°¸ê®Æ¨Ó·½ªº±±¨î¶µ¡A¤ñ¥Î SqlDataReaderªº¦h ¡C ³o¬O¦]¬°DataSet ©M DataTable ¦³¹ê§@ IListSource ( ²£¥Í IList)¡A ¦Ó SqlDataReader ¬O¹ê§@ IEnumerable¡C¦Ó ³\¦hªº ¯à¨Ï¥Î¸ê®ÆÃ´µ²ªºWinForm ±±¨î¶µ³£»Ý­n¹ê§@ IListªº¸ê®Æ¨Ó·½¡C

³o¨âªÌ¶¡ªº®t²§¬O¦]¬°¦b³]­p®É©Ò¹w·Qªº¨Ï¥Î®×¨Ò«¬ºA´N¤£¦P¡C e DataSet ( ³o¬O¥]§t¤F DataTable) ¬O­Ó¦P®É¾A¥Îºô¸ô¸ò®à¤W«¬ ( WinForm ) ®×¨Òªº¤º®eÂ×´IªºÂ÷½u¬[ºc ¡C ¦Ó¥t¤@¤è­±¡A data reader «h¬O¥Î¨Ó¶i¦æºô¸ôÀ³¥Îµ{¦¡ªº³Ì¨Î¤ÆÁٻݭn³Ì¨Î¤Æ ¶¶¦VÃþ«¬ ¸ê®Æ¦s¨ú¡C

½T»{§A·Q­n¶i¦æ¸ê®ÆÃ´µ²ªº±±¨î¶µªº¸ê®Æ¨Ó·½»Ý¨D¡C

¦bÀ³¥Îµ{¦¡¼h¦¸¤¤¶Ç»¼¸ê®Æ

DataSet ´£¨Ñ¤F¸ê®ÆªºÃöÁp¦¡À˵øÁÙ¥i¥H¿ï¾Ü­n¦p¦P XML ¯ë¦a¾Þ§@¡A ¨Ã¥B¥i¥H¹ï¸ê®Æ§@Â÷½u§Ö¨ú½Æ»s¥H¥Î¨Ó¦b¦bÀ³¥Îµ{¦¡¼h¦¸¤Î¤¸¥ó¤¤¤¤¶Ç»¼¡CµM¦Ó¡ASqlDataReader´£¨Ñªº«h¬O³Ì¨Îªº®Ä¯à¦]¬°¥¦¥i¥HÁ×§K¬°¤F³Ð«ØDataSet©Ò³y¦¨ªº®Ä¯à»P°O¾ÐÅ骺®ö¶O¡C ÁÙ°O±o³Ð«ØDataSetª«¥ó·|³y¦¨³\¦h¤lª«¥óªº²£¥Í¶Ü ¡X ¥]¬A DataTable¡A DataRow¡AÁÙ¦³ DataColumn ª«¥ó ¡X ÁÙ¦³§@¬°³o¨Çª«¥óªº®e¾¹ªº¶°¦Xª«¥ó¡C

¨Ï¥Î DataSet

¦b¤U¦Cªºª¬ªp¤U¡A ¥ÎSqlDataAdapterª«¥ó¨Ó§ó·sDataSet :

§A»Ý­n¸ê®ÆªºÂ÷½u±`¾n«¬§Ö¨ú¡A¦nÅý§A¥i¥H¦bÀ³¥Îµ{¦¡¤¤±N¨ä¶Ç»¼¨ì¨ä¥Lªº¤¸¥ó©Î¼h¦¸¡C

§A»Ý­n¦b°O¾ÐÅ餺§@¥X¸ê®ÆªºÃöÁp¦¡À˵ø ¥H¶i¦æ XML ©Î¬O«D XMLªº¾Þ§@¡C

§A·Q³B²z¥Ñ¦hºØ¸ê®Æ¨Ó·½¡A¦p: ¦h­Ó¸ê®Æ®w¡A¸ê®Æªí¡A©ÎÀÉ®× Â^¨ú¥X¨Óªº¸ê®Æ

§A·Q¨Ï¥Î SqlDataAdapterªº§å¦¸§ó·s¥\¯à¨Ó§ó·sÂ^¨ú¥X¨Óªº¸ê®Æ¦C¡C

§A·Q­n¦b¸ê®Æ¨Ó·½¤W¤ä´© IListªº±±¨î¶µ¤W¶i¦æ¸ê®ÆÃ´µ²¡C

ªþµù : ¦pªG·Q­n§ó¸Ô²Óªº¸ê°T¡A½Ð¨ì MSDN ºô¯¸¾\Ū "Designing Data Tier Components and Passing Data Through Tiers" ºô§}¦p¤U http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnbda/html/BOAGag.asp¡C

§ó¦h¬ÛÃö¸ê°T

¦pªG§A¨Ï¥ÎSqlDataAdapter ¨Ó²£¥Í DataSet ©Î¬O DataTable¡A½Ðª`·N¥H¤U¨Æ¶µ:

§A¤£»Ý­n©ú½T¦a¶i¦æ¸ê®Æ®w³sµ²ªº¶}±Ò©ÎÃö³¬¡C SqlDataAdapter ªºFill ¤èªk·|¶}±Ò¸ê®Æ®w³sµ²¨Ã¦b¦^¶Ç«eÃö³¬¡C¦pªG³sµ²¤w¸g¶}±Ò¡A Fill´N·|Åý³sµ²Ä~Äò«O«ù¶}±Ò¡C

¦pªG§A¦]¬°¨ä¥Lªº»Ý¨D¦Ó­n¶i¦æ¸ê®Æ®w³sµ²¡A ½Ð¾¨¶q¨Ï¥Î Fill ¤èªk¡C¦]¬°³o¼Ë§A¥i¥HÁ×§K¤£¥²­nªº ¶}±Ò / Ãö³¬ ³sµ²ªº°Ê§@ ¤~¯àÀò±o¸û¦nªº®Ä¯à¡C

ÁöµM§A¥i¥H­«½Æ¨Ï¥Î¬Û¦Pªº SqlCommand ª«¥ó¥H¦h¦¸°õ¦æ¬Û¦Pªº©R¥O¡A¦ý½Ð¤£­n­«½Æ¨Ï¥Î¬Û¦Pªº SqlCommand ª«¥ó°õ¦æ¤£¦Pªº©R¥O¡C

¦pªG·Q¨ú±o¥Î SqlDataAdapter §ó·s DataSet ©Î DataTableªº½d¨Òµ{¦¡½X¡A½Ð°Ñ¾\ªþ¿ý¤¤ªº¦p¦ó¨Ï¥Î SqlDataAdapter ¨ÓÂ^¨ú¦h¦C¸ê®Æ ¡C

¨Ï¥Î SqlDataReader

¦b¤U¦Cªºª¬ªp¤U¡A ½Ð¨Ï¥ÎSqlCommand ª«¥ó©I¥s ExecuteReader ¤èªk¥HÀò±oSqlDataReaderª«¥ó :

§A­n³B²z«Ü¤j¶qªº¸ê®Æ Ȅ ¤j¦h¬O¦b¦P¤@­Ó§Ö¨ú¸Ì¡C

§A·Q´î¤ÖÀ³¥Îµ{¦¡¦û¥Îªº°O¾ÐÅé¡C

§A·QÁ×§K¦]¬°³Ð«Ø DataSetª«¥ó¦Ó³y¦¨ªº¸ê·½®ö¶O¡C

§A·Q­n¦b¸ê®Æ¨Ó·½¤W¹ê§@IEnumerableªº±±¨î¶µ¤W¶i¦æ¸ê®ÆÃ´µ²¡C¡C

§A§Æ±æ¯à±N¸ê®Æ¦s¨ú¦X²z¤Æ»P³Ì¨Î¤Æ¡C

§A©ÒŪ¨úªº¸ê®Æ¦C¥]§t¤G¶i¦ì¤j«¬ª«¥ó ( BLOB ) Äæ¦ì¡C §A¥i¥H¥Î SqlDataReader §â BLOB ¸ê®Æ±q¸ê®Æ®w²¾¦Ü¥iºÞ²z°Ï¶ô¡A¤£¥²¤@¦¸Åª¨ú¥þ³¡¸ê®Æ¡C ¦pªG·Qª¾¹D¦p¦ó³B²z BLOB ¸ê®Æ¡A ½Ð¸Ô¾\¥»¤å¤¤³B²z BLOB ³¹¸`¡C

§ó¦h¬ÛÃö¸ê°T

¦pªG§A¨Ï¥Î SqlDataReader¡A ½Ðª`·N¤U¦C¨Æ¶µ :

·í data reader ¦b§@¥Î®É¡A·|»P¸ê®Æ®w«O«ù³sµ²¡A¦Ó¥B¸Ó³sµ²¤]¤£¯àÂà§@¥¦¥Î¡C ©Ò¥H¤£»Ý§@¥Î®É¡A ½Ð¾¨§Ö©I¥sSqlDataReaderªºClose ¥HÃö³¬³sµ²¡C

¤@­Ó³sµ²¥u¦³¤@­Ó data reader¯à¥Î¡C

·í§Aµ²§ô data reader ®É¡A©Î¬O SqlDataReader ª«¥ó¤¤³s½uªº¥Í©R¶g´Á¤w¦Ü¡A´N·|ÂǥѶǰe CommandBehavior.CloseConnectionªº¦CÁ|¸ê®Æ«¬§O­È¨ì ExecuteReader ¤èªk¤¤¡A¦Ó±N¸ê®Æ®w³sµ²½T¹êÃö³¬¡C ³o·N¨ýµÛ¥u¦³¦b SqlDataReader Ãö³¬®É¡A³sµ²¤~·|Ãö³¬¡C

·í¨Ï¥Î reader ¨Ó¦s¨ú¸ê®Æ®É¡A¦pªGª¾¹D¸ê®Æ®w¤¤ªºÄæ¦ì¸ê®Æ«¬ºA¡A½Ð¨Ï¥Î«ü©w«¬§O¦s¨ú¤èªk ( ¦p : GetInt32 ©M GetString )¡A¦]¬°³o¼Ë¥i¥H¦³®Ä´î¤Ö³B²z«¬§OÂà´«°ÝÃDªº®É¶¡¡A´£°ªÅª¨ú®Ä²v ¡C

¬°¤FÁ×§KµL¥Îªº¸ê®Æ±q¦øªA¾¹¶Ç°e¨ì¥Î¤áºÝ¡A¦pªG§A·Q­nÃö³¬ reader ¨Ã©ñ±ó³Ñ¤Uªº¸ê®Æ¡A½Ð¦b©I¥s reader ªº Close ¤èªk«e¥ý©I¥s©R¥Oª«¥óªº Cancel ¤èªk¡CCancel ¥i¥H½T«O¦b¦øªA¾¹ºÝªº¸ê®Æ·|³Q±ó¸m¦Ó¥B¤£·|¦A¶Ç¿é¦h¾lªº¸ê®Æ¨ì¥Î¤áºÝ¡C ¬Û¹ï¦a¡A¦pªGª½±µ©I¥s Close «h·|³y¦¨ reader ¶Ç°e¦h¾lªº¸ê®Æ¡C

¦pªG§A·Q¨ú±o¹w¦sµ{§Çªº¿é¥Xµ²ªG©Î¬O¶Ç¦^­È¡A½Ð¨Ï¥Î SqlCommand ª«¥ó¤¤ªº ExecuteReader ¤èªk¡A ¦Ó¦b¨ú±o¿é¥Xµ²ªG©Î¶Ç¦^­È¤§«e½Ð¥ý©I¥s reader ¤Wªº Close ¤èªk¡C

¦pªG·QÂǥѽd¨Òµ{¦¡½X¨Ó¤F¸Ñ¦p¦ó¨Ï¥Î SqlDataReader¡A½Ð°Ñ¾\ªþ¿ý¤¤ªº¦p¦ó¨Ï¥Î SqlDataReader ¨ÓÂ^¨ú¦h¦C¸ê®Æ ¡C

¨Ï¥Î XmlReader

¦b¤U¦Cªºª¬ªp¤U¡A ½Ð¨Ï¥ÎSqlCommand ª«¥ó©I¥s ExecuteXmlReader ¤èªk¥HÀò±o¨Ï¥ÎXmlReader ª«¥ó :

§A·Q­n¥Î XML ªº¤è¦¡¨Ó³B²zÂ^¨ú¸ê®Æ¡A ¦ý§A¤£·Q¦]¬°³Ð«Ø DataSet ¦Ó³y¦¨®Ä¯à®ö¶O¤]¤£·Q¶i¦æ¸ê®ÆªºÂ÷½u§Ö¨ú¡C

§A·Qºë½T¨Ï¥Î SQL Server 2000 ªº FORXML ¤l¥y¡A ¨Ï±q¸ê®Æ®wÂ^¨ú¥X¨Óªº¸ê®Æ¥Î XML °Ï¶ô (´N¬O XML ¤å¥ó¨S¦³ root ¶µ¥Ø ) ¡C ¨Ò¦p¡A³o­Ó¤èªk¥i¥HÅý§Aºë·Ç¦a«ü©w¶µ¥Ø¦WºÙ¡A ©Ò¥HÀ³¸Ó¦³¶µ¥Ø©Î¬O attribute-centric ªºµ²ºc´y­z¡A ©Ò¥HÀ³¸Ó¦³µ²ºc´y­zÀ³¸Ó¥H XML ¸ê®Æªº®æ®É¦^¶Çµ¥µ¥¡C

§ó¦h¬ÛÃö¸ê°T

¦pªG§A¨Ï¥Î XmlReader¡A½Ðª`·N¥H¤U¨Æ¶µ :

·í§A¨Ï¥Î XmlReader Ū¨ú¸ê®Æ®É¡A·|»P¸ê®Æ®w«O«ù³sµ²¡C¦ÓSqlCommand ª«¥ó¤¤ªº ExecuteXmlReader²{¦b¨Ã¤£¤ä´© CommandBehavior.CloseConnection ªº¦CÁ|¸ê®Æ«¬§O­È¡A ©Ò¥H§A¥²¶·¦bµ²§ôreader¨Ï¥Î«e¡A¦Û¦æ¶i¦æClose¡C

¦pªG·QÂǥѽd¨Òµ{¦¡½X¨Ó¤F¸Ñ¦p¦ó¨Ï¥Î XmlReader¡A½Ð°Ñ¾\ªþ¿ý¤¤ªº¦p¦ó¨Ï¥Î XmlReader ¨ÓÂ^¨ú¦h¦C¸ê®Æ ¡C

Â^¨ú³æ¦C¸ê®Æ

¦b¦¹®×¨Ò¤¤¡A§A·Q±q¸ê®Æ¨Ó·½ªº¯S©wªº¸ê®ÆÄæ¦ì¶°¦X¤¤Â^¨ú³æ¦C¸ê®Æ¡CÁ|¨Ò¨Ó»¡¡A§A¦³¤@­ÓÅU«È ID µM«á§Æ±æ§ä¨ì¸ÓÅU«Èªº¬ÛÃö¸ê®Æ¡A©Î¬O§A¦³¤@­Ó²£«~ ID µM«á·QÂ^¨ú²£«~¸ê°T¡C

¤ñ¸û¥i¨Ñ¿ï¾Üªº¤è®×

¦pªG§A·Q±q¸ê®Æ®w¤¤Â^¨ú³æ¦C¸ê®Æ¡A§A¥i¥H¨Ï¥Î¤§«e°Q½×ªº ¦h¦C¸ê®ÆÂ^¨ú»P¾ã¦X®×¨Ò¤¤ªº°µªk¡A¥Î SqlDataAdapter ¨Ó§ó·s DataSet ©Î¬O DataTable ¡CµM¦Ó¡A°£«D§A¯S§O»Ý­n DataSet/DataTableªº¥\¯à¡A §_«hÀ³¸Ó¾¨¶qÁ×§K³Ð«Ø³o¨Çª«¥ó¡C

¦pªG§A·QÂ^¨ú³æ¦C¸ê®Æ¡A ½Ð©ó¤U¦C¤èªk¤¤¾Ü¤@¶i¦æ :

¨Ï¥Î¹w¦sµ{§Ç¿é¥X°Ñ¼Æ¡C

¨Ï¥Î SqlDataReader ª«¥ó¡C

¨âºØ¿ï¾Ü³£¯àÁ×§K¦]¬°¦b¦øªA¾¹¤W³Ð«Øµ²ªG¶°¥H¤Î¦b¥Î¤áºÝ¤W³Ð«Ø DataSet ª«¥ó¦Ó³y¦¨ªºµL¿×®Ä¯à®ö¶O¡C ¨âºØ¤èªkªº®Ä¯à¤ñ¸û°ò¥»¤W¬O¥Ñ¸ê®Æ®wªº­t²üµ{«×¥H¤Î¬O§_±Ò¥Î³sµ²¤½¥Î¨Ó¨M©w¡C·í¸ê®Æ®w¶}±Ò³sµ²¦@¥Î¨Ã¦b°ª­t²üµ{«×ª¬ºA¤U ( ¦³ 200 ­Ó³sµ²¦P®É¶i¦æ )¡A ®Ä¯à´ú¸ÕÃÒ©ú ¨Ï¥Î¹w¦sµ{§Çªº¤èªk¤ñ¨Ï¥Î SqlDataReader ´£°ª 30% ªº®Ä¯à ¡C

¨Ï¥Î¹w¦sµ{§Ç¿é¥X°Ñ¼Æ

·í§A·Q­n¦b±Ò¥Î³sµ²¦@¥Îªº¦h¼h¦¡À³¥Îµ{¦¡¤¤Â^¨ú³æ¦C¸ê®Æ¡A½Ð¨Ï¥Î¹w¦sµ{§Ç¿é¥X°Ñ¼Æ¡C

§ó¦h¬ÛÃö¸ê°T

¦pªG·QÂǥѽd¨Òµ{¦¡½X¨Ó¤F¸Ñ¦p¦ó¨Ï¥Î¹w¦sµ{§Ç¿é¥X°Ñ¼Æ¡A½Ð°Ñ¾\ªþ¿ý¤¤ªº¦p¦ó¨Ï¥Î¹w¦sµ{§Ç¿é¥X°Ñ¼Æ¨ÓÂ^¨ú³æ¦C¸ê®Æ ¡C

¨Ï¥Î SqlDataReader

¦b¤U¦Cªºª¬ªp¤U¡A ½Ð¨Ï¥ÎSqlDataReader :

§A»Ý­n¸ê®Æ­È¥H¥~ªº¤¤Ä~¸ê®Æ¡C§A¥i¥H¨Ï¥Î data reader ¤¤ªº GetSchemaTable ¨Ó¨ú±oÄæ¦ì¤¤Ä~¸ê®Æ¡C

§A¨S¦³¨Ï¥Î³sµ²¦@¥Î¡C¦b³sµ²¦@¥ÎÃö³¬ªº±¡ªp¤U¡A¤£½×¸ê®Æ®wªº­t²üª¬ªp¦p¦ó¡A¨Ï¥Î SqlDataReader ³£¬O¤@­Ó¦nªº¿ï¾Ü ; ¦b¤@¼Ë¦³ 200 ­Ó³s½uªºª¬ªp¤U¡A®Ä¯à´ú¸ÕÃÒ©ú³oºØ¤èªk·|¤ñ¨Ï¥Î¹w¦sµ{§Çªº¤èªk´£°ª 20% ªº®Ä¯à ¡C

§ó¦h¬ÛÃö¸ê°T

¦pªG§A¨Ï¥Î SqlDataReader¡A ½Ðª`·N¤U¦C¨Æ¶µ :

¦pªG§Aª¾¹D¬d¸ßµ²ªG¥u·|¬O³æ¦C¸ê®Æ¡A·í§A©I¥sSqlCommand ª«¥ó¤¤ªº ExecuteReader¤èªk®É¡A½Ð¨Ï¥Î CommandBehavior.SingleRow ªº¦CÁ|¸ê®Æ«¬§O­È¡C¤@¨Ç providers ¦p OLE DB .NET Data Provider ¥i¥H¨Ï¥Î³o­Ó³Z¬¨Ó¶i¦æ®Ä¯àªº³Ì¨Î¤Æ¡CÁ|¨Ò¨Ó»¡¡A³o­Ó provider ¨Ï¥Î IRow ¤¶­±¨Ó¨Ó°õ¦æ¸ê®ÆÃ´µ²¤@©w¬O¤ñ¨Ï¥Î IRowset¡C¢°¤£¹L³o­Ó°Ñ¼Æ¦b SQL Server .NET Data Provider ¤WµL®Ä¡C

¦pªG§Aªº SQL Server ©R¥O§t¦³¿é¥X°Ñ¼Æ¥H¤Î¦^¶Ç­È¡A ¦b DataReader Ãö³¬«e¬OµLªk¨ú±oªº¡C

·í§A¨Ï¥Î SqlDataReader ª«¥ó®É¡A¤@©w­n¥Î SqlDataReader ª«¥óªº«ü©w«¬§O¦s¨ú¤èªk¨ÓÂ^¨ú¿é¥X°Ñ¼Æ¡A¨Ò¦p GetString ©M GetDecimal¡C³o¥i¥HÁ×§KµL¿×ªº«¬§OÂà´«¡C

.NET Framework version 1.1 ¥]§t¤FÃB¥~ªº DataReader ÄݩʡA¦W¬° HasRows¡A³o¬O¥Î¨ÓÅý§A¦b DataReader Ū¨ú¸ê®Æ«e¨M©w¬O§_­n¶Ç¦^µ²ªG¡C

¦pªG·QÂǥѽd¨Òµ{¦¡½X¨Ó¤F¸Ñ¦p¦ó¨Ï¥Î SqlDataReader ª«¥ó¥HÂ^¨ú³æ¦C¸ê®Æ¡A½Ð°Ñ¾\ªþ¿ý¤¤ªº¦p¦ó¨Ï¥Î SqlDataReader ¨ÓÂ^¨ú³æ¦C¸ê®Æ¡C

Â^¨ú³æ¤@¶µ¥Ø

¦b¦¹®×¨Ò¤¤¡A§A·Q­nÂ^¨ú¸ê®Æ¤¤ªº³æ¤@¶µ¥Ø¡CÁ|¨Ò¨Ó»¡¡A§A¤]³\·|·Q¥Î²£«~ ID ¬d§ä³æ¤@²£«~ªº¦WºÙ¡A©Î¬O¬Y¦ìÅU«Èªº«H¥Îµ{«×¡A©Î¬O¬Y¦ìÅU«Èªº©m¦W¡C³o¼Ëªº®×¨Ò¤¤¡A³q±`¤£·|·Q¥Î DataSet ©Î¬O DataTable¡C

§A¤]¥i¯à³æ¯Â¦a¥u¬O·Q½T»{¬Y­Ó¸ê®Æ¦æ¬O§_¦s¦b©ó¸ê®Æ®w¤¤¡CÁ|¨Ò¨Ó»¡¡A·í·sªº¨Ï¥ÎªÌ¦bºô¯¸¤Wµù¥U®É¡A§A»Ý­n¥h½T»{¥L©Ò¿ï©wªº¨Ï¥ÎªÌ¦WºÙ¬O§_¤w¸g¦s¦b¡C³o¬O¤@ºØ³æ¤@¶µ¥Ø¬d§äªº¯S¨Ò¡A¦ý¦b³oºØª¬ªp¤U¦^¶Ç­È¥u»Ý­n¬O¤@­Ó¥¬ªL­È¡C

¤ñ¸û¥i¨Ñ¿ï¾Üªº¤è®×

·í§A·Q­nÂ^¨ú¸ê®Æ¤¤ªº³æ¤@¶µ¥Ø®É¡A½Ð¦Ò¼{¥H¤U¤è®× :

¨Ï¥Î SqlCommand ª«¥ó¤¤ªº ExecuteScalar ¤èªk¥H¤Î¹w¦sµ{§Ç¡C

¨Ï¥Î¹w¦sµ{§Ç¿é¥X©Î¦^¶Ç°Ñ¼Æ¡C

¨Ï¥Î SqlDataReader ª«¥ó¡C

ExecuteScalar ¤èªk·|ª½±µ¦^¶Ç¸ê®Æ¶µ¥Ø¡A¦]¬°¥¦¥»¨Ó´N¬O¬°¤F¥u¦^¶Ç³æ¤@¸ê®Æ­Èªº¬d¸ß¦Ó³]­p¡C¥¦©Ò»Ý­nªºµ{¦¡½X¤ñ¨ä¥Lªº¨â­Ó¤èªk³£­n¤Ö¡C

´N®Ä¯àªºÆ[ÂI¦Ó½×¡A§AÀ³¸Ó¨Ï¥Î¨Ï¥Î¹w¦sµ{§Ç¿é¥X©Î¦^¶Ç°Ñ¼Æ¡C¦]¬°´ú¸Õµ²ªGÃÒ©ú¡A¨Ï¥Î¹w¦sµ{§Çªº¤èªk¤£½×¸ê®Æ®w¬O¦b§C'­t²üª¬ºA©Î°ª­t²üª¬ºA( ±q¤Ö©ó100­Ó³sµ²¨ì200­Ó³sµ² ) ¡A®Ä¯à³£Åܰʤ£¤j ¡C

§ó¦h¬ÛÃö¸ê°T

Â^¨ú¸ê®Æ¤¤ªº³æ¤@¶µ¥Ø®É¡A ½Ðª`·N¤U¦C¨Æ¶µ:

I¦pªG¬d¸ß¥¿±`¦^¶Ç½Æ¼Æ­ÓÄæ¦ì©Î¸ê®Æ¦C¡A³z¹L ExecuteQuery °õ¦æ¥u·|¦^¶Ç¤@­ÓÄæ¦ì©Î¸ê®Æ¦C¡C

¦pªG·QÂǥѽd¨Òµ{¦¡½X¨Ó¤F¸Ñ¦p¦ó¨Ï¥Î ExecuteScalar¡A½Ð°Ñ¾\ªþ¿ý¤¤ªº¦p¦ó¨Ï¥Î ExecuteScalar ¨ÓÂ^¨ú³æ¤@¶µ¥Ø¡C

¦pªG·QÂǥѽd¨Òµ{¦¡½X¨Ó¤F¸Ñ¦p¦ó¨Ï¥Î¨Ï¥Î¹w¦sµ{§Ç¿é¥X©Î¦^¶Ç°Ñ¼Æ¥HÂ^¨ú³æ¤@¶µ¥Ø¡A ½Ð°Ñ¾\ªþ¿ý¤¤ªº¦p¦ó¨Ï¥Î ¹w¦sµ{§Ç¿é¥X©Î¬O¦^¶Ç°Ñ¼Æ¨ÓÂ^¨ú³æ¤@¶µ¥Ø ¡C

¦pªG·QÂǥѽd¨Òµ{¦¡½X¨Ó¤F¸Ñ¦p¦ó¨Ï¥Î SqlDataReader ª«¥ó¨ÓÂ^¨ú³æ¤@¶µ¥Ø¡A ½Ð°Ñ¾\ªþ¿ý¤¤ªº¦p¦ó¨Ï¥Î SqlDataReader ¨ÓÂ^¨ú³æ¤@¶µ¥Ø ¡C

¦^¨ì­¶­º¦^¨ì­¶­º

³z¹L¨¾¤õÀð³sµ²

§A±N±`±`»Ý­n³]©wºô»Úºô¸ôÀ³¥Îµ{¦¡¥H³z¹L¨¾¤õÀð³sµ² SQL Server ¡C Á|¨Ò¨Ó»¡¡A³\¦hºô¸ôÀ³¥Îµ{¦¡¦³¤@­Ó­«­nªº¬[ºc¤¸¥ó¡A¦Ó¥¦­Ìªº¨¾¤õÀð¬O©PÃäºô¸ô ( ¤]³QºÙ§@ DMZ ©Î¬O «D­x¨Æ°Ï°ì )¡A¨ä¥\¥Î¬O¹jÂ÷«eºÝºô­¶¦øªA¾¹¸ò¤º³¡ºô¸ô¡C

³z¹L¨¾¤õÀð³sµ² SQL Server »Ý­n¹ï¨¾¤õÀð¡A¥Î¤áºÝ¡A¥H¤Î¦øªA¾¹¶i¦æ¯S§Oªº³]©wr¡CSQL Server ¯S§O´£¨Ñ¤F ¥Î¤áºÝºô¸ô¤½¥Îµ{¦¡©M¦øªA¾¹ºô¸ô¤½¥Îµ{¦¡¥Î¨Ó¶i¦æ³]©w¡C

¿ï¾Üºô¸ô¨ç¦¡®w

³z¹L¨¾¤õÀð³sµ² SQL Server®É¡A¨Ï¥Î SQL Server TCP/IP ºô¸ô¨ç¦¡®w¥i¥H²¤Æ³]©w¤u§@¡C¦b SQL Server 2000 ¤¤¦w¸Ë®É´N¹w³]¦n¤F¡C¦pªG§A¨Ï¥Îªº¬O¤§«eª©¥»ªº SQL Server¡A½T»{§A¥i¥H¨Ï¥Î¥Î¤áºÝºô¸ô¤½¥Îµ{¦¡©M¦øªA¾¹ºô¸ô¤½¥Îµ{¦¡¡A³z¹L¥Î¤áºÝ¤Î¦øªA¾¹ºÝªººô¸ô¨ç¦¡®w¡A³]©w TCP/IP¡C

°£¤F³]©w¤Wªº¤è«K¥~¡A¨Ï¥Î TCP/IP ¨ç¦¡®wÁÙ¦³¥H¤Uªº¦n³B :

³B²z¤j¶q¸ê®Æªº®Ä¯à´£¤É¥H¤Î¼W¥[¤F©µ®i©Ê¡C

¤£¥Î³B²zÃö©ó¨ã¦WºÞ¹Dªº¦w¥þ©Ê°ÝÃD ¡C

§A¥²¶·¶i¦æ¥Î¤áºÝ¸ò¦øªA¾¹ªº TCP/IP ³]©w¡C¦]¬°¤j³¡¤Àªº¨¾¤õÀð ³£·|­­¨î¥i¥Î¨Ó§@¬°ºô¸ô¬y³qªº³s±µ°ð¡A§A¤]¥²¶·ÂÔ·V«ä¦Ò SQL Server ­n¨Ï¥Îªº³s±µ°ð¡C

SQL Serverªº¹w³]¬O¨Ï¥Î³s±µ°ð 1433¡CUDP ³s±µ°ð 1434 ¤]¥i¥H¥Î¨ÓÅý SQL ¥Î¤áºÝ¦b°Ï°ìºô¸ô¤º³sµ² SQL servers ¡CµM¦Ó¡A¹ê»Ú°õ¦æ SQL Server 2000®É ¡A¥i¥H¦b­è±Ò°Ê®É°ÊºA«ü©w³s±µ°ð¡C§Aªººô¸ôºÞ²z­û¤j·§¤£·|µªÀ³¦b¨¾¤õÀ𤤥´¶}¬Y­Ó½d³òªº³s±µ°ð ; ¦]¦¹¡A·í§A¦P®É¨Ï¥Î SQL Server »P¨¾¤õÀð®É¡A­n¨Ï¥Î¦øªA¾¹ºô¸ô¤½¥Îµ{¦¡¨Ó³o³]©w±M¥Îªºt³s±µ°ð¡C§Aªººô¸ôºÞ²z­û´N¥i¥H³]©w¨¾¤õÀ𠤹³\¯S©wªº IP ©M ³s±µ°ð ¶i¦æºô¸ô¶Ç¿é¡C

ªþµù : ¥Î¤áºÝºô¸ôÀ³¥Îµ{¦¡©Ò¨Ï¥Î°ÊºA«ü©w³s±µ°ð¡A³q±`¬O±q 1024 - 5000¡C³o¬O¼Ð·Çªº TCP/IP ¥Î¤áÀ³¥Îµ{¦¡¡A¦ý³o¤]·N¨ýªÌ§Aªº¨¾¤õÀ𥲶·¤¹³\³o»ò¤j½d³òªº³s±µ°ð¨Ï¥Î¡C¦pªG·Q¨ú±o§ó¦hÃö©ó SQL Server ¨Ï¥Îªº³s±µ°ð¸ê°T¡A½Ð°Ñ¾\ Microsoft Knowledge Base article 287932¡AÂI¿ï¥k¤è³sµ²¶i¤J "INF: TCP Ports Needed for Communication to SQL Server Through a Firewall¡C"

©R¦W°õ¦æ­ÓÅ骺°ÊºA±´¯Á

¦pªG§A§ïÅܤF SQL Server ³s±µ°ð¡A³]©w§Aªº¥Î¤áºÝ³z¹L¸Ó³s±µ°ð¶i¦æ³sµ²¡C Ãö©ó¨ä¤¤²Ó¸`¡A ½Ð°Ñ¾\¥»¤å¤¤ªº³]©w¥Î¤áºÝ³¹¸` ¡C

¦pªG§A§ïÅܤF SQL Server 2000 ªº¹w³]°õ¦æ­ÓÅ骺³s±µ°ð¡A¨S¦³­×§ï¥Î¤áºÝ³]©w±N·|³y¦¨³sµ²¿ù»~¡C¦pªG§A¦³¦h­Ó SQL Server °õ¦æ­ÓÅé¡A ³Ì·sª©ªº MDAC ¸ê®Æ¦s¨ú°ïÅ| ( 2.6 ) ¥i¥Î°ÊºA±´¯Á¨Ã¥B¨Ï¥Î User Datagram Protocol (UDP) negotiation ( ³z¹LUDP ³s±µ°ð 1434 ) ¨Ó§ä¨ì©R¦W°õ¦æ­ÓÅé¡CÁöµM³o¦b¶}µoÀô¹Ò¤¤¬O¥i¦æªº¡A ¦ý¦b¥Í¬¡Àô¹Ò¤¤À³¸Ó¤£¤j¥i¯à¡A¦]¬°¨¾¤õÀð³q±`³£¬O«ÊÂê UDP negotiation ªº¶Ç¿é¡C

¬°¤FÁ×¶}³o­Ó°ÝÃD¡A¥u¯à³]©w§Aªº¥Î¤áºÝ¥Î¥Ø¼Ð©Ò¶}©ñªº³s±µ°ð³sµ²¡C

³]©w¥Î¤áºÝ

§AÀ³¸Ó¥¿½T³]©w¥Î¤áºÝ¥H¨Ï¥Î TCP/IP ºô¸ô¨ç¦¡®w¨Ó³sµ² SQLServer¡A¦Ó¥B§AÀ³¸Ó½T»{¥Î¤áºÝ¦³³]©w¥¿½Tªº³s±µ°ð¨Ó³sµ²¡C

¨Ï¥Î SQL Server ¥Î¤áºÝºô¸ô¤½¥Îµ{¦¡¨Ó¶i¦æ¥Î¤áºÝ³]©w¡C¦³ªº®É­Ô¡A³o­Ó¤½¥Îµ{¦¡¨Ã¨S¦³¦w¸Ë¦b¥Î¤áºÝ (¨Ò¦p¡A§Aªººô­¶¦øªA¾¹ )¡C¦b³oºØª¬ªp¤U¡A§A¥i¥H¨Ï¥Î¤U¦C¤èªk :

¦b³sµ²¦r¦ê¤¤¡A¨Ï¥Î "Network Library=dbmssocn" ³o¼Ëªº¦WºÙ­È²Õ¡A¨Ó«ü©w©Ò¨Ï¥Îªººô¸ô¨ç¦¡®w¡C ÃöÁä¦r"dbmssocn" ´N¬O¥Î¨ÓÃѧO TCP/IP (sockets) ¨ç¦¡®wªº¡C

ªþµù : ¨Ï¥Î SQL Server .NET Data Provider ®É¡Aºô¸ô¨ç¦¡®wªº¹w³]­È¬O "dbmssocn"¡C

­×§ï¥Î¤áºÝ¤¤ªº¨t²Îµn¿ýÀÉ¡AÅý TCP/IP ¦¨¬°¹w³]¨ç¦¡®w¡C ¦pªG·Q¨ú±o§ó¦hÃö©ó³]©w SQL Server ºô¸ô¨ç¦¡®wªº¸ê°T¡A ½Ð¦Ü¥H¤Uºô§} HOWTO: Change SQL Server Default Network Library Without Using Client Network Utility (Q250550)¡C

«ü©w³s±µ°ð

¦pªG§Aªº SQL Server ªº°õ¦æ­ÓÅ餣¬O¨Ï¥Î¹w³]ªº 1433 ³s±µ°ð¡A§A¥i¥H¥Î¤U¦C¤èªk«ü©w³sµ²¥Îªº³s±µ°ð :

¨Ï¥Î¥Î¤áºÝºô¸ô¤½¥Îµ{¦¡¡C

¨Ï¥Î¦b³sµ²¦r¦ê¤¤ "Server" ©Î¬O "Data Source" ªº¦WºÙ­È²Õ¡A¨Ó«ü©w³s±µ°ð¡C¦r¦êªº®æ¦¡¦p¤U :"Data Source=ServerName¡A PortNumber"

ªþµù : ServerName ¤]¥i¥H¬O IP ¦ì§}©Î¬O Domain Name System (DNS) ©Òµ¹ªº¦WºÙ¡C ´N®Ä¯àªº³Ì¨Î¤Æ¦Ó¨¥¡AÀ³¸Ó­n¨Ï¥Î IP ¦ì§}¥HÁ×§K DNS ªº¬d§ä¡C

¦pªG§A¦³¶}µo¹LªA°È¤¸¥ó¨Ï¥Î COM+ ¤À´²¦¡¥æ©ö ¸ò Microsoft Distributed Transaction Coordinator (DTC) ªºªA°È¡A§A¤]»Ý­n³]©w§Aªº¨¾¤õÀð¦nÅý DTC ªº¤£¦P¹êÅé¶¡¡A¥H¤Î DTC ¸ò¸ê·½ºÞ²zªÌ¦p SQL Server ¶¡¡A¥i¥H¤¬¬Û¶Ç¿é¡C

¦p·Q¨ú±o§ó¦hÃö©ó¶}±Ò³s±µ°ð¥H¨Ñ DTC ¨Ï¥Îªº¬ÛÃö¸ê°T¡A½Ð¦Ü¥H¤Uºô§} INFO: Configuring Microsoft Distributed Transaction Coordinator (DTC) to Work Through a Firewall¡C

¦^¨ì­¶­º¦^¨ì­¶­º

³B²z BLOB

·í¤µ¡A³\¦hÀ³¥Îµ{¦¡°£¤F¶Ç²Îªº¦r¤¸¤Î¼Æ¾Ú¸ê®Æ¤§¥~¡AÁٻݭn³B²z¸ê®Æ®æ¦¡¡A¹³¬O¹Ï§Î©MÁn­µ¡A ¬Æ¦Ü¬O§óºë½oªº¸ê®Æ®æ¦¡¡A¦p¼v¹³¤@Ãþªº¡C³o¨Ç¹Ï§Î¡AÁn­µ¡A¥H¤Î¼v¹³ªº®æ¦¡¦³µÛ¦hºØ¤£¦Pªº«¬§O¡CµM¦Ó¡A±qÀx¦sªº¨¤«×¨Ó¬Ý¡A³o¨Ç³q³q¥i¥H³Qµø¬°¤G¶i¦ì¸ê®Æ¡A³q±`³QºÙ¬°¤G¶i¦ì¤j«¬ª«¥ó¡A©Î¬O BLOB¡C

SQL Server ´£¨Ñ¤F binary¡A varbinary¡A ©M image ¸ê®Æ«¬§O¨ÓÀx¦s BLOB¡CºÉºÞ¥¦À³¸Ó¬O¤G¶i¦ì¸ê®Æ¡A¤£¹L BLOB ¸ê®Æ¤]¥i¥H³Qµø¬°¤å¦r¸ê®Æ¡CÁ|¨Ò¨Ó»¡¡A§A¤]³\·|·Q­n¤@­Ó¥i¥HÀx¦s¥ô·Nªø«×ªºµ§°OÄæ¦ì¨Ã¥B¥Î¬Y­Ó¯S©w¸ê®Æ¦C¨Ó»P¨äÁpô¡CSQL Server ´£¨Ñ¤Fntext ©M text ¸ê®Æ«¬§O¨Ó¹F¦¨³o­Ó¥Øªº¡C

¤@¯ë¦Ó¨¥¡A·í¤G¶i¦ì¸ê®Æ¤p©ó 8 KB¡A¨Ï¥Î varbinary¡C¶W¹L³o­Ó¤j¤pªº¤G¶i¦ì¸ê®Æ¡A¨Ï¥Î image¡Cªí­Ó 2 ¼Ð©ú¤F¨C­Ó«¬§Oªº¥D­n¯S¦â¡C

ªí®æ 2¡C Data Type Features

¸ê®Æ«¬§O¤j¤p´y­z

binary

±q 1 byte ¨ì 8¡A000 bytes¡C Àx¦s®Éªº¤j¤p¬O«ü©wªø«×¦A¥[ 4 bytes¡C

©T©wªø«×ªº¤G¶i¦ì¸ê®Æ

varbinary

±q 1 byte ¨ì 8000 bytes¡C Àx¦s®Éªº¤j¤p¬O¸ê®Æªº¹ê»Úªø«×¦A¥[ 4 bytes¡C

ªø«×¤£©wªº¤G¶i¦ì¸ê®Æ

image

ªø«×¤£©wªº¤G¶i¦ì¸ê®Æ¡A¤j¤p±q 0 ¨ì 2 GB¡C

¤j³W¼Ò¡Aªø«×¤£©wªº¤G¶i¦ì¸ê®Æ

text

ªø«×¤£©wªº¤G¶i¦ì¸ê®Æ¡A¤j¤p±q 0 ¨ì 2 GB¡C

¦r¤¸¸ê®Æ

ntext

ªø«×¤£©wªº¤G¶i¦ì¸ê®Æ¡A¤j¤p±q 0 ¨ì 2 GB¡C

Unicode ¦r¤¸¸ê®Æ

ªþµù : ®Microsoft SQL Server 2000 ¤ä´©¦b¸ê®Æ¦C¤¤Àx¦s¤p«¬¨ì¤¤«¬ªº text¡Antext ©M image ªº¸ê®Æ­È¡C³o¶µ¥\¯à¦b¸ê®Æªíªº text¡A ntext¥H¤Î image ¸ê®ÆÄæ¦ì³£¬O¤@¦¸¥H¤@³æ¦ì¶i¦æÅª¼g¦Ó¥B¤j³¡¤À¦b¦¹¸ê®Æªí°õ¦æªº±Ô­z³£·|¨Ï¥Î¦¹¤T«¬§Oªº®É­Ô¡A¬Û·í¦a¦³¥Î¡C ±z¥i¥H¦b SQL Server ½u¤W»¡©ú¤å¥ó¤¤ªº "text in row" ¶µ¥Ø¤U¡A§ä¨ì§ó²M·¡ªº¸ê°T¡C

BLOB ¸ê®ÆÀ³¸Ó¦s©ñ¦b¦ó³B

SQL Server 7.0 ¤Î¤§«áªºª©¥»´£°ª¤F³B²z¸ê®Æ®w¤¤BLOB ¸ê®Æªº®Ä¯à¡C³o¼Ë°µªº²z¥Ñ¤§¤@¬O¦]¬°¸ê®Æ®wªº¤À­¶ÀɼW¤j¬° 8 KB¡C ¦]¦¹¡A¤å¦r©Î¹Ï¤ù¸ê®Æ¤p©ó 8 KB ªº¤£»Ý­n±N¨äÀx¦s¦b¤£¦P¤À­¶¤¤¡A ¦Ó¬O¥i¥HÀx¦s¦b³æ¤@¸ê®Æ¦C¤¤¡C³o·N¨ýµÛŪ¼g text¡A ntext¡A©Î image¸ê®Æ¥i¥H¸òŪ¼g¦r¤¸¸ò¤G¶i¦ì¦r¦ê¤@¼Ë§Ö¡C ¶W¹L 8 KBªº¸Ü¡A «h¬O¦b¸ê®Æ¦C¤¤¦s¤J«ü¼Ð¡A¦Ó¹ê»Ú¸ê®Æ¦s©ñ¦b¤G¤¸¾ðµ²ºcªº¤£¦P¤À­¶Àɤ¤¡A·íµM³o¥²µM·|³y¦¨®Ä¯à¤Wªº¼vÅT¡C

¦pªG·Qª¾¹D§ó¦hÃö©ó±N text¡A ntext¥H¤Îimage¸ê®Æ¦s¤J³æ¤@¸ê®Æ¦Cªº¬ÛÃö¸ê°T ¡A½Ð°Ñ¦Ò SQL Server½u¤W»¡©ú¤å¥óªº "Using Text and Image Data" ¥DÃD¡C

¤@­Ó³q±`¥Î¨Ó³B²z BLOB ¸ê®Æªº¤èªk¬O±N BLOB ¸ê®Æ¦s©ñ¦bÀɮרt²Î¤¤¡AµM«á¦b¸ê®Æ®wÄæ¦ì¤¤¬ö¿ý©Ò¦s©ñÀɮתº«ü¼Ð (³Ì¦n¬O¥Î Uniform Resource Locator [URL] ³sµ² ) ¡C¦b SQL Server 7.0 ¥H«eªºª©¥»¡A ±N BLOB ¦s©ñ¦b¸ê®Æ®w¥~³¡ªºÀɮרt²Î¤¤¥i¥H§ïµ½®Ä¯à ¡C

µM¦Ó¡A¦b SQL Server 2000 ¤¤§ïµ½¤F¹ï BLOB ªº¤ä´©©Ê¡A¥[¤W ADO.NET ¤ä´©Åª¼g BLOB ¸ê®Æ¡A Åýª½±µ§â BLOB ¸ê®ÆÀx¦s¦b¸ê®Æ®w¤¤¦¨¬°¥i¦æ¤è®×¡C

BLOB ¸ê®ÆÀx¦s¦b¸ê®Æ®wªºÀuÂI

BLOB ¸ê®ÆÀx¦s¦b¸ê®Æ®w¤¤·|¦³¤U¦Cªº´X¶µÀuÂI :

¦b¸ê®Æ¦C¤¤¶i¦æ BLOB ¸ê®Æ»P¨ä¥L¶µ¥Øªº¦P¨B¤ñ¸û®e©ö¡C

BLOB ¥i¥H¥Î¸ê®Æ®w³Æ¤À¡C ¥u¨Ï¥Î¤@­ÓÀx¦s¨t²Î¥i¥H´î»´ºÞ²z¤Wªº­t¾á¡C

¥i¥H³z¹L SQL Server 2000¤¤ ©Ò¤ä´© XML ¨Óª½±µ¦s¨úBLOB ¸ê®Æ¡CSQL Server 2000 ¥i¥H¥Î XML ¸ê®Æ¬y¦^¶Ç 64 ¦ì¤¸½s½X¸ê®Æ¡C

SQL Server Full Text Search (FTS) ¾Þ§@¥i¥H¥Î¨Ó·j´MÄæ¦ì¤¤ªº©T©wªø«×¦r¤¸ ( ¥]¬A Unicode ) ¸ê®Æ¡C §A¤]¥i¥H¦b image Äæ¦ì¤¤¨Ï¥Î FTS ¨Ó§ä½s½X«áªº¤å¦r¸ê®Æ¡C¨Ò¦p¡AMicrosoft Word ©Î¬O Microsoft Excel ¤å¥ó¡C

BLOB ¸ê®ÆÀx¦s¦b¸ê®Æ®wªºÀuÂIªº¯ÊÂI

¥J²Ó«ä¦Ò¤°»ò¼Ëªº¸ê·½À³¸Ó¬OÀx¦s¦bÀɮרt²Î¤¤¤ñÀx¦s¦b¸ê®Æ®w¤¤¦n¡C³Ì¦nªº¨Ò¤l´N¬O¹Ï¤ù¡A³q±`¬O¥Î HTTP HREF ¨Ó§@¬°¦ì¸m°Ñ¦Òªº¡C³o¬O¦]¬°:

±q¸ê®Æ®w¤¤Â^¨ú¹Ï¤ùµ´¹ï¬O¤ñ±qÀɮרt²Î¤¤Â^¨ú¨Ó±o¯Ó¶O¸ê·½¡C

¸ê®Æ®w SAN ¤WªººÏºÐÀx¦s¸Ë¸m³q±`¬O¤ñºô­¶¦øªA¾¹ªººÏºÐÀx¦s­n¨Ó±o¶Q¡C

ªþµù : ¤@­Óºë¤ßµ¦¹ºªº¤¤Ä~¸ê®Æµ¦²¤¥i¥H°£¥h±N¸ê·½¦p : ¹Ï¤ù¡A¹q¼v¡A Microsoft Office ¤å¥ó ¦s¤J¸ê®Æ®wªº»Ý¨D¡C¤¤Ä~¸ê®Æ¬O¥i¥H¯Á¤Þ¤ÆªºÁÙ¥]§t¹ïÀɮרt²Î¤W¸ê·½ªº«ü¼Ð¡C

±N BLOB ¸ê®Æ¼g¤J¸ê®Æ®w

¤U¦Cµ{¦¡½X¥Ü½d¤F¦p¦ó¨Ï¥Î ADO.NET ±NÀɮפ¤ªº¤G¶i¦ì¸ê®Æ¼g¤J SQL Server ¤¤ªº image Äæ¦ì¡C

public void StorePicture( string filename )
{
  // Read the file into a byte array
  using(FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read))
  {
    byte[] imageData = new Byte[fs.Length];
    fs.Read( imageData, 0, (int)fs.Length );
  }

  using( SqlConnection conn = new SqlConnection(connectionString) )
  {
    SqlCommand cmd = new SqlCommand("StorePicture", conn);
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.Add("@filename", filename );
    cmd.Parameters["@filename"].Direction = ParameterDirection.Input;
    cmd.Parameters.Add("@blobdata", SqlDbType.Image);
    cmd.Parameters["@blobdata"].Direction = ParameterDirection.Input;
    // Store the byte array within the image field
    cmd.Parameters["@blobdata"].Value = imageData;
    conn.Open();
    cmd.ExecuteNonQuery();
  }
}
  

±N BLOB ¸ê®Æ±q¸ê®Æ®wŪ¥X

·í§Ú­Ì³z¹L ExecuteReader ¤èªk¡A¨Ï¥Î CommandBehavior.SequentialAccess ¦CÁ|«¬§O­È¡A¨Ó³Ð«Ø SqlDataReader ª«¥ó¥HŪ¨ú§t¦³ BLOB ¸ê®Æªº¸ê®Æ¦C¡C ¦pªG¤£¥Î¦CÁ|«¬§O­È¡Areader ·|¥Ñ¦øªA¾¹¤@¦¸¨ú¤@¦C¸ê®Æ¨ì¥Î¤áºÝ¡C ¦pªG¸ê®Æ¦C¤¤¦³ BLOB Äæ¦ì¡A³o«Ü¥i¯à·|¦û¥Î¤j¶qªº°O¾ÐÅéªÅ¶¡¡CÂǥѨϥΦCÁ|«¬§O­È¡A§A¥i¥H¶i¦æ¸û¨Îªº¶¥¼h±±¨î¡A¦]¬° BLOB ¸ê®Æ±N¥u¦³¦b¨Ï¥Î¨ì®É¤~·|¸ü¤J ( Á|¨Ò¨Ó»¡¡A ÂǥѨϥΠGetBytes ¤èªk¡A§A¥i¥H±±¨î¨C¦¸Åª¨úªº Bytes ¼Æ¥Ø )¡C³o±N¦b¤U¦Cªºµ{¦¡½X°Ï¶ô¤¤¥Ü½d¡C

// Assume previously established command and connection
// The command SELECTs the IMAGE column from the table
conn.Open();
using(SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess))
{
  reader.Read();
  // Get size of image data?#8364;¡§pass null as the byte array parameter
  long bytesize = reader.GetBytes(0, 0, null, 0, 0);
  // Allocate byte array to hold image data
  byte[] imageData = new byte[bytesize];
  long bytesread = 0;
  int curpos = 0;
  while (bytesread < bytesize)
  {
    // chunkSize is an arbitrary application defined value 
    bytesread += reader.GetBytes(0, curpos, imageData, curpos, chunkSize);
    curpos += chunkSize;
  }
}
// byte array 'imageData' now contains BLOB from database
  

ªþµù : ¨Ï¥Î CommandBehavior.SequentialAccess §A¥²¶·­n«ö·ÓÄY®æ§Ç¦C¶¶§Ç¨Ó¦s¨úÄæ¦ì¸ê®Æ¡CÁ|¨Ò¨Ó»¡¡A¦pªG BLOB ¸ê®Æ¦bÄæ¦ì 3¡A¦Ó§A¤]»Ý­nÄæ¦ì 1 ¸òÄæ¦ì 2 ªº¸ê®Æ¡A§A¦bŪ¨úÄæ¦ì 3 ¤§«e¤@©w±o¥ýŪ¨úÄæ¦ì1 ¸ò 2¡C

¦^¨ì­¶­º¦^¨ì­¶­º

¥Î DataSet ¨Ó¶i¦æ¸ê®Æ®w§ó·s

¸ê®Æ®w§ó·sªº¬[ºcÀHµÛ ADO.NET ªº°Ý¥@¦Ó¦³¤F­«¤jÅÜ­²¡CADO.NET ¬O³]­p¥X¨ÓÀ°§U¶}µo¥i¥HÅý¤j¶q¥Î¤á¤Î¤j«¬¸ê®Æ®w¨Ï¥Îªº¦h¼h¦¡À³¥Îµ{¦¡¡C¦Ó¦b³o¤è­±¦³¨Ç­È±oª`·Nªº­«ÂI¡A¯S§O¬O:

ADO.NET À³¥Îµ{¦¡³q±`¬O±N¥Î¤áºÝªºÀ³¥Îµ{¦¡ÅÞ¿è¤À¶}¡A§â°Ó°È³¡¤À¥æ¥Ñ¤¤¥¡¼h¡A¸ê®Æ¾ã¦X­pºâ³¡¤À¥æ¥Ñ¸ê®Æ®w¼h¡C ¦b¹ê¥Î­±¨Ó»¡¡A³o¼ËªºÀ³¥Îµ{¦¡À³¸Ó·|¦³¸û¦hªº§å¦¸¤u§@¦Ó¬Û¹ïªº»P¸ê®Æ®w¤¬°Êªº¦¸¼ÆÅܤÖ( ¦ý³W¼Ò¸û¤j )¡C

ADO.NET À³¥Îµ{¦¡¹ï§ó·s ¦p¦ó ¶i¦æ¦³§óºë·Çªº±±¨î ( ¸ò ADO ¥H¤Î¤§«eªº²£«~¬Û¸û¤§¤U ) ¡C

ADO.NET ¤¹³\À³¥Îµ{¦¡³z¹L«á¥x¸ê®Æ®wªº¹w¦sµ{§Ç¨Ó¶Ç»¼¸ê®ÆÅܤơA¦Ó¤£¬Oª½±µ¾Þ§@¸ê®Æªí¤¤ªº¸ê®Æ¦C¡C³o¬O±ÀÂ˨ϥΪº¤èªk¡C

§ó·sªº°õ¦æ¼Ë¥»

¨Ï¥Î ADO.NET ±q DataSet §ó·s¸ê®Æªº¹Lµ{¤j­P¤W¦p¤U©Ò­z:

1.

³Ð«Ø¤@­Ó DataAdapter ª«¥óµM«á±N¸ê®Æ®w¬d¸ßªºµ²ªG¶ñ¤J DataSet ª«¥ó¡C³o¨Ç¸ê®Æ±N¦¨¬°¥»¦aºÝªº§Ö¨ú¡C

2.

§ó°Ê¥»¦aºÝªº DataSet ª«¥ó¡C³o¨Ç§ó°Ê¥]¬A¦b¥»¦aºÝ§Ö¨úªº DataSet ª«¥ó¤¤¡A§ó·s¡A§R°£¡A¥H¤Î´¡¤J¤@­Ó©Î¥H¤Wªº¸ê®Æªí¡C

3.

ªì©l¤Æ DataAdapter ªºupdate-related ÄݩʡC³o­Ó¨BÆJºë·Ç¦a³]©w¤F§ó·s¡A §R°£¡A ©Î¬O´¡¤Jªº°Ê§@­n¦p¦ó¶i¦æ¡C¦]¬°³o­Ó¨BÆJ¦³«Ü¦hºØ¤èªk¨Ó³B²z¡A¦Ü©ó§Ú­Ì©Ò±ÀÂ˪º¤èªk±N¦b¤U­±ªº³¹¸` "ªì¨Ï¤ÆDataAdapters ¥H§ó·s" ¤¤°Q½×¡C

4.

IJµo DataAdapter ªº Update ¤èªk¨Ó°e¥X³o¨ÇÀÁ¸mªºÅܧó¡C¥»¦aºÝ§Ö¨úªº DataSet ¤¤ªº¨C¤@¶µÅܰʬö¿ý³£·|³B²z¡C ( ¨S¦³³y¦¨¥ô¦ó§ïÅܪº¬ö¿ý±N·|¦Û°Ê³Q Update ¤èªk©¿²¤¡C )

5.

³B²z¥Ñ DataAdapterUpdate ¤èªk¶Ç¥Xªº¨Ò¥~¡C·í­n¨DªºÅܧóµLªk¦b¸ê®Æ®w¤¤¹ê¦æ®É¡A´N·|¤Þµo¨Ò¥~¡C

( ÁÙ¦³¥t¥~¤@­Ó¤èªk¥i¥H¶i¦æ§ó·s¡C§A¥i¥H¥Î ExecuteNonQuery ¤èªkª½±µ°õ¦æ SQL UPDATE «ü¥O ¡C·í§A·Q¥Îµ{¦¡§ó·s¯S©w¸ê®Æ¦C®É¡A³o­Ó¤èªk´N«Ü¾A¦X¡A¦]¬°¤£»Ý­n¥Î¨ì DataSet ª«¥ó¡C)

ªì¨Ï¤ÆDataAdapters ¥H§ó·s

¦b ADO.NET ¤¤¡A§A¥²¶·­n¦Û¤v¼¶¼gµ{¦¡½X¥Î¨Ó°e¥X¸ê®Æ®wªº§ó·s¨ì DataAdapter ª«¥ó¤W¡C¦³¤U¦C¤TºØ¤èªk¥i¥H§@¨ì :

§A¥i´£¨Ñ¦Û¤vªº§ó·sÅÞ¿è¡C

§A¥i¥H¨Ï¥Î Data Adapter Configuration Wizard ¨Ó²£¥Í§ó·sÅÞ¿è¡C

§A¥i¥H¨Ï¥Î CommandBuilder ª«¥ó¨Ó²£¥Í§ó·sÅÞ¿è¡C

«ØÄ³§A§A´£¨Ñ¦Û¤vªº§ó·sÅÞ¿è¡C¬°¤F¸`¬Ù®É¶¡¡A§A¥i¥H¨Ï¥Î Data Adapter Configuration Wizard¡A¦ý¬O¦pªG§A¥Î¤F¡A½Ð¸ÕµÛ¤£­n¦b°õ¦æ¶¥¬q²£¥Í§ó·sÅÞ¿è¡C°£«D§A¯uªº«D¥Î¤£¥i§_«h¤£­n¥Î CommandBuilder ª«¥ó¡A¦]¬°¥¦±N·|ÄY­«¼vÅT®Ä¯à¦Ó¥B§AµLªk±±¨îª«¥ó²£¥Íªº§ó·sÅÞ¿è¡C¦¹¥~¡A CommandBuilder ¤£¯àÅý§A¨Ï¥Î¹w¦sµ{§Ç°e¥X§ó·s¡C

§A¥i¥HÀ³¥Îµ{¦¡»Ý­n°ÊºA²£¥Í¸ê®Æ¦s¨úÅÞ¿è®É¡A¨Ï¥Î CommandBuilder ¡A¨Ò¦p³øªí©Î¬O¸ê®Æ extraction ¤u¨ã¡C¨Ï¥Î CommandBuilder ¥i¥HÁ×§KÅý³o¨Ç¤u¨ã³£¼¶¼g¦Û¤vªºµ{¦¡½X²£¥Í¼Ò²Õ¡C

¨Ï¥Î¹w¦sµ{§Ç

¨Ï¥Î¹w¦sµ{§Ç§ó·sÅý¸ê®Æ®wºÞ²z­ûÀò±o§ó°ªµ¥ªº¦w¥þ©m¥H¤Î½ÆÂøªº¸ê®Æ§¹¾ã©ÊÀˬd¡A¦Ó³o¬O°ÊºA SQL °µ¤£¨ìªº¡CÁ|¨Ò¨Ó»¡¡A¹w¦sµ{§Ç¥i¯à¥i¥H¦A°õ¦æ§ó·sªº®É­Ô¦P®É¦b½]®Ö¬ö¿ý¤¤´¡¤J¶µ¥Ø¡C¾aµÛ¥¦ªºÂ÷½u¬d¸ß³Ì¨Î¤Æ¥\¯à¡A¹w¦sµ{§Ç¯à°÷´£¨Ñ³Ì¦nªº®Ä¯à¡C³Ì«á¡A¦]¬°¹w¦sµ{§Ç±N¸ê®Æ®wµ²ºc¤ÎÀ³¥Îµ{¦¡¹jÂ÷¡A¨Ï±o¨t²ÎºûÅ@¤è«K¡C

¦]¬° ADO.NET À³¥Îµ{¦¡¨Ï¥Î¹w¦sµ{§Ç¦³¬Û·í¦hªºÀuÂI¦Ó¹ê§@ªº¹Lµ{¤]¤£·|ª½±µ§ó°Ê¸ê®Æ®w¨Ó±o§xÃø¡A©Ò¥H´X¥G¦b©Ò¦³ªºª¬ªp¤U³£±ÀÂ˨ϥγo­Ó¤èªk¡C°ß¤@ªº¨Ò¥~¬O¦pªG§A¥²»Ý³B²z¦h­Ó«áºÝ¸ê®Æ®w¡A¦p : Microsoft Access¡A¦Ó¹w¦sµ{§ÇµLªk¦b³o¨Ç¸ê®Æ®w¤W¨Ï¥Î¡C¦b³oºØª¬ªp¤U¡A¥²¶·¨Ï¥Î¬d¸ß©R¥O§ó·s¡C

¦P¨B°õ¦æºÞ²z

DataSet ª«¥ó ¬O³]­p¨Ó¤ä´© »Ý­nªø®É¶¡°õ¦æªº¹B§@ ¶i¦æ¶}©ñ¦¡¦P¨B¡A¨Ò¦p : ¨Ï¥ÎªÌ¦b¨Ï¥Î¸ê®Æ®É¡A¦Ó§A¦b§ó·s¸ê®Æ¡C·í§Ú­Ì³z¹L DataSet ¦V¸ê®Æ®w¶i¦æ§ó·s®É to the database server¡AÁ`¦³¤U¦C¥|ºØ¤èªkºÞ²z ¶}©ñ¦¡¦P¨B:

¥u¥]§t¥D¯Á¤ÞÁäÄæ¦ì

¥]§t¦b WHERE ¤l¥y¤¤ªº©Ò¦³Äæ¦ì

¥]§t°ß¤@¯Á¤ÞÁä¥H¤Î®É¶¡ÂW°OÄæ¦ì

¥]§t°ß¤@¯Á¤ÞÁä¥H¤Î­×§ïªºÄæ¦ì

­È±o¤@´£ªº¬O«á­±ªº¤T­Ó¿ìªkºû«ù¸ê®Æ§¹¾ã©Ê ; ¦Ó²Ä¤@­Ó¨S¦³¡C

³o­Ó¤èªk·|³y¦¨³Ì«áªº§ó·s·|±N¤§«e©Ò§@ªº§ó°Ê³£Âл\±¼¡C CommandBuilder ¨Ã¤£¤ä´©³o­Ó¤èªk¡A¦ý¬O Data Adapter Configuration Wizard ´N¥i¥H¡C·Q¨Ï¥Î³o­Ó¤èªk¡A¶·¥ý¶i¤J Advanced Options ¼ÐÅÒ­¶­±µM«á±¡°£ Use Concurrency ®Ö¨ú¤è¶ôªº¿ï¾Ü¡C

³o­Ó¤èªk¦b¹ê»Ú¤W¬O¤£«ØÄ³¨Ï¥Î¦]¬°¨Ï¥ÎªÌµLªk±oª¾¬O§_·|Âл\¤F¨ä¥L¨Ï¥ÎªÌªº§ó°Ê¡A¯}Ãa¨ä¥L¨Ï¥ÎªÌ§ó·sªº§¹¾ã©Ê¡C(©Ò¥H³o­Ó¤èªk¥u¾A¦X¦b³æ¤@¨Ï¥ÎªÌªº¸ê®Æ®w¡C)

¥]§t¦b WHERE ¤l¥y¤¤ªº©Ò¦³Äæ¦ì

³o­Ó¤èªk¥i¥HÅý§Aªºµ{¦¡½XÂ^¨úªº¸ê®Æ¦C©Î¬O¶i¦æ¸ê®Æ§ó°Êªº¸ê®Æ¦C¡AÁ×§K¦]¬°¨ä¥L¨Ï¥ÎªÌªº§ó°Ê¦Ó³y¦¨¸ê®Æ³QÂл\¡C ³o­Ó¤èªk¬O Data Adapter Configuration Wizard ¥H¤ÎSqlCommandBuilder ²£¥Íªº SQL µ{¦¡½X¤¤¹w³]ªº¨Ï¥Î¤èªk¡C

¦ý¬O¦]¬°¤U¦C¦]¯À¡A³o­Ó¤èªk¦b¹ê»Ú¤W¬O¤£«ØÄ³¨Ï¥Î :

¦pªG¸ê®Æªí¼W¥[¤F·sÄæ¦ì¡A¬d¸ß´N¥²¶·­×§ï¡C

¤@¯ë¦Ó¨¥¡A¸ê®Æ®w¤£·|¤¹³\§A¤ñ¹ï¨â­Ó BLOB ­È¡A¦]¬°BLOB ªº¤j¸ê®Æ¶q·|³y¦¨¤ñ¹ïªº§C®Ä²v¡C ( ¦Ó¹³ CommandBuilder »P Data Adapter Configuration Wizard ³o­Óªº¤u¨ã ¤£À³¸Ó¦b WHERE ¤l¥h¤¤¥]§t BLOB Äæ¦ì¡C)

¤ñ¸û¸ê®Æªí¤¤©Ò§ó·s¸ê®Æ¦Cªº©Ò¦³Äæ¦ì·|³y¦¨¦h¾lªº®Ä¯à®ö¶O¡C

¥]§t°ß¤@¯Á¤ÞÁä¥H¤Î®É¶¡ÂW°OÄæ¦ì

i¨Ï¥Î³o­Ó¤èªk¡A¸ê®Æ®w·|¦b¨C¦¸ªº¸ê®Æ¦C§ó·s«á§ó®É¶¡ÂW°O¬°°ß¤@­È¡C ( ©Ò¥H§A¤@©w­n¦A¸ê®Æªí¤¤¥[¤J®É¶¡ÂW°OÄæ¦ì¡C) ¥Ø«e¡A¤£½×¬O CommandBuilder ©Î¬O Data Adapter Configuration Wizard ³£¤£¤ä´©³oºØ§@ªk¡C

¥]§t°ß¤@¯Á¤ÞÁä¥H¤Î­×§ïªºÄæ¦ì

¤@¯ë¦Ó¨¥¡A³o­Ó¤èªk¨Ã¤£«ØÄ³¨Ï¥Î¡A¦]¬°¦pªG§AªºÀ³¥Îµ{¦¡ÅÞ¿è¨Ï¥Î¹L®Éªº¸ê®ÆÄæ¦ì©Î¬OÄæ¦ì¨S¦³§ó·s³£·|³y¦¨¿ù»~¡CÁ|¨Ò¨Ó»¡¡A¨Ï¥ÎªÌ A §ó°Ê¤F­q³æ¼Æ¶q ¦Ó¨Ï¥ÎªÌ B §ó°Ê¤F³æ»ù¡A ³o·|³y¦¨Á`»ù ( ­q³æ¼Æ¶q ­¼¤W³æ»ù ) ªº­pºâ¿ù»~³æ»ù¡C

¥¿½T¦a§ó·s Null Äæ¦ì

·í¸ê®Æ®wªºÄæ¦ì¤£§t¸ê®Æ­È¡A³q±`§â³o­ÓªÅªº¸ê®ÆÄæ¦ì¬Oµø§@¾Ö¦³¤@­Ó¯S§Oªº null ­È¡CµM¦Ó¡A³oºØ·Qªk¥i¯à´N·|¬Oµ{¦¡³]­p¿ù»~ªº®Ú·½¡A¦]¬°¸ê®Æ®wªº¼Ð·Ç¤¤¬O»Ý­n¹ï null ­È¶i¦æ¯S§O³B²zªº¡C

Ãö©ó null Äæ¦ìªº¥D­n°ÝÃD¬O¦b©ó¦pªG¨ä¤¤¤@­Ó¹Bºâ¤l¬O null ­È ¡ASQLªº = ¹Bºâ¤¸·|¦^¶Ç false ¡C ¹Bºâ¤¸ IS NULL ¬O°ß¤@¦b SQL ¬d¸ß¤¤½T»{Äæ¦ì¬O§_¬° null ­Èªº¤èªk¡C

¦pªG§AªºÀ³¥Îµ{¦¡¨Ï¥Î¤F«e­z«ü©w WHERE ¤l¥yªº§@ªk¨Ó¶i¦æ¦P¨BºÞ²z¡A§A´N¥²¶·¦b¥i¯à¥X²{ null­ÈªºÄæ¦ìºë·Ç¦a¨Ï¥Î IS NULL ¹Bºâ¦¡¡CÁ|¨Ò¨Ó»¡¡A¤U¦Cªº¬d¸ß¦b OldLastName ¬O null ªº®É­Ô¤@©w·|¥¢±Ñ :

SET LastName = @NewLastName WHERE StudentID = @StudentID AND 
                                  LastName = @OldLastName
 
  

À³¸Ó­n³Q§ï¼g¦¨ :

SET LastName = @NewLastName WHERE (StudentID = @StudentID) AND
                                  ((LastName = @OldLastName) OR
                                   (OldLastName IS NULL AND LastName IS NULL))
  

¾\Ū¥Ñ CommandBuilder ¤u¨ã©Ò²£¥Íªº¿é¥X¡A¬O¾Ç·|¦p¦ó¼¶¼g¥X¦p¤W©Ò­zªºªº§ó·sÅ޿誺¦n¤èªk¡C

§ó¦h¬ÛÃö¸ê°T

Ãö©ó¸ê®Æ®w§ó·sªº¸ÔºÉ¤¶²Ð¥i¦b David Sceppa ªº®Ñ Microsoft ADO.NET ( 2002¦~ Microsoft ¥Xª©)¡A chapters 11 ©M 12 ¤¤§ä¨ì¡C

¦^¨ì­¶­º¦^¨ì­¶­º

¨Ï¥Î±j«¬§ODataSetª«¥ó

±j«¬§O DataSet ª«¥ó ±N¸ê®Æ®w¤¤ªº¸ê®Æªí»PÄæ¦ì¥Hª«¥ó»P¨äÄݩʪº¤è¦¡§e²{¡C¦s¨ú¬O³z¹L¦WºÙ¨Ó¶i¦æ¡A¦Ó¤£¬O¨Ï¥Î¶°¦X¤¤ªº¯Á¤Þ¡C³o·N¨ýµÛ§A¥i¥H¤F¸Ñ¡A±j«¬§O DataSet ª«¥ó¸ò DataSet ª«¥ó¦b¦s¨ú¸ê®ÆÄæ¦ì¤Wªº®t²§ :

string n1 = myDataSet.Tables["Students"].Rows[0]["StudentName"];  // untyped
string n2 = myDataSet.Students[0].StudentName;           // strongly typed
  

¨Ï¥Î±j«¬§ODataSetª«¥ó¡A¦³¤U¦C´X¶µÀuÂI :

¦s¨ú¸ê®ÆÄæ¦ìªºµ{¦¡½X´£°ª¤F¥iŪ©Ê¦Ó¥B§ó¬°ºë²¡C

¦b Visual Studio .NET µ{¦¡½X½s¿è¾¹¤¤ªº Intellisense capability ¥\¯à¡A¥i¥HÀ°§A¦Û°Ê§¹¦¨§A·Q­n¿é¤Jªº¾ã¦æµ{¦¡½X¡C

½s;¹¥i¥H®·Àò±j«¬§O DataSet ¤¤ªº«¬§O¤£²Å¿ù»~¡C¦Ó¦b½sͶ¥¬q°»´ú¿ù»~¬O¤ñ¦b°õ¦æ¶¥¬q°»´ú¿ù»~¨Ó±o§ó¦nªº¡C

¦ó®É¨Ï¥Î¨Ï¥Î±j«¬§O DataSet ª«¥ó

¨Ï¥Î±j«¬§O DataSet ¬O«Ü¤è«Kªº¡A¦]¬°¥¦¯à²¤ÆÀ³¥Îµ{¦¡ªº¶}µo¨Ã´î¤Ö¿ù»~µo¥Í¡C¯S§O¬O¦b¦b¥Î¤áºÝªº¦h¼h¦¡À³¥Îµ{¦¡¤¤¡A¤×¨ä¦³¥Î¡C¦]¬°¸ÓÀ³¥Îµ{¦¡¡A¥D­n¬OµÛ­«©ó¹Ï§Î¤Æ¨Ï¥ÎªÌ¤¶­±¥H¤Î¸ê®Æªº¦³®Ä©Ê¡A ©Ò¥H»Ý­n³\¦hÄæ¦ìªº¦s¨ú¾Þ§@¡C

µM¦Ó¡A¦pªG¸ê®Æ®wªº¬[ºc§ïÅܤF¡A¨Ï¥Î±j«¬§O DataSet´N·|Åܱo«Ü³Â·Ð¡A¨Ò¦pÄæ¦ì©M¸ê®Æªíªº¦WºÙ§ïÅÜ¡C ¦b³oºØª¬ªp¤U¡A±j«¬§O DataSet Ãþ§O¤ñ¶·­«·s²£¥Í¦Ó¥B©Ò¦³ªº¬ÛÃöÃþ§O³£»Ý­n­×§ï¡C

¦b¦P¤@­ÓÀ³¥Îµ{¦¡¤¤¦³¥i¯à¦P®É¨Ï¥Î±j«¬§O¸òµL«¬§Oªº¦s¨ú¤è¦¡¡CÁ|¨Ò¨Ó»¡¡A¤@¨Ç¶}µo¤H­û¦b¥Î¤áºÝ¨Ï¥Î±j«¬§O DataSet ¦Ó¦b¦øªA¾¹ºÝ¨Ï¥Î«D«¬§O¡C±j«¬§O DataSet ªºMerge ¤èªk¥i¥H¥Î¨Ó¾É¤J«D«¬§O DataSet ¤¤ªº¸ê®Æ¡C

²£¥Í DataSet Ãþ§O

.NET Framework SDK ©M Visual Studio.NET ³£¦³´£¨Ñ¤½¥Îµ{¦¡¥HÀ°§U§A²£¥Í¥²­nªº DataSet ¤lÃþ§O¡C.NET Framework SDK ¤¤¬O¨Ï¥Î©R¥O¦C¤u¨ã»Pª½±µ¼¶¼gµ{¦¡½X¡C ¦Ó Visual Studio .NET ªº¤èªk¡A«ÜÅãµM¦a¬O¦b Visual Studio .NET ¶}µoÀô¹Ò¤¤¡A¤£»Ý­nÃB¥~ªº©R¥Oµøµ¡¡C

¤£½× DataSet ªºÃþ§O¬O¦p¦ó²£¥Íªº¡A·sªºÃþ§O³£¥²¶·°Ñ¦Ò«¬§ODataSet¨Ã³¡¸p¦b©Ò¦³ªºÀ³¥Îµ{¦¡¼h¦¸¤¤ ¡C( ³o¨Ã¤£¬O¨å«¬®×¨Ò¡A¦ý¦Ò¼{¬O§_¥i¥H¥Î»·ºÝ¤è¦¡¦b¼h¦¸¶¡¶Ç»¼«¬§O DataSet¤]¬O«Ü­«­nªº¡C)

.NET Framework SDK ¥]§t¤F¤@­Ó©R¥O¦C¤½¥Îµ{¦¡¦W¬° XML Schema Definition Tool¡A¥¦¯à°÷¥Î XML µ²ºc´y­zÀÉ (.xsd) À°§U§A²£¥ÍÃþ§OÀÉ¡C µ²¦X¦¹¤½¥Îµ{¦¡»P DataSet ª«¥óªº WriteXmlSchema ¤èªk¯à§â¤@­Ó«D«¬§O DataSet Âà´«¦¨±j«¬§O DataSet¡C

¤U¦C«ü¥O¤F¥Ü½d¦p¦ó¥Î XML µ²ºc´y­zÀɮײ£¥Í¤@­ÓÃþ§OÀÉ¡C¶}±Ò¤@­Ó©R¥O¦Cµøµ¡¨Ã¿é¤J :

C:\>xsd MyNewClass.xsd /d
  

²Ä¤@­Ó°Ñ¼Æ¬O XML µ²ºc´y­zÀɪº¸ô®|¡C²Ä¤G­Ó°Ñ¼Æ¬O§A³Ð«Ø¥Ñ DataSet ­l¥Í¥X¨ÓÃþ§OÀÉ¡C³o­Ó¤u¨ã¹w³]¬O·|²£¥Í Visual C# .NET Ãþ§OÀÉ¡A¦ý¥¦¤]¥i¥H¥[¤W¾A·íªº°Ñ¼Æ¦Ó²£¥Í Visual Basic .NET Ãþ§OÀÉ¡C¦pªG·Q¦C¥X©Ò¦³¥i¥Îªº¿ï¶µ¡A½Ð¿é¤J:

xsd /?
  

Ãþ§OÀɲ£¥Í§¹¦¨«á¡A±N¨ä¥[¤J§Aªº±M®×¤¤¡CµM«á´N¥i¥H³Ð«Ø§Aªº±j«¬§O DataSet Ãþ§Oªº¹êÅé¡A ¨Ï¥Î¤U¦C Visual C# .NET µ{¦¡½X¨Ó¶i¦æ :

MyNewClass ds = new MyNewClass();
  

¨Ï¥Î Visual Studio .NET

­n¦b Visual Studio .NET ¤¤²£¥Í±j«¬§O DataSet¡A¥ý¦bªí³æ³]­pµøµ¡¤¤ÂIÀ»·Æ¹«¥kÁä¡A µM«á«ö¤U Generate Dataset¡C µM«á´N·|²£¥Í¤@­Ó .xsd ( XML Schema Definition ) ÀÉ¡A¥H¤Î¤@­ÓÃþ§OÀÉ¡A µM«á§â¥L­Ì¥[¤J§Aªº±M®×¤¤¡C¦ý¦b³o¤§«e½Ð¥ý½T»{¤@­Ó©Î¥H¤Wªº DataAdapters ¤w¸g¥[¤J§Aªºµøµ¡ªí³æ¡C ª`·N¨º­ÓÃþ§OÀɬOÁôÂ꺡C·Q¬Ý¨ìÃþ§OÀÉ¡A«ö¤U¤è®×Á`ºÞµøµ¡¤¤¤u¨ã¦C¤Wªº Show All Files ¡C

­n¦b±j«¬§O DataSet ¤¤¥[¤JÃöÁp ¡A¥ý¦b¤è®×Á`ºÞµøµ¡¤¤ªº.xsdÀɤW«ö¨â¤U¶}±Ò XML µ²ºc´y­z³]­p¤u¨ã¡AµM«á¦b§A·Q¥[¤Jªº¸ê®Æªí¤WÂI¥kÁä¡C¦b§ÖÅã¥\¯àªí¤¤¡A ¿ï¾Ü Add New Relation¡C

¦b Visual Studio .NET ¤¤²£¥Í±j«¬§O DataSet ªº¥t¥~¤@­Ó¤èªk¬O¦b±M®×Á`ºÞ¤¤±M®×¤WÂIÀ»¥kÁä¡A¿ï¾Ü Add Files¡AµM«á¿ï¾Ü dataset¡C´N·|«Ø¥ß¤@­Ó·sªº .xsd ÀÉ¡C µM«á§A¥i¥H¦b¦øªA¾¹Á`ºÞ¤¤Ápµ²¦Ü¸ê®Æ®w¨Ã¥B§â¸ê®Æªí©ì¦²¦Ü xsd ÀɤW¡C

¦^¨ì­¶­º¦^¨ì­¶­º

³B²z Null ¸ê®ÆÄæ¦ì

¥H¤U¬OÃö©ó¦p¦ó¦b .NET ¸ê®Æ¬[ºc¤¤¨Ï¥Î null Äæ¦ìªº§Þ¥©:

¤@©w­n¥ÎSystem.DBNullÃþ§O¨Ó³]©w¸ê®ÆÄæ¦ì­È¬° null ¡C¤£­n¨Ï¥Î C# ©Î Visual Basic .NET ©Ò´£¨Ñªº null ­È¡C ¦p¥H¤U½d¨Ò©Ò¥Ü : rowStudents["Nickname"] = DBNull¡CValue // correct!

±j«¬§O DataSets ¦b¨C­Ó DataRow§t¦³¨â­ÓÃB¥~ªº¤èªk¡C¤@­Ó¬O¥Î¨Ó½T»{Äæ¦ì¬O§_¦³¬° null ­È¡A ¥t¥~¤@­Ó«h¬O±NÄæ¦ì­È³]¬° null¡C ´N¦p¦P¥H¤Uªºµ{¦¡½X°Ï¶ô©Ò¥Ü : If (tds.rowStudent[0].IsPhoneNoNull()) { ..., } tds.rowStudent[0].SetPhoneNoNull()

¤@©w­n¥Î DataRow Ãþ§O( ©Î¬O¦b¤§«e¶µ¥Ø¤¤ªº¦Pµ¥Ãþ§O )¤¤ªº IsNull ¤èªk ¨Ó´ú¸Õ¸ê®Æ®w¤¤ªº null ­È¡C³o­Ó¤èªk¥u¤ä´©´ú¸Õ¸ê®Æ®wªº null ­È¡C

¦pªG¸ê®ÆÄæ¦ì¥i¯à§t¦³ null ­È¡A¦b¨Ï¥Î¸ê®Æ¤º®e®ÉÀ³¸Ó¥ý¦æ½T»{ ( ¥Î IsNull ¤èªk ) ¡C¨å«¬ªº¨Ò¤l¬O Integer ¸ê®ÆÄæ¦ì¥i¯à¬O null¡C¶¶±a¤@´£¡A.NET run time ªº Integer ¸ê®Æ«¬§O¬O¤£¥]§t null ­Èªº¡C¥H¤U¬O½d¨Ò : int i = rowStudent["ZipCode"]; // throws exception if null!

¨Ï¥Î±j«¬§O DataSet ¤¤ªº nullValue µù¸Ñ ¨Ó³]©w¸ê®Æ®w¤¤ªº null ­ÈÀ³¸Ó¦p¦ó¹ïÀ³¡C¹w³]¬O¦^¶Ç¨Ò¥~ ; µM¦Ó¬°¤F¹F¨ì§ó¨Îªºµ{¦¡±±¨î¡A§A¥i³]©w±N null ­ÈÂà´«¬°¯S©w­È¡A¦p String.Empty¡C

¦^¨ì­¶­º¦^¨ì­¶­º

¥æ©ö

¹ê»Ú¤W¡A©Ò¦³ªº°Ó°È¾É¦VÀ³¥Îµ{¦¡¦b§ó·s¸ê®Æ®É³£»Ý­n¥æ©öªº¤ä´©¡C¥æ©ö¡A³z¹L´£¨Ñ¦³¦Wªº ACID : ¤£¥i³¡¤À§¹¦¨(atomicity)¡A¤@­P©Ê( consistency )¡A¹jÂ÷( isolation )¥H¤Î ­@¤[©Ê(durability ) ªº¥|ºØ°ò¥»«O»Ù¡A¦Ó¨Ï±o¨t²Îªº¾ã¦Xª¬ºA¥i¥H¥]§t¤@­Ó©Î¥H¤Wªº¸ê®Æ¨Ó·½¡C

Á|¨Ò¨Ó»¡¡A¤@­Ó¥Î¥H³B²zÁʶR­q³æªººô­¶«¬¹s°âÀ³¥Îµ{¦¡¡C¨C­Ó­q³æ³£»Ý­n¤T­Ó¤£¦Pªº¾Þ§@¨Ã¶i¦æ¤T­Ó¸ê®Æ®wªº§ó·s :

®w¦s¼Æ¶q¦]¬°­q³æ¦Ó´î¤Ö¤F¡C

«È¤áªº«H¥ÎÃB«×¦]¬°ÁʶR¦æ¬°¦Ó´î¤Ö¡C

¤@­Ó·sªº­q³æ¥²¶·¥[¤J­q³æ¸ê®Æ®w¡C

°ò¥»¤W³o¤T­Ó¤£¦Pªº¾Þ§@¥²¶··í§@¤@­Ó³æ¦ì¨Ó°õ¦æ¡A¤£¯à¥u¦³³¡¤À§¹¦¨¡C¥¦­Ì¥²¶·³£¯à¦¨¥\°õ¦æ¡A ©Î¬O¥þ³£¥¢±Ñ¡A¨ä¥Lªºª¬ªp³£·|¤Þ°_¸ê®Æ¾ã¦X¤Wªº°ÝÃD¡C¥æ©ö¥i¥H´£¨Ñ³o¼Ë¤Î¨ä¥Lªº«O»Ù¡C

¦³Ãö¥æ©ö³B²zªº°ò¦¬ÛÃö¸ê°T¡A½Ð¦Ü¥H¤Uºô§} http://msdn.microsoft.com/library/en-us/cpguidnf/html/cpcontransactionprocessingfundamentals.asp¡C

¦³«Ü¦h¤èªk¥i¥H±N¥æ©öºÞ²z¨Ö¤J¸ê®Æ¦s¨úµ{¦¡½X¤¤¡C¨C­Ó¤èªk³£¦³¤@¨ì¨âºØ¾A¦Xªºµ{¦¡³]­p¼Ò¦¡ :

¤â°Ê¥æ©ö¡C§A¨Ï¥Î¤ä´©¥æ©ö¥\¯àªº ADO.NET ©Î¬O Transact-SQL ª½±µ¦b¤¸¥ó¤¤¼¶¼gµ{¦¡½X©Î¹w¦sµ{§Ç¡C

¦Û°Ê (COM+) ¥æ©ö¡C§A¦b°õ¦æ¶¥¬q«ü©wª«¥ó¥æ©ö»Ý¨Dªº .NET Ãþ§O¤¤¥[¤J«Å§i¦¡ÄݩʡC³o­Ó¼Ò¦¡¥i¥HÅý§A²³æ¦a³]©w¦h­Ó¤¸¥ó³B²z¦P¼Ëªº¥æ©ö¡C

ÁöµM¦Û°Ê¥æ©ö¼Ò¦¡¯à¦³®Ä²¤Æ¤À´²¦¡¥æ©öªº³B²z¡A¦ý³o¨âºØ§Þ³N³£¦³³Q¥Î¨Ó³B²z¥»¦a¥æ©ö ( ¥æ©ö¥u¦b³æ¤@¸ê·½ºÞ²zªÌ ¦p SQL Server 2000 ¤W°õ¦æ ) ©Î¤À´²¦¡¥æ©ö ( ¥æ©ö¦b»·ºÝ¹q¸£¤Wªº¦h­«¸ê·½ºÞ²zªÌ¶¡°õ¦æ )¡C

§A¥i·|¦]¬°µ{¦¡³]­p¼Ò¦¡ªº¤è«K¦Ó¨Ï¥Î¦Û°Ê (COM+) ¥æ©ö¡C·í§A¦A¨t²Î¤¤¦³«Ü¦h¤¸¥ó­n°õ¦æ¸ê®Æ®w§ó·s®É¡A³o­ÓÀuÂI´N¯S§Oªº©úÅã¡CµM¦Ó¡A¦b«Ü¦h®×¨Ò¤¤¡A§AÀ³¸ÓÁ×§K¨Ï¥Î³oºØ¥æ©ö¼Ò¦¡¥H§K³y¦¨¦h¾lªº¸ê·½®ö¶O¤Î®Ä¯à¤U­°¡C

³o­Ó³¹¸`±N­nÀ°§U§A¨Ì·ÓÀ³¥Îµ{¦¡ªº»Ý¨D¦Ó¿ï¾Ü³Ì¦X¾Aªº¤è®×¡C

­n¿ï¾Ü¥æ©ö¼Ò¦¡¡A§AÀ³¸Ó­º¥ý¦Ò¼{§A¬O§_»Ý­n¨Ï¥Î¥æ©ö¡C¥æ©ö¬O·|Åý¦øªA¾¹À³¥Îµ{¦¡¯Ó¶O³Ì¦h¸ê·½ªº¹B§@¡A¦pªG¦b«D¥²­nªºª¬ªp¤U¨Ï¥Î±N·|­°§Cµ{¦¡ªº¥i©µ®i©Ê¡C½ÐÂǥѤU¦Cªº«ü«n¨Ó«ä¦Ò¦p¦ó¨Ï¥Î¥æ©ö :

¥u¦³¦b§A»ÝÂê©w¤@¸s¾Þ§@¨Ã¥B»Ý­n±j¨î°õ¦æACID­ì«h®É¡A¤~¨Ï¥Î¥æ©ö ¡C

¾¨¶q§â¥æ©öªº®É¶¡ÁYµu¥H´î¤Ö¹ï¸ê®Æ®wªºÂê©w¡C

¦b±±¨î¥æ©ö¥Í©R¶g´Á¤¤µ´¹ï¤£­n©ñ¸m¥Î¤áºÝ¡C

¤£­n¹ï³æ¤@ªº SQL ±Ô­z¨Ï¥Î¥æ©ö¡CSQL Server ·|¦Û°Ê§â¨C­Ó±Ô­z¬O¬°¿W¥ß¥æ©ö¡C

¦Û°Ê¥æ©ö vs. ¤â°Ê¥æ©ö

ÁöµM¦Û°Ê¥æ©öªºµ{¦¡³]­p¼Ò¦¡¬O¤ñ¸û²¤Æªº¡A¯S§O¬O·í¦h­Ó¤¸¥ó¦b°õ¦æ¸ê®Æ®w§ó·sªº®É­Ô¡A¦ý¤â°Êªº¥»¦a¥æ©ö«Ü©úÅã¬O¤ñ¸û§Öªº¡A¦]¬°¥¦¤£»Ý­n»P Microsoft DTC ¤¬°Ê¡C§Y¨Ï§A¦b¥»¦aªº³æ¤@¸ê·½ºÞ²zªÌ ( ¦p SQL Server) ¤W¶i¦æ¦Û°Ê¥æ©ö¡A¦ý¬O¦]¬°¥»¦aªº¤â°Ê¥æ©ö·|Á×§K¨Ï¥Î DTC ¶i¦æ¥ô¦ó«D¥²­nªºµ{§Ç¤§¶¡³q°T (IPC)¡A©Ò¥H«e­zª¬ªpÁÙ¬O¦¨¥ß ( ÁöµM®Ä²v¶¡ªº®t¶Z¦³ÁY¤p )¡C

¦b¤U¦Cª¬ªp½Ð¨Ï¥Î¤â°Ê¥æ©ö:

§A­n¹ï³æ¤@¸ê®Æ®w°õ¦æ¥æ©ö¡C

¦b¤U¦Cª¬ªp½Ð¨Ï¥Î¦Û°Ê¥æ©ö:

§A»Ý­n¦b¦h­Ó»·ºÝ¸ê®Æ®w¶¡°õ¦æ³æ¤@¥æ©ö¡C

§A»Ý­n¤@­Ó¥æ©ö¨Ó¥]§t¦h­Ó¸ê·½ºÞ²zªÌ¡C¨Ò¦p¡A¤@­Ó¸ê®Æ®w©M Windows 2000 Message Queuing ( ³q±`³QºÙ¬° MSMQ )¸ê·½ºÞ²zªÌ¡C

ªþµù : ¤£­n±N¥æ©ö¼Ò¦¡²V¥Î¡C½Ð¥u¨Ï¥Î¨ä¤¤¤@ºØ¡C

¦b¤@¯ëÀ³¥Îµ{¦¡®×¨Ò¤¤¡A¦Û°Ê¥æ©öªº®Ä¯à¤w¸g¨¬°÷¡A©Ò¥H§Ú­ÌÀ³¸Ó¨Ï¥Î¦Û°Ê¥æ©ö¨Ó²¤Æµ{¦¡³]­p¼Ò¦¡ ( §Y¨Ï¬O­n¦b³æ¤@¸ê®Æ®w¤W¨Ï¥Î )¡C¦Û°Ê¥æ©öÅý¨Ï¥ÎªÌ¥i¥H»´©ö¦a¨Ï¦h­«¤¸¥ó°õ¦æ¦P¤@¥æ©ö¤¤ªº³¡¤À¾Þ§@¡C

¨Ï¥Î¤â°Ê¥æ©ö

¨Ï¥Î¤â°Ê¥æ©ö¡A§A¨Ï¥Î¤ä´©¥æ©ö¥\¯àªº ADO.NET ©Î¬O Transact-SQL ª½±µ¦b¤¸¥ó¤¤¼¶¼gµ{¦¡½X©Î¹w¦sµ{§Ç¡C¦b¤j³¡¤Àªºª¬ºA¤U¡A§AÀ³¸Ó¦b¹w¦sµ{§Ç¤¤¶i¦æ¥æ©ö±±¨î¡C¦]¬°³oºØ°µªk´£¨Ñ¤F°ªµ¥«Ê¸Ë¡A¦Ó¥B±q®Ä¯àªº¨¤«×¨Ó¬Ý¤]¤£»¹©ó¥Î ADO.NET µ{¦¡½X°õ¦æ¥æ©ö¡C

¥Î ADO.NET °õ¦æ¤â°Ê¥æ©ö

ADO.NET ¤ä´©¥æ©öª«¥ó¡AÅý§A¥Î¨Ó¶}©l·s¥æ©ö¨Ã¥B¯à·Ç½T±±¨î¦ó®É­n°e¥X©Î´_­ì¥æ©ö¡C¥æ©öª«¥ó·|³z¹L³sµ²ª«¥óªº BeginTransaction ¤èªk¨Ó¨ú±o¸ê®Æ®wªº³sµ²¡C©I¥s³o­Ó¤èªk®É¤£»Ý¥]§t±µ¤U¨Ó­n¥æ©ö¤¤°õ¦æªº©R¥O¡C§A¥u»Ý­n³z¹L³]©w©R¥Oª«¥ó Transaction ÄݩʡA´N¥i¥H·Ç½T¦a³sµ²¥æ©ö¸ò¨C­Ó©R¥O¡C¬JµM§A¯à³sµ²¥æ©öª«¥ó¸ò¦h­Ó©R¥Oª«¥ó¡A©Ò¥H´N¯à±N½Æ¼Æ­Ó¾Þ§@¥]¦¨³æ¤@¥æ©ö¹ï³æ¤@¸ê®Æ®w¹B§@¡C

¦pªG·Q¨ú±o¨Ï¥Î ADO.NET ¥æ©öªº½d¨Òµ{¦¡½X¡A½Ð¨ìªþ¿ý¤¤ªº¦p¦ó¼¶¼g ADO.NET ¤â°Ê¥æ©ö¡C

§ó¦h¬ÛÃö¸ê°T

ADO.NET ¤â°Êªºªº¹w³]¹jÂ÷¼h¬O Read Committed¡A³o¬O·í¸ê®Æ³QŪ¨ú®É¸ê®Æ®w¹ï¸ê®Æ¶i¦æ¦@¥ÎÂê©w¡A¦ý¸ê®Æ¦b¥æ©öµ²§ô«e¥i¥H§ó°Ê¡C³o¥i¯à·|³y¦¨µLªk­«ÂÐŪ¨ú¡A©Î¬O¿ùı¸ê®Æ¡C±z¥i¥H³z¹L³]©w¥æ©öª«¥óªº IsolationLevel Äݩʬ° IsolationLevel ©w¸qªº¦CÁ|«¬§O­È¨Ó§ïÅܹjÂ÷¼h¡C

§A¥²¶·­n¦b¥æ©öÂÔ·V¿ï¾Ü¦X¾Aªº¹jÂ÷¼h¡C³o¨ä¹ê¬O¤@ºØ®Ä¯à»P¸ê®Æ¤@­P©ÊªºÅv¿Å¡C³Ì°ªµ¥ªº¹jÂ÷¼h ( Serialized ) ´£¨Ñµ´¹ïªº¸ê®Æ¤@­P©Ê¡A¦ý¥N»ù¬O¨t²Îªº©Ò¦³®Ä¯à¡C¤ñ¸û¦aªº¹jÂ÷¼h¥i¥HÀ³¥Îµ{¦¡§ó¨ã©µ®i©Ê¡A¦ý¬Û¹ïªº¡A¤]·|¼W¥[¸ê®Æ¤£¤@­Pªº¿ù»~µo¥Í¾÷²v¡C¹ï»Ý­n¤j¶qŪ¨ú¡A¤Ö¶q¼g¤Jªº¨t²Î¡A¸û§Cªº¹jÂ÷¼hÀ³¸Ó¬O¤ñ­n¾A¦X¡C

¦pªG·QÀò±o¦³Ãö¦p¦ó¿ï¾Ü¾A¦Xªº¹jÂ÷¼hªº¬Ã¶Q¸ê¹B¡A½Ð°Ñ¾\ Microsoft ¥Xª©ªº®ÑÄy Inside SQL Server 2000¡A§@ªÌ¬O Kalen Delaney¡C

¥Î¹w¦sµ{§Ç°õ¦æ¤â°Ê¥æ©ö

§A¥i¥H¨Ï¥Î¹w¦sµ{§Ç¤¤ªº Transact-SQL ±Ô­zª½±µ±±¨î¤â°Ê¥æ©ö¡CÁ|¨Ò¨Ó»¡¡A§A¥i¥H¦b¹w¦sµ{§Ç¤¤¨Ï¥ÎBEGIN TRANSACTION¡A END TRANSACTION¡A©M ROLLBACK TRANSACTION³o´X­Ó Transact-SQL ¥æ©ö±Ô­z¨Ó°õ¦æ¤â°Ê¥æ©ö¡C

§ó¦h¬ÛÃö¸ê°T

¦pªG¦³»Ý­n¡A§A¥i¥H¦b¹w¦sµ{§Ç¤¤¨Ï¥Î SET TRANSACTION ISOLATION LEVEL ±Ô­z¨Ó±±¨î¹jÂ÷¼h¡CRead Committed ¬O SQL Server ªº¹w³]¹jÂ÷¼h¡C¦pªG·Q¨ú±o§ó¦h SQL Server ¹jÂ÷¼hªº¸ê°T¡A½Ð°Ñ¾\ SQL Server ½u¤W»¡©ú¤å¥óªº "Accessing and Changing Relation Data" ³¹¸`¡C

¦pªG·QÂǥѽd¨Òµ{¦¡½X¨Ó¤F¸Ñ¦p¦ó¨Ï¥Î Transact-SQL ¥æ©ö±Ô­z°õ¦æ¥æ©ö§ó·s¡A½Ð°Ñ¾\ªþ¿ý¤¤ªº¦p¦ó¨Ï¥Î Transact-SQL °õ¦æ¥æ©ö ¡C

¨Ï¥Î¦Û°Ê¥æ©ö

¦Û°Ê¥æ©ö²¤Æ¤Fµ{¦¡³]­p¼Ò¦¡¡A¦]¬°§A¤£»Ý­n¦Û¦æ¶}±Ò·s¥æ©ö©Î¬O°e¥X©Î©ñ±ó¥æ©ö¡CµM¦Ó¡A¦Û°Ê¥æ©ö³Ì­«­nªºÀuÂI¬O¥i¥H»P DTC µ²¦X¡A³oÅý³æ¤@¥æ©ö¥i¥H¦b¦h­Ó¤À´²¦¡¸ê®Æ¨Ó·½¶¡°õ¦æ¡C¦b¤j³W¼Òªº¤À´²¦¡À³¥Îµ{¦¡¤¤¡A³o¶µÀuÂI¯S§O¦³·N¸q¡CÁöµM¥i¥H³z¹L DTC ªºµ{¦¡³]­p¨Óª½±µ¤â°Ê±±¨î¤À´²¦¡¥æ©ö¡A¦ý¦Û°Ê¥æ©ö¤j´T¦a²¤Æ¤F³o¼Ëªº§@·~¨Ã¥B¬O¬°¤F¥H¤¸¥ó¬°°ò¦ªº¨t²Î³]­pªº¡CÁ|¨Ò¨Ó»¡¡A¥¦¥i¥H«Ü®e©ö¦a³]©w¦h­Ó¤¸¥ó°õ¦æ¦P¤@¥æ©ö¤¤ªº¤£¦P¤u§@¡C

¦Û°Ê¥æ©ö¥D­n¬O¾a COM+ ´£¨Ñªº¤À´²¦¡¥æ©ö¤ä´©¥\¯à¡A¤]¦]¦¹¡A¥u¦³ªA°È¤¸¥ó (´N¬O¥Ñ ServicedComponent Ãþ§O­l¥Í¥X¨Óªº¤¸¥ó ) ¥i¥H¨Ï¥Î¦Û°Ê¥æ©ö¡C

¦p¦ó³]©w¤@­Ó¦Û°Ê¥æ©öÃþ§O :

¥Î System.EnterpriseServices ©R¦WªÅ¶¡¤¤ªº ServicedComponent Ãþ§O­l¥ÍÃþ§O¡C

¨Ï¥Î Transaction Äݩʩw¸qÃþ§Oªº¥æ©ö»Ý¨D¡C¥Ñ TransactionOption ¦CÁ|«¬§O¤¤©w¸qªº­È¥i¥H¨M©w¦b COM+ catalog ¤¤¸ÓÃþ§OÀ³¸Ó­n¦p¦ó³]©w¡C¥Î³o­ÓÄݩʤ]¥i¥H¶i¦æ¨ä¥L¬ÛÃö³]©w¡A¦p¥æ©ö¹jÂ÷¼h©Mµ¥«Ý®É¶¡¡C

¬°¤FÁ×§K¥²¶·ª½±µ³B²z¥æ©ö²£¥Íªºµ²ªG¡A§A¥i¥H¥Î AutoComplete Äݩʨӥ[µù¦b¤èªk¤W¡C¦pªG³o¨Ç¤èªk¦^¶Ç¨Ò¥~¡A¥æ©ö¥i¥H¦Û°Ê¨ú®ø¡C·íµM¦pªG¦³»Ý­n§AÁÙ¬O¥i¥Hª½±µ³B²z¥æ©öµ²ªG¡CÃö©ó¨ä¤¤ªº²Ó¸`¡A½Ð°Ñ¾\¤U­±ªº Determining Transaction Outcome ³¹¸`¡C

§ó¦h¬ÛÃö¸ê°T

¦pªG·Q¨ú±o§ó¦hÃö©ó COM+ ¦Û°Ê§ó·sªº¸ê°T¡A½Ð¦b SDK ¥­¥x»¡©ú¤å¥ó¤¤·j´M "Automatic Transactions Through COM+"¡C

¦pªG·Q­n .NET ¥æ©öÃþ§Oªº½d¨Ò¡A½Ð°Ñ¾\ªþ¿ý¤¤ªº¦p¦ó¼¶¼g¥æ©ö¥Îªº .NET Ãþ§O¡C

³]©w¥æ©ö¹jÂ÷¼h

COM+ version 1.0 ( ¦bWindows 2000 ¤W°õ¦æªº COM+ ) ªº¥æ©ö¹jÂ÷¼h¬O Serialized¡CÁöµM³o¼Ë´£¨Ñ¤F°ª«×ªº¹jÂ÷¡A´«¨Óªº«o¬O®Ä¯à¤WªºÄ묹¡C¦]¬°¸ê·½ºÞ²zªÌ( ³q±`¬O¸ê®Æ®w ) ¦b¥æ©ö¶i¦æ¤¤¥²¶·¦P®Éºû«ùŪ¨ú©M¼g¤JÂê©w¡A©Ò¥H¾É­P¨t²Îªº¾ãÅé®Ä¯à¤U­°¡C¦b³oºØ®É­Ô¡A¨ä¥Lªº¥æ©ö³£¬O³Q«ÊÂꪺ¡A³o·|¹ï§AªºÀ³¥Îµ{¦¡ªº©µ®i©Ê³y¦¨«Ü¤jªº¼vÅT¡C

COM+ version 1.5¡A¬O·f¸ü¦b Microsoft Windows .NET ¤¤¡A¤¹³\¦b COM+ catalog ¥H¤¸¥ó¬°³æ¦ì³]©w¥æ©ö¹jÂ÷¼h¡CT¨ä¤¤Ãö©ó®Ú¤¸¥óªº¥æ©ö¹jÂ÷¼h³]©w´N·|¨M©w¸Ó¥æ©öªº¹jÂ÷¼h¡C¦¹¥~¡A¦b¦P¤@¥æ©ö¤¤ªº¤º³¡¤l¤¸¥óªº¹jÂ÷¼h¤£¯à³]©w±o¤ñ®Ú¤¸¥óªº¹jÂ÷¼hÁÙ°ª¡C¦pªG¯uªº³o¼Ë³]©w¡A¦b¤l¤¸¥óªì©l¤Æ®É±N·|¤Þµo¿ù»~¡C

¹ï .NET ºÞ²zÃþ§O¦Ó¨¥¡ATransaction Äݩʤ䴩¤½¶}ªº Isolation ÄݩʡC§A¥i¥H¥Î³o­ÓÄݩʨӫŧi¯S©wªº¹jÂ÷¼h¡A´N¦p¥H¤Uµ{¦¡½X©Ò­z¡C

 [Transaction(TransactionOption.Supportedm, Isolation=TransactionIsolationLevel.ReadCommitted)]
public class Account : ServicedComponent
{
  ...
}
  

§ó¦h¬ÛÃö¸ê°T

¦pªG·Q¨ú±o¦hÃö©ó¥æ©ö¹jÂ÷¼h³]©w¥H¤Î¨ä¥L Windows .NET COM+ ±j¤Æ ªº¬ÛÃö³]©w¡A½Ð°Ñ¾\ MSDN Âø»x¤å³¹¡A "Windows XP: Make Your Components More Robust with COM+ 1.5 Innovations" ÂI¿ï¥H¤Uºô§}¶i¤J http://msdn.microsoft.com/msdnmag/issues/01/08/ComXP/default.aspx¡C

¨M©w¥æ©öµ²ªG

¦Û°Ê¥æ©öªºµ²ªG¬O¥Ñ transaction abort flag¡A¸ò consistent flags¡A¥H¤Î¥æ©ö¹Lµ{¤¤©Ò¦³¬ÛÃö¤¸¥óªº¤º®e¨Ó¨M©w¡C¥æ©öµ²ªG¬O¦b¥æ©ö¤¤ªº®Ú¤¸¥ó°±¤î¹B§@®É ( ·|§â±±¨îÅv¦^¶Çµ¹©I¥sªÌ )¨M©w ¡C¦b¹Ï 5 ¤¤¡A®i²{¥Xªº¬O¨å«¬ªº»È¦æ°òª÷¶Ç¿é¥æ©ö¡C

Figure 1.5. Transaction stream and context

¹Ï 1.5. ¥æ©ö¹Lµ{»P¤º®e

¥æ©öµ²ªG¬O¦b®Úª«¥ó (¦b½d¨Ò¤¤¡A¬O Transfer ª«¥ó ) °±¤î¹B§@®É¨M©w¡AµM«á¥Î¤áºÝªº¤èªk±N·|¦^¶Ç¡C¦pªG¥æ©ö¤º®e¤¤¦³¥ô¦óªº consistent flags ³Q³]¬° false¡A©Î¬O transaction abort flag ³Q³]¬° true¡A¹ê»Ú¤Wªº DTC ¥æ©ö·|³Q¨ú®ø¡C

§A¥i¥H¥Î .NET ª«¥ó³z¹L¤U¦C¨âºØ¤èªk¤§¤@¨Ó±±¨î¥æ©öµ²ªG :

§A¥i¥H¥Î AutoComplete Äݩʨӥ[µù¤èªk¡AµM«áÅý .NET ¦Û°Ê³B²z¥æ©öµ²ªG¡C³z¹L³o­ÓÄݩʡA¦pªG¤èªk¦^¶Ç¨Ò¥~¡Aconsistent flag ·|¦Û°Ê³Q³]¬° false ( ³o³Ì«á·|¾É­P¥æ©ö¨ú®ø )¡C¦pªG¤èªk¨S¦³¦^¶Ç¨Ò¥~¡Aconsistent flag ·|³Q³]¬° true¡A³o¥Nªí¥æ©öÀ³¸Ó­n³Q°e¥X¡C³o­Ó¤èªk¨ä¹ê¤£¤Ó¦³«O»Ù¡A¦]¬°¥¦­n³z¹L¦P¤@¥æ©ö¤¤¨ä¥Lª«¥óªº°Ñ»P¡C

§A¥i¥H©I¥s ContextUtil Ãþ§O¤¤ªº SetComplete ©Î¬O SetAbort ÀRºA¤èªk¡A³o¥i¥Hª½±µ³]©w consistent flag ¬° true ©Î false¡C

SQL Server ¿ù»~ÄY­«µ{«×¤j©ó 10 ·|³y¦¨ managed data provider ¦^¶Ç SqlException «¬§Oªº¿ù»~¡C¦pªG§Aªº¤èªk®·Àò¨Ã³B²z¤F³o­Ó¨Ò¥~¡A½T»{§A¦³¤â°Ê¨ú®ø³o­Ó¥æ©ö¡A©Î¬O¹ï¦³¼Ð©ú [AutoComplete] ªº¤èªk¡A½T»{³o­Ó¨Ò¥~¦³¦^¶Çµ¹©I¥sªÌ¡C

[AutoComplete] ¤èªk

¹ï¦³¼Ð©ú AutoComplete Äݩʪº¤èªk¡A½Ð¶i¤U¦C°Ê§@¤§¤@ :

¦^¶Ç SqlException ¨ì©I¥s°ïÅ|¡C

§â SqlException ¥]¸Ë¦¨¤@­Ó¥~³¡¨Ò¥~¨Ã¥B¦^¶Çµ¹¤¬¸ûªÌ¡C§A¥i¯à·|·Q§â­ì¨Óªº¨Ò¥~¥]¸Ë¦nÅý©I¥sªÌ§ó¦n³B²z¡C

¦^¶Ç¨Ò¥~¥¢±Ñ·|³y¦¨ª«¥ó¨S¦³¥¿½T¦a¨ú®ø¥æ©ö¡A¾¨ºÞ¸ê®Æ®w¤w¸gµo¥Í¿ù»~¡C³o¥Nªí¥Ñ¨ä¥Lª«¥ó°õ¦æªº¦¨¥\¾Þ§@¥i¯à¤w¸g°e¥X¡C

¤U¦Cµ{¦¡½X·|®·Àò SqlException ¡A¨Ã¥B±N¨äª½±µ¦^¶Çµ¹©I¥sªÌ¡C¦Ó¥æ©ö³Ì«á·|³Q¨ú®ø¡C¦]¬°·íª«¥ó°±¤î¹B§@®É¡Aª«¥óªº consistent flag ·|¦Û°Ê³Q³]¬° false¡C

 [AutoComplete]
void SomeMethod()
{
  try
  {
    // Open the connection, and perform database operation
    . . .
  }
  catch (SqlException sqlex )
  {
    LogException( sqlex ); // Log the exception details
    throw;                 // Rethrow the exception, causing the consistent 
                           // flag to be set to false.
  }
  finally
  {
    // Close the database connection
    . . .
  }
}
  

«D [AutoComplete] ¤èªk

¹ï¨S¦³¥[µù AutoComplete Äݩʪº¤èªk¡A§A¥²¶· :

¦b catch µ{¦¡°Ï¶ô¤¤©I¥s ContextUtilSetAbort ¤èªk¥H¨ú®ø¥æ©ö¡C³o·|Åý consistent flag ³]¬° false¡C

¦pªG¨S¦³µo¥Í¨Ò¥~¡A«h©I¥s Call ContextUtil.SetComplete ¥H°e¥X¥æ©ö¡C³o·|Åý consistent flag ³]¬° true ( ³o¬O¥¦ªº¹w³]ª¬ºA )¡C

¤U¦Cµ{¦¡½X´N¬O¥Ü½d¡C

void SomeOtherMethod()
{
  try
  {
    // Open the connection, and perform database operation
    . . .
    ContextUtil.SetComplete(); // Manually vote to commit the transaction
  }
  catch (SqlException sqlex)
  {
    LogException( sqlex );   // Log the exception details
    ContextUtil.SetAbort();  // Manually vote to abort the transaction
    // Exception is handled at this point and is not propagated to the caller
  }
  finally
  {
    // Close the database connection
    . . .
  }
}
  

ªþµù : ¦pªG§A¦³«Ü¦h catch µ{¦¡°Ï¶ô¡A¤èªkªº¶}©l³B©I¥sªº ContextUtil.SetAbort ¤@¦¸´N¦n¡A¨Ã¥B¦b try µ{¦¡°Ï¶ôªºµ²§À©I¥s ContextUtil.SetComplete¡C³o¼Ë°µªº¸Ü¡A§A´N¤£»Ý­n¦b¨C­Ó catch µ{¦¡°Ï¶ô¤¤­«½Æ©I¥s ContextUtil.SetAbort¡C³o¨Ç¤èªk©Ò³]©wªº consistent flag ¥u¦³¦b¤èªk¦^¶Ç®É¤~¨ã¦³·N¸q¡C

§A¤@©w±o§â¨Ò¥~ ( ©Î¬O¥]¸Ë¹Lªº¨Ò¥~ )¦^¶Ç¨ì©I¥s°ïÅ|¡A¦]¬°³o¼Ë¤~¯àÅý©I¥sªºµ{¦¡½Xª¾¹D¥æ©ö¥¢±Ñ¤F¡C³o¼Ë¤~¯àÅý©I¥sªºµ{¦¡½X¶i¦æ½Õ¾ã¡CÁ|¨Ò¨Ó»¡¡A¦b»È¦æ°òª÷¶Ç¿é®×¨Ò¤¤¡A¦pªG¦©´Ú¾Þ§@¥¢±Ñ¡A¶Ç¿é¤¸¥ó¥i¥H¨M©w¤£­n°õ¦æ«H¥Î¾Þ§@¡C

¦pªG§A§â consistent flag ³]¬° false ¥i¬O¨S¦³¦^¶Ç¥ô¦ó¨Ò¥~¡A©I¥sªºµ{¦¡½X´NµLªk±oª¾¥æ©ö¥¢±Ñ¤F¡CÁöµM§A¥i¥H¦^¶Ç¤@­Ó©Î¤@¨Ç¥¬ªL°Ñ¼Æ¡A§AÁÙ¬OÀ³¸Ó¦^¶Ç¨Ò¥~¥H«ü¥X¿ù»~ª¬ªp¡C³o¬O¥Î¼Ð·Çªº¨Ò¥~³B²z¤èªkÅýµ{¦¡½X§ó²M´·¥B¨ã³Æ¤@­P©Ê¡C

¦^¨ì­¶­º¦^¨ì­¶­º

¸ê®Æ¤À­¶

¸ê®Æ¤À­¶¬O¤À´²¦¡À³¥Îµ{¦¡¤¤ªº±`¨£»Ý¨D¡CÁ|¨Ò¨Ó»¡¡A¨Ï¥ÎªÌ¥i¯à·|·Q¬Ý¨ì®ÑÄy²M³æ¡A¦ý¤£¯à¤@¦¸Åã¥Ü¾ã­Ó²M³æ¡C¨Ï¥ÎªÌ·|·Q­n¹ï¸ê®ÆÅã¥Ü¶i¦æ¤H©Ê¤Æªº³B²z¡A¤ñ¦p»¡Æ[¬Ý¤U¤@­¶©Î¤W¤@­¶©Î¬O¸õ¦Ü²M³æªº¶}ÀY©Îµ²§À¡C

³o­Ó³¹¸`°Q½×ªº¬O¦p¦ó¹ê§@³o¼Ëªº¥\¯à¡A¥H¤Î¦UºØ¤è®×¹ï®Ä¯à»P©µ®i©Êªº¼vÅT¡C

¤ñ¸û¥i¨Ñ¿ï¾Üªº¤è®×

¶i¦æ¸ê®Æ¤À­¶ªº¿ï¾Ü¦³ :

¨Ï¥Î SqlDataAdapter ¤¤ªº Fill ¤èªk±N¬d¸ßµ²ªG¤¤ªº³¡¤À¤º®e¶ñ¤J DataSet ¤¤

³z¹L COM ªº¤¬³q©Ê¨Ï¥Î ADO ¥H¤Î¨Ã¥B¨Ï¥Î¤@­Ó¦øªA¾¹ºÝªº´å¼Ð

¥Î¹w¦sµ{§Ç¤â¬q¹ê§@¸ê®Æ¤À­¶

­n¨Ï¥Î¤°»ò¼Ëªº¤è¦¡¶i¦æ¸ê®Æ¤À­¶¡AÀ³¸Ó­n¨ú¨M©ó¥H¤U¦]¯À:

©µ®i©Êªº»Ý¨D

®Ä¯àªº»Ý¨D

ºô¸ôÀW¼e

¸ê®Æ®w¦øªA¾¹ªº°O¾ÐÅé»P¹q·½

¤¤¤¶¼h¦øªA¾¹ªº°O¾ÐÅé»P¹q·½

§A·Q¦b¤@­Ó­¶­±¤¤¦^¶Ç¦h¤Ö¸ê®Æ¦C

¸ê®Æ¤À­¶ªº¤j¤p

®Ä¯à´ú¸ÕÃÒ¹ê¡A¨Ï¥Î¹w¦sµ{§Ç¤â°Ê¶i¦æ¡A¦b¦UºØªº­t²üª¬ºA¤U³£¯à¾Ö¦³¨}¦n®Ä¯à¡CµM¦Ó¡A·í§A¦b¦øªA¾¹¤W¨Ï¥Î³o­Ó¤èªk°õ¦æ¤u§@®É¡A¦pªG§Aºô¯¸¤Wªº¥\¯à³£¸ò¤À­¶¥\¯à¬ÛÃö¡A¦øªA¾¹ªº­t²üµ{«×´N·|¦¨¬°«Ü­«¤jªº°ÝÃD¡C¬°¤F½T©w­þ­Ó¤è®×¾A¦X§Aªº¨t²ÎÀô¹Ò¡A³Ì¦n¯à¨C­Ó¤èªk³£¦b§Aªº¨t²Î¤W´ú¸Õ¤@¤U¡C

¥H¤U¦³´X­Ó¿ï¾Ü¤è®×¥i¨Ñ°Q½×¡C

¨Ï¥Î SqlDataAdapter ªº Fill ¤èªk

¥¿¦p¤§«e©Ò´£ªº¡ASqlDataAdapter ¬O¥Î¨Ó±N¸ê®Æ®w¤¤¸ê®Æ¶ñ¤J DataSet¡C¦h¸üªº Fill ¤èªk¤¤ªº¤@ºØ( ¦p¤U¦Cµ{¦¡½X©Ò­z ) ¨Ï¥Î¨â­Ó¾ã¼Æ¯Á¤Þ­È¡C

public int Fill(
   DataSet dataSet,
   int startRecord,
   int maxRecords,
   string srcTable
);
  

startRecord ¬O±q¦ó³B¶}©l¬ö¿ýªº¯Á¤Þ¡CmaxRecords ¬O±q startRecord ¶}©l¡A«áÀx¦sªº¬ö¿ýªº³Ì¤j­È¡AµM«á±N³o¼Ë¤º®e½Æ»s¶i DataSet¡C

¤º³¡¹B§@¤¤¡ASqlDataAdapter ¨Ï¥Î SqlDataReader ¨Ó°õ¦æ¬d¸ß¨Ã¦^¶Çµ²ªG¡CSqlDataAdapter ±o¨ìµ²ªG«á³Ð«Ø DataSet ·Ç³Æ§â¦^¶Ç«áªº¸ê®Æ¶ñ¤J¡CSqlDataAdapter copies ³z¹L startRecord ©M maxRecords °Ñ¼Æ±N¸ê®Æ½Æ»s·í­è²£¥Íªº DataSet ¨Ã¥B§â¤£»Ý­nªºµ²ªG¸ê®Æ±Ë±ó¡C³o¥Nªí»¡¥i¯à·|¦³«Ü¦h¤£¥²­nªº¸ê®Æ±q¦øªA¾¹¶Ç¿é¨ì¥Î¤áºÝ¡A³o¬O¥»¤èªkªº¥D­n¯ÊÂI¡C

Á|¨Ò¨Ó»¡¡A¦pªG§A¦³ 1000 µ§¬ö¿ý¦Ó§A·Q­n²Ä 900 µ§¨ì 950 µ§¡A¨º¤§«eªº 899 µ§³£·|³z¹Lºô¸ô¶Ç¨ì¥Î¤áºÝµM«á¦A±Ë±ó¡C³oºØ¸ê·½®ö¶O¦b¤p³W¼Òªºµ²ªG¦^¶Ç®É¤]³\ÁÙ¦n¡A¦ý¦pªG¬O¤j³W¼Òªº¸ê®Æ´N«ÜÄY­«¤F¡C

¨Ï¥Î ADO

¥t¥~¤@­Ó¤èªk¬O¥Î COM ¬°°ò¦ªº ADO ¨Ó¹ê§@¡C³o­Ó¤èªk¤¤ªº­«ÂI¬O³z¹L¦øªA¾¹ºÝ´å¼Ð¨Ó¶i¦æ¦s¨ú¡AµM«á±N¸ê®Æ¾É¥X¦Ü ADO ªº Recordset ª«¥ó¡C§A¥i¥H³]©w Recordset ªº´å¼Ð¦ì¸m¬° adUseServer¡C ¦pªG§Aªº OLE DB provider ¤ä´©³oºØ°µªk ( SQLOLEDB ¤ä´© )¡A´N·|±Ò¥Î¦øªA¾¹ºÝ´å¼Ð¡C§A¥i¥H³z¹L³o­Ó´å¼Ð¨Ó§ä´M­n¶}©l¦s¨úªº¬ö¿ý¡A¦Ó¤£¥Î±N¥ô¦ó¸ê®Æ³z¹Lºô¸ô¶Ç¨ì¥Î¤áºÝ¡C

³o­Ó¤èªk¥D­n¦³¨â­Ó¯ÊÂI :

¦b¤j¦h¼Æªº±¡ªp¤U¡A§A·|·Q­n¥ÎºÞ²zµ{¦¡½X§â Recordset ª«¥ó¤¤¦^¶Çªº¸ê®ÆÂà·|¶ñ¤J DataSet ¤¤¡CÁöµM OleDbDataAdapter ¦³ Fill ¤èªk§â ADO ªº Recordset ª«¥óÂà´«âФJ DataSet¡A¤£¹L¨Ã¤£¯à¥Ñ¯S©wªº¬ö¿ý¶}©l©Îµ²§ô¡C¹ê»Ú¤W¥u¯à§â¤â°Ê¿ï¾Ü Recordset ª«¥ó¤¤ªº¶}©l¬ö¿ý¡A³z¹L°j°é¤â°Ê§â¸ê®Æ½Æ»s¨ì DataSet¤¤¡C³o¼Ë§@ªk©Ò³y¦¨ªº®Ä¯à®ö¶O¡A¯S§O¬O³z¹L COM ¤¬³q©I¥s³y¦¨ªº¡A¥i¯à¤ñ³z¹Lºô¸ô¶Ç¿é¦h¾l¸ê®ÆÁÙ¦h¡A¤×¨ä¬O¦b¤p«¬ªº DataSet¡C

¦b§A­nªº¸ê®Æ±q¦øªA¾¹¶Ç¿é¨ì¥Î¤áºÝ®É¡A§A³£¥²¶·ºû«ù³sµ²ª¬ºA¨Ã¶}±Ò¦øªA¾¹´å¼Ð¡C¦Ó¦b¸ê®Æ®w¦øªA¾¹¤W¨Ï¥Î¤Îºû«ù­È³o­Ó´å¼Ð¬O«Ü¯Ó¶O¸ê·½ªº¡CÁöµM¨Ï¥Î³o­Ó°µªk¥i¯à·|´£°ª§Aªº®Ä¯à¡A¦ý«o¥i¯à­°§Cµ{¦¡ªº©µ®i©Ê¥H¤Î®ö¶O¤Ó¦h¦øªA¾¹¸ê·½¡C

¨Ï¥Î¤â°Ê¹ê§@

³Ì«á©Ò­n°Q½×ªº³oºØ¤èªk¬O¨Ï¥Î¹w¦sµ{§Ç¨Ó¦b§AªºÀ³¥Îµ{¦¡¤¤¤â°Ê¹ê§@¤À­¶¥\¯à¡C¹ï¦³°ß¤@Á䪺¸ê®Æªí¡A§A¨Ï¥Î¹w¦sµ{§Ç¨Ó¹ê§@¬Û¹ï¤W¬O¤ñ¸û®e©ö¡C¹ï¨S¦³°ß¤@Á䪺¸ê®Æªí ( ³o¼Ëªº¸ê®ÆªíÀ³¸Ó¤£¦h )¡A¬Û¹ï¤W´N¤ñ¸û§xÃø¡C

¹ï¦³°ß¤@Á䪺¸ê®Æªí¶i¦æ¤À­¶

¦pªG§A·Q¶i¦æ¤À­¶ªº¸ê®Æªí¨ã¦³°ß¤@Áä¡A§A¥i¥H¦b WHERE ¨Ï¥Î¸Ó¯Á¤ÞÁä¨Ó«Ø¸m±q¯S©w¸ê®Æ¦C¶}©lªº¦^¶Çµ²ªG¡C¨Ã°t¦X SET ROWCOUNT ±Ô­z¨Ï¥Î¥H­­¨î¦^¶Ç¸ê®Æ¶°ªº¤j¤p¡A´£¨Ñ¤@­Ó¦³®Ä²vªº¤À­¶¾÷¨î¡C³o­Ó¤èªk´N¦p¥H¤Uªº¹w¦sµ{§Ç½d¨Ò©Ò¥Ü :

CREATE PROCEDURE GetProductsPaged
@lastProductID int,
@pageSize int
AS
SET ROWCOUNT @pageSize
SELECT *
FROM Products
WHERE [standard search criteria]
AND ProductID > @lastProductID
ORDER BY [Criteria that leaves ProductID monotonically increasing]
GO
  

³o­Ó¹w¦sµ{§Çªº©I¥sªÌ¥u­nºûÅ@ lastProductID ­È¡A¨Ã¥B¦b³sÄòªºµ{§Ç©I¥s¶¡¡A¥[´î¤À­¶¤j¤pªº¼Æ­È¡C

¹ï¤£¨ã°ß¤@Á䪺¸ê®Æªí¶i¦æ¤À­¶

¦pªG§A·Q¶i¦æ¤