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. 注意事项

  1. 连接字符串
  • 确保连接字符串正确,匹配数据库类型和驱动。
  • 存储在Application或配置文件中,避免硬编码:
    asp conn.ConnectionString = Application("dbConnection")
  1. 中文编码
  • 设置<%@ Language=VBScript CodePage=65001 %>Response.Charset = "UTF-8"支持中文。
  • 对输出使用Server.HTMLEncode防止XSS:
    asp Response.Write(Server.HTMLEncode(rs("username")))
  1. 安全性
  • SQL注入:使用参数化查询(Command对象)避免注入:
    asp cmd.Parameters.Append cmd.CreateParameter("param", 200, 1, 50, Request.Form("input"))
  • 验证用户输入,防止恶意SQL。
  • 避免在代码中硬编码数据库凭据。
  1. 性能
  • 及时关闭RecordsetConnectionrs.Close, conn.Close)。
  • 释放对象(Set rs = Nothing)避免内存泄漏。
  • 避免频繁查询大表,优化SQL语句。
  1. 错误处理
  • 使用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.EOFrs.BOF避免空记录集错误。
  1. 数据库驱动
  • 确保服务器安装了正确的数据库驱动(如SQL Server Native Client、MySQL ODBC)。
  • Access需Microsoft ACE OLEDB驱动。
  1. 调试
  • 输出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是与数据库交互的核心工具,通过ConnectionRecordsetCommand对象实现连接、查询和更新。支持SQL Server、Access等数据库,适合动态Web应用。注意连接字符串配置、中文编码、安全性(如SQL注入防护)和错误处理,确保代码健壮。更多细节可参考微软官方文档中的ADODB说明。

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注