久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

[分享]ASP調(diào)用存儲(chǔ)過(guò)程 - ASP技術(shù)論壇 - 編程論壇

 谷忙 2011-03-08
ASP調(diào)用存儲(chǔ)過(guò)程

存儲(chǔ)過(guò)程的使用是Command對(duì)象得到應(yīng)用的一個(gè)領(lǐng)域,。存儲(chǔ)過(guò)程(有時(shí)也稱存儲(chǔ)查詢)是存儲(chǔ)在數(shù)據(jù)庫(kù)中預(yù)先定義的SQL查詢語(yǔ)句,。
為什么應(yīng)該創(chuàng)建和使用存儲(chǔ)過(guò)程而不是在代碼中直接使用SQL字符串呢,?主要有以下幾個(gè)理由:
· 存儲(chǔ)過(guò)程被數(shù)據(jù)庫(kù)編譯過(guò),。這樣可以產(chǎn)生一個(gè)“執(zhí)行計(jì)劃”,因此數(shù)據(jù)庫(kù)確切地知道它將做什么,,從而加快了過(guò)程的執(zhí)行速度,。
· 存儲(chǔ)過(guò)程通常被數(shù)據(jù)庫(kù)高速緩存,這樣使它們運(yùn)行得更快,,因?yàn)榇藭r(shí)不需要從磁盤(pán)中讀取它們,。并非所有的數(shù)據(jù)庫(kù)都支持這種緩存機(jī)制,比如微軟的Access就不支持,,而SQL Server卻支持,。
· 通過(guò)指定數(shù)據(jù)庫(kù)中的表只能被存儲(chǔ)過(guò)程修改,可以確保數(shù)據(jù)更安全,。這意味著具有潛在危險(xiǎn)的SQL操作不會(huì)執(zhí)行,。
· 可以避免將ASP代碼和冗長(zhǎng)的SQL語(yǔ)句混在一起,從而使ASP代碼更易于維護(hù),。
· 可以將所有SQL代碼集中存放于服務(wù)器,。
· 可以在存儲(chǔ)過(guò)程中使用輸出參數(shù),允許返回記錄集或其他的值,。
一般說(shuō)來(lái),,存儲(chǔ)過(guò)程幾乎總是比相當(dāng)?shù)腟QL語(yǔ)句執(zhí)行速度快。
為了使用存儲(chǔ)過(guò)程,,只要將存儲(chǔ)過(guò)程的名字作為命令文本,,并設(shè)置相應(yīng)的類型。例如,,考慮前面更新書(shū)價(jià)的例子,。如果在SQL Server上創(chuàng)建一個(gè)存儲(chǔ)過(guò)程,可以編寫(xiě)代碼:
CREATE PROCEDURE usp_UpdatePrices
AS
UPDATE Titles
SET Price = Price * 1.10
WHERE TYPE='Business'
要在ASP網(wǎng)頁(yè)中運(yùn)行該存儲(chǔ)過(guò)程,,只需要使用以下代碼:
Set cmdUpdate = Server.CreateObject("ADODB.Command")

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

cmdUpdate.Execute , , adExecuteNoRecords
這只是運(yùn)行存儲(chǔ)過(guò)程,。沒(méi)有記錄集返回,因?yàn)橹皇窃诟聰?shù)據(jù),。需要記住的是,,除非確實(shí)需要,,不要?jiǎng)?chuàng)建記錄集。
雖然這樣做也可以,,但并不是很靈活,,因?yàn)閮H僅處理一種類型的書(shū)。更好的做法是創(chuàng)建一個(gè)允許我們選擇書(shū)類型的過(guò)程,,這樣就不必為每類書(shū)創(chuàng)建一個(gè)過(guò)程,。同樣也可去掉固定的10%更新,這樣使得靈活性更好,。那么,,如何才能做到這一點(diǎn)呢,很簡(jiǎn)單,,使用參數(shù),。
1. 參數(shù)
存儲(chǔ)過(guò)程的參數(shù)(或變量)與一般的過(guò)程和函數(shù)的參數(shù)一樣,可以傳到函數(shù)內(nèi)部,,然后函數(shù)可以使用它的值,。SQL Server(其他數(shù)據(jù)庫(kù)也一樣,包括Access)中的存儲(chǔ)過(guò)程都具有這樣的功能,。
為了使存儲(chǔ)過(guò)程能處理多種類型的書(shū),,甚至允許用戶指定價(jià)格的增加(或減少),需要增加一些參數(shù):
CREATE PROCEDURE usp_UpdatePrices
@Type Char(12),
@Percent Money

