ASP呼叫儲存過程詳解。

2022-02-05 13:18:12 字數 4161 閱讀 3366

asp

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

現在,我基本上通過呼叫儲存過程訪問sql server,以下的文字雖不敢保證絕對正確,但都是實踐的總結,希望對大家能有幫助。

儲存過程就是作為可執行物件存放在資料庫中的乙個或多個sql命令。

定義總是很抽象。儲存過程其實就是能完成一定操作的一組sql語句,只不過這組語句是放在資料庫中的(這裡我們只談sql server)。如果我們通過建立儲存過程以及在

asp中呼叫儲存過程,就可以避免將sql語句同

asp**混雜在一起。這樣做的好處至少有三個:

第一、大大提高效率。儲存過程本身的執行速度非常快,而且,呼叫儲存過程可以大大減少同資料庫的互動次數。

第二、提高安全性。假如將sql語句混合在

asp**中,一旦**失密,同時也就意味著庫結構失密。

第三、有利於sql語句的重用。

在asp

中,一般通過command物件呼叫儲存過程,根據不同情況,本文也介紹其它呼叫方法。為了方便說明,根據儲存過程的輸入輸出,作以下簡單分類:

1. 只返回單一記錄集的儲存過程

假設有以下儲存過程(本文的目的不在於講述t-sql語法,所以儲存過程只給出**,不作說明): /*sp1*/

create procedure dbo.getuserlist

asset nocount on

begin

select * from dbo.[userinfo]

endgo 以上儲存過程取得userinfo表中的所有記錄,返回乙個記錄集。通過command物件呼叫該儲存過程的

asp**如下:

'**通過command物件呼叫儲存過程**

dim mycomm,myrst

set mycomm = server.createobject("adodb.command")

mycomm.activeconnection = myconstr 'myconstr是資料庫連線字串

mycomm.commandtext = "getuserlist" '指定儲存過程名

mycomm.commandtype = 4 '表明這是乙個儲存過程

mycomm.prepared = true '要求將sql命令先行編譯

set myrst = mycomm.execute

set mycomm = nothing 儲存過程取得的記錄集賦給myrst,接下來,可以對myrst進行操作。

在以上**中,commandtype屬性表明請求的型別,取值及說明如下:

-1 表明commandtext引數的型別無法確定

1 表明commandtext是一般的命令型別

2 表明commandtext引數是乙個存在的表名稱

4 表明commandtext引數是乙個儲存過程的名稱

還可以通過connection物件或recordset物件呼叫儲存過程,方法分別如下: '**通過connection物件呼叫儲存過程**

dim myconn,myrst

set myconn = server.createobject("adodb.connection")

myconn.open myconstr 'myconstr是資料庫連線字串

set myrst = myconn.execute("getuserlist",0,4) '最後乙個參斷含義同commandtype

set myconn = nothing '**通過recordset物件呼叫儲存過程**

dim myrst

set myrst = server.createobject("adodb.recordset")

myrst.open "getuserlist",myconstr,0,1,4

'myconstr是資料庫連線字串,最後乙個參斷含義與commandtype相同

2. 沒有輸入輸出的儲存過程

請看以下儲存過程: /*sp2*/

create procedure dbo.deluserall

asset nocount on

begin

delete from dbo.[userinfo]

endgo 該儲存過程刪去userinfo表中的所有記錄,沒有任何輸入及輸出,呼叫方法與上面講過的基本相同,只是不用取得記錄集: '**通過command物件呼叫儲存過程**

dim mycomm

set mycomm = server.createobject("adodb.command")

mycomm.activeconnection = myconstr 'myconstr是資料庫連線字串

mycomm.commandtext = "deluserall" '指定儲存過程名

mycomm.commandtype = 4 '表明這是乙個儲存過程

mycomm.prepared = true '要求將sql命令先行編譯

mycomm.execute '此處不必再取得記錄集

set mycomm = nothing 當然也可通過connection物件或recordset物件呼叫此類儲存過程,不過建立recordset物件是為了取得記錄集,在沒有返回記錄集的情況下,還是利用command物件吧。

3. 有返回值的儲存過程

在進行類似sp2的操作時,應充分利用sql server強大的事務處理功能,以維護資料的一致性。並且,我們可能需要儲存過程返回執**況,為此,將sp2修改如下: /*sp3*/

create procedure dbo.deluserall

asset nocount on

begin

begin transaction

delete from dbo.[userinfo]

if @@error=0

begin

commit transaction

return 1

endelse

begin

rollback transaction

return 0

end

return

endgo 以上儲存過程,在delete順利執行時,返回1,否則返回0,並進行回滾操作。為了在

aspasp

userid=@userid

return

endgo 呼叫該儲存過程的

aspasp

asp**如下: /*sp5*/

create procedure dbo.getusername

--為了加深對"順序"的印象,將以下兩引數的定義順序顛倒一下

@username varchar(40) output,

@userid int

asset nocount on

begin

if @userid is null return

select @username=username

from dbo.[userinfo]

where

userid=@userid

aspasp

中,如何同時取得這些記錄集呢?為了說明這一問題,在userinfo表中增加兩個字段:usertel及usermail,並設定只有登入使用者可以檢視這兩項內容。 /*sp7*/

create procedure dbo.getuserinfo

@userid int,

@checklogin bit

asset nocount on

begin

if @userid is null or @checklogin is null return

select username

from dbo.[usrinfo]

where

userid=@userid

--若為登入使用者,取usertel及usermail

if @checklogin=1

select usertel,usermail

from dbo.[userinfo]

where

userid=@userid

return

endgo 以下是

asp

asp呼叫儲存過程

1.呼叫儲存過程的一般方法 先假設在sql server中有一儲存過程dt users create procedure dbo dt users as select from users return go 第一種方法是不利用command物件,直接用recordset物件 set rs serv...

asp呼叫儲存過程!

1.呼叫儲存過程的一般方法 先假設在sql server中有一儲存過程dt users create procedure dbo dt users as select from users return go 第一種方法是不利用 mand物件,直接用recordset物件 set rs server...

asp呼叫儲存過程

1.呼叫儲存過程的一般方法 先假設在sql server中有一儲存過程dt users create procedure dbo dt users asselect from users return go第一種方法是不利用command物件,直接用recordset物件 set rs server...