在 Access 中使用“存儲(chǔ)過程”(一)
發(fā)表時(shí)間:2023-08-16 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]我們已經(jīng)熟悉在 ASP 中通過調(diào)用 SQL Server 存儲(chǔ)過程來執(zhí)行數(shù)據(jù)庫操作,不過大家是否知道,在桌面級(jí)數(shù)據(jù)庫 Access 中,我們也能夠創(chuàng)建并使用“存儲(chǔ)過程”?Access + ASP 是...
我們已經(jīng)熟悉在 ASP 中通過調(diào)用 SQL Server 存儲(chǔ)過程來執(zhí)行數(shù)據(jù)庫操作,不過大家是否知道,在桌面級(jí)數(shù)據(jù)庫 Access 中,我們也能夠創(chuàng)建并使用“存儲(chǔ)過程”?
Access + ASP 是開發(fā)輕量級(jí) Web 應(yīng)用程序的絕佳組合:簡單,快速,兼容性好,但是性能通常不高。并且,用 ADODB.Connection 和 Recordset 對(duì)象來執(zhí)行 SQL 語句的方式,也有一些不方便,因?yàn)閹?shù)的 SQL 語句的參數(shù)值也常常是拼接到字符串中,于是便有了諸如“單引號(hào)問題”這樣的麻煩。使用存儲(chǔ)過程的一個(gè)好處就是,支持 SQL 語句參數(shù)值的另外提供。
事實(shí)上,Access(2000 及以上版本)中所謂“存儲(chǔ)過程”,和 SQL Server 中的 Stored Procedure 是不能比的。它只能算是“Stored Procedure Lite”,不支持多條 SQL 語句,不支持邏輯語句(呵呵,畢竟不是 T-SQL)等等,我也還不清楚它是不是預(yù)編譯了。不過,正如同 VBScript 實(shí)現(xiàn)的所謂“類”僅僅具有封裝性,對(duì)于代碼結(jié)構(gòu)的“美化”和程序重用性具有很大促進(jìn)一樣,Access 的“輕量存儲(chǔ)過程”,對(duì)于規(guī)范,小出錯(cuò)幾率的數(shù)據(jù)庫操作應(yīng)該也有幫助,并且性能可能會(huì)有提高。
下面我譯 step by step 的方式,介紹如何在 Access 中創(chuàng)建存儲(chǔ)過程,然后在 ASP 程序中使用它。
(一)在 Access 中創(chuàng)建“存儲(chǔ)過程”
不知道大家的 Access 應(yīng)用水平如何,反正它對(duì)于我來說,僅僅就是一個(gè) MDB 數(shù)據(jù)庫文件的創(chuàng)建工具,我只會(huì)新建 MDB 文件,然后在 Access 的界面中創(chuàng)建表,索引,約束等等,over~
Access 中的“查詢”,就扮演了存儲(chǔ)過程的角色。下文中我提到的 Access 的“存儲(chǔ)過程”或者“查詢”都是指這個(gè)東西
對(duì)于“查詢”的創(chuàng)建,Access 提供了一個(gè)傻瓜工具,類似 VS.NET 里邊建立 DataAdapter 時(shí)的向?qū)。不過我喜歡直接寫 SQL 代碼
好,下面先看看我們這個(gè)簡單的例子中所使用的數(shù)據(jù)庫的表結(jié)構(gòu)。
然后在 Access 主界面上點(diǎn)擊左側(cè)的“查詢”按鈕,再在右邊雙擊“在設(shè)計(jì)視圖中創(chuàng)建查詢”,以打開查詢設(shè)計(jì)視圖。
這時(shí)彈出的是可視化的查詢生成器,我們首先添加 SQL 語句需要涉及的表。
添加表之后,在設(shè)計(jì)視圖上點(diǎn)擊鼠標(biāo)右鍵,選擇“SQL 視圖”,以切換到 SQL 代碼編輯窗口。
好,下面說說 Access 的存儲(chǔ)過程的特點(diǎn)。
Access 的查詢,我目前的感覺是對(duì) SQL 語句的一個(gè)包裝,或許進(jìn)行了某種優(yōu)化如預(yù)編譯。我們不能像寫 SQL Server 存儲(chǔ)過程那樣使用多重操作,事務(wù),邏輯判斷,循環(huán)等等……
但是我們使用 Access 存儲(chǔ)過程的主要目的,就是使用參數(shù)額外提供的查詢,使用存儲(chǔ)過程,我們不必再面對(duì)將參數(shù)值拼接到 SQL 語句字符串中時(shí)遇到的各種麻煩,比如:
代碼:
--------------------------------------------------------------------------------
Dim sql
sql = "SELECT * FROM Users WHERE UserName = '" & userName & "'"
--------------------------------------------------------------------------------
以上代碼中,如果字符串變量 userName 中含有“'”單引號(hào),則會(huì)報(bào)錯(cuò)。我們必須手工轉(zhuǎn)化:
代碼:
--------------------------------------------------------------------------------
Dim sql
sql = "SELECT * FROM Users WHERE UserName = '" & Replace(userName, "'", "''")
& "'" '轉(zhuǎn)化為連續(xù)兩個(gè)單引號(hào)
--------------------------------------------------------------------------------
而使用帶參數(shù)查詢,我們的 SQL 語句可以寫為:
代碼:
--------------------------------------------------------------------------------
Dim sql
sql = "SELECT * FROM Users WHERE UserName = @userName"
--------------------------------------------------------------------------------
然后把參數(shù) @userName 的值以 Command 對(duì)象的 Parameter 屬性來傳入即可,很方便直觀。
代碼:
--------------------------------------------------------------------------------
With cmd
'創(chuàng)建參數(shù)對(duì)象
.Parameters.Append .CreateParameter("@userName")
'給各參數(shù)指定值
.Parameters("@userName") = userName
End With
--------------------------------------------------------------------------------
這里還要說明 Access 存儲(chǔ)過程中參數(shù)的使用。和 SQL Server 的存儲(chǔ)過程中用 @ 變量指定參數(shù),然后同名傳入?yún)?shù)對(duì)象不同,Access 中的參數(shù),是以“順序”而非“名字”來識(shí)別的。傳入的參數(shù)無需指定名字,隨便起,SQL 中的參數(shù)名字也可以隨便起,只要傳入?yún)?shù)值時(shí),按照 SQL 語句中的參數(shù)出現(xiàn)順序指定就行了。通常,我們使用 Command 對(duì)象的 Execute 方法,直接傳入?yún)?shù)值數(shù)組來執(zhí)行~
代碼:
--------------------------------------------------------------------------------
cmd.Execute , Array(userName)
--------------------------------------------------------------------------------
再比如,你的一個(gè) Access 存儲(chǔ)過程這么寫:
代碼:
--------------------------------------------------------------------------------
select * from Users where UserName = p_UserName and BookTitle = p_bookTitle
--------------------------------------------------------------------------------
你可以就這么執(zhí)行,通過傳入?yún)?shù)值數(shù)組,但是順序要對(duì)應(yīng):
代碼:
--------------------------------------------------------------------------------
cmd.Execute , Array(userName, bookTitle)
--------------------------------------------------------------------------------
OK,看看我們的例子中使用的兩個(gè)查詢,一個(gè)是寫入數(shù)據(jù)。寫好 SQL 語句后保存并命名。
另一個(gè)讀取數(shù)據(jù)的存儲(chǔ)過程代碼。
(出處:PConline)