AS
UPDATE Titles
SET Price = Price * (1 + @Percent / 100)
WHERE Type = @Type
現(xiàn)在,,存儲(chǔ)過(guò)程usp_UpdatePrices帶有兩個(gè)參數(shù):
· 一個(gè)是書(shū)的類型(@Type),。
· 一個(gè)是書(shū)價(jià)變化的百分比(@Percent)。
與VBScript的函數(shù)一樣,,這些參數(shù)都是變量,。然而,與VBScript和其他腳本語(yǔ)言不同的是:在這些腳本語(yǔ)言中的變量都是variant類型,,而SQL變量具有確定的類型(char,、Money等等)。必須遵守SQL變量的命名規(guī)范,,即變量必須以符號(hào)@開(kāi)始,。
注意,我們讓百分?jǐn)?shù)作為一個(gè)整數(shù)(如10代表10%),,而不是作為一個(gè)分?jǐn)?shù)值傳入此過(guò)程,。這只是讓存儲(chǔ)過(guò)程變得更直觀一些。
2. Parameters集合
那么,,現(xiàn)在有了帶參數(shù)的存儲(chǔ)過(guò)程,,但如何通過(guò)ADO來(lái)調(diào)用它呢?我們已經(jīng)見(jiàn)到了如何用Command對(duì)象調(diào)用不帶參數(shù)的存儲(chǔ)過(guò)程,,實(shí)際上,,它們之間并沒(méi)有什么不同,。不同之處在于Parameters集合的使用。
Parameters集合包含存儲(chǔ)過(guò)程中每個(gè)參數(shù)的Parameter對(duì)象,。然而,,ADO并不會(huì)自動(dòng)地知道這些參數(shù)是什么,因此,,必須用CreateParameter方法創(chuàng)建它們,,采用下面的形式:
Set Parameter = Command.CreateParameter (Name, [Type], [Direction], [Size], [Value])
一旦創(chuàng)建了參數(shù)就可以將其追加到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
沒(méi)有必要顯式地創(chuàng)建一個(gè)對(duì)象去保存參數(shù),,缺省的Variant類型已經(jīng)可以工作得相當(dāng)好,。如果不想創(chuàng)建一個(gè)變量,也可以走捷徑,,例如下面的代碼:
cmdUpdate.Parameters.Append = _
cmdUpdate.CreateParameter("@Percent", adCurrency, adParamInput, , 10)
這使用CreateParameter方法返回一個(gè)Parameter對(duì)象,并用Append方法接收它,。這種方法比使用變量運(yùn)行得快,,卻加長(zhǎng)了代碼行,可讀性比較差,??梢愿鶕?jù)自己的愛(ài)好選擇其中一種方法。
參數(shù)加到Parameters集合后,,就保留在其中,,因此,不一定在創(chuàng)建參數(shù)時(shí)就為每個(gè)參數(shù)賦值,??梢栽诿钸\(yùn)行前的任何時(shí)候設(shè)置參數(shù)的值。例如:
cmdUpdate.Parameters.Append = _
cmdUpdate.CreateParameter("@Percent", adCurrency, adParamInput)

cmdUpdate.Parameters("@Percent") = 10
前一章提到了訪問(wèn)集合中的值有好幾種方法,,Parameters集合并沒(méi)有什么不同,。上面的例子使用參數(shù)的名字在集合中檢索參數(shù),也可以使用索引號(hào)進(jìn)行檢索:
cmdUpdate.Parameters(0) = 10
以上代碼對(duì)參數(shù)集合中第一個(gè)(Parameters集合從0開(kāi)始編號(hào))參數(shù)進(jìn)行了賦值,。使用索引號(hào)比使用名字索引速度快,,但很顯然使用名字使代碼更易讀。
重點(diǎn)注意Parameters集合中參數(shù)的順序必須與存儲(chǔ)過(guò)程中參數(shù)的順序相一致,。
運(yùn)行帶參數(shù)的命令一旦加入?yún)?shù),,就可立即運(yùn)行命令,同時(shí)這些參數(shù)的值傳入存儲(chǔ)過(guò)程,。
<!-- #INCLUDE FILE="../Include/Connection.asp" -->
接下來(lái),,可以創(chuàng)建一個(gè)窗體(在這兒不顯示大量文本,僅僅用一個(gè)樣本文件),。該窗體調(diào)用一個(gè)名為StoreProcedure.asp的文件,。
<FORM NAME="UpdatePrices" Method="post" ACTION="StoredProcedure.asp">
<TABLE>
<TR>
<TD>Book Type:</TD>
<TD><SELECT NAME="lstTypes"></TD>
現(xiàn)在開(kāi)始編寫(xiě)ASP腳本從title表中讀取書(shū)的類型,。使用一個(gè)SQL字符串只返回唯一的書(shū)類型,然后將返回值放到HTML的OPTION標(biāo)記中:
<%
Dim recTypes
Dim sDQ

