在 Access 中使用“預存程序”

來源:互聯網
上載者:User
access|預存程序 由於片上傳問題所以圖片沒有顯示:
完整文章請看:http://www.luckybbs.com/showAnnounce.asp?id=36487
我們已經熟悉在 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>"
%>



運行結果。
此主題相關圖片

感覺起來,速度似乎很快,呵呵~

不知道這樣在 Access 中使用預存程序的意義大不大,不過確實很好玩

A



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。