ASP不是数据库而是强大的服务器端脚本技术深入了解其如何连接并操作各类数据库构建动态网页应用

引言
在Web开发领域,ASP(Active Server Pages)经常被误解为一种数据库技术。然而,这种认识是错误的。ASP实际上是一种强大的服务器端脚本技术,由微软开发,用于创建动态网页和Web应用程序。它的真正价值在于能够连接并操作各种数据库系统,从而实现数据的动态展示和交互。本文将深入探讨ASP的本质,以及它如何与各类数据库协作,构建功能丰富的动态网页应用。
ASP技术基础
什么是ASP
ASP(Active Server Pages)是微软公司开发的一种服务器端脚本环境,它允许开发人员创建和运行动态网页和Web应用程序。ASP首次发布于1996年,作为Internet Information Services (IIS)的一部分,它革命化了Web开发的方式,使得开发人员能够轻松地将服务器端处理与HTML内容结合起来。
ASP文件以
.asp
为扩展名,包含HTML标记、服务器端脚本和客户端脚本。当浏览器请求一个ASP页面时,服务器会先处理其中的服务器端脚本,然后将生成的HTML发送到客户端浏览器。这意味着客户端只能看到处理后的HTML结果,而无法查看原始的服务器端脚本代码,这在一定程度上提高了应用程序的安全性。
ASP的工作原理
ASP的工作流程可以概括为以下几个步骤:
客户端浏览器向服务器请求一个ASP页面。
Web服务器接收到请求,识别出这是一个ASP文件。
服务器将ASP文件发送到ASP引擎进行处理。
ASP引擎逐行执行服务器端脚本,可能与数据库交互、执行计算或处理表单数据。
执行完成后,ASP引擎将结果转换为标准的HTML。
服务器将生成的HTML发送回客户端浏览器。
客户端浏览器接收并渲染HTML,显示给用户。
这一过程使得ASP能够根据用户请求、数据库内容或其他动态因素生成个性化的网页内容,而不仅仅是静态的HTML页面。
ASP的版本演变
ASP技术经历了多个版本的演进:
ASP 1.0
:1996年发布,是IIS 3.0的一部分,引入了基本的脚本功能。
ASP 2.0
:1997年发布,作为IIS 4.0的一部分,增加了事务处理、错误处理等功能。
ASP 3.0
:1999年发布,作为IIS 5.0的一部分,增强了XML支持和可扩展性。
ASP.NET
:2002年发布,是ASP的重大升级,基于.NET Framework,提供了更强大的功能和更好的性能。
尽管ASP.NET已经取代了传统ASP,但许多现有的Web应用程序仍然使用传统ASP技术,因此了解ASP的数据库连接和操作技术仍然具有重要的实际意义。
ASP与数据库的关系
ASP不是数据库
首先,需要明确的是,ASP本身不是数据库系统。它是一种服务器端脚本技术,用于生成动态网页内容。数据库是专门用于存储、管理和检索数据的系统,如Microsoft SQL Server、MySQL、Oracle等。ASP与数据库的关系是:ASP作为应用程序层,负责业务逻辑和用户界面;数据库作为数据存储层,负责数据的持久化存储。
ASP与数据库的交互模式
ASP与数据库的交互通常遵循以下模式:
建立连接
:ASP通过适当的数据库驱动程序或提供程序与数据库建立连接。
发送查询
:ASP向数据库发送SQL查询或存储过程调用。
处理结果
:ASP接收数据库返回的结果集,并进行处理。
显示数据
:ASP将处理后的数据嵌入到HTML中,生成动态网页内容。
关闭连接
:完成操作后,ASP关闭与数据库的连接,释放资源。
这种交互模式使得ASP能够根据数据库中的内容动态生成网页,实现数据的展示、添加、修改和删除等功能。
ASP支持的数据库类型
ASP具有广泛的数据库兼容性,可以连接和操作多种数据库系统,包括:
Microsoft Access
:适合小型应用和开发环境。
Microsoft SQL Server
:企业级数据库系统,与ASP有良好的集成。
MySQL
:流行的开源数据库系统。
Oracle
:大型企业级数据库系统。
其他ODBC兼容数据库
:任何支持ODBC(开放数据库连接)标准的数据库。
这种广泛的兼容性使得ASP成为连接不同数据库系统的理想选择,特别是在需要集成多个数据源的企业环境中。
连接数据库的方法
使用ADO连接数据库
在ASP中,最常用的数据库连接技术是ADO(ActiveX Data Objects)。ADO是微软提供的一种高级数据访问接口,它简化了与数据库的交互过程。ADO提供了几个核心对象,用于连接数据库、执行查询和处理结果:
Connection对象
:用于建立与数据库的连接。
Command对象
:用于执行SQL命令或存储过程。
Recordset对象
:用于表示从数据库返回的数据集。
Parameter对象
:用于表示Command对象的参数。
下面我们将详细介绍如何使用这些对象连接不同类型的数据库。
连接Microsoft Access数据库
Microsoft Access是一种常用的桌面数据库系统,适合小型应用和开发环境。使用ASP连接Access数据库通常有两种方法:通过ODBC驱动程序或通过OLE DB提供程序。
通过ODBC连接Access
首先,需要在服务器上创建一个系统DSN(数据源名称),然后使用以下代码连接数据库:
<% ' 创建Connection对象 Set conn = Server.CreateObject("ADODB.Connection") ' 打开数据库连接 conn.Open "DSN=myAccessDB;UID=;PWD=;" ' 执行SQL查询 Set rs = conn.Execute("SELECT * FROM Users") ' 处理查询结果 While Not rs.EOF Response.Write rs("UserName") & "
”
rs.MoveNext
Wend

