国产午夜成人免费看片无遮挡_日本免费xxxx色视频_免费人成网上在线观看_黄网址在线永久免费观看

當前位置:雨林木風下載站 > 技術開發教程 > 詳細頁面

ASP 3.0高級編程(411)

ASP 3.0高級編程(411)

更新時間:2022-05-14 文章作者:未知 信息來源:網絡 閱讀次數:

9.2.3 存儲過程
       存儲過程的使用是Command對象得到應用的一個領域。存儲過程(有時也稱存儲查詢)是存儲在數據庫中預先定義的SQL查詢語句。
       為什么應該創建和使用存儲過程而不是在代碼中直接使用SQL字符串呢?主要有以下幾個理由:
       · 存儲過程被數據庫編譯過。這樣可以產生一個“執行計劃”,因此數據庫確切地知道它將做什么,從而加快了過程的執行速度。
       · 存儲過程通常被數據庫高速緩存,這樣使它們運行得更快,因為此時不需要從磁盤中讀取它們。并非所有的數據庫都支持這種緩存機制,比如微軟的Access就不支持,而SQL Server卻支持。
       · 通過指定數據庫中的表只能被存儲過程修改,可以確保數據更安全。這意味著具有潛在危險的SQL操作不會執行。
       · 可以避免將ASP代碼和冗長的SQL語句混在一起,從而使ASP代碼更易于維護。
       · 可以將所有SQL代碼集中存放于服務器。
       · 可以在存儲過程中使用輸出參數,允許返回記錄集或其他的值。
       一般說來,存儲過程幾乎總是比相當的SQL語句執行速度快。
       為了使用存儲過程,只要將存儲過程的名字作為命令文本,并設置相應的類型。例如,考慮前面更新書價的例子。如果在SQL Server上創建一個存儲過程,可以編寫代碼:
       CREATE PROCEDURE usp_UpdatePrices
       AS
              UPDATE Titles
              SET        Price = Price * 1.10
              WHERE  TYPE='Business'
       對于微軟的Access數據庫,可以使用一個簡單的更新查詢語句完成相同的任務,如圖9-1所示:

圖9-1  使用微軟的Access數據庫完成更新查詢
       要在ASP網頁中運行該存儲過程,只需要使用以下代碼:
       Set cmdUpdate = Server.CreateObject("ADODB.Command")

       cmdUpdate.ActiveConnection = strConn
       cmdUpdate.CommandText = "usp_UpdatePrices"
       cmdUpdate.CommandType = adCmdStoredProc

       cmdUpdate.Execute , , adExecuteNoRecords
       這只是運行存儲過程。沒有記錄集返回,因為只是在更新數據。需要記住的是,除非確實需要,不要創建記錄集。
       雖然這樣做也可以,但并不是很靈活,因為僅僅處理一種類型的書。更好的做法是創建一個允許我們選擇書類型的過程,這樣就不必為每類書創建一個過程。同樣也可去掉固定的10%更新,這樣使得靈活性更好。那么,如何才能做到這一點呢,很簡單,使用參數。
1.  參數
存儲過程的參數(或變量)與一般的過程和函數的參數一樣,可以傳到函數內部,然后函數可以使用它的值。SQL Server(其他數據庫也一樣,包括Access)中的存儲過程都具有這樣的功能。
為了使存儲過程能處理多種類型的書,甚至允許用戶指定價格的增加(或減少),需要增加一些參數:
CREATE PROCEDURE usp_UpdatePrices
       @Type           Char(12),
       @Percent              Money

AS
       UPDATE Titles
       SET        Price = Price * (1 + @Percent / 100)
       WHERE  Type = @Type
現在,存儲過程usp_UpdatePrices帶有兩個參數:
· 一個是書的類型(@Type)。
· 一個是書價變化的百分比(@Percent)。
與VBScript的函數一樣,這些參數都是變量。然而,與VBScript和其他腳本語言不同的是:在這些腳本語言中的變量都是variant類型,而SQL變量具有確定的類型(char、Money等等)。必須遵守SQL變量的命名規范,即變量必須以符號@開始。
注意,我們讓百分數作為一個整數(如10代表10%),而不是作為一個分數值傳入此過程。這只是讓存儲過程變得更直觀一些。
2.  Parameters集合
那么,現在有了帶參數的存儲過程,但如何通過ADO來調用它呢?我們已經見到了如何用Command對象調用不帶參數的存儲過程,實際上,它們之間并沒有什么不同。不同之處在于Parameters集合的使用。
Parameters集合包含存儲過程中每個參數的Parameter對象。然而,ADO并不會自動地知道這些參數是什么,因此,必須用CreateParameter方法創建它們,采用下面的形式:
Set Parameter = Command.CreateParameter (Name, [Type], [Direction], [Size], [Value])
參數及說明如表9-3所示:
表9-3  CreateParameter方法的參數及說明
參 數
說 明

