ASP講座之六:ASP與資料庫(一)
作者:Eve Cole
更新時間:2009-05-30 19:55:05
在前面幾講中,我們已經學習了ASP的基本內容,靈活運用這些知識,你已經可以使用ASP建立一個Web網站了。但一般來說,一個真正的、完整的站點是離不開資料庫的,因為少量的數據,如網頁訪問人數等完全可以存儲在文本文件中,但實際應用中,需要保存的數據遠不止這一點點,而且這些數據之間往往還有關聯,利用資料庫來管理這些數據,可以很方便的查詢和更新。資料庫有很多種,例如:Fox資料庫(.dbf)、Access資料庫(.mdb)、Informix、Oracle和SQL Server等等,在本講座中,我會以Microsoft Access資料庫和SQL Server 7.0為例來說明ASP是如何存取資料庫的。為什麼選擇ASP?統計數據表明,SQL Server 7.0是當前最快、性價比最高的資料庫,而www.8848.net、www.dell.com、www.hotbot.com等許多大型的網站都是使用ASP技術創建的,所以ASP是比較容易掌握而且很實用的技術,你應該滿懷信心和勇氣地試著接近它、了解它,進而使用它。
在進一步學習之前,要做哪些準備:
1. 如果你沒有接觸過資料庫,建議先安裝Office中的Microsoft Access,了解一下資料庫的基本知識。
2. 最好安裝Microsoft SQL Server 7.0。一旦安裝好,立刻就可使用,不需要什麼設置,注意在Windows9.x中應安裝DeskTop版本,而7.0以前的版本只能安裝在NT Server中。
3. 接下來所討論的內容,需要一個叫做MDAC(Microsoft Data Access Components)的元件,這個元件已經包含在ASP中,如果你想了解更多的相關內容,或是下載最新的版本,可以存取http:// www.microsoft.com/data。
一、 與資料庫建立連結在正式開始之前,先介紹一下ADO-ActiveX Data Objects,剛接觸這個概念,你只要把ADO看作ASP與資料庫之間的橋樑就可以了。
(一) 與Microsoft Access資料庫建立連線方法一:範例wuf40.asp
<% @LANGUAGE = VBScript %>
<% ' wuf40.asp
Option Explicit
Dim Cnn, StrCnn
' 1 - 建立Connection 對象
Set Cnn = Server.CreateObject("ADODB.Connection")
StrCnn = "Driver={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("asp") & "NorthWind.mdb;"
' 2 - 使用Connection 物件的Open 方法開啟資料庫
Cnn.Open StrCnn
Response.Write Server.MapPath("asp") & "NorthWind.mdb;" & "<br>"
Response.Write "資料庫連線成功: " & Cnn.State & "<br>"
' 3 - 使用Connection 物件的Close 方法關閉連接
Cnn.close
Response.Write "資料庫已經關閉: " & Cnn.State
' 4 - 將Connection 物件從記憶體中刪除,以釋放資源
Set Cnn = Nothing
%>
Northwind.mdb是Microsoft Access97自帶的一個範例資料庫,一般位於目錄「Microsoft OfficeOfficeSamples」下,你可以自己找一下,然後將這個檔案拷到Web伺服器對應目錄下(本例放在C :InetPubhomeasp下)。
在這裡,Server物件的MapPath方法將指定的虛擬路徑轉換為真實的檔案路徑,最終結果類似:C:InetPubhomeaspNorthwind.mdb。
方法二:用OLE DB建立Microsoft Access連接,以下列出關鍵部分。
Set Cnn = Server.CreateObject("ADODB.Connection")
StrCnn = "Provider = Microsoft.Jet.OLEDB.4.0; Data Source = C:InetpubhomeaspNorthwind.mdb"
Cnn.Open StrCnn
(二) 與SQL Server資料庫建立連線方法一:用OLE DB連接SQL Server,詳見例程wuf41.asp。
Set Cnn = Server.CreateObject("ADODB.Connection")
StrCnn = "Provider=sqloledb; User ID=sa; Password=; Initial Catalog=pubs; Data Source=ICBCZJP"
Cnn.Open StrCnn
Initial Catalog後指定資料庫名,Data Source後為機器名稱(即網路→屬性→識別中的電腦名稱)或IP位址(需安裝DNS服務)。
方法二:
Set Cnn = Server.CreateObject("ADODB.Connection")
StrCnn = "Driver={SQL Server};Server=ICBCZJP;UID=sa;PWD=;Database=pubs"
Cnn.Open StrCnn
除了上述的兩種方法之外,當然還可使用許多文章、資料中介紹的最經典的方法:使用ODBC產生連結。就是先在Web伺服器控制面板的「ODBC Data Sources」建立一個連接,然後在ASP中使用類似「StrCnn ="DSN=ADOCnn; UID = sa;PWD=;Database=pubs"」的連接字串。這裡不詳細介紹,一來這不是最好的方法,二來其他資料都介紹了這個方法。
另外,有興趣下載例程wuf42.asp看看如何使用Connection物件的ConnectionTimeout和ConnectionString屬性。
二、 資料庫從這裡起步-檢索資料庫中已存在的資料現在假定你已有最基本的資料庫知識,知道如何使用Microsoft Access開啟Northwind.mdb中的「運貨商」表,看到表中儲存的幾條數據。現在問題是如何使用ASP在瀏覽器中顯示這些數據,以下介紹三種方法。
特別提醒:如果你的資料庫底子較薄,只要會使用第二種方法就行了,切不可貪多,以免走火入魔,切記!切記!
方法一:只使用Connection 物件。範例wuf43.asp
<% @LANGUAGE = VBScript %>
<% ' wuf43.asp
Option Explicit
'這一句是非常重要的, 它可以確保所看到的資料不是緩存在客戶端的資料,
'而是伺服器端隨時更新過的最新數據
Response.Expires = 0
'第一部分: 建立連接
Dim Cnn, StrCnn
Set Cnn = Server.CreateObject("ADODB.Connection")
StrCnn = "Provider = Microsoft.Jet.OLEDB.4.0; Data Source = C:InetpubhomeaspNorthwind.mdb"
Cnn.Open StrCnn
'第二部分: 使用Connection 物件的Execute 方法得到記錄集
Dim StrSQL, rsTest
'下面是一句SQL語句(結構化查詢語句), 本講座不具體介紹'建議找本書看看,基本使用還是比較簡單的,一學就會
'這句話的意思是從運貨商表中選出所有的數據
StrSQL = "Select * From 運貨商"
Set rsTest = Cnn.Execute(StrSQL)
%>
<HTML>
<BODY>
<% '第三部分: 將得到的記錄集顯示到瀏覽器上
'循環至記錄結束- 一行一行、一筆記錄一筆記錄的顯示
Do While Not rsTest.EOF
'下面這兩行的作用是一樣的, 即rsTest("運貨商ID") 等同於rsTest(0)
Response.Write rsTest("運貨商ID") & " " & rsTest("公司名稱") & " " & rsTest("電話") & " " & "<BR>"
'Response.Write rsTest(0) & " " & rsTest(1) & " " & rsTest(2) & " " & "<BR>"
'移到下一筆記錄- 這句話可千萬不能少否則就陷入死循環
rsTest.MoveNext
Loop
'第四部: 打掃戰場
Cnn.close
Set rsTest = Nothing: Set Cnn = Nothing
%>
</BODY>
</HTML>
這個範例是很簡單的,第三部分顯示資料是資料庫典型的輸出樣式,你可以參考以前所學的知識加上表格和顏色美化輸出結果。
非初級使用者可以參考wuf44.asp看看Execute方法的完整使用。
方法二:透過建立Recordset 物件-記得初學者只要掌握此方法就夠了。
例:wuf45.asp,其他部分同wuf43.asp,關鍵在於程式的第二部分。
'第二部分: 透過建立RecordSet 物件來得到記錄集
Dim StrSQL, rsTest
'建立Recordset 對象
Set rsTest = Server.CreateObject("ADODB.Recordset")
StrSQL = "Select 運貨商ID,電話,公司名稱From 運貨商Where 電話= '(503) 555-9931'"
'將Recordset 物件附加到連接Cnn
Set rsTest.ActiveConnection = Cnn
'使用Recordset 物件的Open 方法開啟記錄集
rsTest.Open StrSQL
現在讓我們來看看Recordset物件Open方法的完整用法,例wuf48.asp。
<% @LANGUAGE = VBScript %>
<% ' wuf48.asp
Option Explicit
Response.Expires = 0
%>
<!--#include file="adovbs.inc"-->
<%
'第一部分: 建立連接
Dim Cnn, StrCnn
Set Cnn = Server.CreateObject("ADODB.Connection")
StrCnn = "Provider = Microsoft.Jet.OLEDB.4.0; Data Source = C:InetpubhomeaspNorthwind.mdb"
Cnn.Open StrCnn
'第二部分: 透過建立RecordSet 物件來得到記錄集
Dim rsTest
Set rsTest = Server.CreateObject("ADODB.Recordset")
rsTest.Open "運貨商",Cnn,adOpenForwardOnly,adLockReadOnly,adCmdTable
%>
<HTML>
<BODY>
<% '第三部分: 將得到的記錄集顯示到瀏覽器上
Do While Not rsTest.EOF
Response.Write rsTest(0) & " " & rsTest(1) & " " & rsTest(2) & " " & "<BR>"
rsTest.MoveNext
Loop
'第四部: 打掃戰場
rsTest.Close: Cnn.Close
Set rsTest = Nothing: Set Cnn = Nothing
%>
</BODY>
</HTML>
分析:
1.首先看看關鍵句:
rsTest.Open "運貨商",Cnn,adOpenForwardOnly,adLockReadOnly,adCmdTable
第一個參數可以是表名(如:運貨商),也可以是SQL語句(如wuf45.asp)。
第二個參數指定目前的連線。
第三個參數指示CursorType,決定提供者開啟Recordset 時應該使用的遊標類型。這裡採用僅向前移動的遊標。
第四個參數指示LockType,決定提供者開啟Recordset 時應該使用的鎖定(並發)類型。這裡指定為唯讀。
第五個參數與第一個參數相關,如本例中第一個參數為表名,則第五個參數使用adCmdTable,若第一個參數為SQL語句,則第該參數為adCmdText,如:
rsTest.Open "Select * From 運貨商",Cnn,adOpenForwardOnly,adLockReadOnly,adCmdText
我想不見得大部人都能真正搞懂這五個參數的意思,沒關係,剛開始只要照搬會用就行,以後我們會不斷接觸,熟了便能生巧。
關於CursorType和LockType這兩個參數,將在下講詳細闡述,僅檢索資料只需按本例設定就可以了。
2.這五個參數,也可以利用Recordset物件的屬性來設置,如例wuf46.asp。
'第二部分: 透過建立RecordSet 物件來得到記錄集
Dim rsTest
Set rsTest = Server.CreateObject("ADODB.Recordset")
rsTest.ActiveConnection = Cnn
rsTest.CursorType = adOpenForwardOnly
rsTest.LockType = adLockReadOnly
rsTest.Open "運貨商", , , ,adCmdTable
3. 再看看這句話:<!--#include file="adovbs.inc"-->。
(1) 因為使用了像adOpenForwardOnly,adLockReadOnly,adCmdText這樣的常數,所以需要將adovbs.inc這個檔案包含進來。
(2) adovbs.inc這個檔案一般位於目錄Program FilesCommon FilesSYSTEMADO下,你可將它拷貝至Web伺服器目前目錄(本講下載包中也有該檔案)。
(3) 用記事本打開這個文件看一下,就明白為什麼需要這個文件了。
方法三:透過引入Command 物件-這個應該在你有能力的前提下研究。
<% @LANGUAGE = VBScript %>
<% ' wuf47.asp
Option Explicit
Response.Expires = 0
%>
<!--#include file="adovbs.inc"-->
<%
'第一部分: 建立連接
Dim Cnn, StrCnn
Set Cnn = Server.CreateObject("ADODB.Connection")
StrCnn = "Provider = Microsoft.Jet.OLEDB.4.0; Data Source = C:InetpubhomeaspNorthwind.mdb"
Cnn.Open StrCnn
'第二部分: 透過建立Command 物件得到記錄集
Dim StrSQL, rsTest, cmdTest
'建立Command 對象
Set cmdTest = Server.CreateObject("ADODB.Command")
StrSQL = "SELECT MAX(數量) FROM 訂單明細"
cmdTest.CommandText = StrSQL
cmdTest.CommandType = adCmdText '表示指令類型為SQL 語句
Set cmdTest.ActiveConnection = Cnn
'使用Command 物件的Execute 方法得到記錄集。
Set rsTest = cmdTest.Execute
%>
<HTML>
<BODY>
<% '第三部分: 將得到的記錄集顯示到瀏覽器上
Do While Not rsTest.EOF
Response.Write rsTest(0) & "<BR>"
rsTest.MoveNext
Loop
'第四部: 打掃戰場
rsTest.Close: Cnn.Close
Set rsTest = Nothing: Set cmdTest=Nothing: Set Cnn = Nothing
%>
</BODY>
</HTML>
關於Command 物件的使用以後也會在資料庫的深入程式中重點講解。
本講主要介紹如何與資料庫連接並檢索資料庫數據,初學者難免會有點糊塗,切記,你只需要學會以下知識點即可:
1. 如何使用OLE DB與Microsoft Access資料庫建立連線;
2. 如何使用OLE DB與Microsoft SQL Server資料庫建立連線;
3. 如何透過建立Recordset物件檢索資料庫中的資料。