‘ 关闭记录集和连接
rs.Close
Set rs = Nothing
conn.Close
Set conn = Nothing
%>
通过OLE DB连接Access
使用OLE DB提供程序直接连接Access数据库,无需创建DSN:
<% ' 创建Connection对象 Set conn = Server.CreateObject("ADODB.Connection") ' 定义连接字符串 connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("database.mdb") ' 打开数据库连接 conn.Open connStr ' 执行SQL查询 Set rs = conn.Execute("SELECT * FROM Users") ' 处理查询结果 While Not rs.EOF Response.Write rs("UserName") & "
”
rs.MoveNext
Wend

‘ 关闭记录集和连接
rs.Close
Set rs = Nothing
conn.Close
Set conn = Nothing
%>
对于Access 2007及更高版本(.accdb文件),连接字符串需要修改为:
connStr = “Provider=Microsoft.ACE.OLEDB.12.0;Data Source=” & Server.MapPath(“database.accdb”)
连接Microsoft SQL Server
Microsoft SQL Server是一种功能强大的企业级数据库系统,与ASP有良好的集成。连接SQL Server同样可以使用ODBC或OLE DB。
通过ODBC连接SQL Server
<% ' 创建Connection对象 Set conn = Server.CreateObject("ADODB.Connection") ' 打开数据库连接 conn.Open "DSN=mySQLServer;UID=myUsername;PWD=myPassword;Database=myDatabase" ' 执行SQL查询 Set rs = conn.Execute("SELECT * FROM Customers") ' 处理查询结果 While Not rs.EOF Response.Write rs("CustomerName") & "
”
rs.MoveNext
Wend

‘ 关闭记录集和连接
rs.Close
Set rs = Nothing
conn.Close
Set conn = Nothing
%>
通过OLE DB连接SQL Server
<% ' 创建Connection对象 Set conn = Server.CreateObject("ADODB.Connection") ' 定义连接字符串 connStr = "Provider=SQLOLEDB;Data Source=myServerAddress;Initial Catalog=myDatabase;User Id=myUsername;Password=myPassword;" ' 打开数据库连接 conn.Open connStr ' 执行SQL查询 Set rs = conn.Execute("SELECT * FROM Customers") ' 处理查询结果 While Not rs.EOF Response.Write rs("CustomerName") & "
”
rs.MoveNext
Wend

‘ 关闭记录集和连接
rs.Close
Set rs = Nothing
conn.Close
Set conn = Nothing
%>
对于SQL Server 2005及更高版本,建议使用SQL Native Client提供程序:
connStr = “Provider=SQLNCLI;Data Source=myServerAddress;Initial Catalog=myDatabase;User Id=myUsername;Password=myPassword;”
连接MySQL数据库
MySQL是一种流行的开源数据库系统,可以通过ODBC或OLE DB连接ASP应用程序。
通过ODBC连接MySQL
首先需要安装MySQL ODBC驱动程序,然后使用以下代码连接:
<% ' 创建Connection对象 Set conn = Server.CreateObject("ADODB.Connection") ' 定义连接字符串 connStr = "DRIVER={MySQL ODBC 5.1 Driver};SERVER=localhost;DATABASE=myDatabase;USER=myUsername;PASSWORD=myPassword;OPTION=3;" ' 打开数据库连接 conn.Open connStr ' 执行SQL查询 Set rs = conn.Execute("SELECT * FROM Products") ' 处理查询结果 While Not rs.EOF Response.Write rs("ProductName") & "
”
rs.MoveNext
Wend

‘ 关闭记录集和连接
rs.Close
Set rs = Nothing
conn.Close
Set conn = Nothing
%>
通过OLE DB连接MySQL
使用MySQL的OLE DB提供程序连接:
<% ' 创建Connection对象 Set conn = Server.CreateObject("ADODB.Connection") ' 定义连接字符串 connStr = "Provider=MySQLProv;Data Source=myDatabase;User Id=myUsername;Password=myPassword;" ' 打开数据库连接 conn.Open connStr ' 执行SQL查询 Set rs = conn.Execute("SELECT * FROM Products") ' 处理查询结果 While Not rs.EOF Response.Write rs("ProductName") & "
”
rs.MoveNext
Wend

