欧美成人精品手机在线观看_69视频国产_动漫精品第一页_日韩中文字幕网 - 日本欧美一区二区

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

[點(diǎn)晴永久免費(fèi)OA]ASP程序與SQL存儲(chǔ)過程結(jié)合使用詳解

admin
2022年6月21日 19:4 本文熱度 1097

    定義總是很抽象,存儲(chǔ)進(jìn)程其實(shí)就是能完成特定操作的一組SQL語句,只不過這組語句是放在數(shù)據(jù)庫中的(這里我們只談SQL SERVER)。如果我們通過創(chuàng)建存儲(chǔ)進(jìn)程以及在ASP中調(diào)用存儲(chǔ)進(jìn)程,就可以避免將SQL語句同ASP代碼混雜在一起。這樣做的好處至少有三個(gè):
  第一、大大提高效率。存儲(chǔ)進(jìn)程本身的執(zhí)行速度非??欤遥{(diào)用存儲(chǔ)進(jìn)程可以大大減少同數(shù)據(jù)庫的交互次數(shù)。
  第二、提高安全性。假如將SQL語句混合在ASP代碼中,一旦代碼失密,同時(shí)也就意味著庫結(jié)構(gòu)失密。
  第三、有利于SQL語句的重用。


  在ASP中,一般通過COMMAND對(duì)象調(diào)用存儲(chǔ)進(jìn)程,根據(jù)不同情況,本文也介紹其它調(diào)用方法。為了方便說明,根據(jù)存儲(chǔ)進(jìn)程的輸入輸出,作以下簡單分類:
  1. 只返回單一記錄集的存儲(chǔ)進(jìn)程
  假設(shè)有以下存儲(chǔ)進(jìn)程(本文的目的不在于講述T-SQL語法,所以存儲(chǔ)進(jìn)程只給出代碼,不作說明):

  /*SP1*/
  create PROCEDURE DBO.GETUSERLIST
  AS
  SET NOCOUNT ON
  BEGIN
  select * from DBO.[USERINFO]
  END
  GO

  以上存儲(chǔ)進(jìn)程取得USERINFO表中的所有記錄,返回一個(gè)記錄集。通過COMMAND對(duì)象調(diào)用該存儲(chǔ)進(jìn)程的ASP代碼如下:
  '**通過COMMAND對(duì)象調(diào)用存儲(chǔ)進(jìn)程**
  DIM MYCOMM,MYRST
  SET MYCOMM = SERVER.createOBJECT("ADODB.COMMAND")
  MYCOMM.ACTIVECONNECTION = MYCONSTR    'MYCONSTR是數(shù)據(jù)庫連接字串
  MYCOMM.COMMANDTEXT  = "GETUSERLIST"   '指定存儲(chǔ)進(jìn)程名
  MYCOMM.COMMANDTYPE  = 4      '表明這是一個(gè)存儲(chǔ)進(jìn)程
  MYCOMM.PREPARED    = TRUE      '要求將SQL命令先行編譯
  SET MYRST = MYCOMM.execUTE
  SET MYCOMM = NOTHING

  存儲(chǔ)進(jìn)程取得的記錄集賦給MYRST,接下來,可以對(duì)MYRST進(jìn)行操作。
  在以上代碼中,COMMANDTYPE屬性表明請(qǐng)求的類型,取值及說明如下:
  -1   表明COMMANDTEXT參數(shù)的類型無法確定
  1  表明COMMANDTEXT是一般的命令類型
  2  表明COMMANDTEXT參數(shù)是一個(gè)具有的表名稱
  4  表明COMMANDTEXT參數(shù)是一個(gè)存儲(chǔ)進(jìn)程的名稱

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

  '**通過CONNECTION對(duì)象調(diào)用存儲(chǔ)進(jìn)程**
  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對(duì)象調(diào)用存儲(chǔ)進(jìn)程**
  DIM MYRST
  SET MYRST = SERVER.createOBJECT("ADODB.RECORDSET")
  MYRST.OPEN "GETUSERLIST",MYCONSTR,0,1,4
  'MYCONSTR是數(shù)據(jù)庫連接字串,最后一個(gè)參斷含義與COMMANDTYPE相同

  
  2. 沒有輸入輸出的存儲(chǔ)進(jìn)程
  請(qǐng)看以下存儲(chǔ)進(jìn)程:

  /*SP2*/
  create PROCEDURE DBO.DELUSERALL
  AS
  SET NOCOUNT ON
  BEGIN
  delete from DBO.[USERINFO]
  END
  GO

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

  '**通過COMMAND對(duì)象調(diào)用存儲(chǔ)進(jìn)程**
  DIM MYCOMM
  SET MYCOMM = SERVER.createOBJECT("ADODB.COMMAND")
  MYCOMM.ACTIVECONNECTION = MYCONSTR    'MYCONSTR是數(shù)據(jù)庫連接字串
  MYCOMM.COMMANDTEXT  = "DELUSERALL"  '指定存儲(chǔ)進(jìn)程名
  MYCOMM.COMMANDTYPE  = 4      '表明這是一個(gè)存儲(chǔ)進(jìn)程
  MYCOMM.PREPARED    = TRUE      '要求將SQL命令先行編譯
  MYCOMM.execUTE          '此處不必再取得記錄集
  SET MYCOMM = NOTHING  

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


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

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

  '**調(diào)用帶有返回值的存儲(chǔ)進(jìn)程并取得返回值**
  DIM MYCOMM,MYPARA
  SET MYCOMM = SERVER.createOBJECT("ADODB.COMMAND")
  MYCOMM.ACTIVECONNECTION = MYCONSTR    'MYCONSTR是數(shù)據(jù)庫連接字串
  MYCOMM.COMMANDTEXT  = "DELUSERALL"  '指定存儲(chǔ)進(jìn)程名
  MYCOMM.COMMANDTYPE  = 4      '表明這是一個(gè)存儲(chǔ)進(jìn)程
  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ǔ)進(jìn)程中聲明的參數(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í):

  SET MYPARA = MYCOMM.createPARAMETER("RETURN",2,4)
  MYCOMM.PARAMETERS.APPEND MYPARA


  可以簡化為:

  MYCOMM.PARAMETERS.APPEND MYCOMM.createPARAMETER("RETURN",2,4)

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

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


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

  /*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ǔ)進(jìn)程的ASP代碼如下:

  '**調(diào)用帶有輸入輸出參數(shù)的存儲(chǔ)進(jìn)程**
  DIM MYCOMM,USERID,USERNAME
  USERID = 1
  SET MYCOMM = SERVER.createOBJECT("ADODB.COMMAND")
  MYCOMM.ACTIVECONNECTION = MYCONSTR    'MYCONSTR是數(shù)據(jù)庫連接字串
  MYCOMM.COMMANDTEXT  = "GETUSERNAME"   '指定存儲(chǔ)進(jìn)程名
  MYCOMM.COMMANDTYPE  = 4      '表明這是一個(gè)存儲(chǔ)進(jìn)程
  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í),順序一定要與存儲(chǔ)進(jìn)程中定義的順序相同,而且各參數(shù)的數(shù)據(jù)類型、長度也要與存儲(chǔ)進(jìn)程中定義的相同。
  如果存儲(chǔ)進(jìn)程有多個(gè)參數(shù),ASP代碼會(huì)顯得繁瑣,可以使用WITH命令簡化代碼:

  '**調(diào)用帶有輸入輸出參數(shù)的存儲(chǔ)進(jìn)程(簡化代碼)**
  DIM MYCOMM,USERID,USERNAME
  USERID = 1
  SET MYCOMM = SERVER.createOBJECT("ADODB.COMMAND")
  WITH MYCOMM
  .ACTIVECONNECTION = MYCONSTR    'MYCONSTR是數(shù)據(jù)庫連接字串
  .COMMANDTEXT  = "GETUSERNAME"   '指定存儲(chǔ)進(jìn)程名
  .COMMANDTYPE  = 4      '表明這是一個(gè)存儲(chǔ)進(jìn)程
  .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對(duì)象呢?不是的。如果需要多次調(diào)用同一存儲(chǔ)進(jìn)程,只需改變輸入?yún)?shù),就會(huì)得到不同的輸出:

  '**多次調(diào)用同一存儲(chǔ)進(jìn)程**
  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"   '指定存儲(chǔ)進(jìn)程名
    .COMMANDTYPE  = 4      '表明這是一個(gè)存儲(chǔ)進(jìn)程
    .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

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


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

  為了演示這種情況下的調(diào)用方法,我們改善一下上面的例子。還是取得ID為1的用戶的用戶名,但是有可能該用戶不具有(該用戶已刪除,而USERID是自增長的字段)。存儲(chǔ)進(jìn)程根據(jù)用戶具有與否,返回不同的值。此時(shí),存儲(chǔ)進(jìn)程和ASP代碼如下:

  /*SP5*/
  create PROCEDURE DBO.GETUSERNAME
  --為了加深對(duì)"順序"的印象,將以下兩參數(shù)的定義順序顛倒一下
  @USERNAME VARCHAR(40) OUTPUT,
  @USERID INT
  AS
  SET NOCOUNT ON
  BEGIN
  IF @USERID IS NULL RETURN
  select @USERNAME=USERNAME
    from DBO.[USERINFO]
    where USERID=@USERID
  IF @@ROWCOUNT>0
    RETURN 1
  ELSE
    RETURN 0
  RETURN
  END
  GO

  '**調(diào)用同時(shí)具有返回值、輸入?yún)?shù)、輸出參數(shù)的存儲(chǔ)進(jìn)程**
  DIM MYCOMM,USERID,USERNAME
  USERID = 1
  SET MYCOMM = SERVER.createOBJECT("ADODB.COMMAND")
  WITH MYCOMM
  .ACTIVECONNECTION = MYCONSTR    'MYCONSTR是數(shù)據(jù)庫連接字串
  .COMMANDTEXT  = "GETUSERNAME"   '指定存儲(chǔ)進(jìn)程名
  .COMMANDTYPE  = 4      '表明這是一個(gè)存儲(chǔ)進(jìn)程
  .PREPARED    = TRUE      '要求將SQL命令先行編譯
  '返回值要最先被聲明
  .PARAMETERS.APPEND .createPARAMETER("RETURN",2,4)
  '以下兩參數(shù)的聲明順序也做相應(yīng)顛倒
  .PARAMETERS.APPEND .createPARAMETER("@USERNAME",200,2,40)
  .PARAMETERS.APPEND .createPARAMETER("@USERID",3,1,4,USERID)
  .execUTE
  END WITH
  IF MYCOMM(0) = 1 THEN
  USERNAME = MYCOMM(1)
  ELSE
  USERNAME = "該用戶不具有"
  END IF
  SET MYCOMM = NOTHING