sDQ = Chr(34) ' double quote character

Set recTypes = Server.CreateObject("ADODB.Recordset")

recTypes.Open "usp_BookTypes", strConn

While Not recTypes.EOF
Response.Write "<OPTION VALUE=" & sDQ & recTypes("type") & sDQ & _
">" & recTypes("type")
recTypes.MoveNext
Wend

recTypes.Close
Set recTypes = Nothing

%>
顯示書(shū)的類型后,,接著可以構(gòu)建窗體的其他部分,,包括一個(gè)允許用戶輸入書(shū)價(jià)變化百分?jǐn)?shù)的文本框。
</SELECT>
</TD>
</TR>
<TR>
<TD>Percent Value</TD>
<TD><INPUT NAME="txtPercent" TYPE="TEXT"></TD>
</TR>
</TABLE>
<P>
<INPUT TYPE="submit" VALUE="Run Query">
</FORM>
現(xiàn)在看一下Run Query按鈕調(diào)用的ASP文件StoredProcedure.asp,。首先,,聲明變量并從調(diào)用窗體取出書(shū)的類型和百分?jǐn)?shù)。
Dim cmdUpdate
Dim lRecs
Dim sType
Dim cPercent

' Get the form values
sType = Request.Form("lstTypes")
cPercent = Request.Form("txtPercent")
現(xiàn)在可以向用戶顯示一些確認(rèn)信息,,告訴他們將發(fā)生什么,。
' Tell the user what's being done
Response.Write "Updating all books"
If sType <> "all" Then
Response.Write " of type <B>" & sType & "</B>"
End If
Response.Write " by " & cPercent & "%<P>"
現(xiàn)在重新回到代碼內(nèi)部,在此創(chuàng)建Command對(duì)象和參數(shù),。
Set cmdUpdate = Server.CreateObject("ADODB.Command")

With cmdUpdate
.ActiveConnection = strConn
.CommandText = "usp_UpdatePrices"
.CommandType = adCmdStoredProc
利用從前面網(wǎng)頁(yè)的窗體中提取的數(shù)據(jù)值,,使用快捷方法創(chuàng)建和增加參數(shù)。
' Add the parameters
.Parameters.Append .CreateParameter ("@Type", adVarWChar, adParamInput, _
12, sType)
.Parameters.Append .CreateParameter ("@Percent", adCurrency, _
adParamInput, , cPercent)
現(xiàn)在,,運(yùn)行存儲(chǔ)過(guò)程,。
' Execute the command
.Execute lRecs, , adExecuteNoRecords
End With
為了確認(rèn),可以告訴用戶已經(jīng)更新多少條記錄,。
' And finally tell the user what's happened
Response.Write "Procedure complete. " & lRecs & " were updated."

Set cmdUpdate = Nothing
%>
這樣就有了兩個(gè)簡(jiǎn)單界面,。前者創(chuàng)建了一個(gè)供選擇的項(xiàng)目列表,后者使用其中某個(gè)項(xiàng)目值更新數(shù)據(jù),。這是許多需要顯示和更新數(shù)據(jù)的ASP頁(yè)面的基礎(chǔ),。

搜索更多相關(guān)主題的帖子: 數(shù)據(jù)庫(kù)  SQL  微軟  ASP  緩存  
2006-1-16 20:22:00
conn
Rank: 2
等 級(jí):新手上路
威 望:5
帖 子:420
專家分:0
注 冊(cè):2005-11-27
  得分:0 
