主頁(yè) > 知識(shí)庫(kù) > ASP存儲(chǔ)過(guò)程開(kāi)發(fā)應(yīng)用詳解第1/2頁(yè)

ASP存儲(chǔ)過(guò)程開(kāi)發(fā)應(yīng)用詳解第1/2頁(yè)

熱門(mén)標(biāo)簽:Mysql連接數(shù)設(shè)置 Linux服務(wù)器 電子圍欄 團(tuán)購(gòu)網(wǎng)站 服務(wù)器配置 科大訊飛語(yǔ)音識(shí)別系統(tǒng) 阿里云 銀行業(yè)務(wù)
我在初學(xué)時(shí)查閱過(guò)大量相關(guān)資料,發(fā)現(xiàn)其中提供的很多方法實(shí)際操作起來(lái)并不是那么回事。對(duì)于簡(jiǎn)單的應(yīng)用,這些資料也許是有幫助的,但僅限于此,因?yàn)樗鼈兏揪褪乔宦?,互相抄襲,稍微復(fù)雜點(diǎn)的應(yīng)用,就全都語(yǔ)焉不詳了。

現(xiàn)在,我基本上通過(guò)調(diào)用存儲(chǔ)過(guò)程訪(fǎng)問(wèn)SQL Server,以下的文字都是實(shí)踐的總結(jié),希望對(duì)大家能有幫助。

存儲(chǔ)過(guò)程就是作為可執(zhí)行對(duì)象存放在數(shù)據(jù)庫(kù)中的一個(gè)或多個(gè)SQL命令。

定義總是很抽象。存儲(chǔ)過(guò)程其實(shí)就是能完成一定操作的一組SQL語(yǔ)句,只不過(guò)這組語(yǔ)句是放在數(shù)據(jù)庫(kù)中的(這里我們只談SQL Server)。如果我們通過(guò)創(chuàng)建存儲(chǔ)過(guò)程以及在ASP中調(diào)用存儲(chǔ)過(guò)程,就可以避免將SQL語(yǔ)句同ASP代碼混雜在一起。這樣做的好處至少有三個(gè):

第一、大大提高效率。存儲(chǔ)過(guò)程本身的執(zhí)行速度非常快,而且,調(diào)用存儲(chǔ)過(guò)程可以大大減少同數(shù)據(jù)庫(kù)的交互次數(shù)。

第二、提高安全性。假如將SQL語(yǔ)句混合在ASP代碼中,一旦代碼失密,同時(shí)也就意味著庫(kù)結(jié)構(gòu)失密。

第三、有利于SQL語(yǔ)句的重用。

在ASP中,一般通過(guò)command對(duì)象調(diào)用存儲(chǔ)過(guò)程,根據(jù)不同情況,本文也介紹其它調(diào)用方法。為了方便說(shuō)明,根據(jù)存儲(chǔ)過(guò)程的輸入輸出,作以下簡(jiǎn)單分類(lèi):

1. 只返回單一記錄集的存儲(chǔ)過(guò)程

假設(shè)有以下存儲(chǔ)過(guò)程(本文的目的不在于講述T-SQL語(yǔ)法,所以存儲(chǔ)過(guò)程只給出代碼,不作說(shuō)明):

以下為引用的內(nèi)容:
/*SP1*/
CREATE PROCEDURE dbo.getUserList
as
set nocount on
begin
select * from dbo.[userinfo]
end
go

以上存儲(chǔ)過(guò)程取得userinfo表中的所有記錄,返回一個(gè)記錄集。通過(guò)command對(duì)象調(diào)用該存儲(chǔ)過(guò)程的ASP代碼如下:

以下為引用的內(nèi)容:
**通過(guò)Command對(duì)象調(diào)用存儲(chǔ)過(guò)程**
DIM MyComm,MyRst
Set MyComm = Server.CreateObject("ADODB.Command")
MyComm.ActiveConnection = MyConStr 'MyConStr是數(shù)據(jù)庫(kù)連接字串
MyComm.CommandText = "getUserList" '指定存儲(chǔ)過(guò)程名
MyComm.CommandType = 4 '表明這是一個(gè)存儲(chǔ)過(guò)程
MyComm.Prepared = true '要求將SQL命令先行編譯
Set MyRst = MyComm.Execute
Set MyComm = Nothing

存儲(chǔ)過(guò)程取得的記錄集賦給MyRst,接下來(lái),可以對(duì)MyRst進(jìn)行操作。

在以上代碼中,CommandType屬性表明請(qǐng)求的類(lèi)型,取值及說(shuō)明如下:

