按如下步骤可以建立一个新的文件数据源:
1. 打开WINDOWS NT SEVER的控制面板(选择Start|Setting|Control Panel)。
2. 单击ODBC的图标。
3. 单击标签File DSN。
4. 单击按钮Add,出现Create New Data Source对话框。
5. 在对话框中,选择SQL Sever驱动程序并单击按钮Next,出现Create a New
Data Source对话框。
6. 输入你所建的数据源的名字。例如,输入mydata.dsn。单击Next,再单击Finish,则wizard程序Create
a New Data Source to SQL Sever会被启动(见图22.1)。
<%
Set MyConn=Sever.CreateObject("ADODB.Connection")
MyConn.Open "FILEDSN=d:\Program Files\
Common Files\ODBC\Data Sources\MyData.dsn"
Set RS=MyConn.Execute("SELECT * FROM Mytable")
MyConn.Close
%>
在这个例子中,使用了Execute()方法以返回一个SQL SELECT查询的结果。与上一个例子不同,这个Execute方法使用了括号。当你要返回结果时,千万别忘了使用括号,否则你会收到错误信息
Expected end of statement.
这个SQL查询的结果被读取到记录集对象的一个实例RS中。该记录集由Execute()方法自动创建。你将在下一章中学习如何使用记录集。
Execute方法包含两个可选参数。你可以给一个RecordsAffected参数,用来保存被执行的SQL语句所操作的记录个数。你还可以给一个Options参数,用来提供被执行的SQL语句的有关信息。下面的例子同时使用了这两种可选参数:
<%
Set MyConn=Sever.CreateObject("ADODB.Connection")
MyConn.Open "FILEDSN=d:\Program Files\
Common Files\ODBC\Data Sources\MyData.dsn"
MyConn.Execute "UPDATE Mytable Set Mycolumn='Goodbye!'",HowMany,adCMDText
Response.Write(HowMany)
MyConn.Close
%>
<%
Set MyConn=Sever.CreateObject("ADODB.Connection")
MyConn.Open "FILEDSN=d:\Program Files\
Common Files\ODBC\Data Sources\MyData.dsn"
FOR i=1 TO 32
MySQL="INSERT Mytable (Mycolumn) VALUES (' This is entry "&i&"
')"
MyConn.Execute MySQL, HowMany,adCMDText
NEXT
MyConn.Close
%>
<%
Set MyConn=Sever.CreateObject("ADODB.Connection")
MyConn.Open "FILEDSN=d:\Program Files\
Common Files\ODBC\Data Sources\MyData.dsn"
' create a new table
MySQL="CREATE TABLE newtable (mycolumn VARCHAR(255))"
MyConn.Execute MySQL
' populate the table
MySQL="INSERT newtable (mycolumn) VALUES('hello')"
MyConn.Execute MySQL
'truncate the table
MySQL="TRUNCATE TABLE newtable"
MyConn.Execute MySQL
'drop the table
MySQL="DROP TABLE newtable"
MyConn.Execute MySQL
Myconn.Close
%>
<%
Set MyConn=Sever.CreateObject("ADODB.Connection")
MyConn.Open "FILEDSN=d:\Program Files\
Common Files\ODBC\Data Sources\MyData.dsn"
Set RS=MyConn.Execute("SELECT * FROM Mytable")
RS.Close
MyConn.Close
%>
<%
Set MyConn=Sever.CreateObject("ADODB.Connection")
MyConn.Open "FILEDSN=d:\Program Files\
Common Files\ODBC\Data Sources\MyData.dsn"
Set RS=MyConn.Execute("SELECT * FROM Mytable")
WHILE NOT RS.EOF
Response.Write("
"&RS("Mycolumn"))
RS.MoveNext
WEND
RS.Close
MyConn.Close
%>
<%
Set MyConn=Sever.CerateObject("ADODB.Connection")
MyConn.Open "FILEDSN=d:\Program Files\
Common Files\ODBC\Data Source\MyData.dsn"
Set RS=MyConn.Execute("SELECT * FROM Mytable")
%>
<%
Set MyConn=Sever.CreateObject("ADODB.Connection")
Set RS=Sever.CreateObject("ADODB.RecordSet")
MyConn.Open "FILEDSN=d:\Program Files\
Common Files\ODBC\Data Sources\MyData.dsn
RS.Open "SELECT * FROM Mytable",MyConn,adOpenDynamic
RS.Close
MyConn.Close
%>
<%
Set MyConn=Sever.CreateObject("ADODB.Connection")
Set RS=Sever.CreateObject("ADODB.RecordSet")
MyConn.Open "FILEDSN=d:\Program Files\
Common Files\ODBC\Data Sources\MyData.dsn
RS.Open "SELECT * FROM Mytable",MyConn,adOpenDynamic,adLockPessimistic
RS.Close
MyConn.Close
%>
<%
Set MyConn=Sever.CreateObject("ADODB.Connection")
Set RS=Sever.CreateObject("ADODB.RecordSet")
MyConn.Open "FILEDSN=d:\Program Files\
Common Files\ODBC\Data Sources\MyData.dsn
RS.Open "SELECT * FROM Mytable",MyConn,adOpenDynamic,adCMDText
RS.AddNew
RS("MyColumn")="A new column"
RS.Update
RS.Close
MyConn.Close
%>
在这个脚本中,用AddNew方法创建了一条新记录。接着,新记录的MyColumn域被赋值“A
new column”。最后,调用Update方法保存新记录。要使用这些方法,记录集必须以只读方式以外的其它锁定方式打开。
你也可以使用SQL INSERT语句向一个表中添加新记录,以取代AddNew方法。通常,使用SQL比使用上述的方法要好一些,因为SQL更加灵活。本书的其余部分将使用SQL来操作数据库中的数据。
<%
Set MyConn=Sever.CreateObject("ADODB.Connection")
Set RS=Sever.CreateObject("ADODB.RecordSet")
MyConn.Open "FILEDSN=d:\Program Files\
Common Files\ODBC\Data Sources\MyData.dsn
RS.Open "SELECT * FROM Mytable",MyConn,adOpenStatic
RS.MoveLast
WHILE NOT RS.EOF
Response.Write("
"&RS("MyCOlumn"))
WEND
RS.Close
MyConn.Close
%>
<%
Set MyConn=Sever.CreateObject("ADODB.Connection")
Set RS=Sever.CreateObject("ADODB.RecordSet")
MyConn.Open "FILEDSN=d:\Program Files\
Common Files\ODBC\Data Sources\MyData.dsn
RS.Open "SELECT Mycolumn FROM Mytable",MyConn,adOpenStatic
Response.Write(RS.RecrdCount)
RS.Close
MyConn.Close
%>
<%
Set MyConn=Sever.CreateObject("ADODB.Connection")
Set RS=Sever.CreateObject("ADODB.RecordSet")
MyConn.Open "FILEDSN=d:\Program Files\
Common Files\ODBC\Data Sources\MyData.dsn
RS.Open "SELECT * FROM Password_Table
WHERE Password="&Request.Form("Password"),Myconn
IF RS.EOF THEN
Response.Write("The password you entered is invalid.")
ELSE
Response.Write("Welcome to our web site!")
END IF
RS.Close
MyConn.Close
%>
<%
Set MyConn=Sever.CreateObject("ADODB.Connection")
Set RS=Sever.CreateObject("ADODB.RecordSet")
MyConn.Open "FILEDSN=d:\Program Files\
Common Files\ODBC\Data Sources\MyData.dsn
RS.Open "SELECT COUNT(*) Mycount FORM Password_Table",MyConn
%>
There are <% =RS("MyCount")%> registered users at the web site.
<%
RS.Close
MyConn.Close
%>
表23.1 pages.asp
<% ' Figure out the current page IF
Request.QueryString("MOVE")="NEXT" THEN Session("CurrentPage")=Session("CurrentPage")+1
END IF IF Request.QueryString("MOVE")="PREV" THEN Session("CurrentPage")=Session("CurrentPage")-1
END IF IF Session("CurrentPage")="" THEN Session("CurrentPage")=1
END IF %>
Current Page: <%=Session("CurrentPage")%>
<% ' Open a Connection and Recordset Set
MyConn=Server.CreateObject("ADODB.Connection") Set
RS=Server.CreateObject("ADODB.RecordSet") MyConn.Open "FILEDSN=d:\Program
Files\Common Files\ODBC\Data Sources\MyData.dsn" ' Retrieve the list of products
RS.Open "SELECT ProductName FROM Products", MyConn,adOpenStatic ' Set the number
of records in a page RS.PageSize=5 ' Set the current page
RS.AbsolutePage=Session("CurrentPage") ' Show the records for the current page
WHILE NOT RS.EOF AND NumRows
Product Name: <%=RS("ProductName")%> <% RS.MoveNext NumRows=NumRows+1
WEND %>
<% IF Session("CurrentPage")>1 THEN %> [PREV]
<% END IF %> <% IF Session("CurrentPage")[NEXT] <% END IF %> <% RS.Close MyConn.Close %>
<%
Set MyConn=Sever.CreateObject("ADODB.Connection")
Set RS=Sever.CreateObject("ADODB.RecordSet")
MyConn.Open "FILEDSN=d:\Program Files\
Common Files\ODBC\Data Sources\MyData.dsn
RS.Open "SELECT MyFirstCol,MySecondCol FORM Mytable",MyConn
MyArray=RS.GetRows()
RS.Close
MyConn.Close
%>
<%
Set MyConn=Sever.CreateObject("ADODB.Connection")
Set RS=Sever.CreateObject("ADODB.RecordSet")
MyConn.Open "FILEDSN=d:\Program Files\
Common Files\ODBC\Data Sources\MyData.dsn
RS.MaxRecords=10
RS.Open "SELECT MyColumn FROM Mytable",MyConn
WHILE NOT RS.EOF
Response.Write("
"&RS("MyColumn"))
RS.MoveNext
WEND
RS.Close
MyConn.Close
%>
<%
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
%>
<%
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
%>
<%
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
%>
<%
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("
"&RS("Mycolumn"))
RS.MoveNext
WEND
RS.Close
MyConn.Close
%>
<%
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,adParamReturnValue)
MyCommand.Parameters.Append MyParam
MyCommand.Execute
%>
There are <%=MyCommand("RetVal")%> records in Mytable.
<%
MyConn.Close
%>
<%
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
%>
The person with the alphabetically Hiighest name is
<%=MyCommand("HighUser")%>
The person with the alphabetically lowest name is
<%=MyCommand("LowUser")%>
<%
MyConn.Close
%>
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"
<%
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,adParamOutput,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指定两个输入参数。注意两个输入参数在命令执行前都被分配了一个值。
<%
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
%>
表24.2 acknowledge.asp
<% ' Retrieve form fields into variables
Email=Replace(Request.Form("Email"),"'","''")
Contents=Replace(Request.Form("Contents"),"'","''")
' Check for empty content IF Email="" THEN Email="Unknown" IF
Contents="" THEN Contents="None"
' Grab the user's IP address UserIP=Request.ServerVariables("REMOTE_ADDR")
' Create the SQL command string MySQL="INSERT Feedback
(Feed_Email,Feed_IP,Feed_Contents) VALUES
('"&Email&"','"&UserIP&"','"&Contents&"')"
' Insert the form data into the Feedback table Set
MyConn=Server.CreateObject("ADODB.Connection") MyConn.Open
"FILEDSN=d:\Program Files\Common Files\ODBC\Data Sources\MyData.dsn"
MyConn.Execute MySQL %>
表24.3 display.asp
<% ' Create ADO objects Set 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 return RS.MaxRecords=25
' Retrieve the records RS.Open "SELECT * FROM Feedback ORDER BY Feed_Date DESC",
MyConn %>
<% ' Close the Recordset and Connection RS.Close MyConn.Close %>
例子应用程序:创建密码保护系统
这一节演示如何使用ADO对你的站点进行密码保护。你将学习如何创建一个注册网页,新的访问者可以用它注册到你的站点上。你还将学习如何防止访问者看到他们没有访问权限的网页。
为什么需要一个密码保护系统呢?你可以配置IIS,使用基本认证模式或WINDOWS
NT Challenge/Response认证模式。使用两种中的任一种认证系统,通过改变对文件的权限,你可以强制用户在访问一个网页之前输入密码。
注
要了解使用基本认证模式和WINDOWS NT Challenge/Response认证模式的更多内容,请参阅第20章的“使用权限检查组件”一节。
但是,不论使用基本认证模式或WINDOWS NT Challenge/Response认证模式,都存在一个问题。这两种认证系统都是与WINDOWS
NT安全体系想分离的。这意味着每当有新用户注册时,你都要手工添加用户。而且你不能容易地从ASP网页中访问和修改密码和用户名。
如果你只是想通过密码来保护你自己的和其他管理员的特殊网页,IIS提供的两种认证系统都是可行的。但是,假如你想在用户提供了诸如电话号码或信用卡号码这样的信息后,自动为新用户进行注册。在这种情况下,你需要建立一个密码确认系统。
在这一节,你将学习如何使用ADO建立一个密码确认系统。你需要建立如下的数据库表和两个文件:
注
如果你在注册表单中要求输入象信用卡号码这样的重要信息,你应该使用加密管道层(SSL)对信息进行加密。要了解加密管道层的更多信息,请参阅第二章,“安装和使用Internet
Information Sever”。
表24.4 register.asp
<% CONST HomePage="/default.asp"
' Check If Registration Information Is Incomplete IF
Request.Form("UserName")="" OR
Request.Form("UserPass")="" [ccc]OR
Request.Form("UserPhone")="" THEN %>
Please complete all of the following information:
<% 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 %>
<% 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 IF END IF %>