标题标题  显示论坛会员列表名单  搜索论坛搜索  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.1709 seconds.

 
保养品
保养品, Skin Care
www.elady.tw
美材批发
美材, Cosmetic
www.elady.tw/beauty_org
保养品批发
名牌保养品、保养品批发
gb.perfume.com.tw/skincare
饰品批发
饰品、饰品批发
gb.perfume.com.tw/ornament