-1 表明CommandText參數(shù)的類(lèi)型無(wú)法確定
1 表明CommandText是一般的命令類(lèi)型
2 表明CommandText參數(shù)是一個(gè)存在的表名稱(chēng)
4 表明CommandText參數(shù)是一個(gè)存儲(chǔ)過(guò)程的名稱(chēng)

還可以通過(guò)Connection對(duì)象或Recordset對(duì)象調(diào)用存儲(chǔ)過(guò)程,方法分別如下:

'**通過(guò)Connection對(duì)象調(diào)用存儲(chǔ)過(guò)程**
DIM MyConn,MyRst
Set MyConn = Server.CreateObject("ADODB.Connection")
MyConn.open MyConStr 'MyConStr是數(shù)據(jù)庫(kù)連接字串
Set MyRst = MyConn.Execute("getUserList",0,4) '最后一個(gè)參斷含義同CommandType
Set MyConn = Nothing

'**通過(guò)Recordset對(duì)象調(diào)用存儲(chǔ)過(guò)程**
DIM MyRst
Set MyRst = Server.CreateObject("ADODB.Recordset")
MyRst.open "getUserList",MyConStr,0,1,4
'MyConStr是數(shù)據(jù)庫(kù)連接字串,最后一個(gè)參斷含義與CommandType相同

2. 沒(méi)有輸入輸出的存儲(chǔ)過(guò)程

請(qǐng)看以下存儲(chǔ)過(guò)程:

以下為引用的內(nèi)容:
/*SP2*/
CREATE PROCEDURE dbo.delUserAll
as
set nocount on
begin
delete from dbo.[userinfo]
end
go

該存儲(chǔ)過(guò)程刪去userinfo表中的所有記錄,沒(méi)有任何輸入及輸出,調(diào)用方法與上面講過(guò)的基本相同,只是不用取得記錄集:

'**通過(guò)Command對(duì)象調(diào)用存儲(chǔ)過(guò)程**
DIM MyComm
Set MyComm = Server.CreateObject("ADODB.Command")
MyComm.ActiveConnection = MyConStr 'MyConStr是數(shù)據(jù)庫(kù)連接字串
MyComm.CommandText = "delUserAll" '指定存儲(chǔ)過(guò)程名
MyComm.CommandType = 4 '表明這是一個(gè)存儲(chǔ)過(guò)程
MyComm.Prepared = true '要求將SQL命令先行編譯
MyComm.Execute '此處不必再取得記錄集
Set MyComm = Nothing

當(dāng)然也可通過(guò)Connection對(duì)象或Recordset對(duì)象調(diào)用此類(lèi)存儲(chǔ)過(guò)程,不過(guò)建立Recordset對(duì)象是為了取得記錄集,在沒(méi)有返回記錄集的情況下,還是利用Command對(duì)象吧。

3. 有返回值的存儲(chǔ)過(guò)程

在進(jìn)行類(lèi)似SP2的操作時(shí),應(yīng)充分利用SQL Server強(qiáng)大的事務(wù)處理功能,以維護(hù)數(shù)據(jù)的一致性。并且,我們可能需要存儲(chǔ)過(guò)程返回執(zhí)行情況,為此,將SP2修改如下:

