版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
命令對象
8.4.1命令對象的屬性和方法
命令對象既可以利用已經(jīng)創(chuàng)建的連接對象來創(chuàng)建,也可以不用先創(chuàng)建連接對象就直接使用命令對象,只需設(shè)置命令對象的ActiveConnection屬性為一個連接字串即可,這時ADO將自動創(chuàng)建一個隱含的連接對象,但不會分配一個對象變量給它。因此如果多個命令對象要使用相同的連接,則應(yīng)明確地創(chuàng)建并打開一個連接對象,這樣就可將連接對象賦給該變量。1.創(chuàng)建命令對象使用命令對象之前,必須先用Server.Createobject方法創(chuàng)建該對象。可以使用下列腳本創(chuàng)建命令對象:<%'創(chuàng)建命令對象Setcomm=Server.Createobject("ADODB.Command")%>2.命令對象的屬性通常在使用命令對象之前需要對命令對象的屬性進行必要的設(shè)置,以便對該對象進行相應(yīng)的操作。下面分別介紹命令對象的屬性。
(1)ActiveConnection屬性在執(zhí)行命令對象的命令之前,必須先設(shè)置ActiveConnection屬性,否則將發(fā)生錯誤。
ActiveConnection屬性設(shè)置或返回命令對象所使用的連接對象??梢詫ctiveConnection屬性設(shè)置為一個已經(jīng)存在并打開的連接對象,也可以為其定義一個連接使用的有效字串。(2)CommandText屬性將命令對象與連接對象關(guān)聯(lián)后,可以使用CommandText屬性設(shè)置數(shù)據(jù)庫查詢字串,并在執(zhí)行命令對象的Execute方法時將該字串提交給數(shù)據(jù)提供者處理。
通常該屬性為SQL語句,但也可以是一個表名或是一個StoredProcedure名。
設(shè)置了CommandText屬性后,就可調(diào)用命令對象的Execute方法來執(zhí)行由CommandText屬性值所指定的操作。(3)CommandType屬性
CommandType屬性定義如何使用CommandText,分別為adCmdText,adCmdTable,adCmdStoredProc及adCmdUnknown。與前面在講連接對象的Execute方法中的相應(yīng)的選項的含義相同。設(shè)置該屬性可優(yōu)化CommandText屬性的計算。如果沒有設(shè)置該屬性值,則ADO因不知CommandText屬性值是SQL語句、表還是存儲過程,需要花時間去識別而影響系統(tǒng)的執(zhí)行速度。(4)CommandTimeOut屬性該屬性定義命令對象終止并產(chǎn)生錯誤之前需等待的時間,默認為30秒。(5)Prepared屬性
Prepared屬性決定數(shù)據(jù)提供者在首次執(zhí)行命令對象前是否保存命令的編譯版本,該屬性是一個布爾型值。當Prepared屬性設(shè)置為True時,將會把首次執(zhí)行CommandText屬性中指定查詢的結(jié)果編譯并保存下來,在后繼命令的執(zhí)行中,數(shù)據(jù)提供者將直接使用已編譯好的命令版本,從而提高執(zhí)行性能。如果該屬性設(shè)置為False,則將直接執(zhí)行命令對象而不創(chuàng)建編譯版本。在實際使用中有些數(shù)據(jù)提供者可能不支持命令的預(yù)編譯,此時當該屬性設(shè)置為True時,ADO將返回錯誤。3.命令對象的方法(1)CreateParameter方法:用來產(chǎn)生一個新的Parameter對象,并在執(zhí)行之前加到命令對象的Parameters集合中。返回值為創(chuàng)建的Parameter對象。Parameter對象表示傳遞給SQL語句或存儲過程的一個或多個參數(shù)。
CreateParameter方法的語法格式如下:SetParam=comm.CreateParameter(name,type,direction,size,value)其中的各個參數(shù)均為可選項,具體說明如下:
Name:是一個字符串,指定Parameter對象的名稱,該名稱為參數(shù)的引用名,在后面引用參數(shù)的值時會有用。Type:是一個長整型值,指定Parameter對象的數(shù)據(jù)類型。例如整數(shù)為adInteger;Direction:是一個長整型值,指定參數(shù)是輸入還是輸出,相應(yīng)的值為:adParamInput(指示輸入?yún)?shù))、adParamOutput(指示為輸出參數(shù))、adParamReturnValue(指示為返回值)、adParamUnknown(指示參數(shù)類型無法確定)、adParamInputOutput(指示為輸入/輸出參數(shù));Size:是一個長整型值,指定參數(shù)的最大長度或最大的值。Value:是一個變體型值,指定參數(shù)的值??梢詫⒏鱾€選項分開來寫,例如下面的兩種寫法是等價的。Setparam=comm.CreateParameter(name,type,direction,size,value)或Setparam=comm.CreateParameter(name,type,direction,size)param.value=value
下面的方法其靈活性更大。大家請注意,在使用了CreateParameter方法后只是建立了新的parameter對象,還需使用Parameter對象的Append方法將該參數(shù)傳遞給命令對象。(2)Execute方法調(diào)用命令對象的Execute方法用來執(zhí)行由CommandText屬性值所指定的查詢、SQL語句或存儲過程。有以下兩種格式:按行返回的格式:SetRecordset=Command.Execute(RecordsetsAffected,Parameters,Options)沒有返回的格式:Command.ExecuteRecordsetsAffected,Parameters,Options其中參數(shù)說明如下:RecordsAffected:可選,為長整型變量,返回操作所影響的記錄數(shù)。Parameters:可選,為變體整型組,返回使用SQL語句傳送的參數(shù)值。(用該參數(shù)傳送時輸出參數(shù)將不返回正確值)Options:可選,為長整型值,定義數(shù)據(jù)提供者如何理解命令對象的CommandText屬性。4.命令對象數(shù)據(jù)集合命令對象所提供的數(shù)據(jù)集合包括Parameters數(shù)據(jù)集合及Properties數(shù)據(jù)集合。前者表示所要傳遞的參數(shù),后者表示命令對象的所有屬性集合。命令對象是通過Parameter對象來傳遞一個參數(shù),而Parameters數(shù)據(jù)集合則是此命令對象所有Parameter對象的集合。(1)Parameters數(shù)據(jù)集合Parameters數(shù)據(jù)集合所提供的方法與屬性有Count屬性、Append方法、Delete方法、Refresh方法與Item方法等,分述如下:Count屬性:該屬性可用來取得Parameters數(shù)據(jù)集合中所包含的Parameter對象個數(shù)。Append方法:該方法可以增加一個Parameter對象到Parameters數(shù)據(jù)集合中。
Delete方法:該方法可以從Parameters數(shù)據(jù)集合中刪除一個Parameter對象。Refresh方法:該方法可以重新取得Parameters數(shù)據(jù)集合中所包含的所有Parameter對象。Item方法:該方法可以用來取得Parameters數(shù)據(jù)集合中所包含的所有Parameter對象。該方法有一個參數(shù),表示所要取得的Parameter對象索引值,這個索引值通常介于0到Count屬性值-1之間。需要注意的是使用Command對象的Parameters集合上的Refresh方法可為在Command對象中指定的存儲過程或者參數(shù)化查詢檢索提供者端參數(shù)信息。對于不支持存儲過程調(diào)用或參數(shù)化查詢的提供者來說,集合將為空。在調(diào)用Refresh方法之前應(yīng)該將Command對象的ActiveConnection屬性設(shè)置為有效的
Connection對象,將CommandText屬性設(shè)置為有效命令,并且將CommandType屬性設(shè)置為adCmdStoredProc。
如果在調(diào)用Refresh方法之前訪問Parameters集合,ADO將自動調(diào)用方法并填充集合。(2)Parameter對象Parameter對象負責所要傳遞參數(shù)的相關(guān)屬性,Name屬性、Value屬性、Type屬性及Attribute屬性等,分述如下:
Name屬性:該屬性表示對象屬性的名稱。Value屬性:該屬性表示表示參數(shù)的設(shè)置初值。Type屬性:該屬性表示對象屬性的數(shù)據(jù)類型,與Property對象的Type屬性相同。Attribute屬性:表示表示對象的特性。8.4.2命令對象的使用1.使用命令對象執(zhí)行SQL語句命令對象代表一個命令(例如,一個SQL查詢或一個SQL存儲過程)。在第8章“Activex數(shù)據(jù)對象”和第10章“使用記錄集”中,分別介紹了如何用連接對象的Execute方法和記錄集對象的Open方法執(zhí)行命令字符串。考慮下面這兩個例子:
RS.Open"SELECT*FROMconsumption",MyConnMyConn.Execute"UPDATEconsumptionSETyjfy=50"
這兩個例子都使用了SQL命令字符串。在第一個例子中,用命令字符串打開記錄集;在第二個例子中,執(zhí)行命令字符串來更新數(shù)據(jù)。
命令對象是對數(shù)據(jù)存儲執(zhí)行命令的對象。連接對象也有這樣的功能,但是連接對象在處理命令的功能上受到一定的限制,而命令對象是特別為處理命令的各方面問題而創(chuàng)建的。實際上,當從連接對象中運行一條命令時,已經(jīng)隱含地創(chuàng)建了一個命令對象。有時其它對象允許向命令傳入?yún)?shù),但在連接對象中不能指定參數(shù)的任何細節(jié)。使用命令對象允許指定參數(shù)以及輸出參數(shù)和命令執(zhí)行后的返回值的精確細節(jié)(比如,數(shù)據(jù)類型和長度)。代替命令字符串,可以使用命令對象。命令對象可以用來代表一個專門的命令。用命令對象的一個實例可以返回記錄集或執(zhí)行一個不返回記錄集的SQL命令,參看下面程序。程序
sample8-01.asp<!--#INCLUDEVIRTUAL="ADOVBS.inc"--><%SetMyConn=Server.CreateObject("ADODB.Connection")SetMyCommand=Server.CreateObject("ADODB.Command")MyConn.Open"dsn=vod;uid=sa;pwd=ser;"SetMyCommand.ActiveConnection=MyConnMyCommand.CommandText="UPDATEconsumptionSETyjfy=50"MyCommand.CommandType=adCMDTextMyCommand.ExecuteMyConn.Close%>在這個例子中,創(chuàng)建了命令對象MyCommand。接著,ActiveConnection屬性把命令和一個打開的連接聯(lián)系在一起。因為是在分配一個對象,所以需要用Set語句完成。CommandText屬性指定要執(zhí)行什么SQL語句。CommandType屬性指明該命令是一個命令的文本定義。最后,調(diào)用Execute方法執(zhí)行這個命令。命令對象也可用來返回一個記錄集。使用命令對象,可以通過兩種途徑返回記錄集,上面腳本中使用的是第一種途徑。另一種途徑采用了Execute()方法。如:
程序sample11-02.asp<!--#INCLUDEVIRTUAL="ADOVBS.inc"--><%SetMyConn=Server.CreateObject("ADODB.Connection")SetMyCommand=Server.CreateObject("ADODB.Command")MyConn.Open"dsn=vod;uid=sa;pwd=ser;"SetMyCommand.ActiveConnection=MyConnMyCommand.CommandType=adCMdTextMyCommand.commandText="SELECT*FROMmember"SetRS=MyCommand.Execute()RS.CloseMyConn.Close%>在這段腳本中,命令對象的Execute()方法被用來返回一個記錄集。注意因為該方法被用來返回結(jié)果所以要使用括號。用命令對象創(chuàng)建了記錄集對象RS后,就可以用標準的方式對它進行操作。也可以和一個已經(jīng)存在的記錄集一起使用命令對象,如下面程序:
程序sample11-03.asp<!--#INCLUDEVIRTUAL="ADOVBS.inc"--><%SetMyConn=Server.CreateObject("ADODB.Connection")SetMyCommand=Server.CreateObject("ADODB.Command")SetRs=Server.CreateObject("ADODB.RecordSet")MyConn.Open"dsn=vod;uid=sa;pwd=ser;“SetMyCommand.ActiveConnection=MyConnMyCommand.CommandType=adCMdTextMyCommand.commandText="SELECT*FROMmember"RS.OpenMyCommand,,3,3MyConn.Close%>用命令對象打開一個已經(jīng)存在的記錄集對象的好處是可以指定記錄集的游標和鎖定類型。在這個例子中,命令對象用來打開一個使用靜態(tài)游標和adLockOptimistic鎖定的記錄集。注意打開記錄集時如果使用了命令對象,那么就不需指定連接對象,命令對象即可決定該使用哪個連接。2.存儲過程及存儲過程體的創(chuàng)建
存儲過程的使用是命令對象得到應(yīng)用的一個領(lǐng)域。存儲過程(有時也稱存儲查詢)是存儲在數(shù)據(jù)庫中預(yù)先定義的SQL查詢語句。存儲過程邏輯駐留在存儲過程體中。(1)存儲過程的優(yōu)點使用命令對象有一個主要的優(yōu)點,就是可以和命令對象一起使用SQL存儲過程。當建設(shè)好一個站點后,應(yīng)盡可能的把SQL命令轉(zhuǎn)換為存儲過程。與其在ASP網(wǎng)頁內(nèi)部執(zhí)行SQL查詢,不如調(diào)用包含這些查詢的存儲過程。
使用SQL存儲過程的理由有很多:1)存儲過程被數(shù)據(jù)庫編譯過。這樣可以產(chǎn)生一個“執(zhí)行計劃”,因此數(shù)據(jù)庫確切地知道它將做什么,從而加快了過程的執(zhí)行速度。當一個SQL語句包含在存儲過程中時,服務(wù)器不必每次執(zhí)行它都要分析和編譯它,SQL存儲過程執(zhí)行起來比SQL命令文本快得多。2)存儲過程通常被數(shù)據(jù)庫高速緩存,這樣使它們運行得更快,因為此時不需要從磁盤中讀取它們。并非所有的數(shù)據(jù)庫都支持這種緩存機制,比如微軟的Access就不支持,而SQL
Server卻支持。3)通過指定數(shù)據(jù)庫中的表只能被存儲過程修改,可以確保數(shù)據(jù)更安全。這意味著具有潛在危險的SQL操作不會執(zhí)行。
4)可以避免將ASP代碼和冗長的SQL語句混在一起,從而使ASP代碼更易于維護。5)可以將所有SQL代碼集中存放于服務(wù)器。6)可以在存儲過程中使用輸出參數(shù),允許返回記錄集或其它的值。7)可以在多個網(wǎng)頁中調(diào)用同一個存儲過程,這使得站點易于維護。如果一個SQL語句需要做某些改動,只要做一次即可。8)可以在存儲過程中利用Transact-SQL的強大功能。一個SQL存儲過程可以包含多個SQL語句,可以使用變量和條件,可以在一個存儲過程內(nèi)引用其它存儲過程。這就意味著可以用存儲過程建立非常復(fù)雜的查詢,以非常復(fù)雜的方式更新數(shù)據(jù)庫。由于存儲過程有著極大的優(yōu)點,因此,在實際中能用存儲過程就要用存儲過程。
(2)存儲過程的基本語法規(guī)則1)局部變量局部變量保持存儲過程的中間值。當一個值在存儲過程中需要多次使用,或者某個查詢的結(jié)果需要在隨后的查詢中使用時,需要使用局部變量。在這些情形下,值被存儲在局部變量中,可以用于以后的使用。本地變量的名稱以“@”符號開頭,名稱中可以包含字符和數(shù)值。局部變量在使用前需要進行類型聲明。對局部變量進行賦值需要使用SELECT語句。SELECT可以從一個表中檢索出值并將其賦給某個變量,也可以給變量賦一個常量值。一個簡單的SELECT語句可以給多個局部變量賦值。
例如:
DECLARE@var1integer,@var2varchar(20)SELECT@var1=32,@var2='MyAge'
如果從SELECT查詢中沒有返回任何數(shù)據(jù),而SELECT又要將數(shù)據(jù)的值賦予局部變量,則該局部變量的值將不會發(fā)生改變。2)條件語句存儲過程中提供的條件語句包括:IF…ELSE語句和WHILE語句。在IF…ELSE語句中包含三個部分:布爾運算表達式,IF語句塊和ELSE語句塊。語法如下:IF(boolen_expr){statements}ELSE{statements}在IF或ELSE語句塊中可以有多條語句,用語句BEGIN和END來標志語句塊。WHILE語句可用于處理直到某個條件為TRUE前重復(fù)執(zhí)行的語句。語法如下:WHILE(boolen_expr)BEGINstatement(s)BREAKStatement(s)CONTINUEENDBEGIN和END語句標志循環(huán)體,BREAK語句結(jié)束循環(huán)的執(zhí)行(即走到END語句之后),CONTINUE語句將控制處理過程回到循環(huán)的開始處(即BEGIN語句的右邊)。
注意:如果有兩個或多個WHILE循環(huán)被嵌套,則內(nèi)部的BREAK退出的是次外層的循環(huán)。內(nèi)部循環(huán)結(jié)束之后的所有語句在內(nèi)部循環(huán)執(zhí)行之后才能繼續(xù)執(zhí)行。
3)GOTO語句在存儲過程的執(zhí)行中,語句是順序執(zhí)行的。GOTO語句則是用來打破這種語句執(zhí)行的順序,它立即跳到某條語句上執(zhí)行,而這條語句往往不緊跟在前一語句之后。GOTO語句與一個標志(Label)一起使用,該標志用來標識一條語句。4)RETURN語句RETURN語句用于無條件的退出存儲過程。RETURN之后的任何語句都不再執(zhí)行。RETURN語句可以給調(diào)用語句返回一個值,但不能返回NULL值。SQLServer經(jīng)常為存儲過程返回一個狀態(tài)值。如果成功地執(zhí)行,則返回一個0,如果出現(xiàn)了錯誤,則返回一個為負數(shù)的錯誤碼。5)使用游標(CURSOR)
在需要一行一行處理時,游標十分有用。游標可以打開一個結(jié)果集合(按照指定的標準選擇的行),并提供在結(jié)果集中一行一行處理的功能。基于游標的類型,可以對其進行回滾或者前進。一個存儲過程體中可以包含任意條TransactSQL語句。但是,下面的TransactSQL語句不能在任何存儲過程體中出現(xiàn):CREATEDEFAULTCREATETRIGGERCREATEPROCEDURECREATERULECREATEVIEW
在存儲過程中可以使用參數(shù),可以傳送和返回參數(shù),還可以得到一個返回值(從SQLRETURN語句)。(3)建立新的存儲過程新建存儲過程的過程和方法在第7章中已經(jīng)介紹過。例如,從MicrosoftSQLSever程序組中啟動ISQL/w。然后,在查詢窗口中即可輸入以下的文本:
CREATEPROCEDUREsp_myprocASSELECT*FROMmember單擊執(zhí)行查詢按鈕(看起來象一個綠色三角形)后,就建立了這個存儲過程。該存儲過程的名字是sp_myproc。
另外還可使用ASP腳本來創(chuàng)建存儲過程,例如下面程序用來創(chuàng)建存儲過程,返回節(jié)目單playbill表中節(jié)目編號為1的節(jié)目名稱。程序sample11-04.asp<%@LANGUAGE=VBScript%><!--#includefile="adovbs.inc"--><%DimStrSQLSetConn=Server.CreateObject("ADODB.Connection")Conn.open"driver={SQLServer};server=localhost;uid=sa;pwd=ser;database=vod"StrSQL="CREATEPROCEDUREoutjmmc(@jmmcvarcharOUTPUT)ASselect@jmmc=jmmcfromplaybillwherejmbh=1"Conn.ExecuteStrSQLResponse.Write"創(chuàng)建存儲過程成功"Conn.closeSetConn=Nothing%>3.使用命令對象調(diào)用存儲過程如果想以盡可能高效的方式從會員信息表member中取出所有記錄,并在一個ASP網(wǎng)頁中顯示會員信息,就應(yīng)該使用存儲過程。將存儲過程的名字作為命令文本,并設(shè)置相應(yīng)的類型。在下面的程序中調(diào)用sp_myproc以顯示所有會員名單。程序sample11-05.asp<!--#INCLUDEVIRTUAL="ADOVBS.inc"--><%SetMyConn=Server.CreateObject("ADODB.Connection")SetMyCommand=Server.CreateObject("ADODB.Command")MyConn.Open"driver={SQLServer};server=localhost;uid=sa;pwd=ser;database=vod"SetMyCommand.ActiveConnection=MyConnMyCommand.CommandType=adCMdStoredProcMyCommand.commandText="sp_myproc"SetRS=MyCommand.Execute()DOWHILENOTRS.EOFResponse.WriteRS("hy_name")&"<BR>“RS.MoveNextLOOPRS.CloseMyConn.Close%>這段腳本通過調(diào)用存儲過程sp_myproc取出記錄,并顯示表member中的所有記錄。當用命令對象調(diào)用存儲過程時,應(yīng)該把該命令對象的CommandType屬性設(shè)為adCMDStoredProc。CommandText屬性用來指定要調(diào)用的存儲過程。如果不調(diào)用ADOVBS.inc文件,也可以根據(jù)使用的ADO版本的不同在global.asa文件中引入<!--METADATA...-->參數(shù)。對照參數(shù)如下:(1)ADO2.7版本<!--METADATA
TYPE="TypeLib"
NAME="MicrosoftActiveXDataObjects2.7Library"
UUID="{EF53050B-882E-4776-B643-EDA472E8E3F2}"
VERSION="2.7"-->
(2)ADO2.6版本
<!--METADATA
TYPE="TypeLib"
NAME="MicrosoftActiveXDataObjects2.6Library"
UUID="{00000206-0000-0010-8000-00AA006D2EA4}"
VERSION="2.6"-->
(3)ADO2.5版本<!--METADATA
TYPE="TypeLib"
iveXDataObjects2.5Library"
UUID="{00000205-0000-0010-8000-00AA006D2EA4}"
VERSION="2.5"-->
4.使用返回狀態(tài)值用命令對象可以從一個存儲過程得到返回狀態(tài)值。例如,要統(tǒng)計member表中的會員總數(shù),效率最高的方法是建立一個存儲過程,如:CREATEPROCEDUREsp_CounthyASRETURN(SELECTCOUNT(*)FROMmember)
該存儲過程用SQL集合函數(shù)COUNT()計算member表中的會員總數(shù),并用RETURN語句返回這個數(shù)。要得到一個存儲過程的返回狀態(tài)值,必須為命令對象建立一個參數(shù),Parameters集合即為參數(shù)對象集合??梢杂妹顚ο蟮腃reateParameter()方法建立一個參數(shù),再用Append方法把這個參數(shù)添加到命令對象的Parameters集合中。如:程序sample11-06.asp<!--#INCLUDEVIRTUAL="ADOVBS.inc"--><%SetMyConn=Server.CreateObject("ADODB.Connection")SetMyCommand=Server.CreateObject("ADODB.Command")MyConn.Open"driver={SQLServer};server=localhost;uid=sa;pwd=ser;database=vod"SetMyCommand.ActiveConnection=MyConnMyCommand.CommandType=adCMdStoredProcMyCommand.CommandText="sp_Counthy"SetMyParam=Mycommand.CreateParameter("RetVal",adInteger,adParamReturnValue)MyCommand.Parameters.AppendMyParamMyCommand.Execute%> 一共有<%=MyCommand(“RetVal”)%>個會員注冊.<%MyConn.Close%>在這個腳本中,用CreateParameter()方法建立了一個參數(shù)對象。此例中CreateParameter()方法有三個參數(shù):第一個參數(shù)為新參數(shù)指定一個名字。第二個參數(shù)指定數(shù)據(jù)類型。最后,第三個參數(shù)指定新參數(shù)的類型。在此例中,常量adParamReturnValue指明該參數(shù)是一個返回參數(shù)。建立了任何新參數(shù)之后,都必須把它添加到命令對象的Parameters集合中。Append方法用來把新參數(shù)添加到這個集合中。命令執(zhí)行后,參數(shù)的值可以被取出。因為該參數(shù)是命令對象的Parameters集合中的一員,用MyCommand("RetVal")可以返回該參數(shù)的值。實際上,用以下的任何一個表達式都可以得到這個值:MyCommand("RetVal")MyCommand(0)MyCommand.Parameters("RetVal")MyCommand.Parameters(0)MyCommand.Parameters.Item("RetVal")MyCommand.Parameters.Item(0)
對所有的集合,都可以通過名字或順序號指定一個參數(shù)。5.參數(shù)集合和參數(shù)對象命令對象最好的應(yīng)用就是向內(nèi)駐程序或數(shù)據(jù)提供者的查詢命令發(fā)送參數(shù)。為了提供這一功能,命令對象包括一個參數(shù)對象的命令。使用CreateParameter方法,就能夠非常方便地利用內(nèi)駐程序提高運行速度。(1)使用輸出參數(shù)上一節(jié)中的程序sample8-17.asp演示了如何得到返回狀態(tài)值。從一個存儲過程取出輸出參數(shù)值與此非常相似。使用輸出參數(shù)的好處是輸出參數(shù)可以有一個或多個,而且可以是任何數(shù)據(jù)類型。例如,要輸出會員消費記錄表consumption中最高點播次數(shù)和最低點播次數(shù),可以使用下面的存儲程序:CREATEPROCEDUREsp_HighandLow1(@HighintOUTPUT,@LowintOUTPUT)ASSELECT@High=MAX(dbcs)FROMconsumptionSELECT@Low=MIN(dbcs)FROMconsumption這個存儲過程有兩個參數(shù)@High和@Low。@High為會員最高點播次數(shù),@Low為會員最低點播次數(shù)。調(diào)用該存儲過程,可以使用如下的腳本:程序sample8-18.asp<!--#INCLUDEVIRTUAL="ADOVBS.inc"--><%SetMyConn=Server.CreateObject("ADODB.Connection")SetMyCommand=Server.CreateObject("ADODB.Command")MyConn.Open"driver={SQLServer};server=localhost;uid=sa;pwd=ser;database=vod"SetMyCommand.ActiveConnection=MyConnMyCommand.CommandType=adCMdStoredProcMyCommand.CommandText="sp_HighandLow1"SetMyFirstParam=Mycommand.CreateParameter("High",adInteger,adParamOutPut)MyCommand.Parameters.AppendMyFirstParamSetMySecondParam=Mycommand.CreateParameter("Low",adInteger,adParamOutPut)MyCommand.Parameters.AppendMySecondParamMyCommand.Execute%><p>點播次數(shù)最多為:<%=MyCommand("High")%>次<p>點播次數(shù)最少為:<%=MyCommand("Low")%>次<%MyConn.Close%>在這個腳本中,用CreateParameter()方法創(chuàng)建了兩個參數(shù)對象,兩個參數(shù)都被定義為INT型。為了指明它們是輸出參數(shù),使用了常量adParamOutput。
又如,要輸出會員消費記錄表consumption中點播次數(shù)最多和點播次數(shù)最少的會員賬號(假定會員點播次數(shù)均不相同),可以使用下面的存儲程序:CREATEPROCEDUREsp_HighandLow2(@HighhyVARCHAR(30)OUTPUT,@LowhyVARCHAR(30)OUTPUT)ASSELECT@Highhy=hy_idFROMconsumptionwheredbcsin(SELECTMAX(dbcs)FROMconsumption)SELECT@Highhy=hy_idFROMconsumptionwheredbcsin(SELECTMIN(dbcs)FROMconsumption)GO調(diào)用該存儲過程,可以使用如下的腳本:程序:sample8-19.asp<!--#INCLUDEVIRTUAL="ADOVBS.inc"--><%SetMyConn=Server.CreateObject("ADODB.Connection")SetMyCommand=Server.CreateObject("ADODB.Command")MyConn.Open"driver={SQLServer};server=localhost;uid=sa;pwd=ser;database=vod"SetMyCommand.ActiveConnection=MyConnMyCommand.CommandType=adCMdStoredProcMyCommand.CommandText="sp_HighandLow2"SetMyFirstParam=Mycommand.CreateParameter("Highhy",adVarChar,adParamOutPut,30)MyCommand.Parameters.AppendMyFirstParamSetMySecondParam=Mycommand.CreateParameter("Lowhy",adVarChar,adParamOutPut,30)MyCommand.Parameters.AppendMySecondParamMyCommand.Execute%><p>點播次數(shù)最多為會員:<%=MyCommand("Highhy")%><p>點播次數(shù)最少為會員:<%=MyCommand("Lowhy")%><%MyConn.Close%>
這個腳本的結(jié)構(gòu)與上一個非常相似。在這個腳本中,用CreateParameter()方法創(chuàng)建的兩個輸出參數(shù)對象均被定義為VARCHAR型,為了指明它們是輸出參數(shù),使用了常量adParamOutput。最后在CreateParameter()方法中指定了每個參數(shù)的最大長度為30。注意的是當建立的參數(shù)是變長度數(shù)據(jù)類型,如VARCHAR型時,必須指定一個最大長度。
(2)使用輸入?yún)?shù)SQL存儲過程可以接收輸入?yún)?shù)。輸入?yún)?shù)能夠把數(shù)據(jù)傳遞給存儲過程。例如,在會員信息表member中保存了會員帳號和密碼?,F(xiàn)在建立一個檢查密碼的存儲過程sp_CheckPass來檢查會員是否輸入了合法的密碼??稍诓樵兎治銎鞔翱谥休斎胍韵麓鎯^程:CREATEPROCEDUREsp_CheckPass(@CHKidVARCHAR(30),@CHKPassVARCHAR(30),@ISValidCHAR(8)OUTPUT)ASIFEXISTS(SELECThy_idFROMmemberWHEREhy_id=@CHKidANDpasswd=@CHKPass)SELECT@ISValid="pass"ELSESELECT@ISValid="Invalid"GO這個存儲過程接收兩個輸入?yún)?shù):輸入?yún)?shù)@CHKId向存儲過程傳遞會員帳號;@CHKPass向存儲過程傳遞登陸密碼。如果會員擁有指定的密碼,輸出參數(shù)將返回“pass”,否則,返回“Invalid”。
現(xiàn)在用下面的程序調(diào)用存儲過程sp_CheckPass。程序sample8-20.asp
<!--#INCLUDEVIRTUAL="ADOVBS.inc"--><%SetMyConn=Server.CreateObject("ADODB.Connection")SetMyCommand=Server.CreateObject("ADODB.Command")MyConn.Open"driver={SQLServer};server=localhost;uid=sa;pwd=ser;database=vod"SetMyCommand.ActiveConnection=MyConnMyCommand.CommandType=adCMdStoredProcMyCommand.CommandText="sp_CheckPass"'存儲過程名稱SetMyFirstParam=Mycommand.CreateParameter("CHKid",adVarChar,adParamInput,30)'創(chuàng)建輸入?yún)?shù)對象MyCommand.Parameters.AppendMyFirstParam'把參數(shù)加到參數(shù)集合SetMySecondParam=Mycommand.CreateParameter("CHKPass",adVarChar,adParamInput,30)MyCommand.Parameters.AppendMySecondParamSetMyThirdParam=Mycommand.CreateParameter("ISValid",adChar,adParamOutput,8)'創(chuàng)建返回參數(shù)對象MyCommand.Parameters.AppendMyThirdParamMyCommand("CHKId")="0001"'取得輸入?yún)?shù)MyCommand("CHKPass")="marry"MyCommand.Execute'執(zhí)行存儲過程%>TheCheckResultis<%=MyCommand("ISValid")%><%MyConn.Close'關(guān)閉數(shù)據(jù)庫連接%>本例中用CreateParameter()方法建立了三個參數(shù)對象,其中兩個輸入?yún)?shù),一個輸出參數(shù)。建立了任何新參數(shù)之后,都必須把它添加到命令對象的Parameters集合中。Append方法用來把新參數(shù)添加到這個集合中。最后,調(diào)用Execute方法執(zhí)行存儲過程。在這個例子中,帳號“0001”和密碼“marry”被傳遞給存儲過程。如果表中存在這個名字——密碼組合,則報告該密碼為Pass,否則報告該密碼為Invalid。6.取出參數(shù)信息當需要用到一個存儲過程,但是又不知道該存儲過程需要什么參數(shù)時,例如不知道參數(shù)的數(shù)據(jù)類型或參數(shù)的大小,那么如何確定這些信息呢?下面的腳本可以得到一個存儲過程sp_myproc所使用的參數(shù)的有關(guān)信息。
程序sample8-21.asp<!--#INCLUDEVIRTUAL="ADOVBS.inc"--><%SetMyConn=Server.CreateObject("ADODB.Connection")SetMyCommand=Server.CreateObject("ADODB.Command")MyConn.Open"dsn=vod;uid=sa;pwd=ser;"SetMyCommand.ActiveConnection=MyConnMyCommand.CommandType=adCMdStoredProcMyCommand.CommandText="sp_myproc"MyCommand.Parameters.Refresh%><HTML><HEAD><TITLE>ParameterInformation</TITLE></HEAD><BODY><TABLEBORDER=1><CAPTION>ParameterInformation</CAPTION><TR><TH>ParameterName</TH><TH>DATATYPE</TH><TH>DIRECTION</TH><TH>SIZE</TH></TR><%fori=0toMyCommand.Parameters.count-1%><TR><TD><%=MyCommand.Parameters(i).name%></TD><TD><%=MyCommand.Parameters(i).type%></TD><TD><%=MyCommand.Parameters(i).direction%></TD><TD><%=MyCommand.Parameters(i).value%></TD></TR><%NextMyConn.Close%></TABLE></BODY></HTML>這個例子顯示了存儲過程sp_myproc的所有參數(shù)的有關(guān)信息。每個參數(shù)的名字、數(shù)據(jù)類型、說明和大小被顯示在一個表中(一個參數(shù)的說明指明了該參數(shù)是輸入?yún)?shù)、輸出參數(shù)或是返回狀態(tài)值)。要顯示另一個存儲過程的信息,只要替換存儲過程名即可。這個例子中的重要語句MyCommand.Parameters.Refresh。當這個語句執(zhí)行時,該存儲過程的參數(shù)的有關(guān)信息被從數(shù)據(jù)庫中取出。該程序運行結(jié)果見圖8-18。這個腳本不返回常量,它返回的是原始值。要解釋這個腳本的返回值,需要參考包含文件ADOVBS.inc。在這個文件中,原始值與正確的常量相對應(yīng)。圖8-18sample8-20.asp運行結(jié)果本
章
小
結(jié)本章簡要描述了Activex數(shù)據(jù)對象(ADO)、Connection對象、Recordset對象及Command對象的屬性、方法和集合,以及如何在ASP中使用這三大對象來訪問和操作數(shù)據(jù)庫。ActiveX數(shù)據(jù)對象(ADO)可用來將數(shù)據(jù)庫訪問添加到Web頁中,編寫簡潔和可升級腳本
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年菏澤家政職業(yè)學(xué)院單招職業(yè)技能考試備考試題含詳細答案解析
- 2026年安徽商貿(mào)職業(yè)技術(shù)學(xué)院單招綜合素質(zhì)筆試備考試題含詳細答案解析
- 2026貴州民族大學(xué)招聘52人考試重點題庫及答案解析
- 2026年江西建設(shè)職業(yè)技術(shù)學(xué)院高職單招職業(yè)適應(yīng)性測試備考試題及答案詳細解析
- 2026四川廣安市前鋒區(qū)財政局招聘勞務(wù)派遣制從事相關(guān)專業(yè)施工圖設(shè)計評審工作者1人參考考試題庫及答案解析
- 2026年湖北國土資源職業(yè)學(xué)院單招綜合素質(zhì)筆試參考題庫含詳細答案解析
- 2026年山東藥品食品職業(yè)學(xué)院單招綜合素質(zhì)筆試模擬試題含詳細答案解析
- 2026年明達職業(yè)技術(shù)學(xué)院單招職業(yè)技能考試備考題庫含詳細答案解析
- 2026年貴州電子商務(wù)職業(yè)技術(shù)學(xué)院單招職業(yè)技能考試模擬試題含詳細答案解析
- 2026年貴州工貿(mào)職業(yè)學(xué)院單招綜合素質(zhì)筆試參考題庫含詳細答案解析
- 2026福建閩投永安抽水蓄能有限公司招聘6人備考題庫(含答案詳解)
- 2026年龍華消防巡查員考試題庫附答案
- 2025年山東省濟南市中考英語真題卷含答案解析
- 2024年陜西藝術(shù)職業(yè)學(xué)院輔導(dǎo)員考試筆試題庫附答案
- 2025-2030中國銅箔市場產(chǎn)銷規(guī)模分析與未來發(fā)展戰(zhàn)略規(guī)劃研究報告
- 施工網(wǎng)格化管理方案
- 2026年醫(yī)院衛(wèi)生院家庭醫(yī)生簽約服務(wù)工作實施方案
- 2026年九字對聯(lián)帶橫批(400副)
- 低空經(jīng)濟應(yīng)用場景:創(chuàng)新與挑戰(zhàn)
- 電氣故障排查與處理技巧
- 2025醫(yī)療器械安全和性能基本原則清單
評論
0/150
提交評論