‘ 关闭记录集和连接
rs.Close
Set rs = Nothing
conn.Close
Set conn = Nothing
%>
连接Oracle数据库
Oracle是一种大型企业级数据库系统,可以通过ODBC或OLE DB连接ASP应用程序。
通过ODBC连接Oracle
<% ' 创建Connection对象 Set conn = Server.CreateObject("ADODB.Connection") ' 打开数据库连接 conn.Open "DSN=myOracleDB;UID=myUsername;PWD=myPassword;" ' 执行SQL查询 Set rs = conn.Execute("SELECT * FROM Employees") ' 处理查询结果 While Not rs.EOF Response.Write rs("EmployeeName") & "
”
rs.MoveNext
Wend

‘ 关闭记录集和连接
rs.Close
Set rs = Nothing
conn.Close
Set conn = Nothing
%>
通过OLE DB连接Oracle
<% ' 创建Connection对象 Set conn = Server.CreateObject("ADODB.Connection") ' 定义连接字符串 connStr = "Provider=OraOLEDB.Oracle;Data Source=myOracleDB;User Id=myUsername;Password=myPassword;" ' 打开数据库连接 conn.Open connStr ' 执行SQL查询 Set rs = conn.Execute("SELECT * FROM Employees") ' 处理查询结果 While Not rs.EOF Response.Write rs("EmployeeName") & "
”
rs.MoveNext
Wend

‘ 关闭记录集和连接
rs.Close
Set rs = Nothing
conn.Close
Set conn = Nothing
%>
数据库操作技术
执行SQL查询
在ASP中,可以使用ADO的Connection对象或Command对象执行SQL查询。以下是几种常见的查询执行方式:
使用Connection.Execute方法
<% ' 创建Connection对象 Set conn = Server.CreateObject("ADODB.Connection") ' 打开数据库连接 conn.Open "Provider=SQLOLEDB;Data Source=myServer;Initial Catalog=myDB;User Id=myUser;Password=myPass;" ' 执行SQL查询 Set rs = conn.Execute("SELECT * FROM Products WHERE CategoryID = 1") ' 处理查询结果 While Not rs.EOF Response.Write rs("ProductName") & " - $" & rs("Price") & "
”
rs.MoveNext
Wend

‘ 关闭记录集和连接
rs.Close
Set rs = Nothing
conn.Close
Set conn = Nothing
%>
使用Command对象执行查询
<% ' 创建Connection和Command对象 Set conn = Server.CreateObject("ADODB.Connection") Set cmd = Server.CreateObject("ADODB.Command") ' 打开数据库连接 conn.Open "Provider=SQLOLEDB;Data Source=myServer;Initial Catalog=myDB;User Id=myUser;Password=myPass;" ' 设置Command对象属性 Set cmd.ActiveConnection = conn cmd.CommandText = "SELECT * FROM Products WHERE CategoryID = ?" cmd.CommandType = adCmdText ' 创建参数对象 Set param = cmd.CreateParameter("CategoryID", adInteger, adParamInput, , 1) cmd.Parameters.Append param ' 执行查询 Set rs = cmd.Execute ' 处理查询结果 While Not rs.EOF Response.Write rs("ProductName") & " - $" & rs("Price") & "
”
rs.MoveNext
Wend

