ADO如何善用RecordSet组件呢?

為了善用RecordSet物件,RecordSet物件還有許多有用的屬性和方法,讓我們再學學:

Filter屬性:於ReecordSet設定搜尋過濾的條件,只顯示合乎條件的資料。
Clone方法:複製一份RecordSet。
CacheSize屬性:設定或得知RecordSet暫存(cache)於記憶體的的記錄筆數。
Filter屬性

經由SELECT等指令將查詢存放到RecordSet的記錄,仍然可以於RecordSet中再設定搜尋過濾的條件,方法為使用Filter屬性。

Filter屬性,於ReecordSet設定搜尋的過濾條件,只顯示合乎條件的資料。

讓我們看一個於ASP程式碼當中使用Filter屬性的例子。

譬如ASP程式碼rs19.asp如下,Filter設定為rs2.Filter = "出版='松崗'",表示只要搜尋 [出版] 欄位為 [松崗] 的記錄:

 1   
 2  
 3Set conn1 = Server.CreateObject("ADODB.Connection")   
 4  
 5conn1.Open "DBQ="& Server.MapPath("ntopsamp.mdb") &";Driver={Microsoft Access Driver (*.mdb)};DriverId=25;FIL=MS Access;"   
 6  
 7Set rs2 = Server.CreateObject("ADODB.Recordset")   
 8  
 9SqlStr = "SELECT * From 著作"   
10  
11rs2.Open SqlStr,conn1,1,1   
12  
13rs2.Filter = "出版='松崗'"   
14  
1<table border="0" cellpadding="5" colspan="8">
2<tr>
3<td align="CENTER" bgcolor="#008080"><font color="#FFFFFF">書名</font></td>
4<td align="CENTER" bgcolor="#008080"><font color="#FFFFFF">出版</font></td>
5<td align="CENTER" bgcolor="#008080"><font color="#FFFFFF">圖片</font></td>
6<td align="CENTER" bgcolor="#008080"><font color="#FFFFFF">簡介</font></td>   
7  

Do while not rs2.EOF

 1  
 2<tr>
 3<td align="CENTER" bgcolor="f7efde">```
 4= rs2("書名") 
 5```</td>
 6<td align="CENTER" bgcolor="f7efde">```
 7= rs2("出版") 
 8```</td>
 9<td align="CENTER" bgcolor="f7efde">```
10= rs2("圖片") 
11```</td>
12<td align="CENTER" bgcolor="f7efde">```
13= rs2("簡介") 
14```</td>
15</tr>   
16  

rs2.MoveNext

1  

Loop

1  
2</tr></table>
1 rs2.Close 

以上的 ASP程式碼rs19.asp,於用戶端使用瀏覽器,瀏覽執行的結果,顯示過濾後的結果,只顯示合乎條件的資料。

CacheSize屬性

CacheSize屬性,設定或得知RecordSet暫存(cache)於記憶體的的記錄筆數,預設值為1。

譬如您若將CacheSize設定為10時,ADO首先將前10筆的記錄暫存(cache)放到本機記憶體緩衝器(local memory buffer)當中,一旦您移動到最末的第10筆記錄時,ADO暫存(cache)第二個10筆記錄。

若要更新暫存(cache)的記錄,可使用Resync方法。

讓我們看一個於ASP程式碼當中使用CacheSize的例子。

譬如ASP程式碼rs18.asp如下,這個例子將產品資料表的資料由第一筆逐一移動到最末筆,總計循環做了100次,計算總共花了多少時間,比較有和沒有設定CacheSize的執行效能差別:

 1   
 2  
 3Set conn1 = Server.CreateObject("ADODB.Connection")   
 4  
 5conn1.Open "DBQ="& Server.MapPath("ntopsamp.mdb") &";Driver={Microsoft Access Driver (*.mdb)};DriverId=25;FIL=MS Access;"   
 6  
 7Set rs2 = Server.CreateObject("ADODB.Recordset")   
 8  
 9SqlStr = "SELECT * From 產品"   
10  
11rs2.Open SqlStr,conn1,1,1   
12  
13t1 = Timer   
14  
15For i = 1 to 100   
16  
17rs2.MoveFirst   
18  
19Do while not rs2.EOF   
20  
21A = rs2(0)   
22  
23rs2.MoveNext   
24  
25Loop   
26  
27Next   
28  
29t2 = Timer   
30  
31Response.Write "

<br/>

 1無設CacheSize: " & CINT(t2 - t1)   
 2  
 3rs2.MoveFirst   
 4  
 5rs2.CacheSize = 10   
 6  
 7t2 = Timer   
 8  
 9For i = 1 to 100   
10  
11rs2.MoveFirst   
12  
13Do while not rs2.EOF   
14  
15A = rs2(0)   
16  
17rs2.MoveNext   
18  
19Loop   
20  
21Next   
22  
23t2 = Timer   
24  
25Response.Write "