Name
參數名。這是Parameters集合中的參數名,不是存儲過程中的參數名。然而,使用相同的名字是一個好的做法

Type
參數的數據類型。可以是一個adDataType常數,詳見附錄

Direction
參數的方向,指明是參數向存儲過程提供信息,還是存儲過程向ADO返回信息。可以是下面的值之一:
adParamInput,參數是傳給存儲過程的輸入參數
adParamOutput,參數是從存儲過程檢索出的輸出參數
adParamInputOutput,參數可同時作為輸入和輸出參數
adParamReturnValue,該參數包含存儲過程返回的狀態

Size
參數長度。對于固定長度的類型,比如整型,該值可以忽略

Value
參數的值

一旦創建了參數就可以將其追加到Parameters集合中,例如:
Set parValue = cmdUpdate.CreateParameter("@Type", adVarWChar, adParamInput, _
                                                               12, "Business")
cmdUpdate.Parameters.Append parValue

Set parValue = cmdUpdate.CreateParameter("@Percent", adCurrency, _
                                                               adParamInput,  , 10)
cmdUpdate.Parameters.Append parValue
沒有必要顯式地創建一個對象去保存參數,缺省的Variant類型已經可以工作得相當好。如果不想創建一個變量,也可以走捷徑,例如下面的代碼:
cmdUpdate.Parameters.Append =  _
cmdUpdate.CreateParameter("@Percent", adCurrency, adParamInput,  , 10)
       這使用CreateParameter方法返回一個Parameter對象,并用Append方法接收它。這種方法比使用變量運行得快,卻加長了代碼行,可讀性比較差。可以根據自己的愛好選擇其中一種方法。
       參數加到Parameters集合后,就保留在其中,因此,不一定在創建參數時就為每個參數賦值。可以在命令運行前的任何時候設置參數的值。例如:
cmdUpdate.Parameters.Append =  _
cmdUpdate.CreateParameter("@Percent", adCurrency, adParamInput)

       cmdUpdate.Parameters("@Percent") = 10
前一章提到了訪問集合中的值有好幾種方法,Parameters集合并沒有什么不同。上面的例子使用參數的名字在集合中檢索參數,也可以使用索引號進行檢索:
cmdUpdate.Parameters(0) = 10
以上代碼對參數集合中第一個(Parameters集合從0開始編號)參數進行了賦值。使用索引號比使用名字索引速度快,但很顯然使用名字使代碼更易讀。
重點注意Parameters集合中參數的順序必須與存儲過程中參數的順序相一致。
運行帶參數的命令
一旦加入參數,就可立即運行命令,同時這些參數的值傳入存儲過程。現在可用一個友好的網頁去更新用戶選擇的類型的書價。例如,假設有一個名為UpdatePrices.asp的網頁,其運行時的界面如圖9-2所示:

圖9-2  UpdatePrices.asp網頁運行時的界面
通過數據庫中獲取書類型的列表,可以很輕松地動態創建該頁面。首先要做的是包含文件Connection.asp,該文件包含了連接字符串(保存在變量strConn中)以及對ADO常數的引用,這在前面的章節已經討論過。
<!-- #INCLUDE FILE="../Include/Connection.asp" -->
接下來,可以創建一個窗體(在這兒不顯示大量文本,僅僅用一個樣本文件)。該窗體調用一個名為StoreProcedure.asp的文件。
<FORM NAME="UpdatePrices" Method="post" ACTION="StoredProcedure.asp">
<TABLE>
<TR>
  <TD>Book Type:</TD>
  <TD><SELECT NAME="lstTypes"></TD>
現在開始編寫ASP腳本從title表中讀取書的類型。使用一個SQL字符串只返回唯一的書類型,然后將返回值放到HTML的OPTION標記中:
<%
  Dim recTypes
  Dim sDQ

  sDQ = Chr(34)          ' double quote character

  Set recTypes = Server.CreateObject("ADODB.Recordset")

  recTypes.Open "usp_BookTypes", strConn

  While Not recTypes.EOF
    Response.Write "<OPTION VALUE=" & sDQ & recTypes("type") & sDQ & _
                   ">" & recTypes("type")
    recTypes.MoveNext
  Wend

  recTypes.Close
  Set recTypes = Nothing
  