‘ 关闭记录集和连接
rs.Close
Set rs = Nothing
conn.Close
Set conn = Nothing
%>
插入数据
向数据库插入新记录是常见的数据库操作之一。以下是使用ASP插入数据的示例:
<% ' 创建Connection对象 Set conn = Server.CreateObject("ADODB.Connection") ' 打开数据库连接 conn.Open "Provider=SQLOLEDB;Data Source=myServer;Initial Catalog=myDB;User Id=myUser;Password=myPass;" ' 获取表单数据 productName = Request.Form("productName") categoryID = Request.Form("categoryID") price = Request.Form("price") ' 构建SQL插入语句 sql = "INSERT INTO Products (ProductName, CategoryID, Price) VALUES ('" & productName & "', " & categoryID & ", " & price & ")" ' 执行插入操作 conn.Execute sql ' 关闭连接 conn.Close Set conn = Nothing ' 重定向到成功页面 Response.Redirect "success.asp" %>
为了防止SQL注入攻击,建议使用参数化查询:
<% ' 创建Connection和Command对象 Set conn = Server.CreateObject("ADODB.Connection") Set cmd = Server.CreateObject("ADODB.Command") ' 打开数据库连接 conn.Open "Provider=SQLOLEDB;Data Source=myServer;Initial Catalog=myDB;User Id=myUser;Password=myPass;" ' 获取表单数据 productName = Request.Form("productName") categoryID = Request.Form("categoryID") price = Request.Form("price") ' 设置Command对象属性 Set cmd.ActiveConnection = conn cmd.CommandText = "INSERT INTO Products (ProductName, CategoryID, Price) VALUES (?, ?, ?)" cmd.CommandType = adCmdText ' 创建参数对象 Set param1 = cmd.CreateParameter("ProductName", adVarChar, adParamInput, 100, productName) Set param2 = cmd.CreateParameter("CategoryID", adInteger, adParamInput, , categoryID) Set param3 = cmd.CreateParameter("Price", adCurrency, adParamInput, , price) ' 添加参数到Command对象 cmd.Parameters.Append param1 cmd.Parameters.Append param2 cmd.Parameters.Append param3 ' 执行插入操作 cmd.Execute ' 关闭连接 conn.Close Set conn = Nothing Set cmd = Nothing ' 重定向到成功页面 Response.Redirect "success.asp" %>
更新数据
更新数据库中的现有记录是另一个常见的操作。以下是使用ASP更新数据的示例:
<% ' 创建Connection对象 Set conn = Server.CreateObject("ADODB.Connection") ' 打开数据库连接 conn.Open "Provider=SQLOLEDB;Data Source=myServer;Initial Catalog=myDB;User Id=myUser;Password=myPass;" ' 获取表单数据 productID = Request.Form("productID") productName = Request.Form("productName") categoryID = Request.Form("categoryID") price = Request.Form("price") ' 构建SQL更新语句 sql = "UPDATE Products SET ProductName = '" & productName & "', CategoryID = " & categoryID & ", Price = " & price & " WHERE ProductID = " & productID ' 执行更新操作 conn.Execute sql ' 关闭连接 conn.Close Set conn = Nothing ' 重定向到成功页面 Response.Redirect "success.asp" %>
同样,使用参数化查询更安全:
<% ' 创建Connection和Command对象 Set conn = Server.CreateObject("ADODB.Connection") Set cmd = Server.CreateObject("ADODB.Command") ' 打开数据库连接 conn.Open "Provider=SQLOLEDB;Data Source=myServer;Initial Catalog=myDB;User Id=myUser;Password=myPass;" ' 获取表单数据 productID = Request.Form("productID") productName = Request.Form("productName") categoryID = Request.Form("categoryID") price = Request.Form("price") ' 设置Command对象属性 Set cmd.ActiveConnection = conn cmd.CommandText = "UPDATE Products SET ProductName = ?, CategoryID = ?, Price = ? WHERE ProductID = ?" cmd.CommandType = adCmdText ' 创建参数对象 Set param1 = cmd.CreateParameter("ProductName", adVarChar, adParamInput, 100, productName) Set param2 = cmd.CreateParameter("CategoryID", adInteger, adParamInput, , categoryID) Set param3 = cmd.CreateParameter("Price", adCurrency, adParamInput, , price) Set param4 = cmd.CreateParameter("ProductID", adInteger, adParamInput, , productID) ' 添加参数到Command对象 cmd.Parameters.Append param1 cmd.Parameters.Append param2 cmd.Parameters.Append param3 cmd.Parameters.Append param4 ' 执行更新操作 cmd.Execute ' 关闭连接 conn.Close Set conn = Nothing Set cmd = Nothing ' 重定向到成功页面 Response.Redirect "success.asp" %>
删除数据
从数据库中删除记录也是常见的操作。以下是使用ASP删除数据的示例:
<% ' 创建Connection对象 Set conn = Server.CreateObject("ADODB.Connection") ' 打开数据库连接 conn.Open "Provider=SQLOLEDB;Data Source=myServer;Initial Catalog=myDB;User Id=myUser;Password=myPass;" ' 获取要删除的记录ID productID = Request.QueryString("id") ' 构建SQL删除语句 sql = "DELETE FROM Products WHERE ProductID = " & productID ' 执行删除操作 conn.Execute sql ' 关闭连接 conn.Close Set conn = Nothing ' 重定向到产品列表页面 Response.Redirect "product_list.asp" %>
使用参数化查询更安全:
<% ' 创建Connection和Command对象 Set conn = Server.CreateObject("ADODB.Connection") Set cmd = Server.CreateObject("ADODB.Command") ' 打开数据库连接 conn.Open "Provider=SQLOLEDB;Data Source=myServer;Initial Catalog=myDB;User Id=myUser;Password=myPass;" ' 获取要删除的记录ID productID = Request.QueryString("id") ' 设置Command对象属性 Set cmd.ActiveConnection = conn cmd.CommandText = "DELETE FROM Products WHERE ProductID = ?" cmd.CommandType = adCmdText ' 创建参数对象 Set param = cmd.CreateParameter("ProductID", adInteger, adParamInput, , productID) cmd.Parameters.Append param ' 执行删除操作 cmd.Execute ' 关闭连接 conn.Close Set conn = Nothing Set cmd = Nothing ' 重定向到产品列表页面 Response.Redirect "product_list.asp" %>
调用存储过程
存储过程是预编译的SQL语句,存储在数据库中,可以提高性能和安全性。以下是使用ASP调用存储过程的示例:
<% ' 创建Connection和Command对象 Set conn = Server.CreateObject("ADODB.Connection") Set cmd = Server.CreateObject("ADODB.Command") ' 打开数据库连接 conn.Open "Provider=SQLOLEDB;Data Source=myServer;Initial Catalog=myDB;User Id=myUser;Password=myPass;" ' 设置Command对象属性 Set cmd.ActiveConnection = conn cmd.CommandText = "sp_GetProductsByCategory" cmd.CommandType = adCmdStoredProc ' 创建参数对象 Set param = cmd.CreateParameter("CategoryID", adInteger, adParamInput, , 1) cmd.Parameters.Append param ' 执行存储过程 Set rs = cmd.Execute ' 处理查询结果 While Not rs.EOF Response.Write rs("ProductName") & " - $" & rs("Price") & "
”
rs.MoveNext
Wend

