国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > ASP > 正文

ASP在 Access 中使用“存儲(chǔ)過程”

2024-05-04 11:07:12
字體:
供稿:網(wǎng)友

我們已經(jīng)熟悉在 ASP 中通過調(diào)用 SQL Server 存儲(chǔ)過程來執(zhí)行數(shù)據(jù)庫(kù)操作,不過大家是否知道,在桌面級(jí)數(shù)據(jù)庫(kù) Access 中,我們也能夠創(chuàng)建并使用“存儲(chǔ)過程”?

Access + ASP 是開發(fā)輕量級(jí) Web 應(yīng)用程序的絕佳組合:簡(jiǎn)單,快速,兼容性好,但是性能通常不高。并且,用 ADODB.Connection 和 Recordset 對(duì)象來執(zhí)行 SQL 語(yǔ)句的方式,也有一些不方便,因?yàn)閹?shù)的 SQL 語(yǔ)句的參數(shù)值也常常是拼接到字符串中,于是便有了諸如“單引號(hào)問題”這樣的麻煩。使用存儲(chǔ)過程的一個(gè)好處就是,支持 SQL 語(yǔ)句參數(shù)值的另外提供。

事實(shí)上,Access(2000 及以上版本)中所謂“存儲(chǔ)過程”,和 SQL Server 中的 Stored Procedure 是不能比的。它只能算是“Stored Procedure Lite”,不支持多條 SQL 語(yǔ)句,不支持邏輯語(yǔ)句(呵呵,畢竟不是 T-SQL)等等,我也還不清楚它是不是預(yù)編譯了。不過,正如同 VBScript 實(shí)現(xiàn)的所謂“類”僅僅具有封裝性,對(duì)于代碼結(jié)構(gòu)的“美化”和程序重用性具有很大促進(jìn)一樣,Access 的“輕量存儲(chǔ)過程”,對(duì)于規(guī)范,小出錯(cuò)幾率的數(shù)據(jù)庫(kù)操作應(yīng)該也有幫助,并且性能可能會(huì)有提高。

下面我譯 step by step 的方式,介紹如何在 Access 中創(chuàng)建存儲(chǔ)過程,然后在 ASP 程序中使用它。

(一)在 Access 中創(chuàng)建“存儲(chǔ)過程”

不知道大家的 Access 應(yīng)用水平如何,反正它對(duì)于我來說,僅僅就是一個(gè) MDB 數(shù)據(jù)庫(kù)文件的創(chuàng)建工具,我只會(huì)新建 MDB 文件,然后在 Access 的界面中創(chuàng)建表,索引,約束等等,over~

Access 中的“查詢”,就扮演了存儲(chǔ)過程的角色。下文中我提到的 Access 的“存儲(chǔ)過程”或者“查詢”都是指這個(gè)東西

對(duì)于“查詢”的創(chuàng)建,Access 提供了一個(gè)傻瓜工具,類似 VS.NET 里邊建立 DataAdapter 時(shí)的向?qū)А2贿^我喜歡直接寫 SQL 代碼

然后在 Access 主界面上點(diǎn)擊左側(cè)的“查詢”按鈕,再在右邊雙擊“在設(shè)計(jì)視圖中創(chuàng)建查詢”,以打開查詢?cè)O(shè)計(jì)視圖。

這時(shí)彈出的是可視化的查詢生成器,我們首先添加 SQL 語(yǔ)句需要涉及的表。

添加表之后,在設(shè)計(jì)視圖上點(diǎn)擊鼠標(biāo)右鍵,選擇“SQL 視圖”,以切換到 SQL 代碼編輯窗口。

好,下面說說 Access 的存儲(chǔ)過程的特點(diǎn)。

Access 的查詢,我目前的感覺是對(duì) SQL 語(yǔ)句的一個(gè)包裝,或許進(jìn)行了某種優(yōu)化如預(yù)編譯。我們不能像寫 SQL Server 存儲(chǔ)過程那樣使用多重操作,事務(wù),邏輯判斷,循環(huán)等等……

但是我們使用 Access 存儲(chǔ)過程的主要目的,就是使用參數(shù)額外提供的查詢,使用存儲(chǔ)過程,我們不必再面對(duì)將參數(shù)值拼接到 SQL 語(yǔ)句字符串中時(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 語(yǔ)句可以寫為:

代碼:
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 語(yǔ)句中的參數(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 語(yǔ)句后保存并命名。

另一個(gè)讀取數(shù)據(jù)的存儲(chǔ)過程代碼。


(二)使用存儲(chǔ)過程

然后我們可以在 ASP 程序中調(diào)用這些存儲(chǔ)過程了。

這里可以看到為什么我說 Access 中的查詢就是它的存儲(chǔ)過程——我們的 Command 對(duì)象的 CommandType 屬性設(shè)置的是 4,即 Stored Proc!

so...

以下的代碼很簡(jiǎn)單:


代碼:
<%
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 '存儲(chǔ)過程
    .CommandText = "AddNewData"
End With

cmd.Execute , Array(CStr(Now()), CSng(s))

With cmd
    .ActiveConnection = conn
    .CommandType = &H0004 '存儲(chǔ)過程
    .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>"
%> 

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 舟曲县| 都江堰市| 治县。| 逊克县| 大丰市| 嘉兴市| 景东| 浏阳市| 荥经县| 上杭县| 汉中市| 兴城市| 勃利县| 鲁山县| 安吉县| 万全县| 洪洞县| 龙南县| 永泰县| 奉化市| 基隆市| 江川县| 宁乡县| 涞水县| 湖南省| 乌鲁木齐县| 乌兰察布市| 台东市| 高唐县| 城固县| 岗巴县| 通辽市| 陕西省| 遵义市| 咸丰县| 许昌县| 顺昌县| 佛学| 清远市| 铁岭市| 贵溪市|