Posted: 2005/2月/16 11:54上午 | IP記錄
|
|
|
使用命令對像
命令對像代表一個命令(例如,一個SQL查詢或一個SQL存儲過程)。第22章,「Activex數據對像」,和第23章,「使 用記錄集」,分別介紹了如何用連接對象的Execute方法和記錄集對象的Open方法執行命令字符串。考慮下面這兩個例子:
RS.Open 「SELECT * FROM Mytable」,MyConn
MyConn.Execute 「UPDATE Mytable SET Mycolumn=』Hello』」
這兩個例子都使用了SQL命令字符串。在第一個例子中,用命令字符串打開記錄集。在第二個例子中,執行命令字符串來更新數據。
代替命令字符串,你可以使用命令對象。命令對象可以用來代表一個專門的命令。你可以用命令對象的一個實例返回記錄集或執行一個不 返回記錄集的SQL命令。這裡有一個例子:
<!--#INCLUDE VIRTUAL=」ADOVBS.inc」-->
<%
Set MyConn=Sever.CreateObject(「ADODB.Connection」)
Set MyCommand=Sever.CreateObject(「ADODB.Command」)
MyConn.Open 「FILEDSN=d:\Program Files\
Common Files\ODBC\Data Sources\MyData.dsn
Set MyCommand.ActiveConnection=MyConn
MyCommand.CommandText=」UPDATE Mytable SET Mycolumn=』Hello』」
MyCommand.CommandType=adCMDText
MyCommand.Execute
MyConn.Close
%>
在這個例子中,創建了命令對象的一個實例。接著,ActiveConnection屬性把命令和 一個打開的連接聯繫在一起。(用Set語句完成這個任務,因為你是在分配一個對象。)CommandText屬性指定要執行什麼 SQL語句。CommandType屬性指明該命令是一個命令的文本定義。最後,調用Execute方法執行這個命令。
在這個例子中,命令對像用來返回一個記錄集。但是,使用命令對象,你可以通過兩種途徑返回記錄集。這是第一種途徑:
<!--#INCLUDE VIRTUAL=」ADOVBS.inc」-->
<%
Set MyConn=Sever.CreateObject(「ADODB.Connection」)
Set MyCommand=Sever.CreateObject(「ADODB.Command」)
MyConn.Open 「FILEDSN=d:\Program Files\
Common Files\ODBC\Data Sources\MyData.dsn
Set MyCommand.ActiveConnection=MyConn
MyCommand.CommandType=adCMdText
MyCommand.commandText=」SELECT * FROM Mytable」
Set RS=MyCommand.Execute()
RS.Close
MyConn.Close
%>
在這段腳本中,命令對象的Execute()方法被用來返回一個記錄集。注意引號的使用,因為該方法被用來返回結果。用命令對像 創建了記錄集對象的一個實例後,你可以用標準的方式操作它。
你也可以和一個已經存在的記錄集一起使用命令對象,像這樣:
<!--#INCLUDE VIRTUAL=」ADOVBS.inc」-->
<%
Set MyConn=Sever.CreateObject(「ADODB.Connection」)
Set MyCommand=Sever.CreateObject(「ADODB.Command」)
Set RS=Sever.CreateObject(「ADODB.RecordSet」)
MyConn.Open 「FILEDSN=d:\Program Files\
Common Files\ODBC\Data Sources\MyData.dsn
Set MyCommand.ActiveConnection=MyConn
MyCommand.CommandType=adCMdText
MyCommand.commandText=」SELECT * FROM Mytable」
RS.Open MyCommand,adOpenStatic,adLockOptimstic
RS.Close
MyConn.Close
%>
用命令對像打開一個已經存在的記錄集對象的好處是你可以指定記錄集的游標和鎖定類型。在這個例子中,命令對像用來打開一個使用靜 態游標和adLockOptimistic鎖定的記錄集。注意打開記錄集時如果使用了命令對象,那麼你不需指定連接對象,命令對 像決定該使用哪個連接。
上面的例子講述了如何使用命令對象。但是沒有講述為什麼要使用連接對象。為什麼你要專門創建一個命令對象,而不使用命令字符串呢 ?
使用命令對像有一個主要的優點。你可以和命令對像一起使用SQL存儲過程。
使用SQL存儲過程有什麼好處
第12章,「高級SQL」,講述了如何創建SQL存儲過程。當你建設好一個站點後,把盡可能多的SQL命令轉換為存儲過程是個好 主意。與其在ASP網頁內部執行SQL查詢,不如調用包含這些查詢的存儲過程。
使用SQL存儲過程的理由有很多:
■SQL存儲過程執行起來比SQL命令文本快得多。當一個SQL語句包含在存儲過程中時,服務器不必每次執行它時都要分析和編譯 它。
■你可以在多個網頁中調用同一個存儲過程。這使你的站點易於維護。如果一個SQL語句需要做某些改動,你只要做一次即可。
■你可以在存儲過程中利用Transact-SQL的強大功能。一個SQL存儲過程可以包含多個SQL語句。你可以使用變量和條 件。這意味著你可以用存儲過程建立非常複雜的查詢,以非常複雜的方式更新數據庫。
■最後,這也許是最重要的,在存儲過程中可以使用參數。你可以傳送和返回參數。你還可以得到一個返回值(從SQL RETURN語句)。
簡而言之,能用存儲過程就要用存儲過程。存儲過程有著極大的優點
使用命令對像調用存儲過程
假設你想取出表Mytable中的所有記錄並在一個ASP網頁中顯示它們。而且,假設你想以盡可能高效的方式從表中取出記錄。在 這種情況下,你應該使用存儲過程。
要建立應該新的存儲過程,從Microsoft SQL Sever程序組中啟動ISQL/w。然後,在查詢窗口中輸入以下的文本:
CREATE PROCEDURE sp_myporc AS
SELECT * FROM Mytable
單擊執行查詢按鈕(看起來像一個綠色三角形),建立這個存儲過程。該存儲過程的名字是sp_myproc。
要在一個ASP網頁中調用sp_myproc,你可以使用命令對象的一個實例。這裡有一個例子:
<!--#INCLUDE VIRTUAL=」ADOVBS.inc」-->
<%
Set MyConn=Sever.CreateObject(「ADODB.Connection」)
Set MyCommand=Sever.CreateObject(「ADODB.Command」)
MyConn.Open 「FILEDSN=d:\Program Files\
Common Files\ODBC\Data Sources\MyData.dsn
Set MyCommand.ActiveConnection=MyConn
MyCommand.CommandType=adCMdStoredProc
MyCommand.commandText=」sp_myproc」
Set RS=MyCommand.Execute()
WHILE NOT RS.EOF
Response.Write(「<BR>」&RS(「Mycolumn」))
RS.MoveNext
WEND
RS.Close
MyConn.Close
%>
這段腳本通過調用存儲過程sp_myproc取出記錄,顯示了表Mytable中的所有記錄。當你用命令對像調用存儲過程時,你 應該把該命令對象的CommandType屬性設為adCMDStoredProc。CommandText屬性用來指定要調用 的存儲過程。
使用返回狀態值
你可以用命令對像從一個存儲過程得到返回狀態值。例如,假設你想統計一個表中的記錄總數。效率最高的方法是建立一個存儲過程,如 下例所示:
CREATE PROCEDURE sp_CountMytabe AS
RETURN(SELECT COUNT(*) FROM Mytable)
這個存儲過程返回表Mytable中的記錄總數。SQL集合函數COUNT()計算該表中的記錄數。RETURN語句返回這個數 。
要得到一個存儲過程的返回狀態值,你必須為命令對像建立一個參數。命令對像有一個名為Parameters的集合,是一個參數對 象的集合。
你可以用命令對象的CreateParameter()方法建立一個參數。接下來,用Append方法把這個參數添加到命令對象 的Parameters集合中。這裡有一個例子:
<!--#INCLUDE VIRTUAL=」ADOVBS.inc」-->
<%
Set MyConn=Sever.CreateObject(「ADODB.Connection」)
Set MyCommand=Sever.CreateObject(「ADODB.Command」)
MyConn.Open 「FILEDSN=d:\Program Files\
Common Files\ODBC\Data Sources\MyData.dsn
Set MyCommand.ActiveConnection=MyConn
MyCommand.CommandType=adCMdStoredProc
MyCommand.CommandText=「sp_CountMytable」
Set MyParam=Mycommand.CreateParameter(「RetVal」,adInteger,adParam ReturnValue)
MyCommand.Parameters.Append MyParam
MyCommand.Execute
%>
There are <%=MyCommand(「RetVal」)%> records in Mytable.
<%
MyConn.Close
%>
在這個腳本中,用CreateParameter()方法建立了一個參數對象。此例中CreateParameter()方法有 三個參數:
第一個參數為新參數指定一個名字。
第二個參數指定數據類型。
最後,第三個參數指定新參數的類型。在此例中,常量adParamReturnValue指明該參數是一個返回參數。
建立了任何新參數之後,都必須把它添加到命令對象的Parameters集合中。Append方法用來把新參數添加到這個集合中 。
命令執行後,參數的值可以被取出。因為該參數是命令對象的Parameters集合中的一員,用MyCommand(「RetV al」)可以返回該參數的值。實際上,用以下的任何一個表達式都可以得到這個值:
MyCommand(「RetVal」)
MyCommand(0)
MyCommand.Parameters(「RetVal」)
MyCommand.Parameters(0)
MyCommand.Parameters.Item(「RetVal」)
MyCommand.Parameters.Item(0)
這些方法都可以用來取出一個參數的值,因為一個參數是命令對象的參數集合的一部分。注意,對所有的集合,你都可以通過名字或順序 號指定一個參數。
使用輸出參數
上一節的例子演示了如何得到返回狀態值。從一個存儲過程取出輸出參數值與此非常相似。使用輸出參數的好處是輸出參數可以有一個或 多個。而且,輸出參數可以是任何數據類型。
比如有一個表Webusers保存了在你站點上註冊的用戶的名字。這個表只有一個字段UserName。現在假設你想取出按字母 順序排在最前和最後的用戶名。你可以使用下面的存儲過程:
CREATE PROCEDURE sp_HighAndLow
(@HighUser VARCHAR(30) OUTPUT,@LowUser VARCHAR(30) OUTPUT)
AS
SELECT @HighUser=MAX(UserName) FROM Webusers
SELECT @LowUser=MIN(UserName) FROM WebUsers
這個存儲過程有兩個輸出參數,@HighUser和@LowUser。@HighUser包含按字母順序排在最後的用戶名(例如 ,Zeek Zimmerman)。@LowUser包含按字母順序排在最前的用戶名(例如,Anne Arnold)。
要在ASP網頁中調用這個存儲過程,你可以使用如下的腳本:
<!--#INCLUDE VIRTUAL=」ADOVBS.inc」-->
<%
Set MyConn=Sever.CreateObject(「ADODB.Connection」)
Set MyCommand=Sever.CreateObject(「ADODB.Command」)
MyConn.Open 「FILEDSN=d:\Program Files\
Common Files\ODBC\Data Sources\MyData.dsn
Set MyCommand.ActiveConnection=MyConn
MyCommand.CommandType=adCMdStoredProc
MyCommand.CommandText=「sp_HighandLow」
Set MyFirstParam=MyCommand.CreateParameter(「HighUser」,adVarChar, adParamOutput,30)
MyCommand.Parameters.Append.MyFirstParam
Set MySecondParam=MyCommand.CreateParameter(「LowUser」,adVarChar, adParamOutput,30)
MyCommand.ParaMeters.Append MySecondParam
MyCommand.Execute
%>
<p>The person with the alphabetically Hiighest name is
<%=MyCommand(「HighUser」)%>
<p>The person with the alphabetically lowest name is
<%=MyCommand(「LowUser」)%>
<%
MyConn.Close
%>
這個腳本的結構與上一個非常相似。在這個腳本中,用CreateParameter()方法創建了兩個參數對象,兩個參數都被定 義為VARCHAR型。為了指明它們是輸出參數,使用了常量adParamOutput。最後,在CreateParamete r()方法中指定了每個參數的最大長度,30。當你建立的參數是變長度數據類型,如VARCHAR型時,你必須指定一個最大長度 。
使用輸入參數
現在討論另外一種參數。SQL存儲過程可以接收輸入參數。輸入參數使你能夠把數據傳遞給存儲過程。
例如,假設有一個表保存了用戶名和密碼。假設你想建立一個檢查密碼的存儲過程。使用下面的這個存儲過程,你可以檢查一個用戶是否 輸入了合法的密碼。
CREATE PROCEDURE sp_CheckPass
(@CHKName VARCHAR(30),@CHKPass VARCHAR(30),@ISValid CHAR(4) OUTPUT)
AS
IF EXISTS(SELECT UserName FROM WebUsers
WHERE UserName=@CHKName AND UserPass=@CHKPass)
SELECT @ISVaid=」Good」
ELSE
SELECT @ISValid=」Bad」
這個存儲過程接收兩個輸入參數。輸入參數@CHKaName向存儲過程傳遞一個用戶名。@CHKPass向存儲過程傳遞一個密碼 。如果有用戶擁有指定的密碼,輸出參數將返回「Good」,否則,返回「Bad」。
使用輸入參數的方法與使用輸出參數的方法非常相似。關鍵的差別是,命令執行前必須給輸入參數分配一個值。這裡有一個例子:
<!--#INCLUDE VIRTUAL=」ADOVBS.inc」-->
<%
Set MyConn=Sever.CreateObject(「ADODB.Connection」)
Set MyCommand=Sever.CreateObject(「ADODB.Command」)
MyConn.Open 「FILEDSN=d:\Program Files\
Common Files\ODBC\Data Sources\MyData.dsn
Set MyCommand.ActiveConnection=MyConn
MyCommand.CommandType=adCMdStoredProc
MyCommand.CommandText=「sp_CheckPass」
Set MyFirstParam=MyCommand.CreateParameter(「UserName」,adVarChar, adParamIntput,30)
MyCommand.Parameters.Append.MyFirstParam
Set MySecondParam=MyCommand.CreateParameter(「UserPass」,adVarChar ,adParamInput,30)
MyCommand.ParaMeters.Append MySecondParam
Set MyThirdParam=MyCommand.CreateParameter(「RetValue」,adChar,adP aramOutput,4)
MyCommand.Parameters.Append MyThirdParam
MyCommand(「UserName」)=」Bill Gates」
MyCommand(「UserPass」)=」Billions」 MyCommand.Execute
%>
The password is <%=Mycommand(「RetValue」)%>
<%
MyConn.Close
%>
在這個例子中,名字Bill Gates和密碼Billions被傳遞給存儲過程。如果表中存在這個名字-密碼組合,則報告該密碼為Good,否則報告該密碼 為Bad。
在這個腳本中,用常量adParamInput指定兩個輸入參數。注意兩個輸入參數在命令執行前都被分配了一個值。
|