標題標題  顯示論壇會員列表名單  搜索論壇搜索  HelpHelp
  注冊注冊  登入登入
ASP教學區
 DoReMe : ASP教學區
主題 話題: 第二十四章 使用命令 回復發表新主題
作者
貼子內容 << Prev Topic下一個主題 >>
erisa
Groupie
Groupie


加入: 2005/2月/16
Online Status: Offline
回復: 43
Posted: 2005/2月/16 11:54上午 | IP記錄 引用 erisa

關於Activex數據對象的最後這一章將講述如何使用命令對象。首先你將學習如何使用命令對像執行有參數的SQL存儲過程。其 餘部分將講述ADO的兩個例子應用程序。首先你將學習為你的站點建立一個高級反饋網頁。然後你將學習如何創建一個密碼保護系統。
Back to Top 查看 erisa's 資料 搜索其他貼子 erisa 訪問 erisa's
 
erisa
Groupie
Groupie


加入: 2005/2月/16
Online Status: Offline
回復: 43
Posted: 2005/2月/16 11:54上午 | IP記錄 引用 erisa

使用命令對像

命令對像代表一個命令(例如,一個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指定兩個輸入參數。注意兩個輸入參數在命令執行前都被分配了一個值。

Back to Top 查看 erisa's 資料 搜索其他貼子 erisa 訪問 erisa's
 
erisa
Groupie
Groupie


加入: 2005/2月/16
Online Status: Offline
回復: 43
Posted: 2005/2月/16 11:55上午 | IP記錄 引用 erisa

取出參數信息

你會發現有時你需要用到一個存儲過程,但是不知道該存儲過程需要什麼參數。例如,你也許不知道參數的數據類型或參數的大小。你如 何能確定這些信息呢?

用下面的腳本,你可以得到一個存儲過程所使用的參數的有關信息:

 

<!--#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」

MyCommand.Parameters.Refresh

%>

<HTML>

<HEAD><TITLE>Parameter Information</TITLE></HEAD>

<BODY>

<TABLE BORDER=1>

<CAPTION>Parameter Information</CAPTION>

<TR>

<TH>Parameter Name</TH>

<TH>Datatype</TH>

<TH>Direction</TH>

<TH>Size</TH>

</TR>

<%For Each thing in Mycommand.Parameters %>

<TR>

<TD><%=thing.name%></TD>

<TD><%=thing.type%></TD>

<TD><%=thing.direction%></TD>

<TD><%=thing.size%></TD>

</TR>

<%

Next

MyConn.Close

%>

</TABLE>

</BODY>

</HTML>

 

這個例子顯示了存儲過程sp_myproc的所有參數的有關信息。每個參數的名字,數據類型,說明,和大小被顯示在一個表中。( 一個參數的說明指明了該參數是輸入參數,輸出參數,或返回狀態值。)要顯示另一個存儲過程的參數信息,只要替換存儲過程名即可。

這個例子中的重要語句是MyCommand.Parameters.Refresh。當這個語句執行時,該存儲過程的參數的有關 信息被從數據庫中取出。

這個腳本不返回常量,它返回的是原始值。要解釋這個腳本的返回值,你需要參考包含文件ADODBS。在這個文件中,原始值與正確 的常量相對應。

Back to Top 查看 erisa's 資料 搜索其他貼子 erisa 訪問 erisa's
 
erisa
Groupie
Groupie


加入: 2005/2月/16
Online Status: Offline
回復: 43
Posted: 2005/2月/16 11:55上午 | IP記錄 引用 erisa

例子應用程序:高級反饋頁

在你的站點上包含一個反饋頁是個好主意。反饋頁使用戶能夠提出問題,建議,和表示讚揚。你可以利用這些信息來改進你的站點,使它 更加符合用戶的要求。

建立反饋頁的最簡單的辦法是使用HTML form把反饋信息傳送給一個e_mail帳號。例如,下面的HTML頁把輸入form的信息傳送給e_mail帳戶webmaster@yoursite.com

 

<HTML>

<HEAD><TITLE>Feedback</TITLE></HEAD>

<BODY>

<H2>please enter any suggestions for improving

this web site in the form below:</H2>

<FORM ACTION=MAILTO:webmaster@yoursite.com>

<TEXTAREA NAME=」Feedback」 COLS=30 ROWS=10 WRAP=VIRTUAL></TEXTAREA>

<P><INPUT TYPE=」SUBMIT」 VALUE=」Submit Feedbacd」>

</FORM>

</BODY>

</HTML>

 

對小站點來說,這個反饋form將會工作得很好。所有的反饋信息都被發送到同一個e_mail帳戶。但是,如果你站點有多個管理 員,你希望所有的管理員都能看到反饋信息。而且,你希望存儲反饋信息,以便將來取出這些信息並做分析。在這種情況下,你應該把用 戶反饋信息存儲在數據庫的表中。

這一節講述如何使用ADO來保存和取出用戶的反饋信息。你將學習如何建立一個高級反饋form。這個工程中用到了下列表和文件:

 


表Feedback。SQL Sever數據庫的一個表,用來存儲用戶反饋信息。


反饋網頁。一個HTML網頁,用戶在這個網頁中輸入反饋信息。


接收網頁。一個ASP網頁,對用戶輸入反饋信息表示感謝,把信息存儲在數據庫中。


顯示網頁。一個ASP網頁,從數據庫中取出反饋信息並顯示。

 

創建表Feedback

表Feedback有四個字段,分別用來存儲e_mail地址,IP地址,反饋輸入的時間,和反饋信息的內容。要創建這個表,從 Microsoft SQL Sever程序組中啟動ISQL/w。接下來,在查詢窗口中輸入以下的文本並執行它:

 

CREATE TABLE Feedback (Feed_Email VARCHAR(50),

Feed_IP VARCHAR(20),

Feed_Date DATETIME Default GetDATE()

Feed_Contents TEXT)

 

創建反饋網頁

反饋網頁是一個標準的HTML網頁(見圖24.1)。它有一個文本框和一個多行文本框,用戶可以在文本框中輸入他們的e_mai l地址,在多行文本框中輸入反饋信息。它還有一個用來提交反饋的提交按鈕。當提交了反饋後,將顯示接收網頁。表24.1顯示了網 頁Feedback的腳本。

 

表24.1 feedback.cfm

<HTML><HEAD><TITLE> Feedback </TITLE></HEAD><BODY BGCOLOR=#FFFFFF><H2> Please enter any suggestions for improvingthis web site in the form below: </H2><FORM METHOD="POST" ACTION="acknowledge.asp">Please enter your email address:<BR><INPUT NAME="Email" TYPE="TEXT" SIZE="30" MAXLENGTH="50"><P><TEXTAREA NAME="Contents" COLS=30 ROWS=10 WRAP=VIRTUAL></TEXTAREA><P><INPUT TYPE="SUBMIT" VALUE="Submit Feedback"></FORM></BODY></HTML>


圖24.1 FeedBack頁

 

創建接收網頁

接收網頁有兩個作用。首先,它用來對用戶提供反饋信息表示感謝(見圖24.2)。第二,更重要的是,這個網頁用來把反饋信息存儲 在表Feedback中。反饋信息的添加使用的是SQL INSERT語句,如表24.2所示。

 

 

表24.2 acknowledge.asp

<%' Retrieve form fields into variablesEmail=Replace(Request.Form("Email"),"'","''")Conten ts=Replace(Request.Form("Contents"),"'","''")

' Check for empty contentIF Email="" THEN Email="Unknown"IF Contents="" THEN Contents="None"

' Grab the user's IP addressUserIP=Request.ServerVariables("REMOTE_ADDR")

' Create the SQL command stringMySQL="INSERT Feedback (Feed_Email,Feed_IP,Feed_Contents) VALUES ('"&Email&"','"&UserIP&"','"&Contents&am p;"')"

' Insert the form data into the Feedback tableSet MyConn=Server.CreateObject("ADODB.Connection")MyConn.Open "FILEDSN=d:\Program Files\Common Files\ODBC\Data Sources\MyData.dsn"MyConn.Execute MySQL%><HTML><HEAD><TITLE> Thank You </TITLE></HEAD><BODY><H2> Thank you for your suggestions! </H2></BODY></HTML>

 

注意

注意這個腳本中如何使用VBScript函數Replace()。函數Replace()把所有的單引號替換為雙引號。這對於防 止SQL Sever認為已經到了SQL命令字符串的結尾是有必要的。如果沒有使用函數Replace(),一個用戶輸入了包含單引號的反 饋信息時,INSEET語句將會導致錯誤。

圖24.2 Acknowledgement頁

 

創建顯示網頁

顯示網頁用來顯示用戶輸入的反饋信息(見圖24.3)。反饋信息取自表Feedback。因為一個站點也許會收到幾千個反饋信息 ,顯示網頁不顯示表中的所有記錄,而是只顯示最後25個信息。這通過使用記錄集對象的Maxrecords屬性來實現。

 

圖24.3 顯示用戶信息頁

 

 

為了顯示每個反饋信息的內容,使用了一個多行文本框。使用多行文本框的好處是它們有滾動條。如果有用戶輸入了相當長的反饋信息, 它不會佔滿整個顯示網頁。表24.3是display.asp的腳本。

 

表24.3 display.asp

<%' Create ADO objectsSet MyConn=Server.CreateObject("ADODB.Connection")Set RS=Server.CreateObject("ADODB.RecordSet")MyConn.Open "FILEDSN=d:\Program Files\Common Files\ODBC\Data Sources\MyData.dsn"

' Set the maximum number of records to returnRS.MaxRecords=25

' Retrieve the recordsRS.Open "SELECT * FROM Feedback ORDER BY Feed_Date DESC", MyConn%>

<HTML><HEAD><TITLE>Display Feedback</TITLE></HEAD><BODY><FORM>& lt;%' Display the recordsWHILE NOT RS.EOF%><BR><B>Date Entered:</B> <%=RS("Feed_Date")%><BR><B>Email:</B> ; <%=RS("Feed_Email")%><BR><B>IP Address: </B><%=RS("Feed_IP")%><BR><TEXTAREA COLS=30 ROWS=10><%=RS("Feed_Contents")%></TEXTAREA>&l t;HR><%RS.MoveNextWEND%>

</FORM></BODY>

</HTML>

<%' Close the Recordset and ConnectionRS.CloseMyConn.Close%>

Back to Top 查看 erisa's 資料 搜索其他貼子 erisa 訪問 erisa's
 
erisa
Groupie
Groupie


加入: 2005/2月/16
Online Status: Offline
回復: 43
Posted: 2005/2月/16 11:55上午 | IP記錄 引用 erisa

例子應用程序:創建密碼保護系統

這一節演示如何使用ADO對你的站點進行密碼保護。你將學習如何創建一個註冊網頁,新的訪問者可以用它註冊到你的站點上。你還將 學習如何防止訪問者看到他們沒有訪問權限的網頁。

為什麼需要一個密碼保護系統呢?你可以配置IIS,使用基本認證模式或WINDOWS NT Challenge/Response認證模式。使用兩種中的任一種認證系統,通過改變對文件的權限,你可以強制用戶在訪問一個 網頁之前輸入密碼。

 

注意

要瞭解使用基本認證模式和WINDOWS NT Challenge/Response認證模式的更多內容,請參閱第20章的「使用權限檢查組件」一節。

 

但是,不論使用基本認證模式或WINDOWS NT Challenge/Response認證模式,都存在一個問題。這兩種認證系統都是與WINDOWS NT安全體系想分離的。這意味著每當有新用戶註冊時,你都要手工添加用戶。而且你不能容易地從ASP網頁中訪問和修改密碼和用戶 名。

如果你只是想通過密碼來保護你自己的和其他管理員的特殊網頁,IIS提供的兩種認證系統都是可行的。但是,假如你想在用戶提供了 諸如電話號碼或信用卡號碼這樣的信息後,自動為新用戶進行註冊。在這種情況下,你需要建立一個密碼確認系統。

在這一節,你將學習如何使用ADO建立一個密碼確認系統。你需要建立如下的數據庫表和兩個文件:

 


表webusers。用來保存註冊信息。


註冊網頁。這個ASP網頁包含一個註冊表單。通過完成這個表單,一個新用戶可以獲得對你站點的訪問。


密碼包含文件。每一個需要密碼保護的網頁都要包含這個文件。

 

創建表webusers

表webusers是一個包含三個字段的SQL Sever表。第一個字段保存用戶名,第二個字段保存用戶密碼,第三個字段保存用戶的電話號碼。

要創建這個表,從Microsoft SQL Sever程序組中啟動ISQL/w。然後,在查詢窗口中鍵入以下的文本並執行它:

 

CRETAT TABLE webusers (UserName VARCHAR(30),

UserPass VARCHAR(30),

UserPhone VARCHAR(30))

 

無論何時,當一個新訪問者試圖訪問一個密碼保護的網頁時,將對這個表進行用戶名和密碼的查詢。

 

創建註冊網頁

註冊網頁使新訪問者可以註冊到你的站點上(見圖24.4)。如果某個沒有合法密碼的訪問者試圖訪問一個密碼保護的網頁,他(她) 將被導向這個註冊網頁。

 

圖24.4 註冊網頁

 

 

 

註冊網頁用了一個選擇結構。如果HTML form中的各個域沒有都填入數據,就顯示這個網頁。否則,如果所有的域都填入了數據,將發生三件事情:

 


首先,註冊信息被插入到表webusers中。


第二,新的用戶名和密碼被分配給session變量UserName和UserPass。


最後,該用戶被導向他原來所在的網頁(如果原來的網頁是未知的,則被導向主頁)。

 

註冊網頁只要求用戶輸入很少的信息。但是,你可以很容易地擴展這個例子,詢問用戶任何你想知道的信息。例如,你可以要求用戶在使 用你的站點之前輸入一個信用卡號碼或地址。要做到這一點,只要在HTML form和表webusers中增加一個域即可。表24.4是註冊網頁的腳本。

 

注意

如果你在註冊表單中要求輸入象信用卡號碼這樣的重要信息,你應該使用加密管道層(SSL)對信息進行加密。要瞭解加密管道層的更 多信息,請參閱第二章,「安裝和使用Internet Information Sever」。

 

表24.4 register.asp

<%CONST HomePage="/default.asp"

' Check If Registration Information Is IncompleteIF Request.Form("UserName")="" OR Request.Form("UserPass")=""[ccc]OR Request.Form("UserPhone")="" THEN%>

<HTML> <HEAD><TITLE>Registration Page</TITLE></HEAD> <BODY BGCOLOR=#FFFFFF> <H2>Please complete all of the following information:</H2> <FORM METHOD="POST" ACTION="<%=Request.ServerVariables("SCRIPT_NAME")%>"&g t; <TABLE> <TR> <TD ALIGN=RIGHT>User Name:</TD> <TD><INPUT NAME="UserName" TYPE="TEXT"VALUE="<%=Request.FORM("UserName")%>">&l t;/TD> </TR><TR> <TD ALIGN=RIGHT>Password:</TD> <TD><INPUT NAME="UserPass" TYPE="PASSWORD"

VALUE="<%=Request.FORM("UserPass")%>"></TD> </TR><TR> <TD ALIGN=RIGHT>Phone Number:</TD> <TD><INPUT NAME="UserPhone" TYPE="TEXT" VALUE="<%=Request.FORM("UserPhone")%>"></TD> </TR><TR> <TD ALIGN=RIGHT COLSPAN=2> <INPUT TYPE="SUBMIT" VALUE="Continue"> </TD> </TR> </TABLE> </FORM> </BODY> </HTML><%ELSE

' Ready Database Objects Set MyConn=Server.CreateObject("ADODB.Connection") MyConn.Open "FILEDSN=d:\Program Files\Common Files\ODBC\Data Sources\MyData.dsn"

' Insert The Registration Information Into WebUsers MySQL="INSERT WebUsers (UserName,UserPass,UserPhone) VALUES (" MySQL=MySQL&"'"&Request.FORM("UserName")&"'" MySQL=MySQL&",'"&Request.FORM("UserPass")&"'" MySQL=MySQL&",'"&Request.FORM("UserPhone")&"')" MyConn.Execute MySQL MyConn.Close

' Create Session Variables Session("UserName")=Request.FORM("UserName") Session("UserPass")=Request.FORM("UserPass")

' Redirect The User To The Appropriate Page IF Session("GoBack")="" THEN Session("GoBack")=HomePage Response.Redirect Session("GoBack")END IF%>

 

創建密碼包含文件

密碼包含文件被包含在你想進行密碼保護的每一個網頁中。它檢查session變量UserName和UserPass是否存在。 如果不存在,就要求用戶輸入名字和密碼(見圖24.5)。然後到表webusers中查詢輸入的名字和密碼。如果密碼是非法的, 用戶將被重新導向註冊網頁。表24.5是包含文件的腳本。

 

圖24.5 密碼包含文件

 

表24.5 pass.inc

<%IF Session("UserName")="" OR Session("UserPass")="" THEN IF Request.FORM("UserName")="" OR Request.FORM("UserPass")="" THEN%><HTML><HEAD><TITLE>Enter Password</TITLE></HEAD><BODY><H2>To access this page, you must enter a password: </H2>If you are a new user, click<A HREF="register.asp"> here. </A><FORM METHOD="POST" ACTION="<%=Request.ServerVariables("SCRIPT_NAME")%>"&g t;<TABLE><TR><TD ALIGN=RIGHT>NAME</TD><TD><INPUT NAME="UserName" TYPE="TEXT"></TR><TR><TD ALIGN=RIGHT>PASSWORD</TD><TD><INPUT NAME="UserPass" TYPE="PASSWORD"></TD></TR><TR><TD ALIGN=RIGHT COLSPAN=2><INPUT TYPE="SUBMIT" VALUE="Continue"></TD></TR></TABLE>< /FORM></BODY></HTML><%Response.End ELSE' Ready Database Objects Set MyConn=Server.CreateObject("ADODB.Connection") MyConn.Open "FILEDSN=d:\Program Files\Common[ccc]Files\ODBC\Data Sources\MyData.dsn" ' Check The Password MySQL="SELECT UserName FROM WebUsers WHERE USERNAME='"&Request.FORM("UserName") MySQL=MySQL&"' AND USERPASS='"&Request.FORM("UserPass")&"'" SET RS=MyConn.Execute(MySQL)

' If the password is bad, redirect to the Registration Page IF RS.EOF THEN RS.CLOSE Session("GoBack")=Request.ServerVariables("SCRIPT_NAME") Response.Redirect "register.asp" Response.END END IF RS.CLOSE END IFEND IF%>

 

測試密碼系統

要在你的站點上完成這個密碼保護系統,你需要把文件pass.inc包含在每一個要進行密碼保護的ASP網頁中。(在標準的HT ML網頁中不能包含這個文件。)表24.6是應該簡單的例子。

 

表24.6 testpass.asp

<!-- #INCLUDE VIRTUAL="pass.inc" --><HTML><HEAD><TITLE> Restricted </TITLE></HEAD><BODY>Only registered users can see this sentence!</BODY></HTML>

 

這個ASP網頁只對已經註冊的用戶顯示。本節中,在測試這個網頁時,你可以用Session.Aandon方法刪除sessio n變量。session變量UserName和UserPass被刪除後,你必須重新輸入密碼才能訪問一個密碼保護的網頁。

 

總結

這一章探索了如何使用命令對像執行SQL存儲過程。你學習了如何傳送和得到輸入參數,輸出參數,和返回值。本章的第二節提供了使 用ADO的兩個例子應用程序。你學習了如何創建一個高級反饋網頁,如何對站點進行密碼保護。

這一章是關於Active Sever Pages對像和組件的最後一章。在本書的下一部分,「使用Microsoft Visual studio」中,你將學習如何使用Visual Studio中的一些程序。這些程序使你能夠容易地創建和擴展你的ASP網頁。

Back to Top 查看 erisa's 資料 搜索其他貼子 erisa 訪問 erisa's
 

如果你想回復的話你必須首先 login
如果你還沒有注冊的話你必須首先 注冊

  回復發表新主題
顯示可打印的頁面 顯示可打印的頁面

論壇跳轉
不能 張貼新論題在這個討論版
不能 回應論題在這個討論版
不能 刪除你的發言在這個討論版
不能 編輯你的發言在這個討論版
不能 新增投票標題在這個討論版
不能 在這個討論版投票

Edit by doreme Forums version 2004
Welcome ©2001-2004 doreme Guide

This page was generated in 0.9834 seconds.

 
保養品
保養品, Skin Care
www.elady.tw
Makeups Wholesale
Wholesale Cosmetics SkinCares
lungjyi.com
保養品批發
名牌保養品、保養品批發
www.perfume.com.tw/skincare
Wholesale Perfumes
Fragrances Perfumes Wholesale
lungjyi.net