‘ 关闭记录集和连接
rs.Close
Set rs = Nothing
conn.Close
Set conn = Nothing
Set cmd = Nothing
%>
处理事务
事务是一组作为单个逻辑单元执行的SQL操作,要么全部成功,要么全部失败。以下是使用ASP处理事务的示例:
<% On Error Resume Next ' 创建Connection对象 Set conn = Server.CreateObject("ADODB.Connection") ' 打开数据库连接 conn.Open "Provider=SQLOLEDB;Data Source=myServer;Initial Catalog=myDB;User Id=myUser;Password=myPass;" ' 开始事务 conn.BeginTrans ' 执行多个SQL操作 conn.Execute "INSERT INTO Orders (CustomerID, OrderDate) VALUES (1, GETDATE())" conn.Execute "INSERT INTO OrderDetails (OrderID, ProductID, Quantity) VALUES (@@IDENTITY, 1, 2)" conn.Execute "UPDATE Products SET Stock = Stock - 2 WHERE ProductID = 1" ' 检查是否有错误 If Err.Number <> 0 Then
‘ 如果有错误,回滚事务
conn.RollbackTrans
Response.Write “订单处理失败: ” & Err.Description
Else
‘ 如果没有错误,提交事务
conn.CommitTrans
Response.Write “订单处理成功”
End If

‘ 关闭连接
conn.Close
Set conn = Nothing
%>
实际应用案例
用户登录系统
用户登录系统是Web应用中最常见的功能之一。以下是使用ASP和数据库实现的用户登录系统:
登录页面 (login.asp)
<%@ Language=VBScript %>



用户登录

用户登录





登录验证页面 (check_login.asp)
<%@ Language=VBScript %>
<% ' 获取表单数据 username = Request.Form("username") password = Request.Form("password") ' 创建Connection和Command对象 Set conn = Server.CreateObject("ADODB.Connection") Set cmd = Server.CreateObject("ADODB.Command") ' 打开数据库连接 conn.Open "Provider=SQLOLEDB;Data Source=myServer;Initial Catalog=myDB;User Id=myUser;Password=myPass;" ' 设置Command对象属性 Set cmd.ActiveConnection = conn cmd.CommandText = "SELECT * FROM Users WHERE Username = ? AND Password = ?" cmd.CommandType = adCmdText ' 创建参数对象 Set param1 = cmd.CreateParameter("Username", adVarChar, adParamInput, 50, username) Set param2 = cmd.CreateParameter("Password", adVarChar, adParamInput, 50, password) ' 添加参数到Command对象 cmd.Parameters.Append param1 cmd.Parameters.Append param2 ' 执行查询 Set rs = cmd.Execute ' 检查用户是否存在 If Not rs.EOF Then ' 用户存在,设置会话变量 Session("UserID") = rs("UserID") Session("Username") = rs("Username") ' 重定向到主页 Response.Redirect "home.asp" Else ' 用户不存在,重定向回登录页面 Response.Redirect "login.asp?error=1" End If ' 关闭记录集和连接 rs.Close Set rs = Nothing conn.Close Set conn = Nothing Set cmd = Nothing %>
主页 (home.asp)
<%@ Language=VBScript %>
<% ' 检查用户是否已登录 If Session("UserID") = "" Then Response.Redirect "login.asp" End If %>



主页

欢迎, <%= Session("Username") %>!

这是一个受保护的页面,只有登录用户才能访问。

退出登录



退出登录页面 (logout.asp)
<%@ Language=VBScript %>
<% ' 清除会话变量 Session.Contents.RemoveAll() Session.Abandon() ' 重定向到登录页面 Response.Redirect "login.asp" %>
产品管理系统
产品管理系统是另一个常见的Web应用,它允许用户查看、添加、编辑和删除产品信息。以下是使用ASP和数据库实现的产品管理系统:
产品列表页面 (product_list.asp)
<%@ Language=VBScript %>
<% ' 创建Connection对象 Set conn = Server.CreateObject("ADODB.Connection") ' 打开数据库连接 conn.Open "Provider=SQLOLEDB;Data Source=myServer;Initial Catalog=myDB;User Id=myUser;Password=myPass;" ' 执行SQL查询 Set rs = conn.Execute("SELECT p.*, c.CategoryName FROM Products p JOIN Categories c ON p.CategoryID = c.CategoryID ORDER BY p.ProductName") %>



产品列表

产品列表

