ASP ADO
ASP ADO(中文讲解)
在经典Active Server Pages(ASP)中,ADO(ActiveX Data Objects)是微软提供的一组COM组件,用于访问和操作数据库。它通过Server.CreateObject
创建,支持连接各种数据库(如SQL Server、Access、MySQL等),执行SQL查询、更新数据等操作。以下是对ASP中使用ADO的详细讲解,包括核心对象、方法、属性、示例和注意事项。
1. ADO 概述
- 作用:ADO是ASP与数据库交互的主要工具,提供连接、查询和操作数据库的功能。
- 核心对象:
Connection
:管理数据库连接。Command
:执行SQL命令(可选,高级操作)。Recordset
:处理查询结果集或执行更新。- 用途:
- 查询数据库(如获取用户列表)。
- 更新数据库(如插入、修改、删除记录)。
- 管理事务或存储过程。
- 依赖:依赖
ADODB
组件,默认随Windows安装(需数据库驱动,如ODBC或OLE DB)。 - 环境:运行于支持ASP的服务器(如IIS)。
2. 核心 ADO 对象
(1) Connection 对象
- 作用:建立和维护数据库连接。
- 创建:
Set conn = Server.CreateObject("ADODB.Connection")
- 常用属性:
ConnectionString
:指定数据库连接信息。asp conn.ConnectionString = "Provider=SQLOLEDB;Data Source=server;Initial Catalog=db;User Id=user;Password=pass;"
ConnectionTimeout
:连接超时时间(秒)。asp conn.ConnectionTimeout = 30
- 常用方法:
Open
:打开数据库连接。asp conn.Open
Close
:关闭连接。asp conn.Close
Execute(sql)
:执行SQL语句,返回Recordset
(可选)。asp Set rs = conn.Execute("SELECT * FROM Users")
(2) Recordset 对象
- 作用:存储查询结果或执行更新操作。
- 创建:
Set rs = Server.CreateObject("ADODB.Recordset")
- 常用属性:
EOF
:布尔值,指示是否到达记录集末尾。asp If rs.EOF Then Response.Write("无记录")
BOF
:布尔值,指示是否在记录集开头。Fields
:访问字段值。asp Response.Write(rs.Fields("username").Value)
RecordCount
:记录数(需特定游标类型)。asp Response.Write("记录数:" & rs.RecordCount)
- 常用方法:
Open(source, connection, cursorType, lockType)
:打开记录集。cursorType
:游标类型(0=只进,1=键集,2=动态,3=静态)。lockType
:锁定类型(1=只读,2=悲观,3=乐观,4=批更新)。asp rs.Open "SELECT * FROM Users", conn, 1, 3
MoveNext
:移动到下一条记录。asp rs.MoveNext
AddNew
:添加新记录。asp rs.AddNew
Update
:保存记录更改。asp rs.Update
Delete
:删除当前记录。asp rs.Delete
Close
:关闭记录集。asp rs.Close
(3) Command 对象(可选)
- 作用:执行参数化查询或存储过程。
- 创建:
Set cmd = Server.CreateObject("ADODB.Command")
- 常用属性:
ActiveConnection
:关联的Connection
对象。asp cmd.ActiveConnection = conn
CommandText
:SQL语句或存储过程名。asp cmd.CommandText = "SELECT * FROM Users WHERE id = ?"
- 常用方法:
Execute
:执行命令,返回Recordset
(可选)。asp Set rs = cmd.Execute
3. 连接数据库
连接数据库需要正确的连接字符串,常见数据库的连接字符串示例:
- SQL Server:
conn.ConnectionString = "Provider=SQLOLEDB;Data Source=localhost;Initial Catalog=MyDB;User Id=sa;Password=pass;"
- Access:
conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Server.MapPath("database.mdb") & ";"
- MySQL(需MySQL ODBC驱动):
conn.ConnectionString = "Driver={MySQL ODBC 8.0 Driver};Server=localhost;Database=MyDB;Uid=user;Pwd=pass;"
4. 示例代码
(1) 查询数据库
查询用户表并显示结果:
<%@ Language=VBScript CodePage=65001 %>
<xaiArtifact artifact_id="1ae1964b-768f-4e14-a49e-db77cd212050" artifact_version_id="704b0160-ab01-400b-a252-2025f94f9030" title="db_query.asp" contentType="text/asp">
<%
Response.Charset = "UTF-8"
Set conn = Server.CreateObject("ADODB.Connection")
conn.ConnectionString = "Provider=SQLOLEDB;Data Source=localhost;Initial Catalog=MyDB;User Id=sa;Password=pass;"
conn.Open
Set rs = conn.Execute("SELECT username, email FROM Users")
Response.Write("<h1>用户列表</h1><ul>")
Do Until rs.EOF
Response.Write("<li>" & Server.HTMLEncode(rs("username")) & ": " & Server.HTMLEncode(rs("email")) & "</li>")
rs.MoveNext
Loop
rs.Close
conn.Close
Set rs = Nothing
Set conn = Nothing
Response.Write("</ul>")
%>
</xaiArtifact>
- 输出示例:
用户列表
- 张伟: zhangwei@example.com
- 李明: liming@example.com
(2) 插入记录
插入新用户记录:
<%@ Language=VBScript CodePage=65001 %>
<xaiArtifact artifact_id="7cf8359d-4f0e-4712-aba1-4717b43d5d5b" artifact_version_id="bd055515-f7e4-49d8-95c1-32deaf3c68d6" title="db_insert.asp" contentType="text/asp">
<%
Response.Charset = "UTF-8"
Set conn = Server.CreateObject("ADODB.Connection")
conn.ConnectionString = "Provider=SQLOLEDB;Data Source=localhost;Initial Catalog=MyDB;User Id=sa;Password=pass;"
conn.Open
Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open "Users", conn, 1, 3 ' 1=键集游标,3=乐观锁定
rs.AddNew
rs("username") = Server.HTMLEncode(Request.Form("username"))
rs("email") = Server.HTMLEncode(Request.Form("email"))
rs.Update
rs.Close
conn.Close
Set rs = Nothing
Set conn = Nothing
Response.Write("用户添加成功!")
%>
</xaiArtifact>
(3) 参数化查询(使用Command)
防止SQL注入的参数化查询:
<%@ Language=VBScript CodePage=65001 %>
<xaiArtifact artifact_id="13987c8a-d843-4fdb-bc5a-d130f8c03187" artifact_version_id="08ea10b0-ef9c-499e-8067-e09a227f38ef" title="db_param_query.asp" contentType="text/asp">
<%
Response.Charset = "UTF-8"
Set conn = Server.CreateObject("ADODB.Connection")
conn.ConnectionString = "Provider=SQLOLEDB;Data Source=localhost;Initial Catalog=MyDB;User Id=sa;Password=pass;"
conn.Open
Set cmd = Server.CreateObject("ADODB.Command")
cmd.ActiveConnection = conn
cmd.CommandText = "SELECT * FROM Users WHERE username = ?"
cmd.Parameters.Append cmd.CreateParameter("param1", 200, 1, 50, Request.QueryString("username"))
Set rs = cmd.Execute
If Not rs.EOF Then
Response.Write("找到用户:" & Server.HTMLEncode(rs("username")))
Else
Response.Write("用户不存在")
End If
rs.Close
conn.Close
Set rs = Nothing
Set cmd = Nothing
Set conn = Nothing
%>
</xaiArtifact>
(4) 错误处理
捕获数据库操作错误:
<%@ Language=VBScript CodePage=65001 %>
<xaiArtifact artifact_id="c8be57cb-889b-447e-92fd-2bd0299c5f86" artifact_version_id="976bffa9-1a22-4846-804e-d549923d4edf" title="db_error_handling.asp" contentType="text/asp">
<%
Response.Charset = "UTF-8"
On Error Resume Next
Set conn = Server.CreateObject("ADODB.Connection")
conn.ConnectionString = "Provider=SQLOLEDB;Data Source=localhost;Initial Catalog=MyDB;User Id=sa;Password=pass;"
conn.Open
If Err.Number <> 0 Then
Response.Write("连接失败:" & Err.Description)
Response.End
End If
Set rs = conn.Execute("SELECT * FROM NonExistentTable")
If Err.Number <> 0 Then
Response.Write("查询失败:" & Err.Description)
Else
Response.Write("查询成功")
rs.Close
End If
conn.Close
Set rs = Nothing
Set conn = Nothing
On Error GoTo 0
%>
</xaiArtifact>
5. 注意事项
- 连接字符串:
- 确保连接字符串正确,匹配数据库类型和驱动。
- 存储在
Application
或配置文件中,避免硬编码:asp conn.ConnectionString = Application("dbConnection")
- 中文编码:
- 设置
<%@ Language=VBScript CodePage=65001 %>
和Response.Charset = "UTF-8"
支持中文。 - 对输出使用
Server.HTMLEncode
防止XSS:asp Response.Write(Server.HTMLEncode(rs("username")))
- 安全性:
- SQL注入:使用参数化查询(
Command
对象)避免注入:asp cmd.Parameters.Append cmd.CreateParameter("param", 200, 1, 50, Request.Form("input"))
- 验证用户输入,防止恶意SQL。
- 避免在代码中硬编码数据库凭据。
- 性能:
- 及时关闭
Recordset
和Connection
(rs.Close
,conn.Close
)。 - 释放对象(
Set rs = Nothing
)避免内存泄漏。 - 避免频繁查询大表,优化SQL语句。
- 错误处理:
- 使用
On Error Resume Next
捕获错误:asp On Error Resume Next conn.Open If Err.Number <> 0 Then Response.Write("错误:" & Err.Description) End If On Error GoTo 0
- 检查
rs.EOF
和rs.BOF
避免空记录集错误。
- 数据库驱动:
- 确保服务器安装了正确的数据库驱动(如SQL Server Native Client、MySQL ODBC)。
- Access需Microsoft ACE OLEDB驱动。
- 调试:
- 输出SQL语句或
Err.Description
检查问题。 - 检查IIS日志或启用详细错误信息。
6. 与Request/Response/Application/Session关系
Request
:提供用户输入,初始化数据库操作:
rs.AddNew
rs("username") = Request.Form("username")
Response
:输出查询结果:
Response.Write(rs("username"))
Application
:存储全局连接字符串:
conn.ConnectionString = Application("dbConnection")
Session
:存储用户特定数据:
Session("userId") = rs("id")
7. 总结
ASP的ADO是与数据库交互的核心工具,通过Connection
、Recordset
和Command
对象实现连接、查询和更新。支持SQL Server、Access等数据库,适合动态Web应用。注意连接字符串配置、中文编码、安全性(如SQL注入防护)和错误处理,确保代码健壮。更多细节可参考微软官方文档中的ADODB
说明。