簡單教會你在ASP中使用SQL語句
5,開始執行
在學會了SELECT語句的構造和用途之后你就該學習如何使用它了。在你所掌握的數據庫工具下,這可能意味著你得按下某個寫著“執行”字樣的按鈕。在ASP網頁上,可以立即執行SQL語句也可以當作存儲過程調用。
一旦創建了SQL 語句,你還得設法訪問其查詢結果。顯然,這里的關鍵就是ASP recordset。為了充分利用你更為熟悉的SQL技能,你需要調整常規ASP網頁上最常采用的recordset:
Dim rs
Set rs = Server.CreateObject ("ADODB.Recordset")
rs.Open SQL,Conn,1,2
這里Conn就是數據庫連接聲明,而唯一的修改就是在rs.Open,之后用包含SQL語句的變量代替了要查詢的數據表的名稱。
這種方法的優點之一是你可以指定游標類型(如以上1 ,2 所示)。
執行SQL
你還可以用緊湊的一行代碼執行SQL語句來創建recordset。以下是語法:
Dim rs
set rs = Conn.Execute(SQL)
在上例中,你所看到的SQL是你存放自己SQL SELECT 語句的變量。該代碼行“運行”SQL語句(或者說對數據庫進行查詢),選取數據并把數據存放在recordset 內,在上例中就是變量rs。這種方法的主要缺點是你不能選擇自己想采用的游標類型。相反,recordset總是用前向游標打開。
因為游標的緣故,你或許打算熟悉兩種創建recordset的方法。直接執行查詢節省了鍵入字符所消耗的時間,但那樣的話你就得采用默認的游標了,這樣有可能遭遇經常不能正常運行的毛病。不管你具體采用哪種辦法,兩者之間的最大的差別也不外乎代碼精練與否。在不考慮你取得什么字段、你的標準是什么的前提下,也不管你如何存儲數據,采用SQL式的recordset 在體積上會比ASP上打開的標準recordset 要小得多,更別提操作起來的簡易性了。畢竟,通過過濾數據,你消除了耗費時間的if-then 測試和可能用到的循環。
6,存儲查詢
當你的查詢相對簡單的時候,每次從頭開始創建SQL語句也不費什么工夫,不過,復雜的查詢就不同了,每次都從頭來會產生很多開發錯誤。因此,一旦讓SQL順利地運行起來,你最好把它們存起來,在需要時再調用它們。這樣,哪怕是一個簡單查詢你都能隨時用上存儲的查詢語句了。
假設你每周都要給團隊做一次報告,指出目前存在的業務支持問題,這些數據需要從你的數據庫中選取,而且要按照日期選擇記錄,同時根據你所在團隊所采用的支持問題的類別排序。一旦你設計了這一查詢,你何必以后每周都重新編寫一次呢?不要在你的HTML頁面上創建查詢,你應該用你的數據庫工具創建查詢并且保存它。 然后你可以采用ActiveCommand 屬性把查詢插入到你的ASP網頁。頭一兩回你可能會覺得沒啥意思,其實也就幾行代碼而已:
Set objSQ = Server.CreateObject ("ADODB.Command")
objSQ.ActiveConnection = "databaseName"
objSQ.CommandText = "storedQueryName"
objSQ.CommandType = adCmdStoredProc
set objRec = objSQ.Execute
注意,采用adCmdStoredProc 表示你已經在頁面上包含了adovbs.inc 文件。該文件定義了你可以按照名字而非數字進行訪問的Access常數。只需要在頁面上包含該文件即可),然后你就可以用adCmdStoredProc 這類名字了。這樣,將來你再看到的時候更容易理解以上被存儲的查詢到底是個什么意思。
7,ORDER BY
從Access數據庫中選取記錄有件最令人喪氣的事情,它們是以怎樣的順序輸入到數據庫內就按照怎樣的順序出來。就算你在Access環境內采用Sort By來改變記錄視圖,數據表內的記錄順序也并沒有發生改變。
如果你正在使用ASP recordset在網頁上寫出記錄,那么你或許知道亂紛紛的順序是多令人痛苦的事。但是你可能不得不經常得面對這一問題,因為并不存在什么簡單方便的解決方案。好在ORDER BY 可以簡化這一難題。
為了對你的結果排序,只要在SELECT語句末尾加上ORDER BY,然后指定你需要排序的參照列即可。因此,如果你想要根據顧客的姓氏對Customers表排序,那么你可以編寫如下的查詢語句:
SQL = "SELECT c_lastname,c_firstname,c_email FROM Customers ORDER BY c_lastname"
這樣,只要你建立了recordset而且開始把結果寫到屏幕上,你就會看見數據按照字母順序排列起來了。
8. 記錄統計
確定數據庫內有多少記錄,或者確定有多少記錄達到了某些標準,這些用ASP完成并非難事。如果你采用了正確的游標類型,你可以用RecordCount 屬性獲得記錄數當然也可以用recordset。但是,有個更簡單的辦法,這就是在自己的SELECT語句中采用count(*) ,代碼如下所示:
SQL = "SELECT count(*) FROM Customers"
或者
SQL = "SELECT count(*) FROM Customers WHERE c_lastname LIKE 'A%'"
舉例說明,以下代碼將選出一些記錄以及這些記錄的總數:
SQL = "SELECT c_firstname, c_lastname, count(*) FROM Customers WHERE c_lastname LIKE 'A%'"
但是你不能實現自己的目的。這里采用的“count”函數其實是一種集合函數,意思是只返回單行信息:回答你提出的問題。對第1個SELECT 語句來說,問題是“在客戶表內有多少條記錄?”查詢返回單一的值作為響應,因此它不能同你常規的查詢相組合。假如你希望得到其他數據,你需要采用RecordCount。
集合函數除了“count”之外還包括AVG、MIN、MAX和SUM等。
9. 連接
任何熟悉SQL和關系數據庫的人都遇見過大量的連接類型。最簡單的說,連接(join)會把兩個表的內容組合到一個虛擬表或者recordset內。假如數據表有效地規一化,或許你會經常從某一個表中選出特定的信息再從另一個表中選出關聯信息。這樣做就需要簡單的“同等連接(equijoin)”。