添加新产品

<% While Not rs.EOF %>

<% rs.MoveNext Wend %>

产品ID 产品名称 类别 价格 库存 操作
<%= rs("ProductID") %> <%= rs("ProductName") %> <%= rs("CategoryName") %> <%= FormatCurrency(rs("Price")) %> <%= rs("Stock") %> “>编辑 |
” onclick=”return confirm(‘确定要删除这个产品吗?’)”>删除



<% ' 关闭记录集和连接 rs.Close Set rs = Nothing conn.Close Set conn = Nothing %>
添加产品页面 (product_add.asp)
<%@ Language=VBScript %>
<% ' 创建Connection对象 Set conn = Server.CreateObject("ADODB.Connection") ' 打开数据库连接 conn.Open "Provider=SQLOLEDB;Data Source=myServer;Initial Catalog=myDB;User Id=myUser;Password=myPass;" ' 获取类别列表 Set rsCategories = conn.Execute("SELECT * FROM Categories ORDER BY CategoryName") %>



添加产品

添加新产品







取消



<% ' 关闭记录集和连接 rsCategories.Close Set rsCategories = Nothing conn.Close Set conn = Nothing %>
保存产品页面 (product_save.asp)
<%@ Language=VBScript %>
<% ' 获取表单数据 action = Request.QueryString("action") productID = Request.Form("productID") productName = Request.Form("productName") categoryID = Request.Form("categoryID") price = Request.Form("price") stock = Request.Form("stock") description = Request.Form("description") ' 创建Connection和Command对象 Set conn = Server.CreateObject("ADODB.Connection") Set cmd = Server.CreateObject("ADODB.Command") ' 打开数据库连接 conn.Open "Provider=SQLOLEDB;Data Source=myServer;Initial Catalog=myDB;User Id=myUser;Password=myPass;" ' 设置Command对象属性 Set cmd.ActiveConnection = conn If action = "add" Then ' 添加新产品 cmd.CommandText = "INSERT INTO Products (ProductName, CategoryID, Price, Stock, Description) VALUES (?, ?, ?, ?, ?)" cmd.CommandType = adCmdText ' 创建参数对象 Set param1 = cmd.CreateParameter("ProductName", adVarChar, adParamInput, 100, productName) Set param2 = cmd.CreateParameter("CategoryID", adInteger, adParamInput, , categoryID) Set param3 = cmd.CreateParameter("Price", adCurrency, adParamInput, , price) Set param4 = cmd.CreateParameter("Stock", adInteger, adParamInput, , stock) Set param5 = cmd.CreateParameter("Description", adLongVarChar, adParamInput, 1000, description) ' 添加参数到Command对象 cmd.Parameters.Append param1 cmd.Parameters.Append param2 cmd.Parameters.Append param3 cmd.Parameters.Append param4 cmd.Parameters.Append param5 ' 执行插入操作 cmd.Execute ElseIf action = "edit" Then ' 更新产品 cmd.CommandText = "UPDATE Products SET ProductName = ?, CategoryID = ?, Price = ?, Stock = ?, Description = ? WHERE ProductID = ?" cmd.CommandType = adCmdText ' 创建参数对象 Set param1 = cmd.CreateParameter("ProductName", adVarChar, adParamInput, 100, productName) Set param2 = cmd.CreateParameter("CategoryID", adInteger, adParamInput, , categoryID) Set param3 = cmd.CreateParameter("Price", adCurrency, adParamInput, , price) Set param4 = cmd.CreateParameter("Stock", adInteger, adParamInput, , stock) Set param5 = cmd.CreateParameter("Description", adLongVarChar, adParamInput, 1000, description) Set param6 = cmd.CreateParameter("ProductID", adInteger, adParamInput, , productID) ' 添加参数到Command对象 cmd.Parameters.Append param1 cmd.Parameters.Append param2 cmd.Parameters.Append param3 cmd.Parameters.Append param4 cmd.Parameters.Append param5 cmd.Parameters.Append param6 ' 执行更新操作 cmd.Execute End If ' 关闭连接 conn.Close Set conn = Nothing Set cmd = Nothing ' 重定向到产品列表页面 Response.Redirect "product_list.asp" %>
安全性考虑
SQL注入攻击防护
SQL注入是一种常见的Web应用安全漏洞,攻击者可以通过注入恶意SQL代码来操纵数据库查询。在ASP中,有几种方法可以防止SQL注入攻击:
使用参数化查询
参数化查询是防止SQL注入的最有效方法。它将SQL语句和参数分开处理,确保用户输入不会被解释为SQL代码。
<% ' 创建Connection和Command对象 Set conn = Server.CreateObject("ADODB.Connection") Set cmd = Server.CreateObject("ADODB.Command") ' 打开数据库连接 conn.Open "Provider=SQLOLEDB;Data Source=myServer;Initial Catalog=myDB;User Id=myUser;Password=myPass;" ' 获取用户输入 username = Request.Form("username") password = Request.Form("password") ' 设置Command对象属性 Set cmd.ActiveConnection = conn cmd.CommandText = "SELECT * FROM Users WHERE Username = ? AND Password = ?" cmd.CommandType = adCmdText ' 创建参数对象 Set param1 = cmd.CreateParameter("Username", adVarChar, adParamInput, 50, username) Set param2 = cmd.CreateParameter("Password", adVarChar, adParamInput, 50, password) ' 添加参数到Command对象 cmd.Parameters.Append param1 cmd.Parameters.Append param2 ' 执行查询 Set rs = cmd.Execute ' 处理结果 If Not rs.EOF Then ' 用户验证成功 Session("UserID") = rs("UserID") Response.Redirect "home.asp" Else ' 用户验证失败 Response.Redirect "login.asp?error=1" End If ' 关闭记录集和连接 rs.Close Set rs = Nothing conn.Close Set conn = Nothing Set cmd = Nothing %>
输入验证
输入验证是另一种防止SQL注入的重要方法。在处理用户输入之前,应该验证输入是否符合预期的格式和范围。
<% ' 获取用户输入 productID = Request.QueryString("id") ' 验证输入是否为数字 If Not IsNumeric(productID) Then Response.Write "无效的产品ID" Response.End End If ' 转换为整数 productID = CLng(productID) ' 创建Connection对象 Set conn = Server.CreateObject("ADODB.Connection") ' 打开数据库连接 conn.Open "Provider=SQLOLEDB;Data Source=myServer;Initial Catalog=myDB;User Id=myUser;Password=myPass;" ' 执行SQL查询 Set rs = conn.Execute("SELECT * FROM Products WHERE ProductID = " & productID) ' 处理结果 If Not rs.EOF Then ' 显示产品信息 Response.Write "产品名称: " & rs("ProductName") Else Response.Write "产品不存在" End If ' 关闭记录集和连接 rs.Close Set rs = Nothing conn.Close Set conn = Nothing %>
身份验证和授权
身份验证和授权是保护Web应用程序的重要机制。身份验证确认用户是谁,授权确定用户可以访问哪些资源。
基于表单的身份验证
基于表单的身份验证是最常见的身份验证方法之一。用户通过填写表单提供用户名和密码,服务器验证这些凭据。
<%@ Language=VBScript %>
<% ' 检查用户是否已提交登录表单 If Request.ServerVariables("REQUEST_METHOD") = "POST" Then ' 获取表单数据 username = Request.Form("username") password = Request.Form("password") ' 创建Connection和Command对象 Set conn = Server.CreateObject("ADODB.Connection") Set cmd = Server.CreateObject("ADODB.Command") ' 打开数据库连接 conn.Open "Provider=SQLOLEDB;Data Source=myServer;Initial Catalog=myDB;User Id=myUser;Password=myPass;" ' 设置Command对象属性 Set cmd.ActiveConnection = conn cmd.CommandText = "SELECT * FROM Users WHERE Username = ? AND Password = ?" cmd.CommandType = adCmdText ' 创建参数对象 Set param1 = cmd.CreateParameter("Username", adVarChar, adParamInput, 50, username) Set param2 = cmd.CreateParameter("Password", adVarChar, adParamInput, 50, password) ' 添加参数到Command对象 cmd.Parameters.Append param1 cmd.Parameters.Append param2 ' 执行查询 Set rs = cmd.Execute ' 检查用户是否存在 If Not rs.EOF Then ' 用户存在,设置会话变量 Session("UserID") = rs("UserID") Session("Username") = rs("Username") Session("Role") = rs("Role") ' 更新最后登录时间 conn.Execute "UPDATE Users SET LastLogin = GETDATE() WHERE UserID = " & rs("UserID") ' 重定向到主页 Response.Redirect "home.asp" Else ' 用户不存在,设置错误消息 Session("LoginError") = "用户名或密码错误" End If ' 关闭记录集和连接 rs.Close Set rs = Nothing conn.Close Set conn = Nothing Set cmd = Nothing End If %>



用户登录

用户登录

<% If Session("LoginError") <> “” Then %>

<%= Session("LoginError") %>

<% Session("LoginError") = "" %>
<% End If %>





性能优化
数据库连接管理
数据库连接是宝贵的资源,应该有效地管理它们以提高应用程序的性能。以下是几种优化数据库连接管理的方法:
连接池
连接池是一种重用数据库连接的技术,可以显著提高应用程序的性能。在ASP中,可以通过配置ODBC数据源或OLE DB连接字符串来启用连接池。
<% ' 创建Connection对象 Set conn = Server.CreateObject("ADODB.Connection") ' 配置连接字符串以启用连接池 connStr = "Provider=SQLOLEDB;Data Source=myServer;Initial Catalog=myDB;User Id=myUser;Password=myPass;OLE DB Services=-2;" ' 打开数据库连接 conn.Open connStr ' 执行数据库操作 Set rs = conn.Execute("SELECT * FROM Products") ' 处理结果 While Not rs.EOF Response.Write rs("ProductName") & "
”
rs.MoveNext
Wend

‘ 关闭记录集和连接
rs.Close
Set rs = Nothing
conn.Close
Set conn = Nothing
%>
及时关闭连接
及时关闭数据库连接是良好的编程实践,可以释放资源并提高性能。可以使用ASP的On Error Resume Next和On Error GoTo 0来确保连接在发生错误时也能被关闭。
<% On Error Resume Next ' 创建Connection对象 Set conn = Server.CreateObject("ADODB.Connection") ' 打开数据库连接 conn.Open "Provider=SQLOLEDB;Data Source=myServer;Initial Catalog=myDB;User Id=myUser;Password=myPass;" ' 检查是否发生错误 If Err.Number <> 0 Then
Response.Write “连接数据库时发生错误: ” & Err.Description
Else
‘ 执行数据库操作
Set rs = conn.Execute(“SELECT * FROM Products”)

