我們已經熟悉在ASP 中透過呼叫SQL Server 預存程序來執行資料庫操作,不過大家是否知道,在桌面級資料庫Access 中,我們也能夠建立並使用預存程序?
Access + ASP 是開發輕量級Web 應用程式的絕佳組合:簡單,快速,相容性好,但效能通常不高。而且,用ADODB.Connection 和Recordset 物件來執行SQL 語句的方式,也有一些不方便,因為帶參數的SQL 語句的參數值也常常是拼接到字串中,於是便有了諸如單引號問題這樣的麻煩。使用預存程序的一個好處就是,支援SQL 語句參數值的另外提供。
事實上,Access(2000 以上版本)中所謂預存程序,和SQL Server 中的Stored Procedure 是不能比的。它只能算是Stored Procedure Lite,不支援多條SQL 語句,不支援邏輯語句(呵呵,畢竟不是T-SQL)等等,我還不清楚它是不是預先編譯了。不過,正如同VBScript 實現的所謂類別僅具有封裝性,對於程式碼結構的美化和程序重用性具有很大促進一樣,Access 的輕量級存儲過程,對於規範,小出錯幾率的數據庫操作應該也有幫助,並且性能可能會有提高。
下面我譯step by step 的方式,介紹如何在Access 中建立預存過程,然後在ASP 程式中使用它。
(一)在Access 建立預存程序
我不知道大家的Access 應用程度如何,反正它對我來說,只是一個MDB 資料庫文件的建立工具,我只會新建MDB 文件,然後在Access 的介面中建立表,索引,約束等等,over~
Access 中的查詢,就扮演了預存程序的角色。下文中我提到的Access 的預存程序或查詢都是指這個東西
對於查詢的創建,Access 提供了一個傻瓜工具,類似VS.NET 裡邊建立DataAdapter 時的精靈。不過我喜歡直接寫SQL 程式碼
然後在Access 主介面上點選左側的查詢按鈕,再在右邊雙擊在設計檢視中建立查詢,以開啟查詢設計檢視。
這時彈出的是可視化的查詢產生器,我們先加入SQL 語句需要涉及的表。
新增表格之後,在設計視圖上點選滑鼠右鍵,選擇SQL 視圖,以切換到SQL 程式碼編輯視窗。
好,下面說說Access 的預存程序的特點。
Access 的查詢,我目前的感覺是對SQL 語句的一個包裝,或許進行了某種最佳化如預編譯。我們不能像寫SQL Server 預存程序那樣使用多重操作,事務,邏輯判斷,循環等等…
但我們使用Access 預存程序的主要目的,就是使用參數額外提供的查詢,使用預存程序,我們不必再面對將參數值拼接到SQL 語句字串中時遇到的各種麻煩,例如:
代碼:
Dim sql
sql = SELECT * FROM Users WHERE UserName = ' & userName & '
以上程式碼中,如果字串變數userName 中含有'單引號,則會報錯。我們必須手工轉化:
代碼:
Dim sql
sql = SELECT * FROM Users WHERE UserName = ' & Replace(userName, ', '') & ' '轉換為連續兩個單引號
而使用帶參數查詢,我們的SQL 語句可以寫成:
代碼:
Dim sql
sql = SELECT * FROM Users WHERE UserName = @userName
然後把參數@userName 的值以Command 物件的Parameter 屬性來傳入即可,很方便直覺。
代碼:
With cmd
'建立參數對象
.Parameters.Append .CreateParameter(@userName)
'給各參數指定值
.Parameters(@userName) = userName
End With
這裡也要說明Access 預存程序中參數的使用。和SQL Server 的預存程序中用@ 變數指定參數,然後同名傳入參數物件不同,Access 中的參數,是以順序而非名字來辨識的。傳入的參數無須指定名字,隨便起,SQL 中的參數名字也可以隨便起,只要傳入參數值時,依照SQL 語句中的參數出現順序指定就行了。通常,我們使用Command 物件的Execute 方法,直接傳入參數值陣列來執行~
代碼:
cmd.Execute , Array(userName)
再例如,你的一個Access 預存程序這麼寫:
代碼:
select * from Users where UserName = p_UserName and BookTitle = p_bookTitle
你可以就這樣執行,透過傳入參數值數組,但順序要對應:
代碼:
cmd.Execute , Array(userName, bookTitle)
OK,看看我們的例子中使用的兩個查詢,一個是寫入資料。寫好SQL 語句後儲存並命名。
另一個讀取資料的預存程序代碼。
(二)使用預存程序
然後我們可以在ASP 程式中呼叫這些預存程序了。
這裡可以看到為什麼我說Access 中的查詢就是它的預存程序-我們的Command 物件的CommandType 屬性設定的是4,也就是Stored Proc!
so...
以下的程式碼很簡單:
代碼:
<%
Option Explicit
Dim s
Randomize
s = Rnd * 100
Dim conn, cmd
Set conn = Server.CreateObject(ADODB.Connection)
Set cmd = Server.CreateObject(ADODB.Command)
conn.Open Provider=Microsoft.Jet.OLEDB.4.0; Data Source= & Server.MapPath(sp.mdb)
With cmd
.ActiveConnection = conn
.CommandType = &H0004 '預存程序
.CommandText = AddNewData
End With
cmd.Execute , Array(CStr(Now()), CSng(s))
With cmd
.ActiveConnection = conn
.CommandType = &H0004 '預存程序
.CommandText = GetData
End With
Dim resultRS, resultArray
Set resultRS = cmd.Execute(, Null)
If Not resultRS.EOF Then
resultArray = resultRS.GetRows()
End If
Set resultRS = Nothing
Set cmd = Nothing
conn.Close
Set conn = Nothing
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>
%>