3. 傳遞數(shù)組參數(shù)
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)不要取笑,謝謝
2006-1-16 20:23:00
conn
Rank: 2
等 級(jí):新手上路
威 望:5
帖 子:420
專家分:0
注 冊(cè):2005-11-27
  得分:0 
6. 更新參數(shù)
無(wú)需輸入所有的參數(shù)細(xì)節(jié),只需調(diào)用Refresh方法,,就能讓ADO完成更新,。例如,假設(shè)已經(jīng)創(chuàng)建了一個(gè)帶有與前面例子相同的參數(shù)的過(guò)程usp_AddEmployee,,并且沒(méi)有改變運(yùn)行的頁(yè)面,。
With cmdEmployee
.ActiveConnection = strConn
.CommandText = "usp_Addemployee"
.CommandType = adCmdStoredProc
然后調(diào)用Refresh方法。
.Parameters.Refresh
這告訴ADO向數(shù)據(jù)存儲(chǔ)請(qǐng)求每個(gè)參數(shù)的細(xì)節(jié),,并創(chuàng)建Parameters集合,。然后可以為其賦值。
.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")
注意并不需要?jiǎng)?chuàng)建任何參數(shù),,包括返回值,。
這似乎真是一條捷徑,但應(yīng)意識(shí)到這種方法也造成了性能上的損失,,因?yàn)锳DO必須向提供者查詢以獲得存儲(chǔ)過(guò)程的參數(shù)細(xì)節(jié),。盡管如此,這種方法還是很有用的,,尤其是在從參數(shù)中取出正確的值有困難的時(shí)候,。
實(shí)際上,可以編寫(xiě)一個(gè)小實(shí)用程序作為開(kāi)發(fā)工具使用,,用來(lái)完成更新并建立Append語(yǔ)句,,可以將其粘貼到自己的代碼中。
其代碼相當(dāng)簡(jiǎn)單,。首先是包含連接符串和另一個(gè)ADOX常數(shù)文件。
<!-- #INCLUDE FILE="../Include/Connection.asp" -->
<!-- #INCLUDE FILE="../Include/ADOX.asp" -->
接下來(lái)創(chuàng)建一個(gè)窗體,,指定目標(biāo)為PrintParameters.asp ASP頁(yè)面,。
<FORM NAME="Procedures" METHOD="post" ACTION="PrintParameters.asp">
Connection String:<BR>
<TEXTAREA NAME="txtConnection" COLS="80" ROWS="5">
<% = strConn %>
</TEXTAREA>
<P>
Stored Procedure:<BR>
<SELECT NAME="lstProcedures">
然后,使用ADOX從SQL Server中得到存儲(chǔ)過(guò)程的列表,,同時(shí)創(chuàng)建一個(gè)含有這些存儲(chǔ)過(guò)程名字的列表框,。
<%
Dim catPubs
Dim procProcedure

' Predefine the quote character
strQuote = Chr(34)
Set catPubs = Server.CreateObject("ADOX.Catalog")

catPubs.ActiveConnection = strConn

For Each procProcedure In catPubs.Procedures
Response.Write "<OPTION VALUE=" & _
strQuote & procProcedure.Name & _
strQuote & ">" & procProcedure.Name
Next

Set procProcedure = Nothing
Set catPubs = Nothing
%>
</SELECT>
<P>
<INPUT TYPE="submit" VALUE="Print Paramaters">
</FORM>
這是一個(gè)簡(jiǎn)單的窗體,包括一個(gè)用于顯示連接字符串的TEXTAREA控件和用于顯示存儲(chǔ)過(guò)程名稱的SELECT控件,。以前沒(méi)有見(jiàn)過(guò)的是ADOX,,ADOX是數(shù)據(jù)定義與安全的ADO擴(kuò)展,可以用來(lái)訪問(wèn)數(shù)據(jù)存儲(chǔ)的目錄(或是元數(shù)據(jù)),。
本書(shū)不打算介紹ADOX的內(nèi)容,,但其十分簡(jiǎn)單。進(jìn)一步的細(xì)節(jié)可參見(jiàn)《ADO Programmer's Reference》,Wrox出版社出版,,2.1版或2.5版都行,。
上面的例子使用了Procedures集合,這個(gè)集合包含數(shù)據(jù)存儲(chǔ)中的所有存儲(chǔ)過(guò)程的列表,。
可以簡(jiǎn)單地從這里拷貝參數(shù)行到代碼中,。在前面使用了一個(gè)以前從未見(jiàn)過(guò)的包含文件。該文件包含了幾個(gè)將ADO常數(shù)(例如數(shù)據(jù)類型,、參數(shù)方向等)轉(zhuǎn)換為字符串值的函數(shù):
<!-- #INCLUDE FILE="../Include/Descriptions.asp" -->
接下來(lái),,定義一些變量,提取用戶請(qǐng)求并創(chuàng)建Command對(duì)象,。
<%
Dim cmdProc
Dim parP
Dim strConnection
Dim strProcedure
Dim strQuote