%>
顯示書的類型后,接著可以構建窗體的其他部分,包括一個允許用戶輸入書價變化百分數的文本框。
</SELECT>
  </TD>
</TR>
<TR>
  <TD>Percent Value</TD>
  <TD><INPUT NAME="txtPercent" TYPE="TEXT"></TD>
</TR>
</TABLE>
<P>
<INPUT TYPE="submit" VALUE="Run Query">
</FORM>
現在看一下Run Query按鈕調用的ASP文件StoredProcedure.asp。首先,聲明變量并從調用窗體取出書的類型和百分數。
Dim cmdUpdate
Dim lRecs
Dim sType
Dim cPercent

' Get the form values
sType = Request.Form("lstTypes")
cPercent = Request.Form("txtPercent")
現在可以向用戶顯示一些確認信息,告訴他們將發生什么。
' Tell the user what's being done
Response.Write "Updating all books"
If sType <> "all" Then
  Response.Write " of type <B>" & sType & "</B>"
End If
Response.Write " by " & cPercent & "%<P>"
現在重新回到代碼內部,在此創建Command對象和參數。
Set cmdUpdate = Server.CreateObject("ADODB.Command")

With cmdUpdate
  .ActiveConnection = strConn
  .CommandText = "usp_UpdatePrices"
  .CommandType = adCmdStoredProc
利用從前面網頁的窗體中提取的數據值,使用快捷方法創建和增加參數。
' Add the parameters
.Parameters.Append .CreateParameter ("@Type", adVarWChar, adParamInput, _
12, sType)
.Parameters.Append .CreateParameter ("@Percent", adCurrency, _
adParamInput, , cPercent)
現在,運行存儲過程。
' Execute the command
  .Execute lRecs, , adExecuteNoRecords
End With
為了確認,可以告訴用戶已經更新多少條記錄。
  ' And finally tell the user what's happened
  Response.Write "Procedure complete. " & lRecs & " were updated."

  Set cmdUpdate = Nothing
%>
這樣就有了兩個簡單界面。前者創建了一個供選擇的項目列表,后者使用其中某個項目值更新數據。這是許多需要顯示和更新數據的ASP頁面的基礎。
3.  傳遞數組參數
Parameters參數集合一般來說比較好用,但有時稍有麻煩(尤其對于新手)。好在有一種快捷方法,使用Execute方法的Parameters參數。例如,調用存儲過程usp_UpdatePrices,但不使用Parameters集合。
創建一個Command對象,并同前面一樣設置其屬性。
' Set cmdUpdate = Server.CreateObject("ADODB.Command")

' Set the properties of the command
With cmdUpdate
       .ActiveConnection = strConn
       .commandText = "usp_UpdatePrices"
       .commandType = adCmdStroreProc
但這里正是差異所在。我們僅是通過Execute方法傳遞參數給存儲過程,而不是創建參數并添加到集合中。
       ' Execute the command
       .Execute lngRecs, Array(strType, curPercent), adExecuteNoRecords
End With
這里使用了Array函數,將單個變量轉換為數組,以適于方法調用。這種方法當然也有缺點:
· 只能使用輸入參數。因為不能指定參數的類型和傳遞方向,而缺省為輸入參數。
· 如果要多次調用存儲過程,這種方法速度就比較慢,因為ADO將向數據存儲詢問參數的內容及數據類型。
集合方法和數組方法之間在速度上的差異非常之小,幾乎可以忽略。所以,如果只有輸入參數,可隨便使用哪一種。實際上,人們更喜歡使用Parameters集合的方法,盡管它稍為繁瑣,但是使參數的屬性更加明確。
4.  輸出參數
我們已經知道如何獲得受命令影響的記錄數,如果需要更多信息,卻又不想返回一個記錄集,怎么辦?也許想從存儲過程中返回兩個或三個值,但又不想費心創建一個記錄集。在這時,可以定義一個輸出參數,其值由存儲過程提供。
例如,對于更新書價的程序,如果想在更新之后找出最高價格,可將存儲過程改成:
CREATE PROCEDURE usp_UpdatePricesMax
       @Type           Char(12),
       @Percent              Money,
       @Max            Money           OUTPUT
AS
BEGIN
       UPDATE Titles
       SET       Price = Price * (1 + @Percent / 100)
       WHERE  Type = @Type

       SELECT @Max = MAX(Price)
       FROM    Titles