以下為引用的內(nèi)容:
/*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

以上存儲(chǔ)過(guò)程,在delete順利執(zhí)行時(shí),返回1,否則返回0,并進(jìn)行回滾操作。為了在ASP中取得返回值,需要利用Parameters集合來(lái)聲明參數(shù):

'**調(diào)用帶有返回值的存儲(chǔ)過(guò)程并取得返回值**
DIM MyComm,MyPara
Set MyComm = Server.CreateObject("ADODB.Command")
MyComm.ActiveConnection = MyConStr 'MyConStr是數(shù)據(jù)庫(kù)連接字串
MyComm.CommandText = "delUserAll" '指定存儲(chǔ)過(guò)程名
MyComm.CommandType = 4 '表明這是一個(gè)存儲(chǔ)過(guò)程
MyComm.Prepared = true '要求將SQL命令先行編譯
'聲明返回值
Set Mypara = MyComm.CreateParameter("RETURN",2,4)
MyComm.Parameters.Append MyPara
MyComm.Execute
'取得返回值
DIM retValue
retValue = MyComm(0) '或retValue = MyComm.Parameters(0)
Set MyComm = Nothing

在MyComm.CreateParameter("RETURN",2,4)中,各參數(shù)的含義如下:

第一個(gè)參數(shù)("RETURE")為參數(shù)名。參數(shù)名可以任意設(shè)定,但一般應(yīng)與存儲(chǔ)過(guò)程中聲明的參數(shù)名相同。此處是返回值,我習(xí)慣上設(shè)為"RETURE";

第二個(gè)參數(shù)(2),表明該參數(shù)的數(shù)據(jù)類(lèi)型,具體的類(lèi)型代碼請(qǐng)參閱ADO參考,以下給出常用的類(lèi)型代碼:

以下為引用的內(nèi)容:
adBigInt: 20 ;
adBinary : 128 ;
adBoolean: 11 ;
adChar: 129 ;
adDBTimeStamp: 135 ;
adEmpty: 0 ;
adInteger: 3 ;
adSmallInt: 2 ;
adTinyInt: 16 ;
adVarChar: 200 ;

對(duì)于返回值,只能取整形,且-1到-99為保留值;

第三個(gè)參數(shù)(4),表明參數(shù)的性質(zhì),此處4表明這是一個(gè)返回值。此參數(shù)取值的說(shuō)明如下:

0 : 類(lèi)型無(wú)法確定; 1: 輸入?yún)?shù);2: 輸入?yún)?shù);3:輸入或輸出參數(shù);4: 返回值

以上給出的ASP代碼,應(yīng)該說(shuō)是完整的代碼,也即最復(fù)雜的代碼,其實(shí)

Set Mypara = MyComm.CreateParameter("RETURN",2,4)
MyComm.Parameters.Append MyPara

可以簡(jiǎn)化為

MyComm.Parameters.Append MyComm.CreateParameter("RETURN",2,4)

甚至還可以繼續(xù)簡(jiǎn)化,稍后會(huì)做說(shuō)明。

對(duì)于帶參數(shù)的存儲(chǔ)過(guò)程,只能使用Command對(duì)象調(diào)用(也有資料說(shuō)可通過(guò)Connection對(duì)象或Recordset對(duì)象調(diào)用,但我沒(méi)有試成過(guò))。

4. 有輸入?yún)?shù)和輸出參數(shù)的存儲(chǔ)過(guò)程

返回值其實(shí)是一種特殊的輸出參數(shù)。在大多數(shù)情況下,我們用到的是同時(shí)有輸入及輸出參數(shù)的存儲(chǔ)過(guò)程,比如我們想取得用戶(hù)信息表中,某ID用戶(hù)的用戶(hù)名,這時(shí)候,有一個(gè)輸入?yún)?shù)----用戶(hù)ID,和一個(gè)輸出參數(shù)----用戶(hù)名。實(shí)現(xiàn)這一功能的存儲(chǔ)過(guò)程如下:

以下為引用的內(nèi)容:
/*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

調(diào)用該存儲(chǔ)過(guò)程的ASP代碼如下:

'**調(diào)用帶有輸入輸出參數(shù)的存儲(chǔ)過(guò)程**
DIM MyComm,UserID,UserName
UserID = 1
Set MyComm = Server.CreateObject("ADODB.Command")
MyComm.ActiveConnection = MyConStr 'MyConStr是數(shù)據(jù)庫(kù)連接字串
MyComm.CommandText = "getUserName" '指定存儲(chǔ)過(guò)程名
MyComm.CommandType = 4 '表明這是一個(gè)存儲(chǔ)過(guò)程
MyComm.Prepared = true '要求將SQL命令先行編譯
'聲明參數(shù)
MyComm.Parameters.append MyComm.CreateParameter("@UserID",3,1,4,UserID)
MyComm.Parameters.append MyComm.CreateParameter("@UserName",200,2,40)
MyComm.Execute
'取得出參
UserName = MyComm(1)
Set MyComm = Nothing

在以上代碼中,可以看到,與聲明返回值不同,聲明輸入?yún)?shù)時(shí)需要5個(gè)參數(shù),聲明輸出參數(shù)時(shí)需要4個(gè)參數(shù)。聲明輸入?yún)?shù)時(shí)5個(gè)參數(shù)分別為:參數(shù)名、參數(shù)數(shù)據(jù)類(lèi)型、參數(shù)類(lèi)型、數(shù)據(jù)長(zhǎng)度、參數(shù)值。聲明輸出參數(shù)時(shí),沒(méi)有最后一個(gè)參數(shù):參數(shù)值。

需要特別注意的是:在聲明參數(shù)時(shí),順序一定要與存儲(chǔ)過(guò)程中定義的順序相同,而且各參數(shù)的數(shù)據(jù)類(lèi)型、長(zhǎng)度也要與存儲(chǔ)過(guò)程中定義的相同。

如果存儲(chǔ)過(guò)程有多個(gè)參數(shù),ASP代碼會(huì)顯得繁瑣,可以使用with命令簡(jiǎn)化代碼:

'**調(diào)用帶有輸入輸出參數(shù)的存儲(chǔ)過(guò)程(簡(jiǎn)化代碼)**
DIM MyComm,UserID,UserName
UserID = 1
Set MyComm = Server.CreateObject("ADODB.Command")
with MyComm
 .ActiveConnection = MyConStr 'MyConStr是數(shù)據(jù)庫(kù)連接字串
 .CommandText = "getUserName" '指定存儲(chǔ)過(guò)程名
 .CommandType = 4 '表明這是一個(gè)存儲(chǔ)過(guò)程
 .Prepared = true '要求將SQL命令先行編譯
 .Parameters.append .CreateParameter("@UserID",3,1,4,UserID)
 .Parameters.append .CreateParameter("@UserName",200,2,40)
 .Execute
end with
UserName = MyComm(1)
Set MyComm = Nothing

假如我們要取得ID為1到10,10位用戶(hù)的用戶(hù)名,是不是要?jiǎng)?chuàng)建10次Command對(duì)象呢?不是的。如果需要多次調(diào)用同一存儲(chǔ)過(guò)程,只需改變輸入?yún)?shù),就會(huì)得到不同的輸出:

'**多次調(diào)用同一存儲(chǔ)過(guò)程**
DIM MyComm,UserID,UserName
UserName = ""
Set MyComm = Server.CreateObject("ADODB.Command")
for UserID = 1 to 10
 with MyComm
  .ActiveConnection = MyConStr 'MyConStr是數(shù)據(jù)庫(kù)連接字串
  .CommandText = "getUserName" '指定存儲(chǔ)過(guò)程名
  .CommandType = 4 '表明這是一個(gè)存儲(chǔ)過(guò)程
  .Prepared = true '要求將SQL命令先行編譯
  if UserID = 1 then
   .Parameters.append .CreateParameter("@UserID",3,1,4,UserID)
   .Parameters.append .CreateParameter("@UserName",200,2,40)
   .Execute
  else
   '重新給入?yún)①x值(此時(shí)參數(shù)值不發(fā)生變化的入?yún)⒁约俺鰠⒉槐刂匦侣暶?
   .Parameters("@UserID") = UserID
   .Execute
  end if
 end with
 UserName = UserName + MyComm(1) + "," '也許你喜歡用數(shù)組存儲(chǔ)
next
Set MyComm = Nothing

通過(guò)以上代碼可以看出:重復(fù)調(diào)用同一存儲(chǔ)過(guò)程時(shí),只需為值發(fā)生改變的輸入?yún)?shù)重新賦值即可,這一方法在有多個(gè)輸入輸出參數(shù),且每次調(diào)用時(shí)只有一個(gè)輸入?yún)?shù)的值發(fā)生變化時(shí),可以大大減少代碼量。

5. 同時(shí)具有返回值、輸入?yún)?shù)、輸出參數(shù)的存儲(chǔ)過(guò)程

前面說(shuō)過(guò),在調(diào)用存儲(chǔ)過(guò)程時(shí),聲明參數(shù)的順序要與存儲(chǔ)過(guò)程中定義的順序相同。還有一點(diǎn)要特別注意:如果存儲(chǔ)過(guò)程同時(shí)具有返回值以及輸入、輸出參數(shù),返回值要最先聲明。

12下一頁(yè)閱讀全文
您可能感興趣的文章:
  • 用ASP開(kāi)發(fā)網(wǎng)頁(yè)需要牢記的注意事項(xiàng)
  • ASP開(kāi)發(fā)中存儲(chǔ)過(guò)程應(yīng)用全接觸
  • ASP開(kāi)發(fā)中數(shù)據(jù)庫(kù)文件調(diào)用的捷徑
  • 動(dòng)態(tài)網(wǎng)站web開(kāi)發(fā) PHP、ASP還是ASP.NET
  • ASP開(kāi)發(fā)網(wǎng)頁(yè)牢記注意事項(xiàng)
  • ASP開(kāi)發(fā)中可能遇到的錯(cuò)誤信息中文說(shuō)明大全(整理收集)
  • 支付寶 接口開(kāi)發(fā)幫助(asp,php,asp.net,jsp)
  • ASP 常見(jiàn)對(duì)象總結(jié)(熟悉一下利用以后的開(kāi)發(fā)使用)
  • ASP開(kāi)發(fā)準(zhǔn)則是什么

標(biāo)簽:蚌埠 棗莊 衡水 萍鄉(xiāng) 衢州 大理 廣元 江蘇

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《ASP存儲(chǔ)過(guò)程開(kāi)發(fā)應(yīng)用詳解第1/2頁(yè)》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話(huà)咨詢(xún)

    • 400-1100-266