我們已經(jīng)熟悉在 ASP 中通過調(diào)用 sql server 存儲過程來執(zhí)行數(shù)據(jù)庫操作,不過大家是否知道,在桌面級數(shù)據(jù)庫 Access 中,我們也能夠創(chuàng)建并使用“存儲過程”?
Access + ASP 是開發(fā)輕量級 Web 應(yīng)用程序的絕佳組合:簡單,快速,兼容性好,但是性能通常不高。并且,用 ADODB.Connection 和 Recordset 對象來執(zhí)行 SQL 語句的方式,也有一些不方便,因?yàn)閹?shù)的 SQL 語句的參數(shù)值也常常是拼接到字符串中,于是便有了諸如“單引號問題”這樣的麻煩。使用存儲過程的一個好處就是,支持 SQL 語句參數(shù)值的另外提供。
事實(shí)上,Access(2000 及以上版本)中所謂“存儲過程”,和 SQL Server 中的 Stored Procedure 是不能比的。它只能算是“Stored Procedure Lite”,不支持多條 SQL 語句,不支持邏輯語句(呵呵,畢竟不是 T-SQL)等等,我也還不清楚它是不是預(yù)編譯了。不過,正如同 VBScript 實(shí)現(xiàn)的所謂“類”僅僅具有封裝性,對于代碼結(jié)構(gòu)的“美化”和程序重用性具有很大促進(jìn)一樣,Access 的“輕量存儲過程”,對于規(guī)范,小出錯幾率的數(shù)據(jù)庫操作應(yīng)該也有幫助,并且性能可能會有提高。
下面我譯 step by step 的方式,介紹如何在 Access 中創(chuàng)建存儲過程,然后在 ASP 程序中使用它。
(一)在 Access 中創(chuàng)建“存儲過程”
不知道大家的 Access 應(yīng)用水平如何,反正它對于我來說,僅僅就是一個 MDB 數(shù)據(jù)庫文件的創(chuàng)建工具,我只會新建 MDB 文件,然后在 Access 的界面中創(chuàng)建表,索引,約束等等,over~
Access 中的“查詢”,就扮演了存儲過程的角色。下文中我提到的 Access 的“存儲過程”或者“查詢”都是指這個東西
對于“查詢”的創(chuàng)建,Access 提供了一個傻瓜工具,類似 VS.NET 里邊建立 DataAdapter 時的向?qū)?。不過我喜歡直接寫 SQL 代碼
好,下面先看看我們這個簡單的例子中所使用的數(shù)據(jù)庫的表結(jié)構(gòu)。
wwww.iTbulo.combJJXD
wwww.iTbulo.combJJXD
然后在 Access 主界面上點(diǎn)擊左側(cè)的“查詢”按鈕,再在右邊雙擊“在設(shè)計(jì)視圖中創(chuàng)建查詢”,以打開查詢設(shè)計(jì)視圖。
wwww.iTbulo.combJJXD
wwww.iTbulo.combJJXD
這時彈出的是可視化的查詢生成器,我們首先添加 SQL 語句需要涉及的表。
wwww.iTbulo.combJJXD
wwww.iTbulo.combJJXD
添加表之后,在設(shè)計(jì)視圖上點(diǎn)擊鼠標(biāo)右鍵,選擇“SQL 視圖”,以切換到 SQL 代碼編輯窗口。
wwww.iTbulo.combJJXD
wwww.iTbulo.combJJXD
好,下面說說 Access 的存儲過程的特點(diǎn)。
Access 的查詢,我目前的感覺是對 SQL 語句的一個包裝,或許進(jìn)行了某種優(yōu)化如預(yù)編譯。我們不能像寫 SQL Server 存儲過程那樣使用多重操作,事務(wù),邏輯判斷,循環(huán)等等……
wwww.iTbulo.combJJXD
這里還要說明 Access 存儲過程中參數(shù)的使用。和 SQL Server 的存儲過程中用 @ 變量指定參數(shù),然后同名傳入?yún)?shù)對象不同,Access 中的參數(shù),是以“順序”而非“名字”來識別的。傳入的參數(shù)無需指定名字,隨便起,SQL 中的參數(shù)名字也可以隨便起,只要傳入?yún)?shù)值時,按照 SQL 語句中的參數(shù)出現(xiàn)順序指定就行了。通常,我們使用 Command 對象的 Execute 方法,直接傳入?yún)?shù)值數(shù)組來執(zhí)行~
代碼:
--------------------------------------------------------------------------------
cmd.Execute , Array(userName)
--------------------------------------------------------------------------------
再比如,你的一個 Access 存儲過程這么寫:
代碼:
--------------------------------------------------------------------------------
select * from Users where UserName = p_UserName and BookTitle = p_bookTitle
--------------------------------------------------------------------------------
你可以就這么執(zhí)行,通過傳入?yún)?shù)值數(shù)組,但是順序要對應(yīng):
代碼:
--------------------------------------------------------------------------------
cmd.Execute , Array(userName, bookTitle)
--------------------------------------------------------------------------------
OK,看看我們的例子中使用的兩個查詢,一個是寫入數(shù)據(jù)。寫好 SQL 語句后存并命名。
wwww.iTbulo.combJJXD
wwww.iTbulo.combJJXD
另一個讀取數(shù)據(jù)的存儲過程代碼。
wwww.iTbulo.combJJXD
wwww.iTbulo.combJJXD
然后我們可以在 ASP 程序中調(diào)用這些存儲過程了。
這里可以看到為什么我說 Access 中的查詢就是它的存儲過程――我們的 Command 對象的 CommandType 屬性設(shè)置的是 4,即 Stored Proc!
so...
以下的代碼很簡單:
代碼:
--------------------------------------------------------------------------------
wwww.iTbulo.combJJXD
<%
Option Explicitwwww.iTbulo.combJJXD
wwww.iTbulo.combJJXD
Dim s
Randomize
s = Rnd * 100wwww.iTbulo.combJJXD
wwww.iTbulo.combJJXD
Dim conn, cmd
Set conn = Server.CreateObject("ADODB.Connection")
Set cmd = Server.CreateObject("ADODB.Command")wwww.iTbulo.combJJXD
wwww.iTbulo.combJJXD
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.MapPath("sp.mdb")wwww.iTbulo.combJJXD
wwww.iTbulo.combJJXD
With cmd
.ActiveConnection = conn
.CommandType = &H0004 '存儲過程
.CommandText = "AddNewData"
End Withwwww.iTbulo.combJJXD
wwww.iTbulo.combJJXD
cmd.Execute , Array(CStr(Now()), CSng(s))wwww.iTbulo.combJJXD
wwww.iTbulo.combJJXD
With cmd
.ActiveConnection = conn
.CommandType = &H0004 '存儲過程
.CommandText = "GetData"
End Withwwww.iTbulo.combJJXD
wwww.iTbulo.combJJXD
Dim resultRS, resultArray
Set resultRS = cmd.Execute(, Null)wwww.iTbulo.combJJXD
wwww.iTbulo.combJJXD
If Not resultRS.EOF Then
resultArray = resultRS.GetRows()
End Ifwwww.iTbulo.combJJXD
wwww.iTbulo.combJJXD
Set resultRS = Nothing
Set cmd = Nothing
conn.Close
Set conn = Nothingwwww.iTbulo.combJJXD
wwww.iTbulo.combJJXD
Response.Write "<ul>"
Dim i
For i = 0 To UBound(resultArray, 2)
Response.Write "<li>" & resultArray(0, i)
Response.Write " " & resultArray(1, i)
Response.Write " " & resultArray(2, i)
Response.Write "</li>"
Next
Response.Write "</ul>"
%>wwww.iTbulo.combJJXD
--------------------------------------------------------------------------------
運(yùn)行結(jié)果。
wwww.iTbulo.combJJXD
wwww.iTbulo.combJJXD
感覺起來,速度似乎很快,呵呵~
不知道這樣在 Access 中使用存儲過程的意義大不大,不過確實(shí)很好玩
wwww.iTbulo.combJJXD