ASP呼叫帶參數預存程序的幾種方式
最近有很多的朋友問到呼叫預存程序的問題,這裡簡單介紹幾種ASP呼叫帶參數預存程序的方法。
1. 這也是最簡單的方法,兩個輸入參數,無回傳值:
set connection = server.createobject("adodb.connection")
connection.open someDSN
Connection.Execute "procname varvalue1, varvalue2"
'將所有物件清除為nothing,釋放資源
connection.close
set connection = nothing
2. 如果要返回Recordset 集:
set connection = server.createobject("adodb.connection")
connection.open someDSN
set rs = server.createobject("adodb.recordset")
rs.Open "Exec procname varvalue1, varvalue2",connection
'將所有物件清除為nothing,釋放資源
rs.close
connection.close
set rs = nothing
set connection = nothing
3. 以上兩種方法都不能有回傳值,(Recordset除外),若要得到回傳值,則需要用Command的方法。
首先說明,傳回值有兩種。一種是在預存過程中直接return一個值,就像C和VB的函數回傳值那樣;另一種是可以傳回多個值,儲存這些值的變數名稱需要在呼叫參數中先行指定。
這個範例要處理多種參數,輸入參數,輸出參數,傳回記錄集以及一個直接回傳值(夠全了吧?)
預存程序如下:
use pubs
GO
-- 建立預存程序
create procedure sp_PubsTest
-- 定義三個參數變量,注意第三個,特別標記是用於輸出
@au_lname varchar (20),
@intID int,
@intIDOut int OUTPUT
AS
SELECT @intIDOut = @intID + 1
SELECT *
FROM authors
WHERE au_lname LIKE @au_lname + '%'
--直接傳回一個值
RETURN @intID + 2
呼叫此預存程序的asp程式如下:
<%@ Language=VBScript %>
<%
Dim CmdSP
Dim adoRS
Dim adCmdSPStoredProc
Dim adParamReturnValue
Dim adParaminput
Dim adParamOutput
Dim adInteger
Dim iVal
Dim oVal
Dim adoField
Dim adVarChar
'這些值在VB 中是預定義常數,可以直接調用,但在VBScript 中沒有預先定義
adCmdSPStoredProc = 4
adParamReturnValue = 4
adParaminput = 1
adParamOutput = 2
adInteger = 3
adVarChar = 200
iVal = 5
oVal = 3
'建一個command對象
set CmdSP = Server.CreateObject("ADODB.Command")
'建立連結
CmdSP.ActiveConnection = "Driver={SQL Server};server=(local);Uid=sa;Pwd=;Database=Pubs"
'定義command 物件呼叫名稱
CmdSP.CommandText = "sp_PubsTest"
'設定command呼叫類型是預存程序(adCmdSPStoredProc = 4)
CmdSP.CommandType = adCmdSPStoredProc
'在command 物件新增參數
'定義預存程序有直接回傳值,且是個整數,省缺值是4
CmdSP.Parameters.Append CmdSP.CreateParameter("RETURN_VALUE", adInteger, adParamReturnValue, 4)
'定義一個字元型輸入參數
CmdSP.Parameters.Append CmdSP.CreateParameter("@au_lname", adVarChar, adParaminput, 20, "M")
'定義一個整數輸入參數
CmdSP.Parameters.Append CmdSP.CreateParameter("@intID", adInteger, adParamInput, , iVal)
'定義一個整數輸出參數
CmdSP.Parameters.Append CmdSP.CreateParameter("@intIDOut", adInteger, adParamOutput, oVal)
'執行預存程序,並取得傳回記錄集
Set adoRS = CmdSP.Execute
'把每個記錄印出來,其中的欄位是虛擬的,可以不用管
While Not adoRS.EOF
for each adoField in adoRS.Fields
Response.Write adoField.Name & "=" & adoField.Value & "<br>" & vbCRLF
Next
Response.Write "<br>"
adoRS.MoveNext
Wend
'印出兩個輸出值:
Response.Write "<p>@intIDOut = “ & CmdSP.Parameters("@intIDOut").Value & "</p>"
Response.Write "<p>Return value = " & CmdSP.Parameters("RETURN_VALUE").Value & "</p>"
'大掃除
Set adoRS = nothing
Set CmdSP.ActiveConnection = nothing
Set CmdSP = nothing
%>
-------------------------------------------------- -------------------------------------------------- --------------------------------
在asp中呼叫sql server的預存程序可以加快程式運行速度
1.呼叫存儲流程的一般方法先假設在sql server中有一預存程序dt_users:
CREATE PROCEDURE [dbo].[dt_users]
AS
select * from users
return
GO
第一種方法是不利用command對象,直接用recordset對象
set rs=server.createobject("adodb.recordset")
sql="exec dt_users"
rs.open sql,conn,1,1 這樣就可第二種方法是利用command對象
set comm=server.createobject("adodb.command")
comm.commantype=4
set comm.activeconnection=conn
comm.commandtext="dbo.dt_users"
set rs=server.createobject("adodb.recordset")
rs.open comm,,1,1
2.給預存程序傳遞參數如果預存程序中不用參數,而是單一的sql語句,還顯示不出呼叫預存程序的優勢!
比如說一bbs的查詢,可以按作者和主題查詢!則可以建立預存程序如下:
參數keyword為關鍵字,choose是選擇查詢的方法。
CREATE PROCEDURE [dbo].[dt_bbs]
@keyword varchar(20)=null,
@choose int=null
as
if @choose=1
select * from bbs where name like @keyword
else
select * from bbs where subject like @keyword
return
go
這樣我們呼叫預存程序時只要將參數傳遞過去就行了,而省去在asp中來寫一段程式用第一種方法:
set rs=server.createobject("adodb.recordset")
sql="exec dt_bbs '"&keyword&"',"&choose&""
rs.open sql,conn,1,1
用第二種方法:
set comm=server.createobject("adodb.command")
comm.commantype=4
comm.Parameters.append comm.CreateParameter("@keyword",adChar,adParamInput,50,keyword)
comm.Parameters.append comm.CreateParameter("@keyword",adInteger,adParamInput,,choose)
set comm.activeconnection=conn
comm.commandtext="dbo.dt_bbs"
set rs=server.createobject("adodb.recordset")
rs.CursorType=3
rs.open comm,,1,1