' Get the connection and procedure name from the user
strQuote = Chr(34)
strConnection = Request.Form("txtConnection")
strProcedure = Request.Form("lstProcedures")

'Update the user
Response.Write "Connecting to <B>" & strConnection & "</B><BR>"
Response.Write "Documenting parameters for <B>" & _
strProcedure & "</B><P><P>"

Set cmdProc = Server.CreateObject("ADODB.Command")

' Set the properties of the command, using the name
' of the procedure that the user selected
With cmdProc
.ActiveConnection = strConnection
.CommandType = adCmdStoredProc
.CommandText = strProcedure
然后使用Refresh方法自動(dòng)填寫(xiě)Parameters集合,。
.Parameters.Refresh
現(xiàn)在可以遍歷整個(gè)集合,寫(xiě)出包含創(chuàng)建參數(shù)所需的細(xì)節(jié)內(nèi)容的字符串,。
For Each parP In .Parameters
Response.Write ".Parameters.Append & _
"("strQuote & parP.Name & _
strQuote & ", " & _
DataTypeDesc(parP.Type) & ", " & _
ParamDirectionDesc(parP.Direction) & _
", " & _
parP.Size & ")<BR>"
Next
End With

Set cmdProc = Nothing
%>
在Descriptions.asp包含文件中可以找到函數(shù)DataTypeDesc和ParamDirectionDesc,。
Descriptions.asp包含文件以及其他的例子文件可以在Web站點(diǎn)http://www.中找到。
這是一個(gè)非常簡(jiǎn)單的技術(shù),,它較好地使用了Refresh方法,。可以簡(jiǎn)單地從這里拷貝參數(shù)行到代碼中,。在前面使用了一個(gè)以前從未見(jiàn)過(guò)的包含文件,。該文件包含了幾個(gè)將ADO常數(shù)(例如數(shù)據(jù)類型、參數(shù)方向等)轉(zhuǎn)換為字符串值的函數(shù):
<!-- #INCLUDE FILE="../Include/Descriptions.asp" -->
接下來(lái),,定義一些變量,,提取用戶請(qǐng)求并創(chuàng)建Command對(duì)象。
<%
Dim cmdProc
Dim parP
Dim strConnection
Dim strProcedure
Dim strQuote

' Get the connection and procedure name from the user
strQuote = Chr(34)
strConnection = Request.Form("txtConnection")
strProcedure = Request.Form("lstProcedures")

'Update the user
Response.Write "Connecting to <B>" & strConnection & "</B><BR>"
Response.Write "Documenting parameters for <B>" & _
strProcedure & "</B><P><P>"

Set cmdProc = Server.CreateObject("ADODB.Command")

' Set the properties of the command, using the name
' of the procedure that the user selected
With cmdProc
.ActiveConnection = strConnection
.CommandType = adCmdStoredProc
.CommandText = strProcedure
然后使用Refresh方法自動(dòng)填寫(xiě)Parameters集合,。
.Parameters.Refresh
現(xiàn)在可以遍歷整個(gè)集合,,寫(xiě)出包含創(chuàng)建參數(shù)所需的細(xì)節(jié)內(nèi)容的字符串。
For Each parP In .Parameters
Response.Write ".Parameters.Append & _
"("strQuote & parP.Name & _
strQuote & ", " & _
DataTypeDesc(parP.Type) & ", " & _
ParamDirectionDesc(parP.Direction) & _
", " & _
parP.Size & ")<BR>"
Next
End With

Set cmdProc = Nothing
%>
在Descriptions.asp包含文件中可以找到函數(shù)DataTypeDesc和ParamDirectionDesc,。
Descriptions.asp包含文件以及其他的例子文件可以在Web站點(diǎn)http://www.中找到,。
這是一個(gè)非常簡(jiǎn)單的技術(shù),它較好地使用了Refresh方法,。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多