3. 有返回值的儲存過程
在進行類似sp2的操作時,應充分利用sql server強大的事務處理功能,以維護資料的一致性。並且,我們可能需要儲存過程返回執**況,為此,將sp2修改如下:
/*sp3*/
create procedure dbo.deluserall
as set nocount on
begin
begin transaction
delete from dbo.[userinfo]
if @@error=0
begin
commit transaction
return 1
end
else
begin
rollback transaction
return 0
end
return
end
go 以上儲存過程,在delete順利執行時,返回1,否則返回0,並進行回滾操作。為了在asp中取得返回值,需要利用parameters集合來宣告引數:
'**呼叫帶有返回值的儲存過程並取得返回值**
dim mycomm,mypara
set mycomm = server.createobject("adodb.command")
mycomm.activeconnection = myconstr 'myconstr是資料庫連線字串
mycomm.commandtext = "deluserall" '指定儲存過程名
mycomm.commandtype = 4 '表明這是乙個儲存過程
mycomm.prepared = true '要求將sql命令先行編譯
'宣告返回值
set mypara = mycomm.createparameter("return",2,4)
mycomm.execute
'取得返回值
dim retvalue
retvalue = mycomm(0) '或retvalue = mycomm.parameters(0)
set mycomm = nothing
在mycomm.createparameter("return",2,4)中,各引數的含義如下:
第乙個引數("reture")為引數名。引數名可以任意設定,但一般應與儲存過程中宣告的引數名相同。此處是返回值,我習慣上設為"reture";
adbigint: 20 ;
adbinary : 128 ;
adboolean: 11 ;
adchar: 129 ;
addbtimestamp: 135 ;
adempty: 0 ;
adinteger: 3 ;
ad**allint: 2 ;
adtinyint: 16 ;
advarchar: 200 ;
對於返回值,只能取整形,且-1到-99為保留值;
第三個引數(4),表明引數的性質,此處4表明這是乙個返回值。此引數取值的說明如下:
0 : 型別無法確定; 1: 輸入引數;2: 輸入引數;3:輸入或輸出引數;4: 返回值
以上給出的asp**,應該說是完整的**,也即最複雜的**,其實
set mypara = mycomm.createparameter("return",2,4)
可以簡化為
甚至還可以繼續簡化,稍後會做說明。
對於帶引數的儲存過程,只能使用command物件呼叫(也有資料說可通過connection物件或recordset物件呼叫,但我沒有試成過)。
4. 有輸入引數和輸出引數的儲存過程
返回值其實是一種特殊的輸出引數。在大多數情況下,我們用到的是同時有輸入及輸出引數的儲存過程,比如我們想取得使用者資訊表中,某id使用者的使用者名稱,這時候,有乙個輸入引數----使用者id,和乙個輸出引數----使用者名稱。實現這一功能的儲存過程如下:
/*sp4*/
create procedure dbo.getusername
@userid int,
@username varchar(40) output
as set nocount on
begin
if @userid is null return
select @username=username
from dbo.[userinfo]
where userid=@userid
return
end
go 呼叫該儲存過程的asp**如下:
'**呼叫帶有輸入輸出引數的儲存過程**
dim mycomm,userid,username
userid = 1
set mycomm = server.createobject("adodb.command")
mycomm.activeconnection = myconstr 'myconstr是資料庫連線字串
mycomm.commandtext = "getusername" '指定儲存過程名
mycomm.commandtype = 4 '表明這是乙個儲存過程
mycomm.prepared = true '要求將sql命令先行編譯
'宣告引數
mycomm.execute
'取得出參
username = mycomm(1)
set mycomm = nothing
在以上**中,可以看到,與宣告返回值不同,宣告輸入引數時需要5個引數,宣告輸出引數時需要4個引數。宣告輸入引數時5個引數分別為:引數名、引數資料型別、引數型別、資料長度、引數值。宣告輸出引數時,沒有最後乙個引數:引數值。
需要特別注意的是:在宣告引數時,順序一定要與儲存過程中定義的順序相同,而且各引數的資料型別、長度也要與儲存過程中定義的相同。
如果儲存過程有多個引數,asp**會顯得繁瑣,可以使用with命令簡化**:
'**呼叫帶有輸入輸出引數的儲存過程(簡化**)**
dim mycomm,userid,username
userid = 1
set mycomm = server.createobject("adodb.command")
with mycomm
.activeconnection = myconstr 'myconstr是資料庫連線字串
.commandtext = "getusername" '指定儲存過程名
.commandtype = 4 '表明這是乙個儲存過程
.prepared = true '要求將sql命令先行編譯
.execute
end with
username = mycomm(1)
set mycomm = nothing
假如我們要取得id為1到10,10位使用者的使用者名稱,是不是要建立10次command物件呢?不是的。如果需要多次呼叫同一儲存過程,只需改變輸入引數,就會得到不同的輸出:
'**多次呼叫同一儲存過程**
dim mycomm,userid,username
username = ""
set mycomm = server.createobject("adodb.command")
for userid = 1 to 10
with mycomm
.activeconnection = myconstr 'myconstr是資料庫連線字串
.commandtext = "getusername" '指定儲存過程名
.commandtype = 4 '表明這是乙個儲存過程
.prepared = true '要求將sql命令先行編譯
if userid = 1 then
.execute
else
'重新給入參賦值(此時引數值不發生變化的入參以及出參不必重新宣告)
.parameters("@userid") = userid
.execute
end if
end with
username = username + mycomm(1) + "," '也許你喜歡用陣列儲存
next
set mycomm = nothing
通過以上**可以看出:重複呼叫同一儲存過程時,只需為值發生改變的輸入引數重新賦值即可,這一方法在有多個輸入輸出引數,且每次呼叫時只有乙個輸入引數的值發生變化時,可以大大減少**量。
ASP開發中儲存過程應用全接觸
asp與儲存過程 stored procedures 的文章不少,但是我懷疑作者們是否真正實踐過。我在初學時查閱過大量相關資料,發現其中提供的很多方法實際操作起來並不是那麼回事。對於簡單的應用,這些資料也許是有幫助的,但僅限於此,因為它們根本就是千篇一律,互相抄襲,稍微複雜點的應用,就全都語焉不詳了...
ASP開發中儲存過程應用全接觸 1
asp與儲存過程 stored procedures 的文章不少,但是我懷疑作者們是否真正實踐過。我在初學時查閱過大量相關資料,發現其中提供的很多方法實際操作起來並不是那麼回事。對於簡單的應用,這些資料也許是有幫助的,但僅限於此,因為它們根本就是千篇一律,互相抄襲,稍微複雜點的應用,就全都語焉不詳了...
ASP開發中儲存過程應用全接觸 1
asp與儲存過程 stored procedures 的文章不少,但是我懷疑作者們是否真正實踐過。我在初學時查閱過大量相關資料,發現其中提供的很多方法實際操作起來並不是那麼回事。對於簡單的應用,這些資料也許是有幫助的,但僅限於此,因為它們根本就是千篇一律,互相抄襲,稍微複雜點的應用,就全都語焉不詳了...