Parameters參數(shù)集合一般來(lái)說(shuō)比較好用,但有時(shí)稍有麻煩(尤其對(duì)于新手),。好在有一種快捷方法,,使用Execute方法的Parameters參數(shù)。例如,,調(diào)用存儲(chǔ)過(guò)程usp_UpdatePrices,,但不使用Parameters集合。
創(chuàng)建一個(gè)Command對(duì)象,,并同前面一樣設(shè)置其屬性,。
' Set cmdUpdate = Server.CreateObject("ADODB.Command")
' Set the properties of the command
With cmdUpdate
.ActiveConnection = strConn
.commandText = "usp_UpdatePrices"
.commandType = adCmdStroreProc
但這里正是差異所在。我們僅是通過(guò)Execute方法傳遞參數(shù)給存儲(chǔ)過(guò)程,,而不是創(chuàng)建參數(shù)并添加到集合中,。
' Execute the command
.Execute lngRecs, Array(strType, curPercent), adExecuteNoRecords
End With
這里使用了Array函數(shù),將單個(gè)變量轉(zhuǎn)換為數(shù)組,,以適于方法調(diào)用,。這種方法當(dāng)然也有缺點(diǎn):
· 只能使用輸入?yún)?shù),。因?yàn)椴荒苤付▍?shù)的類型和傳遞方向,而缺省為輸入?yún)?shù),。
· 如果要多次調(diào)用存儲(chǔ)過(guò)程,,這種方法速度就比較慢,因?yàn)锳DO將向數(shù)據(jù)存儲(chǔ)詢問(wèn)參數(shù)的內(nèi)容及數(shù)據(jù)類型,。
集合方法和數(shù)組方法之間在速度上的差異非常之小,,幾乎可以忽略。所以,,如果只有輸入?yún)?shù),,可隨便使用哪一種。實(shí)際上,,人們更喜歡使用Parameters集合的方法,,盡管它稍為繁瑣,但是使參數(shù)的屬性更加明確,。
4. 輸出參數(shù)
我們已經(jīng)知道如何獲得受命令影響的記錄數(shù),,如果需要更多信息,卻又不想返回一個(gè)記錄集,,怎么辦?也許想從存儲(chǔ)過(guò)程中返回兩個(gè)或三個(gè)值,,但又不想費(fèi)心創(chuàng)建一個(gè)記錄集,。在這時(shí),可以定義一個(gè)輸出參數(shù),,其值由存儲(chǔ)過(guò)程提供,。
例如,對(duì)于更新書(shū)價(jià)的程序,,如果想在更新之后找出最高價(jià)格,,可將存儲(chǔ)過(guò)程改成:
CREATE PROCEDURE usp_UpdatePricesMax
@Type Char(12),
@Percent Money,
@Max Money OUTPUT
AS
BEGIN
UPDATE Titles
SET Price = Price * (1 + @Percent / 100)
WHERE Type = @Type
SELECT @Max = MAX(Price)
FROM Titles
END
這只是在執(zhí)行更新后運(yùn)行了一個(gè)簡(jiǎn)單的SELECT語(yǔ)句,并將值賦給輸出參數(shù),。
現(xiàn)在可以改寫(xiě)StroreProcedure.asp的代碼從而獲取變量@MAX的值,。
<%
Dim cmdUpdate
Dim lngRecs
Dim strType
Dim curPercent
Dim curMax
' Get the form values
strType = Request.Form("lstTypes")
curPercent = Request.Form("txtPercent")
' Tell the user what's being done
Response.Write "Updating all books" & " of type <B>" & strType & "</B>" & _
" by " & curPercent & "%<P>"
Set cmdUpdate = Server.CreateObject("ADODB.Command")
' Set the properties of the command
With cmdUpdate
.ActiveConnection = strConn
.CommandText = "usp_UpdatePricesMax"
.CommandType = adCmdStoredProc
我們只是在集合中加入了另一個(gè)參數(shù),但這次指定為輸出參數(shù),。注意它并沒(méi)有賦值,,因?yàn)槠渲祵⒂纱鎯?chǔ)過(guò)程提供,記住這是一個(gè)輸出參數(shù),。
' Add the parameters
.Parameters.Append .CreateParameter("@Type", adVarWChar, adParamInput, _
12, strType)
.Parameters.Append .CreateParameter("@Percent", adCurrency, _
adParamInput, , curPercent)
.Parameters.Append.CreateParameter("@Max", adCurrency, adParamOutput)
' Execute the command
.Execute lngRecs, , adExecuteNoRecords
一旦執(zhí)行這個(gè)過(guò)程,,就可從集合中取得該值。
' Extract the output parameter, which the stored
' procedure has supplied to the parameters collection
curMax = .Parameters("@Max")
End With
' And finally tell the user what's happened
Response.Write "Procedure complete. " & lngRecs & _
" records were updated.<P>"
Response.Write "The highest price book is now " & _
FormatCurrency(curMax)
Set cmdUpdate = Nothing
%>
如果有不止一個(gè)輸出參數(shù),,可用相同的方法訪問(wèn),??梢允褂脜?shù)名或索引號(hào)取出集合中的值。
5. 返回值
對(duì)函數(shù)返回值的處理不同于存儲(chǔ)過(guò)程返回值的處理,,這常常導(dǎo)致混淆,。在函數(shù)中,經(jīng)常是返回一個(gè)布爾值來(lái)表明函數(shù)運(yùn)行的成功與否,。
If SomeFunctionName() = True Then
' Function succeeded
但在調(diào)用一個(gè)存儲(chǔ)過(guò)程時(shí),,卻不能使用同樣的方法,因?yàn)榇鎯?chǔ)是用Execute方法運(yùn)行的,,同時(shí)返回一個(gè)記錄集,。
Set rsAuthors = cmdAuthors.Execute
如果得不到一個(gè)返回值,如何確定是否已正確執(zhí)行存儲(chǔ)過(guò)程,?當(dāng)發(fā)生錯(cuò)誤時(shí),,會(huì)報(bào)告錯(cuò)誤,這樣就可使用前一章提供的錯(cuò)誤處理代碼來(lái)處理錯(cuò)誤,。但對(duì)于一些非致命的邏輯錯(cuò)誤怎么辦,?
例如,考慮向employee表添加一個(gè)新職員的情形,。你可能不想防止兩個(gè)職員同名的情況,,但想注明這個(gè)情況。那么,,可以使用一個(gè)返回值以表明是否已有同名的職員存在,。存儲(chǔ)過(guò)程如下:
CREATE PROCEDURE usp_AddEmployee
@Emp_ID Char(9),
@FName Varchar(20),
@Minit Char(1),
@LName Varchar(30),
@Job_ID SmallInt,
@Job_Lvl TinyInt,
@Pub_ID Char(4),
@Hire_Date Datetime
AS
BEGIN
DECLARE @Exists Int -- Return value
-- See if an employee with the same name exists
IF EXISTS(SELECT *
FROM Employee
WHERE FName = @FName
AND MInit = @MInit
AND LName = @LName)
SELECT @Exists = 1
ELSE
SELECT @Exists = 0
INSERT INTO Employee (emp_id, fname, minit, lname,
job_id, job_lvl, pub_id, hire_date)
VALUES (@Emp_Id, @FName, @MInit, @LName, @Job_ID,
@Job_Lvl, @Pub_ID, @Hire_Date)
RETURN @Exists
END
該過(guò)程首先檢查是否有同名的職員存在,并據(jù)此設(shè)定相應(yīng)的變量Exists,,若存在同名,,就設(shè)為1,否則為0,。然后將該職員加到表中,,同時(shí)把Exists的值作為返回值返回。
注意盡管返回了一個(gè)值,,但并未將其聲明為存儲(chǔ)過(guò)程的參數(shù),。
調(diào)用該過(guò)程的ASP代碼如下:
<!-- #INCLUDE FILE="../include/Connection.asp" -->
<%
Dim cmdEmployee
Dim lngRecs
Dim lngAdded
Set cmdEmployee = Server.CreateObject("ADODB.Command")
' Set the properties of the command
With cmdEmployee
.ActiveConnection = strConn
.CommandText = "usp_AddEmployee"
.CommandType = adCmdStoredProc
' Create the parameters
' Notice that the return value is the first parameter
.Parameters.Append .CreateParameter ("RETURN_VALUE", adInteger, _
adParamReturnValue)
.Parameters.Append .CreateParameter ("@Emp_id", adChar, adParamInput, 9)
.Parameters.Append .CreateParameter ("@fname", adVarWChar, adParamInput, 20)
.Parameters.Append .CreateParameter ("@minit", adChar, adParamInput, 1)
.Parameters.Append .CreateParameter ("@lname", adVarWChar, adParamInput, 30)
.Parameters.Append .CreateParameter ("@job_id", adSmallInt, adParamInput)
.Parameters.Append .CreateParameter ("@job_lvl", adUnsignedTinyInt, adParamInput)
.Parameters.Append .CreateParameter ("@pub_id", adChar, adParamInput, 4)
.Parameters.Append .CreateParameter ("@hire_date", adDBTimeStamp, _
adParamInput, 8)
' Set the parameter values
.Parameters("@Emp_id") = Request.Form("txtEmpID")
.Parameters("@fname") = Request.Form("txtFirstName")
.Parameters("@minit") = Request.Form("txtInitial")
.Parameters("@lname") = Request.Form("txtLastName")
.Parameters("@job_id") = Request.Form("lstJobs")
.Parameters("@job_lvl") = Request.Form("txtJobLevel")
.Parameters("@pub_id") = Request.Form("lstPublisher")
.Parameters("@hire_date") = Request.Form("txtHireDate")
' Run the stored procedure
.Execute lngRecs, , adExecuteNoRecords
' Extract the return value
lngAdded = .Parameters("RETURN_VALUE")
End With
Response.Write "New employee added.<P>"
If lngAdded = 1 Then
Response.Write "An employee with the same name already exists."
End If
Set cmdEmployee = Nothing
%>
需要重點(diǎn)注意,返回值應(yīng)當(dāng)作為集合中第一個(gè)參數(shù)被創(chuàng)建,。即使返回值并不作為一個(gè)參數(shù)出現(xiàn)在存儲(chǔ)過(guò)程中,,總是Parameters集合中的第一個(gè)Parameters。
因此,,特別強(qiáng)調(diào)一點(diǎn):
存儲(chǔ)過(guò)程的返回值必須聲明為Parameters集合中第一個(gè)參數(shù),,同時(shí)參數(shù)的Direction值必須為adParamReturnValue。
我是新手,但我很虛心,對(duì)我發(fā)的問(wèn)題請(qǐng)不要取笑,謝謝