<br/>

1有設CacheSize: " & CINT(t2 - t1)   
2  
1 rs2.Close 

由本例,未設定CacheSize,花了6秒時間就完成。將CacheSize設定為10時,反而花了9秒時間才完成。可見CacheSize須小心使用,否則將影響執行的效能。

Clone方法

Clone方法,複製一份RecordSet。

有時候想處理一下RecordSet,譬如使用如上的Filter屬性,於ReecordSet設定搜尋的過濾條件,RecordSet就被變更,此時若又想保留原RecordSet時,就可以使用Clone方法,先複製一份RecordSet,再處理複製的那一份。

讓我們看一個於ASP程式碼當中使用Clone的例子。

譬如ASP程式碼rs12.asp如下,使用Set rs1 = rs.Clone將rs 的RecordSet複製一份到rs1的RecordSet當中:

 1   
 2  
 3Set conn1 = Server.CreateObject("ADODB.Connection")   
 4  
 5conn1.Open "DBQ="& Server.MapPath("ntopsamp.mdb") &";Driver={Microsoft Access Driver (*.mdb)};DriverId=25;FIL=MS Access;"   
 6  
 7Set rs = Server.CreateObject("ADODB.Recordset")   
 8  
 9SqlStr = "SELECT * FROM 著作"   
10  
11rs.Open SqlStr,conn1,1,1   
12  
13Set rs1 = rs.Clone   
14  
1<center>
2<table border="0" cellpadding="5" colspan="8">
3<tr>
4<td align="CENTER" bgcolor="#008080"><font color="#FFFFFF">書名</font></td>
5<td align="CENTER" bgcolor="#008080"><font color="#FFFFFF">出版</font></td>
6<td align="CENTER" bgcolor="#008080"><font color="#FFFFFF">圖片</font></td>
7<td align="CENTER" bgcolor="#008080"><font color="#FFFFFF">簡介</font></td>
8</tr>   
9  

Do While Not rs1.EOF

 1  
 2<tr>
 3<td align="CENTER" bgcolor="f7efde">```
 4= rs1("書名")
 5```</td>
 6<td align="CENTER" bgcolor="f7efde">```
 7= rs1("出版")
 8```</td>
 9<td align="CENTER" bgcolor="f7efde">```
10= rs1("圖片")
11```</td>
12<td align="CENTER" bgcolor="f7efde">```
13= rs1("簡介")
14```</td>
15</tr>   
16  

rs1.MoveNext

Loop

rs1.Close

 1  
 2</table>   
 3  
 4以上的 ASP程式碼rs12.asp,於用戶端使用瀏覽器,瀏覽執行的結果,顯示經過複製的那一份rs1的RecordSet。   
 5  
 6DSN data source   
 7  
 8當我們想得知DSN data source的詳細資訊時,可以直接將連線顯示出來。   
 9  
10讓我們看一個於ASP程式碼當中得知DSN data source詳細資訊的例子。   
11  
12譬如ASP程式碼rs11.asp如下:   
13  

Set conn1 = Server.CreateObject("ADODB.Connection")

conn1.Open "DBQ="&amp; Server.MapPath("ntopsamp.mdb") &amp;";Driver={Microsoft Access Driver (*.mdb)};DriverId=25;FIL=MS Access;"

Response.Write(conn1)

 1  
 2以上的 ASP程式碼rs11.asp,於用戶端使用瀏覽器,瀏覽執行的結果,使用Response.Write(conn1),即可顯示DSN data source的詳細資訊。   
 3  
 4OpenSchema   
 5  
 6OpenSchema方法,可得知SQL Server某一個資料庫的資料表資訊。   
 7  
 8讓我們看一個於ASP程式碼當中使用OpenSchema的例子,請先安裝本書所附「網站熱門應用精選」光碟片,以便自動於SQL Server建立comPak資料庫。   
 9  
10譬如ASP程式碼rs30.asp如下:   
11  

Set conn1 = Server.CreateObject("ADODB.Connection")

conn1.Open "driver={SQL Server};server=(Local);uid=sa;pwd=;database=comPak"

set rs = conn1.OpenSchema(20) 'adSchemaTables

Do while not rs.EOF

Response.Write "<br/>" &amp; rs("TABLE_NAME") &amp; ": " &amp; rs("TABLE_TYPE")

rs.MoveNext

Loop

1  
2以上的 ASP程式碼rs30.asp,於用戶端使用瀏覽器,瀏覽執行的結果,由set rs = conn1.OpenSchema(20) 取得SQL Server 的comPak資料庫的資料表資訊,其中rs("TABLE_NAME")取得資料表名稱,rs("TABLE_TYPE")取得資料表類型。</center>
Published At
Categories with Web编程
comments powered by Disqus