6. 同時(shí)返回參數(shù)和記錄集的存儲(chǔ)進(jìn)程
  有時(shí)候,我們需要存儲(chǔ)進(jìn)程同時(shí)返回參數(shù)和記錄集,比如在利用存儲(chǔ)進(jìn)程分頁時(shí),要同時(shí)返回記錄集以及數(shù)據(jù)總量等參數(shù)。以下給出一個(gè)進(jìn)行分頁處理的存儲(chǔ)進(jìn)程:

  /*SP6*/
  create PROCEDURE DBO.GETUSERLIST
  @IPAGECOUNT INT OUTPUT,   --總頁數(shù)
  @IPAGE INT,      --當(dāng)前頁號(hào)
  @IPAGESIZE INT    --每頁記錄數(shù)
  AS
  SET NOCOUNT ON
  BEGIN
  --創(chuàng)建臨時(shí)表
  create TABLE #T (ID INT IDENTITY,   --自增字段
        USERID INT,
        USERNAME VARCHAR(40))
  --向臨時(shí)表中寫入數(shù)據(jù)
  insert INTO #T
    select USERID,USERNAME from DBO.[USERINFO]
    ORDER BY USERID

  --取得記錄總數(shù)
  DECLARE @IRECORDCOUNT INT
  SET @IRECORDCOUNT = @@ROWCOUNT

  --確定總頁數(shù)
  IF @IRECORDCOUNT%@IPAGESIZE=0
    SET @IPAGECOUNT=CEILING(@IRECORDCOUNT/@IPAGESIZE)
  ELSE
    SET @IPAGECOUNT=CEILING(@IRECORDCOUNT/@IPAGESIZE)+1

  --若請(qǐng)求的頁號(hào)大于總頁數(shù),則顯示最后一頁
  IF @IPAGE > @IPAGECOUNT
    select @IPAGE = @IPAGECOUNT

  --確定當(dāng)前頁的始末記錄
  DECLARE @ISTART INT  --START RECORD
  DECLARE @IEND INT  --END RECORD
  select @ISTART = (@IPAGE - 1) * @IPAGESIZE
  select @IEND = @ISTART + @IPAGESIZE + 1

  --取當(dāng)前頁記錄  
  select * from #T where ID>@ISTART AND ID<@IEND

  --刪除臨時(shí)表
  drop TABLE #T

  --返回記錄總數(shù)
  RETURN @IRECORDCOUNT
  END
  GO

  在上面的存儲(chǔ)進(jìn)程中,輸入當(dāng)前頁號(hào)及每頁記錄數(shù),返回當(dāng)前頁的記錄集,總頁數(shù)及記錄總數(shù)。為了更具典型性,將記錄總數(shù)以返回值的形式返回。以下是調(diào)用該存儲(chǔ)進(jìn)程的ASP代碼(具體的分頁操作略去):

  '**調(diào)用分頁存儲(chǔ)進(jìn)程**
  DIM PAGENOW,PAGESIZE,PAGECOUNT,RECORDCOUNT
  DIM MYCOMM,MYRST
  PAGENOW = REQUEST("PN")
  '自定義函數(shù)用于驗(yàn)證自然數(shù)
  IF CHECKNAR(PAGENOW) = FALSE THEN PAGENOW = 1
  PAGESIZE = 20
  SET MYCOMM = SERVER.createOBJECT("ADODB.COMMAND")
  WITH MYCOMM
  .ACTIVECONNECTION = MYCONSTR    'MYCONSTR是數(shù)據(jù)庫連接字串
  .COMMANDTEXT  = "GETUSERLIST"   '指定存儲(chǔ)進(jìn)程名
  .COMMANDTYPE  = 4      '表明這是一個(gè)存儲(chǔ)進(jìn)程
  .PREPARED    = TRUE    '要求將SQL命令先行編譯
  '返回值(記錄總量)
  .PARAMETERS.APPEND .createPARAMETER("RETURN",2,4)
  '出參(總頁數(shù))
  .PARAMETERS.APPEND .createPARAMETER("@IPAGECOUNT",3,2)
  '入?yún)?當(dāng)前頁號(hào))
  .PARAMETERS.APPEND .createPARAMETER("@IPAGE",3,1,4,PAGENOW)
  '入?yún)?每頁記錄數(shù))
  .PARAMETERS.APPEND .createPARAMETER("@IPAGESIZE",3,1,4,PAGESIZE)
  SET MYRST = .execUTE
  END WITH
  IF MYRST.STATE = 0 THEN    '未取到數(shù)據(jù),MYRST關(guān)閉
  RECORDCOUNT = -1
  ELSE
  MYRST.CLOSE  '注意:若要取得參數(shù)值,需先關(guān)閉記錄集對(duì)象
  RECORDCOUNT = MYCOMM(0)
  PAGECOUNT   = MYCOMM(1)
  IF CINT(PAGENOW)>=CINT(PAGECOUNT) THEN PAGENOW=PAGECOUNT
  END IF
  SET MYCOMM = NOTHING

  '以下顯示記錄
  IF RECORDCOUNT = 0 THEN
  RESPONSE.WRITE "無記錄"
  ELSEIF RECORDCOUNT > 0 THEN
  MYRST.OPEN
  DO UNTIL MYRST.EOF
  ......
  LOOP
  '以下顯示分頁信息
  ......
  ELSE  'RECORDCOUNT=-1
  RESPONSE.WRITE "參數(shù)錯(cuò)誤"
  END IF

  對(duì)于以上代碼,只有一點(diǎn)需要說明:同時(shí)返回記錄集和參數(shù)時(shí),若要取得參數(shù),需先將記錄集關(guān)閉,使用記錄集時(shí)再將其打開。


  7. 返回多個(gè)記錄集的存儲(chǔ)進(jìn)程
  本文最先介紹的是返回記錄集的存儲(chǔ)進(jìn)程。有時(shí)候,需要一個(gè)存儲(chǔ)進(jìn)程返回多個(gè)記錄集,在ASP中,如何同時(shí)取得這些記錄集呢?為了說明這一問題,在USERINFO表中增加兩個(gè)字段:USERTEL及USERMAIL,并設(shè)定只有登錄用戶可以查看這兩項(xiàng)內(nèi)容。

  /*SP7*/
  create PROCEDURE DBO.GETUSERINFO
  @USERID INT,
  @CHECKLOGIN BIT
  AS
  SET 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
  END
  GO

  以下是ASP代碼:

  '**調(diào)用返回多個(gè)記錄集的存儲(chǔ)進(jìn)程**
  DIM CHECKLG,USERID,USERNAME,USERTEL,USERMAIL
  DIM MYCOMM,MYRST
  USERID = 1
  'CHECKLOGIN()為自定義函數(shù),判斷訪問者是否登錄
  CHECKLG = CHECKLOGIN()
  SET MYCOMM = SERVER.createOBJECT("ADODB.COMMAND")
  WITH MYCOMM
  .ACTIVECONNECTION = MYCONSTR    'MYCONSTR是數(shù)據(jù)庫連接字串
  .COMMANDTEXT  = "GETUSERINFO"   '指定存儲(chǔ)進(jìn)程名
  .COMMANDTYPE  = 4      '表明這是一個(gè)存儲(chǔ)進(jìn)程
  .PREPARED    = TRUE      '要求將SQL命令先行編譯
  .PARAMETERS.APPEND .createPARAMETER("@USERID",3,1,4,USERID)
  .PARAMETERS.APPEND .createPARAMETER("@CHECKLOGIN",11,1,1,CHECKLG)
  SET MYRST = .execUTE
  END WITH
  SET MYCOMM = NOTHING

  '從第一個(gè)記錄集中取值
  USERNAME = MYRST(0)
  '從第二個(gè)記錄集中取值
  IF NOT MYRST IS NOTHING THEN
  SET MYRST = MYRST.NEXTRECORDSET()
  USERTEL  = MYRST(0)
  USERMAIL = MYRST(1)
  END IF
  SET MYRST = NOTHING

  以上代碼中,利用RECORDSET對(duì)象的NEXTRECORDSET方法,取得了存儲(chǔ)進(jìn)程返回的多個(gè)記錄集。


  至此,針對(duì)ASP調(diào)用存儲(chǔ)進(jìn)程的各種情況,本文已做了較為全面的說明。最后說一下在一個(gè)ASP程序中,調(diào)用多個(gè)存儲(chǔ)進(jìn)程的不同方法。
  在一個(gè)ASP程序中,調(diào)用多個(gè)存儲(chǔ)進(jìn)程至少有以下三種方法是可行的:

  1. 創(chuàng)建多個(gè)COMMAND對(duì)象

  DIM MYCOMM
  SET MYCOMM = SERVER.createOBJECT("ADODB.COMMAND")
  '調(diào)用存儲(chǔ)進(jìn)程一
  ......
  SET MYCOMM = NOTHING
  SET MYCOMM = SERVER.createOBJECT("ADODB.COMMAND")
  '調(diào)用存儲(chǔ)進(jìn)程二
  ......
  SET MYCOMM = NOTHING
  ......

   2. 只創(chuàng)建一個(gè)COMMAND對(duì)象,結(jié)束一次調(diào)用時(shí),清除其參數(shù)

  DIM MYCOMM
  SET MYCOMM = SERVER.createOBJECT("ADODB.COMMAND")
  '調(diào)用存儲(chǔ)進(jìn)程一
  .....
  '清除參數(shù)(假設(shè)有三個(gè)參數(shù))
  MYCOMM.PARAMETERS.delete 2
  MYCOMM.PARAMETERS.delete 1
  MYCOMM.PARAMETERS.delete 0
  '調(diào)用存儲(chǔ)進(jìn)程二并清除參數(shù)
  ......
  SET MYCOMM = NOTHING

  此時(shí)要注意:清除參數(shù)的順序與參數(shù)聲明的順序相反,原因嘛,我也不知道。

  3. 利用PARAMETERS數(shù)據(jù)集合的REFRESH方法重置PARAMETER對(duì)象

  DIM MYCOMM
  SET MYCOMM = SERVER.createOBJECT("ADODB.COMMAND")
  '調(diào)用存儲(chǔ)進(jìn)程一
  .....
  '重置PARAMETERS數(shù)據(jù)集合中包含的所有PARAMETER對(duì)象
  MYCOMM.PARAMETERS.REFRESH
  '調(diào)用存儲(chǔ)進(jìn)程二
  .....
  SET MYCOMM = NOTHING

  一般以為,重復(fù)創(chuàng)建對(duì)象是效率較低的一種方法,但是經(jīng)測(cè)試(測(cè)試工具為MICROSOFT APPLICATION CENTER TEST),結(jié)果出人意料:
  方法2 >= 方法1 >> 方法3
  方法2的運(yùn)行速度大于等于方法1(最多可高4%左右),這兩種方法的運(yùn)行速度遠(yuǎn)大于方法3(最多竟高達(dá)130%),所以建議在參數(shù)多時(shí),采用方法1,在參數(shù)較少時(shí),采用方法2。

  花了一天的時(shí)間,終于把我對(duì)于在ASP中調(diào)用存儲(chǔ)進(jìn)程的一些粗淺的經(jīng)驗(yàn)形成了文字。這其中,有些是我只知其果而不明其因的,有些可能是錯(cuò)誤的,但是,這些都是經(jīng)過我親身實(shí)踐的,各位看官批判地接受吧。


該文章在 2022/6/21 20:35:45 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲(chǔ)管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved