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 的 ConnectionRecordsetCommand 对象(参考前文)。


一、ADO Error 对象核心概念

  • 作用
  • 捕获数据库操作的错误(如连接失败、SQL 语法错误、约束冲突)。
  • 提供详细错误信息,用于调试和用户提示。
  • Errors 集合
  • 属于 Connection 对象,包含零个或多个 Error 对象。
  • 每次操作可能产生多个错误(如多条 SQL 语句)。
  • 适用场景
  • 处理连接失败(如数据库路径错误)。
  • 捕获 SQL 执行错误(如表不存在、违反唯一约束)。
  • 记录错误日志或返回用户友好的错误信息(REST API)。
  • 关键点
  • Errors 集合在每次数据库操作后更新,需检查 Errors.Count
  • Error 对象提供错误号、描述、来源等详细信息。

二、Error 对象核心属性

  • Number:错误编号(通常是数据库提供程序的错误代码)。
  • Description:错误描述(文本说明)。
  • Source:引发错误的组件(如 ADO 或数据库提供程序)。
  • SQLState:SQL 标准错误代码(五字符代码,数据库相关)。
  • NativeError:数据库特定的错误代码。
  • HelpFileHelpContext:帮助文件和上下文(很少使用)。

常用方法

  • 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()

四、结合上下文的应用

  1. 结合 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
  1. 结合 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()
  1. 结合 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 任务计划程序运行。
  1. 结合 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"
  1. 结合列表推导式
  • 提取错误信息。
    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)}")
  1. 结合 ==is
  • 检查 Errors 集合状态:
    python if conn.Errors.Count == 0: # 值比较 print("No errors") if conn.Errors is not None: # 身份比较 print("Errors collection exists")
  1. 结合 str()repr()
  • 调试错误信息:
    python for err in conn.Errors: print(str(err.Description)) # 用户友好 print(repr(err.Description)) # 调试

五、注意事项

  1. 错误捕获
  • 总是使用 On Error Resume Next(ASP)或 try-except(Python)检查 Errors.Count
  • 多个错误可能同时发生(如批量操作)。
  1. 错误清理
  • 调用 conn.Errors.Clear() 清空 Errors 集合,避免累积旧错误。
  • ASP 示例:
    asp conn.Errors.Clear
  1. 性能
  • 频繁检查 Errors.Count 可能影响性能,仅在必要时使用。
  • 使用事务(BeginTransRollbackTrans)处理错误以保持数据一致性。
  1. 调试(类似 console.log)
  • ASP:Response.Write err.Description.
  • Python:print(repr(err.Description)).
  1. 常见错误
  • 连接失败:检查 ConnectionString(路径、提供程序、权限)。
  • SQL 错误:检查表名、字段名、约束(如唯一键)。
  • 超时:设置 conn.ConnectionTimeoutconn.CommandTimeout
  1. 现代替代
  • Python:pyodbcsqlalchemy(更现代的错误处理)。
  • .NET:ADO.NET 或 Entity Framework。

六、总结

  • ADO Error 对象:通过 Errors 集合捕获数据库操作错误,提供详细诊断。
  • 关键步骤:检查 Errors.Count,遍历 Errors 集合,提取 NumberDescription
  • 结合上下文
  • REST API:返回错误 JSON。
  • ChromeDriver:测试错误页面。
  • Cron:记录错误日志。
  • Traefik:代理 ASP 服务。
  • 列表推导式:提取错误信息。
  • 调试:使用 Response.Write(ASP)或 print(repr())(Python)。

如果需要更复杂的错误处理示例(如事务错误、日志记录)或特定调试帮助,请提供更多细节!

类似文章

发表回复

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