ASP調用帶有輸入參數和輸出參數的預存程序

來源:互聯網
上載者:User
預存程序   傳回值其實是一種特殊的輸出參數。在大多數情況下,我們用到的是同時有輸入及輸出參數的預存程序,比如我們想取得使用者資訊表中,某ID使用者的使用者名稱,這時候,有一個輸入參數----使用者ID,和一個輸出參數----使用者名稱。實現這一功能的預存程序如下:<br><br><table style="WIDTH: 475px; HEIGHT: 220px" borderColor=#cccccc width=475 align=center bgColor=#e3e3e3 border=1><tr><td>/*SP4*/<br>CREATE PROCEDURE dbo.getUserName<br>@UserID int,<br>@UserName varchar(40) output<br>as<br>set nocount on<br>begin<br>if @UserID is null return<br>select @UserName=username <br>from dbo.[userinfo] <br>where userid=@UserID<br>return<br>end<br>go</td></tr></table><br>  調用該預存程序的ASP代碼如下:<br><br><table style="WIDTH: 507px; HEIGHT: 242px" borderColor=#cccccc width=507 align=center bgColor=#e3e3e3 border=1><tr><td>'**調用帶有輸入輸出參數的預存程序**<br>DIM MyComm,UserID,UserName<br>UserID = 1<br>Set MyComm = Server.CreateObject("ADODB.Command")<br>MyComm.ActiveConnection = MyConStr 'MyConStr是資料庫連接字串<br>MyComm.CommandText = "getUserName" '指定預存程序名<br>MyComm.CommandType = 4 '表明這是一個預存程序<br>MyComm.Prepared = true '要求將SQL命令先行編譯<br>'聲明參數<br>MyComm.Parameters.append MyComm.CreateParameter("@UserID",3,1,4,UserID)<br>MyComm.Parameters.append MyComm.CreateParameter("@UserName",200,2,40)<br>MyComm.Execute<br>'取得出參<br>UserName = MyComm(1)<br>Set MyComm = Nothing</td></tr></table><br>  在以上代碼中,可以看到,與聲明傳回值不同,聲明輸入參數時需要5個參數,聲明輸出參數時需要4個參數。聲明輸入參數時5個參數分別為:參數名、參數資料類型、參數類型、資料長度、參數值。聲明輸出參數時,沒有最後一個參數:參數值。<br><br>  需要特別注意的是:在聲明參數時,順序一定要與預存程序中定義的順序相同,而且各參數的資料類型、長度也要與預存程序中定義的相同。<br><br>  如果預存程序有多個參數,ASP代碼會顯得繁瑣,可以使用with命令簡化代碼:<br><br><table style="WIDTH: 473px; HEIGHT: 243px" borderColor=#cccccc width=473 align=center bgColor=#e3e3e3 border=1><tr><td>'**調用帶有輸入輸出參數的預存程序(簡化代碼)**<br>DIM MyComm,UserID,UserName<br>UserID = 1<br>Set MyComm = Server.CreateObject("ADODB.Command")<br>with MyComm<br> .ActiveConnection = MyConStr 'MyConStr是資料庫連接字串<br> .CommandText = "getUserName" '指定預存程序名<br> .CommandType = 4 '表明這是一個預存程序<br> .Prepared = true '要求將SQL命令先行編譯<br> .Parameters.append .CreateParameter("@UserID",3,1,4,UserID)<br> .Parameters.append .CreateParameter("@UserName",200,2,40)<br> .Execute<br>end with<br>UserName = MyComm(1)<br>Set MyComm = Nothing</td></tr></table><br>  假如我們要取得ID為1到10,10位使用者的使用者名稱,是不是要建立10次Command對象呢?不是的。如果需要多次調用同一預存程序,只需改變輸入參數,就會得到不同的輸出:<br><br><table style="WIDTH: 489px; HEIGHT: 372px" borderColor=#cccccc width=489 align=center bgColor=#e3e3e3 border=1><tr><td>'**多次調用同一預存程序**<br>DIM MyComm,UserID,UserName<br>UserName = ""<br>Set MyComm = Server.CreateObject("ADODB.Command")<br>for UserID = 1 to 10<br> with MyComm<br>  .ActiveConnection = MyConStr 'MyConStr是資料庫連接字串<br>  .CommandText = "getUserName" '指定預存程序名<br>  .CommandType = 4 '表明這是一個預存程序<br>  .Prepared = true '要求將SQL命令先行編譯<br>  if UserID = 1 then<br>   .Parameters.append .CreateParameter("@UserID",3,1,4,UserID)<br>   .Parameters.append .CreateParameter("@UserName",200,2,40)<br>   .Execute<br>  else<br>   '重新給入參賦值(此時參數值不發生變化的入參以及出參不必重新聲明)<br>   .Parameters("@UserID") = UserID<br>   .Execute<br>  end if<br> end with<br> UserName = UserName + MyComm(1) + "," '也許你喜歡用數組儲存<br>next<br>Set MyComm = Nothing</td></tr></table><br>  通過以上代碼可以看出:重複調用同一預存程序時,只需為值發生改變的輸入參數重新賦值即可,這一方法在有多個輸入輸出參數,且每次調用時只有一個輸入參數的值發生變化時,可以大大減少代碼量。<br><P>  <b>5. 同時具有傳回值、輸入參數、輸出參數的預存程序<br></b><br>  前面說過,在調用預存程序時,聲明參數的順序要與預存程序中定義的順序相同。還有一點要特別注意:如果預存程序同時具有傳回值以及輸入、輸出參數,傳回值要最先聲明。<br><br>  為了示範這種情況下的調用方法,我們改善一下上面的例子。還是取得ID為1的使用者的使用者名稱,但是有可能該使用者不存在(該使用者已刪除,而userid是自增長的欄位)。預存程序根據使用者存在與否,返回不同的值。此時,預存程序和ASP代碼如下:<br><br></P><P><table style="WIDTH: 479px; HEIGHT: 654px" borderColor=#cccccc width=479 align=center bgColor=#e3e3e3 border=1><tr><td>/*SP5*/<br>CREATE PROCEDURE dbo.getUserName<br>--為了加深對"順序"的印象,將以下兩參數的定義順序顛倒一下<br>@UserName varchar(40) output,<br>@UserID int<br>as<br>set nocount on<br>begin<br>if @UserID is null return<br>select @UserName=username <br>from dbo.[userinfo] <br>where userid=@UserID<br>if @@rowcount>0<br>return 1<br>else<br>return 0<br>return<br>end<br>go<br><br>'**調用同時具有傳回值、輸入參數、輸出參數的預存程序**<br>DIM MyComm,UserID,UserName<br>UserID = 1<br>Set MyComm = Server.CreateObject("ADODB.Command")<br>with MyComm<br>.ActiveConnection = MyConStr 'MyConStr是資料庫連接字串<br>.CommandText = "getUserName" '指定預存程序名<br>.CommandType = 4 '表明這是一個預存程序<br>.Prepared = true '要求將SQL命令先行編譯<br>'傳回值要最先被聲明<br>.Parameters.Append .CreateParameter("RETURN",2,4)<br>'以下兩參數的聲明順序也做相應顛倒<br>.Parameters.append .CreateParameter("@UserName",200,2,40)<br>.Parameters.append .CreateParameter("@UserID",3,1,4,UserID)<br>.Execute<br>end with<br>if MyComm(0) = 1 then<br>UserName = MyComm(1)<br>else<br>UserName = "該使用者不存在"<br>end if<br>Set MyComm = Nothing</td></tr></table></P><P><br>  <b>6. 同時返回參數和記錄集的預存程序<br></b><br>  有時候,我們需要預存程序同時返回參數和記錄集,比如在利用預存程序分頁時,要同時返回記錄集以及資料總量等參數。以下給出一個進行分頁處理的預存程序:<br><br></P><P><table style="WIDTH: 481px; HEIGHT: 728px" borderColor=#cccccc width=481 align=center bgColor=#e3e3e3 border=1><tr><td>/*SP6*/<br>CREATE PROCEDURE dbo.getUserList<br>@iPageCount int OUTPUT, --總頁數<br>@iPage int, --當前頁號<br>@iPageSize int --每頁記錄數<br>as<br>set nocount on<br>begin<br>--建立暫存資料表 <br>create table #t (ID int IDENTITY, --自增欄位<br>userid int,<br>username varchar(40))<br>--向暫存資料表中寫入資料<br>insert into #t <br>select userid,username from dbo.[UserInfo]<br>order by userid<br><br>--取得記錄總數 <br>declare @iRecordCount int<br>set @iRecordCount = @@rowcount<br><br>--確定總頁數<br>IF @iRecordCount%@iPageSize=0<br>SET @iPageCount=CEILING(@iRecordCount/@iPageSize)<br>ELSE<br>SET @iPageCount=CEILING(@iRecordCount/@iPageSize)+1<br><br>--若請求的頁號大於總頁數,則顯示最後一頁<br>IF @iPage > @iPageCount<br>SELECT @iPage = @iPageCount<br><br>--確定當前頁的始末記錄<br>DECLARE @iStart int --start record<br>DECLARE @iEnd int --end record<br>SELECT @iStart = (@iPage - 1) * @iPageSize<br>SELECT @iEnd = @iStart + @iPageSize + 1<br><br>--取當前頁記錄 <br>select * from #t where ID>@iStart and ID<@iEnd<br><br>--刪除暫存資料表<br>DROP TABLE #t<br><br>--返回記錄總數<br>return @iRecordCount<br>end<br>go</td></tr></table></P><P><br>  在上面的預存程序中,輸入當前頁號及每頁記錄數,返回當前頁的記錄集,總頁數及記錄總數。為了更具典型性,將記錄總數以傳回值的形式返回。以下是調用該預存程序的ASP代碼(具體的分頁操作略去):<br><br></P><P><table style="WIDTH: 403px; HEIGHT: 716px" borderColor=#cccccc width=403 align=center bgColor=#e3e3e3 border=1><tr><td>'**調用分頁預存程序**<br>DIM pagenow,pagesize,pagecount,recordcount<br>DIM MyComm,MyRst<br>pagenow = Request("pn")<br>'自訂函數用於驗證自然數<br>if CheckNar(pagenow) = false then pagenow = 1<br>pagesize = 20<br>Set MyComm = Server.CreateObject("ADODB.Command")<br>with MyComm<br>.ActiveConnection = MyConStr 'MyConStr是資料庫連接字串<br>.CommandText = "getUserList" '指定預存程序名<br>.CommandType = 4 '表明這是一個預存程序<br>.Prepared = true '要求將SQL命令先行編譯<br>'傳回值(記錄總量) <br>.Parameters.Append .CreateParameter("RETURN",2,4)<br>'出參(總頁數)<br>.Parameters.Append .CreateParameter("@iPageCount",3,2)<br>'入參(當前頁號)<br>.Parameters.append .CreateParameter("@iPage",3,1,4,pagenow)<br>'入參(每頁記錄數)<br>.Parameters.append .CreateParameter("@iPageSize",3,1,4,pagesize)<br>Set MyRst = .Execute<br>end with<br>if MyRst.state = 0 then '未取到資料,MyRst關閉<br>recordcount = -1<br>else<br>MyRst.close '注意:若要取得參數值,需先關閉記錄集對象<br>recordcount = MyComm(0)<br>pagecount = MyComm(1)<br>if cint(pagenow)>=cint(pagecount) then pagenow=pagecount<br>end if<br>Set MyComm = Nothing<br><br>'以下顯示記錄<br>if recordcount = 0 then<br>Response.Write "無記錄"<br>elseif recordcount > 0 then<br>MyRst.open<br>do until MyRst.EOF<br>......<br>loop<br>'以下顯示分頁資訊<br>......<br>else 'recordcount=-1<br>Response.Write "參數錯誤"<br>end if</td></tr></table></P><P><br>  對於以上代碼,只有一點需要說明:同時返回記錄集和參數時,若要取得參數,需先將記錄集關閉,使用記錄集時再將其開啟。</P>

相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

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