ASP 3.0進階編程(四十一)

來源:互聯網
上載者:User
編程|進階 9.2.3 預存程序
預存程序的使用是Command對象得到應用的一個領域。預存程序(有時也稱儲存查詢)是儲存在資料庫中預先定義的SQL查詢語句。
為什麼應該建立和使用預存程序而不是在代碼中直接使用SQL字串呢?主要有以下幾個理由:
· 預存程序被資料庫編譯過。這樣可以產生一個“執行計畫”,因此資料庫確切地知道它將做什麼,從而加快了過程的執行速度。
· 預存程序通常被資料庫快取,這樣使它們運行得更快,因為此時不需要從磁碟中讀取它們。並非所有的資料庫都支援這種緩衝機制,比如微軟的Access就不支援,而SQL Server卻支援。
· 通過指定資料庫中的表只能被預存程序修改,可以確保資料更安全。這意味著具有潛在危險的SQL操作不會執行。
· 可以避免將ASP代碼和冗長的SQL語句混在一起,從而使ASP代碼更易於維護。
· 可以將所有SQL代碼集中存放於伺服器。
· 可以在預存程序中使用輸出參數,允許返回記錄集或其他的值。
一般說來,預存程序幾乎總是比相當的SQL語句執行速度快。
為了使用預存程序,只要將預存程序的名字作為命令文本,並設定相應的類型。例如,考慮前面更新書價的例子。如果在SQL Server上建立一個預存程序,可以編寫代碼:
CREATE PROCEDURE usp_UpdatePrices
AS
UPDATE Titles
SET Price = Price * 1.10
WHERE TYPE='Business'
對於微軟的Access資料庫,可以使用一個簡單的更新查詢陳述式完成相同的任務,如圖9-1所示:

圖9-1 使用微軟的Access資料庫完成更新查詢
要在ASP網頁中運行該預存程序,只需要使用以下代碼:
Set cmdUpdate = Server.CreateObject("ADODB.Command")

cmdUpdate.ActiveConnection = strConn
cmdUpdate.CommandText = "usp_UpdatePrices"
cmdUpdate.CommandType = adCmdStoredProc

cmdUpdate.Execute , , adExecuteNoRecords
這隻是運行預存程序。沒有記錄集返回,因為只是在更新資料。需要記住的是,除非確實需要,不要建立記錄集。
雖然這樣做也可以,但並不是很靈活,因為僅僅處理一種類型的書。更好的做法是建立一個允許我們選擇書類型的過程,這樣就不必為每類書建立一個過程。同樣也可去掉固定的10%更新,這樣使得靈活性更好。那麼,如何才能做到這一點呢,很簡單,使用參數。
1. 參數
預存程序的參數(或變數)與一般的過程和函數的參數一樣,可以傳到函數內部,然後函數可以使用它的值。SQL Server(其他資料庫也一樣,包括Access)中的預存程序都具有這樣的功能。
為了使預存程序能處理多種類型的書,甚至允許使用者指定價格的增加(或減少),需要增加一些參數:
CREATE PROCEDURE usp_UpdatePrices
@Type Char(12),
@Percent Money

AS
UPDATE Titles
SET Price = Price * (1 + @Percent / 100)
WHERE Type = @Type
現在,預存程序usp_UpdatePrices帶有兩個參數:
· 一個是書的類型(@Type)。
· 一個是書價變化的百分比(@Percent)。
與VBScript的函數一樣,這些參數都是變數。然而,與VBScript和其他指令碼語言不同的是:在這些指令碼語言中的變數都是variant類型,而SQL變數具有確定的類型(char、Money等等)。必須遵守SQL變數的命名規範,即變數必須以符號@開始。
注意,我們讓百分數作為一個整數(如10代表10%),而不是作為一個分數值傳入此過程。這隻是讓預存程序變得更直觀一些。
2. Parameters集合
那麼,現在有了帶參數的預存程序,但如何通過ADO來調用它呢?我們已經見到了如何用Command對象調用不帶參數的預存程序,實際上,它們之間並沒有什麼不同。不同之處在於Parameters集合的使用。
Parameters集合包含預存程序中每個參數的Parameter對象。然而,ADO並不會自動地知道這些參數是什麼,因此,必須用CreateParameter方法建立它們,採用下面的形式:
Set Parameter = Command.CreateParameter (Name, [Type], [Direction], [Size], [Value])
參數及說明如表9-3所示:
表9-3 CreateParameter方法的參數及說明
參 數
說 明

Name
參數名。這是Parameters集合中的參數名,不是預存程序中的參數名。然而,使用相同的名字是一個好的做法

Type
參數的資料類型。可以是一個adDataType常數,詳見附錄

Direction
參數的方向,指明是參數向預存程序提供資訊,還是預存程序向ADO返回資訊。可以是下面的值之一:
adParamInput,參數是傳給預存程序的輸入參數
adParamOutput,參數是從預存程序檢索出的輸出參數
adParamInputOutput,參數可同時作為輸入和輸出參數
adParamReturnValue,該參數包含預存程序返回的狀態

Size
參數長度。對於固定長度的類型,比如整型,該值可以忽略

Value
參數的值

一旦建立了參數就可以將其追加到Parameters集合中,例如:
Set parValue = cmdUpdate.CreateParameter("@Type", adVarWChar, adParamInput, _
12, "Business")
cmdUpdate.Parameters.Append parValue

Set parValue = cmdUpdate.CreateParameter("@Percent", adCurrency, _
adParamInput, , 10)
cmdUpdate.Parameters.Append parValue
沒有必要顯式地建立一個對象去儲存參數,預設的Variant類型已經可以工作得相當好。如果不想建立一個變數,也可以走捷徑,例如下面的代碼:
cmdUpdate.Parameters.Append = _
cmdUpdate.CreateParameter("@Percent", adCurrency, adParamInput, , 10)
這使用CreateParameter方法返回一個Parameter對象,並用Append方法接收它。這種方法比使用變數運行得快,卻加長了程式碼,可讀性比較差。可以根據自己的愛好選擇其中一種方法。
參數加到Parameters集合後,就保留在其中,因此,不一定在建立參數時就為每個參數賦值。可以在命令運行前的任何時候設定參數的值。例如:
cmdUpdate.Parameters.Append = _
cmdUpdate.CreateParameter("@Percent", adCurrency, adParamInput)

cmdUpdate.Parameters("@Percent") = 10
前一章提到了訪問集合中的值有好幾種方法,Parameters集合并沒有什麼不同。上面的例子使用參數的名字在集合中檢索參數,也可以使用索引號進行檢索:
cmdUpdate.Parameters(0) = 10
以上代碼對參數集合中第一個(Parameters集合從0開始編號)參數進行了賦值

[1] [2] [3] 下一頁  



相關文章

Alibaba Cloud 10 Year Anniversary

With You, We are Shaping a Digital World, 2009-2019

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 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。