asp程式設計 ASP開發中儲存過程應用全接觸 2

2021-04-06 17:03:35 字數 4283 閱讀 7081

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 的文章不少,但是我懷疑作者們是否真正實踐過。我在初學時查閱過大量相關資料,發現其中提供的很多方法實際操作起來並不是那麼回事。對於簡單的應用,這些資料也許是有幫助的,但僅限於此,因為它們根本就是千篇一律,互相抄襲,稍微複雜點的應用,就全都語焉不詳了...