ACCESS中使用存储过程
生活随笔
收集整理的這篇文章主要介紹了
ACCESS中使用存储过程
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
我們已經(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 語句的方式,也有一些不方便,因為帶參數(shù)的 SQL 語句的參數(shù)值也常常是拼接到字符串中,于是便有了諸如“單引號問題”這樣的麻煩。使用存儲過程的一個好處就是,支持 SQL 語句參數(shù)值的另外提供。
事實上,Access(2000 及以上版本)中所謂“存儲過程”,和 SQL Server 中的 Stored Procedure 是不能比的。它只能算是“Stored Procedure Lite”,不支持多條 SQL 語句,不支持邏輯語句(呵呵,畢竟不是 T-SQL)等等,我也還不清楚它是不是預(yù)編譯了。不過,正如同 VBScript 實現(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ū)А2贿^我喜歡直接寫 SQL 代碼
然后在 Access 主界面上點擊左側(cè)的“查詢”按鈕,再在右邊雙擊“在設(shè)計視圖中創(chuàng)建查詢”,以打開查詢設(shè)計視圖。
這時彈出的是可視化的查詢生成器,我們首先添加 SQL 語句需要涉及的表。
添加表之后,在設(shè)計視圖上點擊鼠標(biāo)右鍵,選擇“SQL 視圖”,以切換到 SQL 代碼編輯窗口。
好,下面說說 Access 的存儲過程的特點。
Access 的查詢,我目前的感覺是對 SQL 語句的一個包裝,或許進(jìn)行了某種優(yōu)化如預(yù)編譯。我們不能像寫 SQL Server 存儲過程那樣使用多重操作,事務(wù),邏輯判斷,循環(huán)等等……
但是我們使用 Access 存儲過程的主要目的,就是使用參數(shù)額外提供的查詢,使用存儲過程,我們不必再面對將參數(shù)值拼接到 SQL 語句字符串中時遇到的各種麻煩,比如:
代碼:
Dim sql
sql = "SELECT * FROM Users WHERE UserName = '" & userName & "'"
以上代碼中,如果字符串變量 userName 中含有“'”單引號,則會報錯。我們必須手工轉(zhuǎn)化:
代碼:
Dim sql
sql = "SELECT * FROM Users WHERE UserName = '" & Replace(userName, "'", "''") & "'" '轉(zhuǎn)化為連續(xù)兩個單引號
而使用帶參數(shù)查詢,我們的 SQL 語句可以寫為:
代碼:
Dim sql
sql = "SELECT * FROM Users WHERE UserName = @userName"
然后把參數(shù) @userName 的值以 Command 對象的 Parameter 屬性來傳入即可,很方便直觀。
代碼:
With cmd
? ? '創(chuàng)建參數(shù)對象
? ? .Parameters.Append .CreateParameter("@userName")
? ? '給各參數(shù)指定值
? ? .Parameters("@userName") = userName
End With
這里還要說明 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 語句后保存并命名。
另一個讀取數(shù)據(jù)的存儲過程代碼。
(二)使用存儲過程
然后我們可以在 ASP 程序中調(diào)用這些存儲過程了。
這里可以看到為什么我說 Access 中的查詢就是它的存儲過程——我們的 Command 對象的 CommandType 屬性設(shè)置的是 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 + ASP 是開發(fā)輕量級 Web 應(yīng)用程序的絕佳組合:簡單,快速,兼容性好,但是性能通常不高。并且,用 ADODB.Connection 和 Recordset 對象來執(zhí)行 SQL 語句的方式,也有一些不方便,因為帶參數(shù)的 SQL 語句的參數(shù)值也常常是拼接到字符串中,于是便有了諸如“單引號問題”這樣的麻煩。使用存儲過程的一個好處就是,支持 SQL 語句參數(shù)值的另外提供。
事實上,Access(2000 及以上版本)中所謂“存儲過程”,和 SQL Server 中的 Stored Procedure 是不能比的。它只能算是“Stored Procedure Lite”,不支持多條 SQL 語句,不支持邏輯語句(呵呵,畢竟不是 T-SQL)等等,我也還不清楚它是不是預(yù)編譯了。不過,正如同 VBScript 實現(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ū)А2贿^我喜歡直接寫 SQL 代碼
然后在 Access 主界面上點擊左側(cè)的“查詢”按鈕,再在右邊雙擊“在設(shè)計視圖中創(chuàng)建查詢”,以打開查詢設(shè)計視圖。
這時彈出的是可視化的查詢生成器,我們首先添加 SQL 語句需要涉及的表。
添加表之后,在設(shè)計視圖上點擊鼠標(biāo)右鍵,選擇“SQL 視圖”,以切換到 SQL 代碼編輯窗口。
好,下面說說 Access 的存儲過程的特點。
Access 的查詢,我目前的感覺是對 SQL 語句的一個包裝,或許進(jìn)行了某種優(yōu)化如預(yù)編譯。我們不能像寫 SQL Server 存儲過程那樣使用多重操作,事務(wù),邏輯判斷,循環(huán)等等……
但是我們使用 Access 存儲過程的主要目的,就是使用參數(shù)額外提供的查詢,使用存儲過程,我們不必再面對將參數(shù)值拼接到 SQL 語句字符串中時遇到的各種麻煩,比如:
代碼:
Dim sql
sql = "SELECT * FROM Users WHERE UserName = '" & userName & "'"
以上代碼中,如果字符串變量 userName 中含有“'”單引號,則會報錯。我們必須手工轉(zhuǎn)化:
代碼:
Dim sql
sql = "SELECT * FROM Users WHERE UserName = '" & Replace(userName, "'", "''") & "'" '轉(zhuǎn)化為連續(xù)兩個單引號
而使用帶參數(shù)查詢,我們的 SQL 語句可以寫為:
代碼:
Dim sql
sql = "SELECT * FROM Users WHERE UserName = @userName"
然后把參數(shù) @userName 的值以 Command 對象的 Parameter 屬性來傳入即可,很方便直觀。
代碼:
With cmd
? ? '創(chuàng)建參數(shù)對象
? ? .Parameters.Append .CreateParameter("@userName")
? ? '給各參數(shù)指定值
? ? .Parameters("@userName") = userName
End With
這里還要說明 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 語句后保存并命名。
另一個讀取數(shù)據(jù)的存儲過程代碼。
(二)使用存儲過程
然后我們可以在 ASP 程序中調(diào)用這些存儲過程了。
這里可以看到為什么我說 Access 中的查詢就是它的存儲過程——我們的 Command 對象的 CommandType 屬性設(shè)置的是 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>"
%>
轉(zhuǎn)載于:https://www.cnblogs.com/MaxIE/archive/2007/10/23/934284.html
總結(jié)
以上是生活随笔為你收集整理的ACCESS中使用存储过程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [读者调查]新增一个读者调查!
- 下一篇: 特洛伊-Troy