常常在論壇上碰到一些新學ASP開發的朋友諮詢如何經過查詢按類別輸出數據,而一般用的方法是先查詢出各種別,而後經過循環一個一個的再查詢出該類別的數據輸出。這個辦法是最簡單的,可是也是比較耗費資源和效率比較低的。下面我介紹兩個方法,都是隻查詢一次就能夠輸出的,但願對你們有所幫助。數據庫
本例子所使用的數據庫結構以下:ide
(一) 經過一個變量控制輸出函數
代碼以下:oop
<%@Language=VBScript CodePage=936%> 測試
<% 字體
Option Explicit code
dim conn,rs,currentClassname 對象
Set Conn=Server.CreateObject("ADODB.Connection") 排序
conn.Open "Driver={Microsoft Access Driver (*.mdb)};Dbq= test.mdb;" ip
set rs=conn.execute("select id,classname,title from test order by classname,title")
currentClassname=""
do while not rs.eof
if currentClassname<>rs("classname") then if currentClassname="" then response.write "<table>" & vbcrlf else response.write "</table><br /><table>" & vbcrlf end if currentClassname=rs("classname") response.write "<tr><td align='center' style='font-weight:bold;'>"¤tClassname&"</td></tr>"& vbcrlf end if response.write "<tr><td><a href='test.asp?id="&rs("id")&"'>"&rs("title")&"</a></td></tr>"& vbcrlf rs.movenext
loop
response.write "</table>"& vbcrlf
%>
rs.close
set rs=nothing
conn.close
set conn=nothing
該方法要點有兩個:
一、 查詢語句。
咱們看看這個查詢語句:select id,classname,title from test order by classname,title
紅色字體部分就是要注意的,只有排序方式是先按類別排序的,咱們才能得出咱們須要的效果。
二、 循環控制變量。
從代碼中,咱們能夠看到currentClassname這個變量記錄了當前的類別名稱,當該名稱發生該表的時候,也就意味着上一類別已經輸出完成,須要更改咱們的顯示了。
(二) 經過ADO的Shape命令查詢結果。
咱們先看看Shape命令在ADO中的說明:
「數據構形」定義了成形 Recordset 的列、由列表明的條目之間的關係以及數據充填到 Recordset 的方式。
成形的 Recordset 能夠由以下類型的列組成:
Shape 命令能夠包含子句,指定針對基本數據提供者並將返回 Recordset 對象的查詢命令。查詢的語法取決於對基本數據提供者的要求。雖然 ADO 並不要求使用任何指定的查詢語言,但一般是使用結構化查詢語言 (SQL)。
您可使用 SQL JOIN 子句關聯兩個表,可是,分級 Recordset 能夠更有效地表達信息。由 JOIN 建立的 Recordset 的每行會多餘地重複一個表中的信息。分級 Recordset 的多個子 Recordset 對象中,每一個對象僅有一個父 Recordset。
Shape 命令能夠僅由 Recordset 對象發出。
Shape 命令能夠嵌套,即父命令或子命令自己能夠是另外一個 Shape 命令。
有關定位分級 Recordset 的詳細信息,請參閱訪問分級 Recordset 中的行。
有關語法正確的 Shape 命令的詳細信息,請參閱形狀語法格式。
合計函數、CALC 函數和 NEW 關鍵字
數據構形支持以下函數。chapter-alias 是指定給包含了將被操做列的子集名稱。
chapter-alias(子集-別名)能夠是完整的,由指向包含 column-name 的子集的每一個子集列名稱組成,所有用句號分隔。例如,若是父子集 chap1 包含擁有數量列 amt 的子子集,則完整名便是 chap1.chap2.amt。
而後咱們能夠寫出以下代碼:
<%@Language=VBScript CodePage=936%>
<%
Option Explicit
dim conn,rs,rschapClassname
Set Conn=Server.CreateObject("ADODB.Connection")
conn.Open "Provider=MSDataShape;Data Provider=MSDASQL;Driver={Microsoft Access Driver (*.mdb)};Dbq=D:/projects/homepage/test/sample1/test.mdb;"
set rs=conn.execute( "SHAPE {select DISTINCT classname from test order by classname }" & vbcrlf & _
"APPEND ({select id,title,classname from test} " & vbcrlf & _ "RELATE classname TO classname) AS chapClassname")
do while not rs.eof
response.write "<table>" & vbcrlf & _ "<tr><td align='center' style='font-weight:bold;'>"&rs("classname")&"</td></tr>"& vbcrlf set rschapClassname=rs("chapClassname").value do while not rschapClassname.eof response.write "<tr><td><a href='test.asp?id="&rschapClassname("id")&"'>"&rschapClassname("title")&"</a></td></tr>"& vbcrlf rschapClassname.movenext loop response.write "</table>" & vbcrlf rs.movenext
loop
rschapClassname.close
set rschapClassname=nothing
rs.close
set rs=nothing
conn.close
set conn=nothing
在以上代碼中咱們要注意的有點:
一、 數據庫聯接
Shape命令構型必定要在數據庫鏈接的字符串中加入Provider=MSDataShape;Data Provider=MSDASQL;,否則是不能用過shape進行查詢的。
二、 查詢結構
咱們看看如下查詢語句:
SHAPE {select DISTINCT classname from test order by classname }
APPEND ({select id,title,classname from test} RELATE classname TO classname) AS chapClassname
首先是查詢出主要類別:{select DISTINCT classname from test order by classname }
而後經過APPEND將該類型的全部記錄做爲一個記錄集追加到主查詢,做爲主查詢的一個字段,而後經過「set rschapClassname=rs("chapClassname").value」訪問該記錄集進行輸出。
看過的朋友必定會問:「這兩個方法哪一個方法最好?」
呵呵,很差意思,由於我沒作過詳細的測試,因此不知道那個最好。你們能夠根據各自狀況選擇其中的一種辦法,或許可能還有更好的辦法是我沒想到的。