ASP基礎講座(下)
當我們需要同浏覽器交互的時候,有時少不了數據庫。因為只有用數據庫才可能大量、快速地處理信息。使用ASP不僅意味著你可以讀取Access和SQL Server的數據庫,同時也意味著你可以讀取其它ODBC(Open Database Connect,開放式數據庫互聯)兼容的數據庫。為了在ASP中訪問數據庫,我們將接觸一個新名詞——ADO(Active Data Object,活動數據對象)。
ADO是一種操作Microsoft所支持的數據庫的方法,有些類似於以前在VB中聽說過的DAO(Data Access Object,數據訪問對象)和RDO(Remote Data Object,遠程數據對象)。在ASP中,ADO可以看作是一個服務器組件(Server Component),更簡單點說,是一系列的對象,應用這些功能強大的對象,即可輕松完成對數據庫復雜的操作。在這裡我們所要學的是使用這些對象的方法,具體的操作步驟可以歸納為以下幾步:
(一)創建數據庫源名(DSN)
(二)創建數據庫鏈接(Connection)
(三)創建數據對象
(四)操作數據庫
(五)關閉數據對象和鏈接
下面具體敘述每一步的作法:
一、創建數據源名
用ODBC時,經常見到DSN這個名詞,它究竟是什麼,有什麼重要作用呢?DSN(Date Source Name)即數據源名稱。我們知道,ODBC是一種訪問數據庫的方法,只要系統中有相應的ODBC驅動程序,任何程序就可以通過ODBC操縱驅動程序的數據庫。比如我們系統中有Access的ODBC驅動程序,那麼即使我們沒有Access軟件,也可以在我們的程序(如VB編的)中間對一個Access的MDB數據庫加、刪、改記錄。而且我們根本不用知道這個數據庫是放在哪裡的。我們只要寫出SQL語句,ODBC驅動程序就會幫我們做一切事情。我們在給ODBC驅動程序傳SQL指令時,即是用DSN來告訴它到底操作的是哪一個數據庫。如果數據庫的平台變了,比如我們改用了SQL Server的數據庫,只要其中表的結構沒變,我們就不用改寫我們的程序,只要重新在系統中配置DSN就行了。由此可見,DSN是應用程序和數據庫之間的橋梁,要通過ODBC訪問數據庫,前提就是我們必須配置好DSN(即架好橋梁)。一個DSN必須包含一些信息:
DSN的名字:就是給這座橋取個名字,當程序訪問數據庫時,給系統傳的就是這個名字,而不是數據庫的實際名稱。
ODBC驅動程序類型:只有指出驅動程序類型,在我們操作數據庫時,系統才會知道調哪個ODBC驅動程序來服務。
數據庫:你必須指定這座橋到底連接的是哪個數據庫,但不同的數據庫系統,指定數據庫名字的方法有些不同。
這座橋是架在系統之中的,所以WIN95(NT)提供了一個工具來完成這件事,即是控制面板中的32 BIT ODBC,共有三類,即用戶DSN、系統DSN、文件DSN。我們一般就用系統DSN,因為這樣可以讓所有在該系統上操作的人都能使用這個DSN。
打開Windows的“控制面板”,找到圖標“32位ODBC)”(有一些系統上叫“ODBC”、“32bit ODBC”),雙擊,出現(如圖一)對話框,選中標簽“系統DSN”,點擊“新建”,選驅動程序為Microsoft Access MDB,單擊“完成”,彈出對話框(如圖二),輸出“Data Source Name”為“dsn1”,單擊“OK”,再單擊“選擇數據庫”,選中你要使用的數據庫,例如“C:\b1.mdb”,這樣就OK了。以後我們就用“dsn1”來訪問數據庫“c:\b1.mdb”,而不直接用文件名“C:\b1.mdb”,這樣做的好處是,一旦我們改變了文件名或存放地,就不用再一個一個地修改程序中所有該數據庫的名稱,而只需修改DSN中的配置就可以了。
二、創數據庫鏈接(Connection)
用過VB的人都知道,DAO中有鏈接(Connection),RDO中有odo Connection。鏈接用以保持一些關於正在訪問的數據的一些狀態信息,以及鏈接者信息。ASP文件中如果要訪問數據,必須首先創建與數據庫的鏈接,其語法如下:
set Mconn=Server createObject(“ADOBDCONNECTION”)
這條語句創建了鏈接對象mConn,接下來:
mConn.Open “dsn1”,“vsername”,“passWord”
這條語句打開鏈接,用到了DSN,本例為“dsn1”。其後的兩個參數分別是訪問數據庫的用戶名和口令,為可選參數。
注意:必須有以上兩個小步驟,因為鏈接對象的創建與打開是兩回事,只有打開了才真正可以用。
三、創建數據對象(Record Set)
ADO中的數據對象通常保存的是查詢結果。Record Set是ADO中最復雜的對象,有許多屬性和方法,靈活運用,可以達到許多好的效果。與DAO中的一樣,Record Set保存的是一行行的記錄,並標有一個當前記錄。以下是創建方法:
Set Record Set=mConn.Execute(sqtStr)
這條語句創建並打開了對象Record Set,其中mCon是先前創建的鏈接對象,sqtStr是一個串,代表一條標准的SQL語句,例如:
sqlStr=“SELECT * FROM tab1”
Set Record Set=mConn.Exe cute(sqlStr)
這條語句執行後,對象Record Set中就保存了表tab1中的所有記錄。在ASP文件中如何引用返回結果,本文將在文末給出一個實例說明。
四、操作數據庫
剛才我們通過調用鏈接對象的Execute方法來將查詢結果返回給一個數據對象。我們說Execute方法的參數是一個標准的SQL語句串,所以我們可以利用它方便地執行數據插入、修改、刪除等操作,例如:
sqlStr=“INSERT INTO tab1 VALUES(1,2)”
mConn.Execute(sqlStr)
/執行插入操作
sqlStr=“UPDATE tab1 SET fIEld1=3”
mConn.Execute(sqlStr)
/執行修改操作
五、關閉數據對象和鏈接對象
在使用了ADO對象之後,一定要記住關閉它,因為它使用了一定的服務器資源。通過調用方法close實現關閉,然後再釋放它。
Record Set.close
Set Record Set=Nothing
/關閉創建的數據對象
mConn.close
Set mConn=Nothing
/關閉創建的鏈接對象
至此,我們已給出了用ASP訪問數據庫的全過程,包括創建數據源-創建鏈接-創建數據對象-操作數據對象-關閉並釋放。這其間由於應用面向對象思想,應該說所有操作都比較簡單,用戶需要注意的僅是對數據結構的了解,亦要清楚當前所操作的對象是什麼,有什麼屬性,等等。只要對這些有了清醒的認識,再加上ASP的強大功能,在網絡上應用你自己的數據庫,就再也不是什麼難事了!
本文最後給出一個例子,這是基於數據庫的ASP留言簿程序,數據庫結構如下:
guestbook.mdb
表lyb:
xm char(100), ly char(255) , sj datetime
文件guestbook.ASP:
<Html>
<head>
<title>lyb</title>
</head>
<body bgcolor=“#ccccf0”>
<p>留言簿</p>
<form METHOD=“POST” action=“guestbook.ASP”>
<input type=“hidden” name=“task” value=“insert”>
<p>姓名:<input TYPE=“text” SIZE=“20” NAME=“xm”></p>
<p>留言:</p>
<p><textarea ROWS=“5” COLS=“80” NAME=“ly”></textarea></p>
<p><input TYPE=“submit” VALUE=“記入留言簿” NAME=“B1”><input TYPE=“reset”
VALUE=“復原” NAME=“B2”></p>
</form>
<%
Set conn = Server.CreateObject(“ADODB.Connection”)
conn.Open “lybdsn”,“”,“”
If Request(“task”)=“insert” then
xm=Request(“xm”)
sj = Date()
sj = sj & “ ” & Hour(Time()) & “:” & Minute(Time())
If Request(“ly”)=“” then
Response.write(“留言不能不輸吧”)
Response.end
else
ly=Request(“ly”)
end if
sql=“INSERT INTO lyb (xm,sj,ly) VALUES ('” & xm & “','” & sj & “','” & ly & “') ”
conn.execute sql
End If
sql = “SELECT * FROM lyb ORDER BY sj DESC”
Set rs = conn.Execute(sql) %>
<% On Error Resume Next
rs.MoveFirst
do while Not rs.eof %>
<hr>
姓名:<%=Server.HtmlEncode(rs.FIElds(“xm”).Value)%><br>
留於:<%=Server.HtmlEncode(rs.FIElds(“sj”).Value)%><br>
留言:<%=Server.HtmlEncode(rs.FIElds(“ly”).Value)%>
<% rs.MoveNext
loop %>
</body>
</Html>