佳木斯湛栽影视文化发展公司

主頁 > 知識庫 > ASP存儲過程開發(fā)應(yīng)用詳解第1/2頁

ASP存儲過程開發(fā)應(yīng)用詳解第1/2頁

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

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

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

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

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

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

第三、有利于SQL語句的重用。

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

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

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

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

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

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

存儲過程取得的記錄集賦給MyRst,接下來,可以對MyRst進(jìn)行操作。

在以上代碼中,CommandType屬性表明請求的類型,取值及說明如下:

-1 表明CommandText參數(shù)的類型無法確定
1 表明CommandText是一般的命令類型
2 表明CommandText參數(shù)是一個(gè)存在的表名稱
4 表明CommandText參數(shù)是一個(gè)存儲過程的名稱

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

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

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

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

請看以下存儲過程:

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

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

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

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

3. 有返回值的存儲過程

在進(jìn)行類似SP2的操作時(shí),應(yīng)充分利用SQL Server強(qiáng)大的事務(wù)處理功能,以維護(hù)數(shù)據(jù)的一致性。并且,我們可能需要存儲過程返回執(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

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

'**調(diào)用帶有返回值的存儲過程并取得返回值**
DIM MyComm,MyPara
Set MyComm = Server.CreateObject("ADODB.Command")
MyComm.ActiveConnection = MyConStr 'MyConStr是數(shù)據(jù)庫連接字串
MyComm.CommandText = "delUserAll" '指定存儲過程名
MyComm.CommandType = 4 '表明這是一個(gè)存儲過程
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)與存儲過程中聲明的參數(shù)名相同。此處是返回值,我習(xí)慣上設(shè)為"RETURE";

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

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

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

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

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

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

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

可以簡化為

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

甚至還可以繼續(xù)簡化,稍后會做說明。

對于帶參數(shù)的存儲過程,只能使用Command對象調(diào)用(也有資料說可通過Connection對象或Recordset對象調(diào)用,但我沒有試成過)。

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

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

以下為引用的內(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)用該存儲過程的ASP代碼如下:

'**調(diào)用帶有輸入輸出參數(shù)的存儲過程**
DIM MyComm,UserID,UserName
UserID = 1
Set MyComm = Server.CreateObject("ADODB.Command")
MyComm.ActiveConnection = MyConStr 'MyConStr是數(shù)據(jù)庫連接字串
MyComm.CommandText = "getUserName" '指定存儲過程名
MyComm.CommandType = 4 '表明這是一個(gè)存儲過程
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ù)類型、參數(shù)類型、數(shù)據(jù)長度、參數(shù)值。聲明輸出參數(shù)時(shí),沒有最后一個(gè)參數(shù):參數(shù)值。

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

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

'**調(diào)用帶有輸入輸出參數(shù)的存儲過程(簡化代碼)**
DIM MyComm,UserID,UserName
UserID = 1
Set MyComm = Server.CreateObject("ADODB.Command")
with MyComm
 .ActiveConnection = MyConStr 'MyConStr是數(shù)據(jù)庫連接字串
 .CommandText = "getUserName" '指定存儲過程名
 .CommandType = 4 '表明這是一個(gè)存儲過程
 .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位用戶的用戶名,是不是要?jiǎng)?chuàng)建10次Command對象呢?不是的。如果需要多次調(diào)用同一存儲過程,只需改變輸入?yún)?shù),就會得到不同的輸出:

'**多次調(diào)用同一存儲過程**
DIM MyComm,UserID,UserName
UserName = ""
Set MyComm = Server.CreateObject("ADODB.Command")
for UserID = 1 to 10
 with MyComm
  .ActiveConnection = MyConStr 'MyConStr是數(shù)據(jù)庫連接字串
  .CommandText = "getUserName" '指定存儲過程名
  .CommandType = 4 '表明這是一個(gè)存儲過程
  .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ù)組存儲
next
Set MyComm = Nothing

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

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

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

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

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

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

    • 400-1100-266
    米林县| 隆回县| 来宾市| 澄迈县| 海城市| 枞阳县| 怀集县| 岳普湖县| 句容市| 田东县| 青冈县| 门源| 连云港市| 增城市| 皋兰县| 通辽市| 噶尔县| 五台县| 隆尧县| 翼城县| 南岸区| 双牌县| 乐安县| 永川市| 明溪县| 大姚县| 句容市| 津南区| 镇安县| 怀仁县| 南澳县| 观塘区| 平定县| 沧州市| 利津县| 阜康市| 乾安县| 红河县| 镇赉县| 文化| 梁山县|