當有一天,你的心情突然變得很壞,但是巧合的是,在你的留言簿中你的網友留了一句很讓你振奮的話,於是你很快就重拾了快樂的心情。但是在不久後你又一次心情變壞,但是這次卻沒有上次那麼幸運,因為沒有人給予你鼓勵,於是你自然就想再看一看上次那句令你很受振奮的話。這時你就會想:假如我的留言簿有留言查詢功能就好了!
為了能達成你的心愿,於是我決定在本章教程為你解說具有留言查詢功能的留言簿程式。在講解之前,讓我們還是先來學習將在來源程式中用到的COMMAND對象。
首先讓我們先來瞭解一下Command對象所提供的屬性和方法以及它們的相應功能
ActiveConnection屬性--建立與Connection通道的連結關係
CommandText屬性--指定資料查詢資訊
CommandTimeout屬性--開始執行資料查詢後允許繼續執行的最長時間
CommandType屬性--指定資料查詢資訊的類型
Prepared屬性--指定資料查詢資訊是否要先行編譯
CreateParameter方法--建立一個新的參數對象
Execute 方法--對資料庫提出資料查詢
Command對象也是ADO對象集合的一員,它主要用來控制對資料庫發出的請求資訊,告訴資料庫:“要哪個資料表裡的資料?要什麼欄位內的資料?資料必須符合什麼限制?請把這些符合我要求的資料全部存放在Recordset對象內返回回來!”那麼說到底,Command對象的功能就是執行SQL(Structured Query Language結構式查詢語言,是用於對存放在電腦資料庫中的資料進行組織、管理和檢索的一種工具;是一種特定類型的資料庫--關聯式資料庫)命令。假如你是一位比較細心的人,你一定還記得我在第三章中其實就已經用上了SQL命令,於是你就會對我發問:“你當時並沒有用到Command對象呀?”
確實,沒有Command對象我們也一樣可以執行SQL命令。我們利用Connection對象或是利用Recordset對象同樣可以執行SQL命令。方法如下所示:
Set rs = conn.Execute(SQL命令)
' 利用Connection對象執行Select SQL命令,然後將結果指定給Recordset對象。
conn.Execute SQL命令
' 利用Connection對象執行資料操作的SQL命令。
Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open SQL命令,conn
' 先建立Recordset對象,再執行SQL命令選取資料。
利用Command對象又是如何來執行SQL命令的呢?大家請看:
Set cmd = Server.CreateObject("ADODB.Command")
Set cmd.ActiveConnection = conn
cmd.CommandText = sql
Set rs = cmd.Execute
' 可見利用Command對象來執行SQL命令,得先將Connection對象及SQL命令設定給對象Command的ActiveConnection及CommandText屬性,然後才執行cmd.Execute函數。
由上述我們可以知道,原來使用Recordset對象和使用Command對象來執行SQL命令,本質都是一樣的。既然如此,那麼我們為什麼還要利用Command對象呢?為了說明這個問題,我分別用兩種不同的方法來為留言簿添加留言查詢功能,其中查詢“留言簿過去五天留言記錄”和“留言記錄日期查詢”是利用Command對象來執行SQL命令的,而“留言者姓名查詢”和“最新十條留言記錄”的查詢則是利用Recordset對象來執行SQL命令。
講了這許多也該入正題了,我們首先來學習的是利用Recordset對象來實現“留言者姓名查詢”和“最新十條留言記錄”的查詢。以下我們還是通過分步驟的方法來進行說明。
步驟一: 首先我們得設計一個留言查詢的介面(Datesearch.asp),如下圖所示:
步驟二:利用Recordset對象來執行SQL命令,實現“最新十條留言記錄”的查詢。
Set conn = Server.CreateObject("ADODB.Connection")
DBPath = Server.MapPath("book2.mdb")
conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & DBPath
sql ="select top 10 * from guestbook order by ID Desc"
這裡用“ order by ID Desc”表示按照“ID”欄位從大到小排序。因為在資料庫中我將ID欄位的資料類型設為“自動編號”,留言記錄的ID將按先後從小到大進行排序,所以要查詢最新的十條留言即是查詢最後的十條ID的記錄。
Set rs = conn.Execute( sql )
利用Recordset對象來執行SQL命令,實現“留言者姓名”的查詢的原理與上述一致,程式如下所示:
namesearch = request.form("name")
namesearch = Replace(namesearch,"'","''")
'還記得我在第三章中介紹SqlStr函數時的說明嗎?忘了就到回去看看吧。
Set conn = Server.CreateObject("ADODB.Connection") DBPath =Server.MapPath("book2.mdb")
conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & DBPath
sql ="select * from guestbook where 姓名 = '"&namesearch&"' order by ID Desc"
Set rs = conn.Execute( sql )
步驟三:設計查詢結果的Web頁面(Search.asp)。
< %
Sub Search( rs )
Response.Write "< CENTER>< table border=2 width=90% cellpadding=2 cellspacing=2 bordercolorlight=#000000 bordercolordark=#FFFFFF bordercolor=#FFFFFF bgcolor=#FFFFFF align=center>"
Response.Write "< TR BGCOLOR=#33CCCC>"
For i=0 to rs.Fields.Count-1
Response.WRITE "< TD>" & rs.Fields(i).Name & "< /TD>"
Next
Response.Write "< /TR>"
'" & rs.Fields(i).Name & "表示顯示資料表的“欄位抬頭”
While Not rs.EOF
Response.Write "< TR>"
For i=0 to rs.Fields.Count-1
Response.WRITE "< TD>" & rs.Fields(i).Value & "< /TD>"
Next
Response.Write "< /TR>"
rs.MoveNext
Wend
Response.Write "< /TABLE>< /CENTER>"
' " & rs.Fields(i).Value & "表示顯示資料表的“資料欄位內容”
End Sub
%>
ASP進階教程Ⅸ:留言查詢功能(二)
我們接上一部分繼續講解如何利用Command對象來執行SQL命令,實現“留言記錄日期查詢”和“留言簿過去五天留言記錄查詢”。但在應用Command對象來執行SQL命令之前我們必須在留言資料庫中先建立查詢,假如我們要查詢的是“留言簿過去五天留言記錄”,那麼在留言資料庫中建立查詢的具體方法如下所示。(對於資料庫,在Access中可以建立五種不同類型的查詢,因為我們要查詢兩個日期之間的留言記錄,因此我在這裡只以“使用‘設計’視圖建立參數查詢”為例,當然你也可以“使用嚮導建立查詢”。使用“設計”視圖建立查詢要比使用嚮導靈活得多,例如,在“設計”視圖中,既可以建立像“選取查詢”之類的簡單查詢,又可以建立像“參數查詢”和“操作查詢”之類的複雜查詢,而且在“查詢設計網格”中既能夠增加、移動、插入和刪除欄位,也能夠設定準則和排序次序,計算總和和平均值,等等)
在Access中,使用‘設計’視圖建立參數查詢:
一、開啟留言資料庫,在“資料庫”視窗中單擊“查詢”選項卡,然後單擊“建立”按鈕 。
二、在“建立查詢”對話方塊中,單擊“設計檢視”,然後單擊“確定”按鈕。
三、在“顯示表”對話方塊中,選擇“表”選項卡,然後單擊“添加按鈕或者雙擊“guestbook”表的名稱,將它添加到“查詢”視窗中,然後關閉“顯示表”的對話方塊。
四、在“guestbook”表的欄位列表中,單擊“ID”欄位的欄位名,按住滑鼠不放,將它拖到“查詢設計網格”的第一列。同樣,可以將“姓名”、“電話”、“EMAIL”、“主題”、“留言”和“時間”欄位的欄位名依次拖到“查詢設計網格”的其它各列中。
五、在作為參數使用的“時間”欄位下的“準則”儲存格中,鍵入下列運算式:
Between[請鍵入開始日期]And[請鍵入結束日期]。
六、單擊工具列上的“儲存”按鈕儲存查詢,這時會彈出一個“另存新檔”的對話方塊,我們在“另存新檔”對話方塊中輸入該查詢表的名稱“留言記錄日期查詢”,然後單擊“確定”按鈕。
在留言資料庫中建立了查詢後,我們接下來將利用Command對象來執行日期查詢的SQL命令編寫如下(Date.asp):
< !--#include file="adovbs.inc" -->
< !--#include file="Search.asp" -->
< %
Head="留言簿查詢"
start=Request("start")
last=Request("last")
'讀取使用者輸入的資料,然後指定給start及last變數
If start="" Then start = #99-10-1#
If last="" Then last = #99-12-30#
'如果使用者沒有輸入查詢的開始時間和結束時間時,在“開始時間”和“結束時間”的查詢方塊中顯示這裡定義的預設值 99-10-1和99-12-30
% >
< h2 Align="Center"> < %=Head%>< /h2>
< hr noshade color="red">
< %
Set conn = Server.CreateObject("ADODB.Connection")
DBPath = Server.MapPath("book2.mdb")
conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & DBPath
Set cmd = Server.CreateObject("ADODB.Command")
Set cmd.ActiveConnection = conn
cmd.CommandText = "留言記錄日期查詢"
'將 Connection對象及SQL命令設定給Command對象的ActiveConnection屬性以及 CommandText屬性
ReDim param(1)
'聲明含有兩個元素的數組,因為該“留言日期查詢”必須有查詢的起始時間和結束時間,所以在這裡必須聲明一個含有兩個元素的數組
param(0) = CDate(start)
param(1) = CDate(last)
Set rs = cmd.Execute( ,param )
'將start及last變數指定給param數組,然後傳入cmd.Execute函數中,在這裡函數cmd.Execute含有兩個參數,其中第一個參數是用於希望返回的資料記錄數,這裡預設表示希望返回所有的資料記錄;參數二“param”是SQL命令的參數。
Search rs
%>
< hr noshade color="red"> < div align="center">
< a href="Datesearch.asp" class="text2">返回留言查詢< /a>
同理,利用Command對象來執行SQL命令,實現“留言簿過去五天留言記錄查詢”的原理與上述實現“留言記錄日期查詢”的原理是一樣的,我們可以編寫如下所示:
Set conn = Server.CreateObject("ADODB.Connection")
DBPath = Server.MapPath("book2.mdb")
conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & DBPath
Set cmd = Server.CreateObject("ADODB.Command")
Set cmd.ActiveConnection = conn
cmd.CommandText = "留言簿過去五天留言記錄"
Set rs = cmd.Execute
Search rs
至此,兩種實現查詢的方法我們都已學習過了,大家能說出它們存在著什麼區別嗎?
打個比方,如果我們直接把某一個SQL命令寫在ASP程式中,要知道該命令是否正確無誤,我們必須啟動瀏覽器瀏覽這個程式才能夠測試出來,若SQL命令有錯,我們必須修改ASP程式,然後再重新瀏覽直到正確為止;如果我們利用Command對象來執行SQL命令,則必須直到留言資料庫中建立的查詢完全正確才將SQL命令儲存成“查詢對象”,於是在ASP程式中我們只要將這個查詢對象的名稱指定給Command對象的CommandText參數,即可正確無誤地執行SQL命令。