END
這只是在執行更新后運行了一個簡單的SELECT語句,并將值賦給輸出參數。
現在可以改寫StroreProcedure.asp的代碼從而獲取變量@MAX的值。
<%
  Dim cmdUpdate
  Dim lngRecs
  Dim strType
  Dim curPercent
  Dim curMax

  ' Get the form values
  strType = Request.Form("lstTypes")  
  curPercent = Request.Form("txtPercent")

  ' Tell the user what's being done
  Response.Write "Updating all books" & " of type <B>" & strType & "</B>" & _
" by " & curPercent & "%<P>"

  Set cmdUpdate = Server.CreateObject("ADODB.Command")

  ' Set the properties of the command
  With cmdUpdate
    .ActiveConnection = strConn
    .CommandText = "usp_UpdatePricesMax"
    .CommandType = adCmdStoredProc
我們只是在集合中加入了另一個參數,但這次指定為輸出參數。注意它并沒有賦值,因為其值將由存儲過程提供,記住這是一個輸出參數。
    ' Add the parameters
    .Parameters.Append .CreateParameter("@Type", adVarWChar, adParamInput, _
12, strType)
    .Parameters.Append .CreateParameter("@Percent", adCurrency, _
adParamInput, , curPercent)
              .Parameters.Append.CreateParameter("@Max", adCurrency, adParamOutput)

   ' Execute the command
    .Execute lngRecs, , adExecuteNoRecords
一旦執行這個過程,就可從集合中取得該值。
       ' Extract the output parameter, which the stored
       ' procedure has supplied to the parameters collection
       curMax = .Parameters("@Max")
  End With


  ' And finally tell the user what's happened
  Response.Write "Procedure complete. " & lngRecs & _
" records were updated.<P>"
         Response.Write "The highest price book is now " & _
                                   FormatCurrency(curMax)

  Set cmdUpdate = Nothing
%>
如果有不止一個輸出參數,可用相同的方法訪問。可以使用參數名或索引號取出集合中的值。

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

