偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

ASP基礎(chǔ)之存儲(chǔ)過程應(yīng)用全接觸(上)

開發(fā) 后端
本文詳細(xì)介紹ASP開發(fā)中的存儲(chǔ)過程,由于文章比較長(zhǎng),分為兩篇為大家介紹,希望對(duì)你有幫助,一起來看。

ASP與存儲(chǔ)過程(Stored Procedures)的文章不少,但是我懷疑作者們是否真正實(shí)踐過。我在初學(xué)時(shí)查閱過大量相關(guān)資料,發(fā)現(xiàn)其中提供的很多方法實(shí)際操作起來并不是那么回事。對(duì)于簡(jiǎn)單的應(yīng)用,這些資料也許是有幫助的,但僅限于此,因?yàn)樗鼈兏揪褪乔宦?,互相抄襲,稍微復(fù)雜點(diǎn)的應(yīng)用,就全都語焉不詳了。

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

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

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

  • 第一、大大提高效率。存儲(chǔ)過程本身的執(zhí)行速度非常快,而且,調(diào)用存儲(chǔ)過程可以大大減少同數(shù)據(jù)庫的交互次數(shù)。
  • 第二、提高安全性。假如將SQL語句混合在ASP代碼中,一旦代碼失密,同時(shí)也就意味著庫結(jié)構(gòu)失密。
  • 第三、有利于SQL語句的重用。

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

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

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

 

  1. /*SP1*/   
  2. CREATE PROCEDURE dbo.getUserList   
  3. as   
  4. set nocount on   
  5. begin   
  6. select * from dbo.[userinfo]   
  7. end   
  8. go  

 

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

 

  1. '**通過Command對(duì)象調(diào)用存儲(chǔ)過程**   
  2. DIM MyComm,MyRst   
  3. Set MyComm = Server.CreateObject("ADODB.Command")   
  4. MyComm.ActiveConnection = MyConStr 'MyConStr是數(shù)據(jù)庫連接字串   
  5. MyComm.CommandText = "getUserList" '指定存儲(chǔ)過程名   
  6. MyComm.CommandType = 4 '表明這是一個(gè)存儲(chǔ)過程   
  7. MyComm.Prepared = true '要求將SQL命令先行編譯   
  8. Set MyRst = MyComm.Execute   
  9. Set MyComm = Nothing  

 

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

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

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

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

 

  1. '**通過Connection對(duì)象調(diào)用存儲(chǔ)過程**   
  2. DIM MyConn,MyRst   
  3. Set MyConn = Server.CreateObject("ADODB.Connection")   
  4. MyConn.open MyConStr 'MyConStr是數(shù)據(jù)庫連接字串   
  5. Set MyRst = MyConn.Execute("getUserList",0,4) '最后一個(gè)參斷含義同CommandType   
  6. Set MyConn = Nothing   
  7. '**通過Recordset對(duì)象調(diào)用存儲(chǔ)過程**   
  8. DIM MyRst   
  9. Set MyRst = Server.CreateObject("ADODB.Recordset")   
  10. MyRst.open "getUserList",MyConStr,0,1,4   
  11. 'MyConStr是數(shù)據(jù)庫連接字串,最后一個(gè)參斷含義與CommandType相同  

 

2. 沒有輸入輸出的存儲(chǔ)過程

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

 

  1. /*SP2*/   
  2. CREATE PROCEDURE dbo.delUserAll   
  3. as   
  4. set nocount on   
  5. begin   
  6. delete from dbo.[userinfo]   
  7. end   
  8. go  

 

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

 

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

 

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

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

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

 

  1. /*SP3*/   
  2. CREATE PROCEDURE dbo.delUserAll   
  3. as   
  4. set nocount on   
  5. begin   
  6. BEGIN TRANSACTION   
  7. delete from dbo.[userinfo]   
  8. IF error=0   
  9. begin   
  10. COMMIT TRANSACTION   
  11. return 1   
  12. end   
  13. ELSE   
  14. begin   
  15. ROLLBACK TRANSACTION   
  16. return 0   
  17. end   
  18. return   
  19. end   
  20. go  

 

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

 

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

 

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

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

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

  • 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ù)取值的說明如下:

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

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

 

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

 

可以簡(jiǎn)化為

 

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

 

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

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

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

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

 

  1. /*SP4*/   
  2. CREATE PROCEDURE dbo.getUserName   
  3. @UserID int,   
  4. @UserName varchar(40) output   
  5. as   
  6. set nocount on   
  7. begin   
  8. if @UserID is null return   
  9. select @UserName=username   
  10. from dbo.[userinfo]   
  11. where userid=@UserID   
  12. return   
  13. end   
  14. go  

 

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

 

  1. '**調(diào)用帶有輸入輸出參數(shù)的存儲(chǔ)過程**   
  2. DIM MyComm,UserID,UserName   
  3. UserID = 1   
  4. Set MyComm = Server.CreateObject("ADODB.Command"
  5. MyComm.ActiveConnection = MyConStr 'MyConStr是數(shù)據(jù)庫連接字串   
  6. MyComm.CommandText = "getUserName" '指定存儲(chǔ)過程名   
  7. MyComm.CommandType = 4 '表明這是一個(gè)存儲(chǔ)過程   
  8. MyComm.Prepared = true '要求將SQL命令先行編譯   
  9. '聲明參數(shù)   
  10. MyComm.Parameters.append MyComm.CreateParameter("@UserID",3,1,4,UserID)   
  11. MyComm.Parameters.append MyComm.CreateParameter("@UserName",200,2,40)   
  12. MyComm.Execute   
  13. '取得出參   
  14. UserName = MyComm(1)   
  15. 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ù)長(zhǎng)度、參數(shù)值。聲明輸出參數(shù)時(shí),沒有最后一個(gè)參數(shù):參數(shù)值。

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

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

 

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

 

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

 

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

 

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

請(qǐng)看本文下篇>>

【編輯推薦】

  1. 利用ASP和SQL Server構(gòu)建網(wǎng)頁防火墻
  2. ASP新手之常用源代碼的總結(jié)(上)
  3. ASP新手之常用源代碼的總結(jié)(下)
  4. ASP新手之常用錯(cuò)誤處理解析
  5. 解決ASP無法更新ACCESS數(shù)據(jù)庫的問題
責(zé)任編輯:于鐵 來源: 互聯(lián)網(wǎng)
相關(guān)推薦

2011-07-06 15:36:31

ASP

2010-07-02 11:00:53

GSMP協(xié)議

2020-08-21 07:00:00

DevOpsIT開發(fā)

2009-03-23 10:01:59

LinuxUbuntu 9.04試用

2012-10-10 09:12:54

Windows Sys

2020-10-21 09:00:15

Azure Sprin云服務(wù)日志

2009-06-25 09:29:14

Linux

2010-07-09 16:16:45

SQL Server

2010-09-08 13:42:06

2009-12-23 15:52:32

無線上網(wǎng)全接觸

2010-09-13 13:29:38

2021-06-23 08:00:00

Redis服務(wù)器緩存

2020-04-28 09:00:00

測(cè)試測(cè)試自動(dòng)化

2010-04-15 16:58:08

英特爾酷睿高清

2012-09-26 16:32:29

2009-07-02 15:07:40

Java認(rèn)證考試

2010-09-10 13:27:42

無線網(wǎng)絡(luò)輻射

2009-12-03 11:22:07

路由器功能指標(biāo)

2010-06-28 12:27:35

SQL Server

2018-12-11 09:00:24

ERP語言數(shù)據(jù)庫
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)