ADO Error 对象
ADO Error 对象中文讲解
在 ADO(ActiveX Data Objects) 中,Error 对象 是用于捕获和处理数据库操作过程中发生的错误的工具。它属于 Connection 对象的 Errors 集合,每次数据库操作(如连接、查询、插入、更新、删除)失败时,ADO 会将错误信息存储在 Errors 集合中。每个 Error 对象包含具体的错误详细信息,如错误描述、错误代码等。这在经典 ASP、VBA、VB6 或 Python(通过 pywin32
)等环境中非常重要,用于调试和错误处理。
本教程详细讲解 ADO Error 对象 的用法、属性,并结合上下文(如 REST API、ChromeDriver、Cron、Traefik、列表推导式)提供实用示例。假设你已熟悉 ADO 的 Connection、Recordset 和 Command 对象(参考前文)。
一、ADO Error 对象核心概念
- 作用:
- 捕获数据库操作的错误(如连接失败、SQL 语法错误、约束冲突)。
- 提供详细错误信息,用于调试和用户提示。
- Errors 集合:
- 属于 Connection 对象,包含零个或多个 Error 对象。
- 每次操作可能产生多个错误(如多条 SQL 语句)。
- 适用场景:
- 处理连接失败(如数据库路径错误)。
- 捕获 SQL 执行错误(如表不存在、违反唯一约束)。
- 记录错误日志或返回用户友好的错误信息(REST API)。
- 关键点:
- Errors 集合在每次数据库操作后更新,需检查
Errors.Count
。 - Error 对象提供错误号、描述、来源等详细信息。
二、Error 对象核心属性
- Number:错误编号(通常是数据库提供程序的错误代码)。
- Description:错误描述(文本说明)。
- Source:引发错误的组件(如 ADO 或数据库提供程序)。
- SQLState:SQL 标准错误代码(五字符代码,数据库相关)。
- NativeError:数据库特定的错误代码。
- HelpFile 和 HelpContext:帮助文件和上下文(很少使用)。
常用方法:
- Errors.Clear:清空 Errors 集合。
- Errors.Refresh:刷新 Errors 集合(不常用)。
三、Error 对象用法
1. 经典 ASP(VBScript)
在 ASP 中,使用 On Error Resume Next
捕获错误,并检查 conn.Errors
集合。
示例:捕获连接错误
<%@ Language=VBScript %>
<html>
<head>
<title>ADO Error 示例</title>
</head>
<body>
<h2>测试数据库连接</h2>
<%
On Error Resume Next
Set conn = Server.CreateObject("ADODB.Connection")
conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\InvalidPath.mdb"
conn.Open
If conn.Errors.Count > 0 Then
For Each err In conn.Errors
Response.Write "错误编号:" & err.Number & "<br>"
Response.Write "错误描述:" & Server.HTMLEncode(err.Description) & "<br>"
Response.Write "错误来源:" & err.Source & "<br>"
Response.Write "SQLState:" & err.SQLState & "<br><hr>"
Next
Else
Response.Write "连接成功!"
conn.Close
End If
Set conn = Nothing
%>
</body>
</html>
- 输出(假设路径错误):
错误编号:-2147467259
错误描述:指定的文件找不到。
错误来源:Microsoft JET Database Engine
SQLState:
- 关键点:
On Error Resume Next
:防止脚本因错误终止。conn.Errors.Count
:检查是否有错误。Server.HTMLEncode
:防止 XSS 攻击。- 调试(类似 console.log):
Response.Write err.Description
.
示例:捕获 SQL 执行错误
<%
On Error Resume Next
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Northwind.mdb"
Set rs = conn.Execute("SELECT * FROM NonExistentTable")
If conn.Errors.Count > 0 Then
For Each err In conn.Errors
Response.Write "错误编号:" & err.Number & "<br>"
Response.Write "错误描述:" & Server.HTMLEncode(err.Description) & "<br>"
Next
Else
Response.Write "查询成功!"
rs.Close
End If
conn.Close
Set conn = Nothing
%>
- 输出(假设表不存在):
错误编号:-2147217865
错误描述:表 'NonExistentTable' 不存在。
2. Python(通过 pywin32)
安装 pywin32
:
pip install pywin32 -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
示例:捕获连接错误
import win32com.client
conn = win32com.client.Dispatch("ADODB.Connection")
conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\InvalidPath.mdb"
try:
conn.Open()
except Exception as e:
print(f"Python 异常:{e}")
for err in conn.Errors:
print(f"错误编号:{err.Number}")
print(f"错误描述:{err.Description}")
print(f"错误来源:{err.Source}")
print(f"SQLState:{err.SQLState}")
print("---")
else:
print("连接成功!")
conn.Close()
- 输出(假设路径错误):
Python 异常:[Microsoft][ODBC Driver Manager] 数据源名称未找到且未指定默认驱动程序
错误编号:-2147467259
错误描述:指定的文件找不到。
错误来源:Microsoft JET Database Engine
SQLState:
---
- 调试:
print(repr(err.Description))
或print(str(conn.Errors.Count))
.
示例:捕获 SQL 执行错误
import win32com.client
conn = win32com.client.Dispatch("ADODB.Connection")
conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Northwind.mdb"
conn.Open()
try:
rs = conn.Execute("SELECT * FROM NonExistentTable")[0]
except Exception as e:
print(f"Python 异常:{e}")
for err in conn.Errors:
print(f"错误编号:{err.Number}")
print(f"错误描述:{err.Description}")
else:
print("查询成功!")
rs.Close()
conn.Close()
四、结合上下文的应用
- 结合 REST API:
- ASP:捕获错误并返回 JSON。
<% Response.ContentType = "application/json" On Error Resume Next Set conn = Server.CreateObject("ADODB.Connection") conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Northwind.mdb" Set rs = conn.Execute("SELECT * FROM NonExistentTable") If conn.Errors.Count > 0 Then Response.Write "{ ""errors"": [" first = True For Each err In conn.Errors If Not first Then Response.Write "," Response.Write "{""number"":" & err.Number & ",""description"":""" & Server.HTMLEncode(err.Description) & """}" first = False Next Response.Write "] }" Else Response.Write "[]" rs.Close End If conn.Close %>
- Python(Flask):
from flask import Flask, jsonify import win32com.client app = Flask(__name__) @app.route('/query') def query(): conn = win32com.client.Dispatch("ADODB.Connection") conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Northwind.mdb" try: conn.Open() rs = conn.Execute("SELECT * FROM NonExistentTable")[0] conn.Close() return jsonify({"status": "success"}) except Exception as e: errors = [{"number": err.Number, "description": str(err.Description)} for err in conn.Errors] conn.Close() return jsonify({"errors": errors}), 500
- 结合 ChromeDriver 和 Selenium:
- 测试 ASP 页面(捕获错误信息)。
python from selenium.webdriver import Chrome driver = Chrome() driver.get('http://localhost/error_test.asp') # ASP 页面触发错误 print(driver.find_element(By.TAG_NAME, 'body').text) # 检查错误输出 driver.quit()
- 结合 Linux Cron(Windows 任务计划程序):
- 定时查询并记录错误日志。
python import win32com.client from tqdm import tqdm conn = win32com.client.Dispatch("ADODB.Connection") conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Northwind.mdb" try: conn.Open() rs = conn.Execute("SELECT * FROM NonExistentTable")[0] except Exception as e: with open("error_log.txt", "w", encoding="utf-8") as f: for err in tqdm(conn.Errors, desc="Logging errors"): f.write(f"Number: {err.Number}, Description: {err.Description}\n") conn.Close()
- 保存为
ado_error.py
,通过 Windows 任务计划程序运行。
- 保存为
- 结合 Traefik:
- Traefik 代理 ASP 网站(显示错误信息)。
yaml services: asp: image: my-asp-app labels: - "traefik.http.routers.asp.rule=Host(`asp.example.com`)" - "traefik.http.routers.asp.entrypoints=websecure"
- 结合列表推导式:
- 提取错误信息。
python import win32com.client conn = win32com.client.Dispatch("ADODB.Connection") conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\InvalidPath.mdb" try: conn.Open() except: errors = [{"number": err.Number, "description": str(err.Description)} for err in conn.Errors] print(f"Errors: {repr(errors)}")
- 结合
==
和is
:
- 检查 Errors 集合状态:
python if conn.Errors.Count == 0: # 值比较 print("No errors") if conn.Errors is not None: # 身份比较 print("Errors collection exists")
- 结合
str()
和repr()
:
- 调试错误信息:
python for err in conn.Errors: print(str(err.Description)) # 用户友好 print(repr(err.Description)) # 调试
五、注意事项
- 错误捕获:
- 总是使用
On Error Resume Next
(ASP)或try-except
(Python)检查Errors.Count
。 - 多个错误可能同时发生(如批量操作)。
- 错误清理:
- 调用
conn.Errors.Clear()
清空 Errors 集合,避免累积旧错误。 - ASP 示例:
asp conn.Errors.Clear
- 性能:
- 频繁检查
Errors.Count
可能影响性能,仅在必要时使用。 - 使用事务(
BeginTrans
、RollbackTrans
)处理错误以保持数据一致性。
- 调试(类似 console.log):
- ASP:
Response.Write err.Description
. - Python:
print(repr(err.Description))
.
- 常见错误:
- 连接失败:检查
ConnectionString
(路径、提供程序、权限)。 - SQL 错误:检查表名、字段名、约束(如唯一键)。
- 超时:设置
conn.ConnectionTimeout
和conn.CommandTimeout
。
- 现代替代:
- Python:
pyodbc
或sqlalchemy
(更现代的错误处理)。 - .NET:ADO.NET 或 Entity Framework。
六、总结
- ADO Error 对象:通过
Errors
集合捕获数据库操作错误,提供详细诊断。 - 关键步骤:检查
Errors.Count
,遍历Errors
集合,提取Number
和Description
。 - 结合上下文:
- REST API:返回错误 JSON。
- ChromeDriver:测试错误页面。
- Cron:记录错误日志。
- Traefik:代理 ASP 服务。
- 列表推导式:提取错误信息。
- 调试:使用
Response.Write
(ASP)或print(repr())
(Python)。
如果需要更复杂的错误处理示例(如事务错误、日志记录)或特定调试帮助,请提供更多细节!