国产午夜成人免费看片无遮挡_日本免费xxxx色视频_免费人成网上在线观看_黄网址在线永久免费观看

  • <label id="pxtpz"><meter id="pxtpz"></meter></label>
      1. <span id="pxtpz"><optgroup id="pxtpz"></optgroup></span>

        色婷婷亚洲精品| 99国产精品视频免费观看| 六月丁香婷婷久久| 91精品国产福利| 日韩中文字幕区一区有砖一区| 欧美日韩一区二区欧美激情| 无吗不卡中文字幕| 日韩午夜精品视频| 国产九色精品成人porny | 欧美久久久影院| 麻豆精品在线观看| 国产日韩欧美一区二区三区乱码| 国产999精品久久久久久| 亚洲色欲色欲www在线观看| 欧美性一区二区| 蓝色福利精品导航| 中文字幕一区二| 91精品国产综合久久香蕉的特点 | 99热国产精品| 日韩av在线播放中文字幕| 国产亚洲精品aa| 一本久道中文字幕精品亚洲嫩| 亚洲成人免费av| 久久久国产一区二区三区四区小说| 成人黄色综合网站| 奇米色一区二区| 中文字幕亚洲视频| 精品欧美黑人一区二区三区| 97精品国产97久久久久久久久久久久| 亚洲国产日韩a在线播放性色| 精品美女在线播放| 欧美日韩一区二区三区四区五区 | 欧美一区二区精品| 色综合久久88色综合天天免费| 男人的天堂久久精品| 中文字幕中文字幕在线一区| 精品少妇一区二区三区日产乱码 | 国产自产v一区二区三区c| 欧美精品一二三| 国产.欧美.日韩| 性做久久久久久免费观看欧美| 中文字幕+乱码+中文字幕一区| 欧美军同video69gay| 成人免费视频caoporn| 蜜臀99久久精品久久久久久软件| 最近中文字幕一区二区三区| 久久久激情视频| 日韩欧美中文字幕精品| 欧美日韩免费视频| 色婷婷久久综合| 91啪九色porn原创视频在线观看| 国产中文一区二区三区| 美女网站色91| 日韩高清电影一区| 亚洲成人你懂的| 亚洲午夜一区二区| 亚洲综合在线五月| 一区二区在线免费观看| 亚洲免费观看高清完整版在线观看熊| 日本一区二区三区国色天香| 国产午夜精品福利| 国产色婷婷亚洲99精品小说| 久久日韩粉嫩一区二区三区| 久久综合九色综合97婷婷女人| 欧美变态tickle挠乳网站| 欧美一卡二卡在线| ww亚洲ww在线观看国产| 国产亚洲一区二区三区| 国产欧美日韩另类一区| 国产精品天美传媒| 一区二区视频免费在线观看| 亚洲国产一二三| 美女视频黄 久久| 国产精品456| 91麻豆免费视频| 欧美猛男男办公室激情| 日韩午夜精品视频| 中文字幕免费一区| 亚洲欧美日韩系列| 亚洲v精品v日韩v欧美v专区| 日日夜夜精品视频免费| 韩国一区二区三区| 99国产精品久久久| 欧美一区二区三区系列电影| 国产亚洲一二三区| 亚洲亚洲人成综合网络| 久久国产精品一区二区| 成人app下载| 欧美久久久久久久久久| 久久久久久久综合色一本| 综合久久久久久| 日韩极品在线观看| 粉嫩aⅴ一区二区三区四区五区| 97久久精品人人做人人爽50路 | 色爱区综合激月婷婷| 欧美肥大bbwbbw高潮| 久久婷婷国产综合精品青草| 中文字幕综合网| 久久精品国产免费看久久精品| 国产aⅴ精品一区二区三区色成熟| 色婷婷狠狠综合| 久久综合狠狠综合| 欧美日韩一卡二卡三卡 | 日本亚洲欧美天堂免费| 精品一区二区三区免费毛片爱| 久久欧美一区二区| 欧美婷婷六月丁香综合色| 蜜桃视频一区二区三区| 亚洲激情一二三区| 国产精品激情偷乱一区二区∴| 欧美成人bangbros| 欧美日韩中文一区| 日本韩国欧美三级| 色综合久久中文综合久久牛| 久久99国产精品尤物| 午夜成人免费电影| 视频一区中文字幕| 日韩国产欧美在线播放| 国模大尺度一区二区三区| 久久精品视频免费观看| 国产盗摄女厕一区二区三区 | 日韩精品1区2区3区| 一区二区日韩电影| aaa亚洲精品| 欧美午夜不卡视频| 国产精品久久三| 久久精品免费观看| 欧美天堂一区二区三区| 亚洲人成电影网站色mp4| 国产精品一区二区男女羞羞无遮挡| 欧美性色aⅴ视频一区日韩精品| 国产精品欧美久久久久一区二区| 经典一区二区三区| 精品久久久久久久久久久久久久久久久 | 色婷婷综合久久久中文一区二区| 一本色道久久综合亚洲91| 国产欧美日韩精品一区| 美女性感视频久久| 欧美一区二区三区精品| 亚洲伊人色欲综合网| 欧美综合久久久| 亚洲高清在线精品| 欧美精品tushy高清| 日日夜夜精品免费视频| 日韩一区二区三区观看| 美女一区二区久久| 精品黑人一区二区三区久久| 成人午夜免费av| 国产精品久久久久影院| 91看片淫黄大片一级在线观看| 国产亚洲一区字幕| 精品国产一区久久| 欧美一区二区三区喷汁尤物| 亚洲欧美一区二区三区久本道91| 国产成人精品免费视频网站| 91精品国产91综合久久蜜臀| 蜜桃av一区二区| 欧美成人女星排行榜| 国内成+人亚洲+欧美+综合在线| 精品成人一区二区三区| 国产高清视频一区| 亚洲免费av在线| 欧美一区二区精品久久911| 狠狠色丁香久久婷婷综合_中| 久久精品免费在线观看| 91香蕉国产在线观看软件| 香蕉影视欧美成人| 久久久久久97三级| 99久久精品久久久久久清纯| 亚洲一二三区视频在线观看| 日韩一区二区不卡| 成人国产在线观看| 视频一区二区欧美| 国产精品网站导航| 欧美人动与zoxxxx乱| 国产激情精品久久久第一区二区 | 九九在线精品视频| 亚洲欧洲另类国产综合| 欧美日韩国产色站一区二区三区| 精品一区二区三区在线观看国产| 欧美极品另类videosde| 欧美午夜电影网| 国产凹凸在线观看一区二区| 亚洲成人av一区二区三区| 国产欧美日韩卡一| 日韩一区二区中文字幕| 色综合一区二区| 国产精品综合一区二区三区| 亚洲成人tv网| 亚洲人成影院在线观看| 国产日韩高清在线| 91精品久久久久久久久99蜜臂| 9l国产精品久久久久麻豆| 麻豆免费看一区二区三区| 一区二区三区日本| 国产精品免费看片| 26uuu国产一区二区三区| 欧美一级片免费看| 在线免费观看视频一区| 不卡av电影在线播放|