‘ 检查是否发生错误
If Err.Number = 0 Then
‘ 处理结果
While Not rs.EOF
Response.Write rs(“ProductName”) & “
”
rs.MoveNext
Wend
Else
Response.Write “执行查询时发生错误: ” & Err.Description
End If

‘ 关闭记录集
rs.Close
Set rs = Nothing
End If

‘ 关闭连接
conn.Close
Set conn = Nothing

‘ 重置错误处理
On Error GoTo 0
%>
缓存技术
缓存是一种存储常用数据的技术,可以减少数据库访问次数,提高应用程序性能。
应用程序级缓存
ASP提供了Application对象,可以用于存储应用程序级别的缓存数据。
<% ' 检查缓存中是否存在产品类别数据 If Not IsObject(Application("Categories")) Then ' 缓存中不存在,从数据库获取 Set conn = Server.CreateObject("ADODB.Connection") conn.Open "Provider=SQLOLEDB;Data Source=myServer;Initial Catalog=myDB;User Id=myUser;Password=myPass;" Set rs = conn.Execute("SELECT * FROM Categories ORDER BY CategoryName") ' 将数据存储到缓存中 Set Application("Categories") = rs.GetRows() ' 关闭记录集和连接 rs.Close Set rs = Nothing conn.Close Set conn = Nothing End If ' 从缓存中获取数据 categories = Application("Categories") ' 显示数据 For i = 0 To UBound(categories, 2) Response.Write categories(1, i) & "
” ‘ 假设第二列是CategoryName
Next
%>
会话级缓存
ASP提供了Session对象,可以用于存储用户特定的缓存数据。
<% ' 检查缓存中是否存在用户购物车数据 If Not IsObject(Session("ShoppingCart")) Then ' 缓存中不存在,从数据库获取 Set conn = Server.CreateObject("ADODB.Connection") conn.Open "Provider=SQLOLEDB;Data Source=myServer;Initial Catalog=myDB;User Id=myUser;Password=myPass;" Set cmd = Server.CreateObject("ADODB.Command") Set cmd.ActiveConnection = conn cmd.CommandText = "sp_GetShoppingCart" cmd.CommandType = adCmdStoredProc Set param = cmd.CreateParameter("UserID", adInteger, adParamInput, , Session("UserID")) cmd.Parameters.Append param Set rs = cmd.Execute() ' 将数据存储到缓存中 Set Session("ShoppingCart") = rs.GetRows() ' 关闭记录集和连接 rs.Close Set rs = Nothing conn.Close Set conn = Nothing Set cmd = Nothing End If ' 从缓存中获取数据 cartItems = Session("ShoppingCart") ' 显示数据 For i = 0 To UBound(cartItems, 2) Response.Write cartItems(1, i) & " - " & cartItems(2, i) & "
” ‘ 假设第二列是ProductName,第三列是Quantity
Next
%>
总结
ASP(Active Server Pages)是一种强大的服务器端脚本技术,而不是数据库系统。它的真正价值在于能够连接并操作各种数据库系统,从而实现数据的动态展示和交互。通过本文的介绍,我们深入了解了ASP如何与数据库交互,包括连接不同类型的数据库、执行各种数据库操作、构建实际应用案例以及考虑安全性和性能优化。
ASP的数据库连接和操作技术为开发人员提供了丰富的工具和灵活性,使他们能够构建功能强大、性能优良的动态网页应用。无论是小型网站还是大型企业应用,ASP都能够满足不同的需求,提供可靠的数据访问和处理能力。
尽管ASP.NET已经取代了传统ASP,成为微软Web开发的主流技术,但许多现有的Web应用程序仍然使用传统ASP技术。因此,了解ASP的数据库连接和操作技术仍然具有重要的实际意义,特别是在维护和升级现有系统时。
通过掌握ASP的数据库技术,开发人员可以更好地理解Web应用程序的工作原理,为学习和使用更现代的技术(如ASP.NET、PHP、Java等)打下坚实的基础。无论技术如何发展,数据库连接和操作的基本原理都是相似的,这些知识和经验将在开发人员的职业生涯中持续发挥作用。