ADO Connection 对象

ADO Connection 对象中文讲解

ADO(ActiveX Data Objects) 中,Connection 对象 是与数据库建立连接的核心组件,用于管理数据库会话、执行命令、处理事务等。它是 ADO 操作的起点,广泛应用于经典 ASP、VBA、VB6 和 Python(通过 pywin32)等环境中,适合与各种数据库(如 Microsoft Access、SQL Server、MySQL)交互。

本教程详细讲解 ADO Connection 对象 的用法、属性、方法,并结合上下文(如 REST API、ChromeDriver、Cron、Traefik、列表推导式)提供实用示例。假设你已了解 ADO 的基本概念,并可能参考过前文的 RecordsetCommand 对象内容。


一、ADO Connection 对象核心概念

  • 作用
  • 建立与数据库的连接。
  • 执行 SQL 命令(简单查询或非查询操作)。
  • 管理事务(开始、提交、回滚)。
  • 提供连接状态和错误信息。
  • 关键特性
  • 连接字符串:定义数据库类型、地址、认证信息等。
  • 事务支持:通过 BeginTransCommitTransRollbackTrans 管理事务。
  • 错误处理:通过 Errors 集合捕获数据库错误。
  • 适用场景
  • Web 应用程序(如 ASP 页面访问数据库)。
  • 批量数据处理(Python 脚本)。
  • 定时任务执行数据库操作(Cron/任务计划程序)。

二、Connection 对象核心属性和方法

  1. 主要属性
  • ConnectionString:定义连接参数(如提供程序、数据源、用户凭据)。
  • Provider:指定数据库提供程序(如 Microsoft.Jet.OLEDB.4.0)。
  • State:连接状态(adStateOpen=1 表示打开,adStateClosed=0 表示关闭)。
  • Errors:错误集合,包含数据库操作的错误信息。
  • ConnectionTimeout:连接超时时间(秒)。
  • CommandTimeout:命令执行超时时间(秒)。
  1. 主要方法
  • Open(ConnectionString):打开数据库连接。
  • Close():关闭连接。
  • Execute(CommandText, RecordsAffected):执行 SQL 命令,返回记录集(SELECT)或受影响行数(INSERT/UPDATE/DELETE)。
  • BeginTrans():开始事务。
  • CommitTrans():提交事务。
  • RollbackTrans():回滚事务。
  1. 常用常量(需引用 ADO 库或手动定义):
  • 状态:adStateOpen=1adStateClosed=0
  • 提供程序:Microsoft.Jet.OLEDB.4.0(Access)、SQLOLEDB(SQL Server)。

三、Connection 对象用法

1. 经典 ASP(VBScript)

使用 Connection 对象连接数据库并执行简单操作。

示例:连接 Access 数据库并查询

<%@ Language=VBScript %>
<html>
<head>
    <title>ADO Connection 示例</title>
</head>
<body>
    <h2>客户列表</h2>
<%
    ' 创建连接
    Set conn = Server.CreateObject("ADODB.Connection")
    conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Northwind.mdb"
    conn.Open

    ' 检查连接状态
    If conn.State = 1 Then  ' adStateOpen
        Response.Write "连接成功!<br>"

        ' 执行查询
        Set rs = conn.Execute("SELECT CompanyName, ContactName FROM Customers WHERE Country='USA'")
        Do Until rs.EOF
            Response.Write Server.HTMLEncode(rs("CompanyName")) & " - " & Server.HTMLEncode(rs("ContactName")) & "<br>"
            rs.MoveNext
        Loop
        rs.Close
    Else
        Response.Write "连接失败!"
    End If

    ' 清理资源
    conn.Close
    Set conn = Nothing
%>
</body>
</html>
  • 输出:显示美国客户的列表。
  • 关键点
  • conn.ConnectionString:定义连接参数。
  • conn.Open:建立连接。
  • conn.Execute:直接执行 SQL,返回 Recordset。
  • 调试(类似 console.log)Response.Write conn.StateResponse.Write conn.Errors(0).Description

示例:事务管理

<%
Set conn = Server.CreateObject("ADODB.Connection")
conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Northwind.mdb"
conn.Open

On Error Resume Next
conn.BeginTrans  ' 开始事务
conn.Execute "INSERT INTO Customers (CustomerID, CompanyName) VALUES ('XYZ01', 'XYZ Corp')"
conn.Execute "UPDATE Customers SET CompanyName='Updated Corp' WHERE CustomerID='XYZ01'"

If conn.Errors.Count = 0 Then
    conn.CommitTrans  ' 提交事务
    Response.Write "事务成功!"
Else
    conn.RollbackTrans  ' 回滚事务
    Response.Write "事务失败:" & conn.Errors(0).Description
End If

conn.Close
Set conn = Nothing
%>

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:\\Northwind.mdb"

try:
    conn.Open()
    if conn.State == 1:  # adStateOpen
        print("连接成功!")

        # 执行查询
        rs = conn.Execute("SELECT CompanyName, ContactName FROM Customers WHERE Country='USA'")[0]
        while not rs.EOF:
            print(f"{str(rs.Fields('CompanyName').Value):<30} {str(rs.Fields('ContactName').Value):<20}")
            rs.MoveNext()
        rs.Close()
    else:
        print("连接失败!")
except Exception as e:
    print(f"错误:{e}")

# 清理资源
conn.Close()
  • 输出
  连接成功!
  Around the Horn              Thomas Hardy
  Great Lakes Food Market      Howard Snyder
  ...
  • 调试print(repr(rs.Fields))print(str(conn.State)).

示例:事务管理

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:
    conn.BeginTrans()
    conn.Execute("INSERT INTO Customers (CustomerID, CompanyName) VALUES ('XYZ02', 'XYZ Corp')")
    conn.Execute("UPDATE Customers SET CompanyName='Updated Corp' WHERE CustomerID='XYZ02'")
    conn.CommitTrans()
    print("事务成功!")
except Exception as e:
    conn.RollbackTrans()
    print(f"事务失败:{e}")

conn.Close()

四、连接字符串示例

  • Microsoft Access
  Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Northwind.mdb

或(较新版本):

  Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Northwind.accdb
  • SQL Server
  Provider=SQLOLEDB;Data Source=localhost;Initial Catalog=Northwind;User ID=sa;Password=your_password
  • ODBC 驱动
  Provider=MSDASQL;Driver={SQL Server};Server=localhost;Database=Northwind;Uid=sa;Pwd=your_password

五、结合上下文的应用

  1. 结合 REST API
  • ASP:通过 Connection 执行查询,返回 JSON。 <% Response.ContentType = "application/json" Set conn = Server.CreateObject("ADODB.Connection") conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Northwind.mdb" Set rs = conn.Execute("SELECT CompanyName, ContactName FROM Customers WHERE Country='USA'") Response.Write "[" first = True Do Until rs.EOF If Not first Then Response.Write "," Response.Write "{""company"":""" & Server.HTMLEncode(rs("CompanyName")) & """,""contact"":""" & Server.HTMLEncode(rs("ContactName")) & """}" first = False rs.MoveNext Loop Response.Write "]" rs.Close conn.Close %>
  • Python(Flask)from flask import Flask, jsonify import win32com.client app = Flask(__name__) @app.route('/customers') def get_customers(): conn = win32com.client.Dispatch("ADODB.Connection") conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Northwind.mdb" conn.Open() rs = conn.Execute("SELECT CompanyName, ContactName FROM Customers WHERE Country='USA'")[0] customers = [{"company": str(rs.Fields("CompanyName").Value), "contact": str(rs.Fields("ContactName").Value)} for _ in range(rs.RecordCount) if not rs.EOF and (rs.MoveNext() or True)] conn.Close() return jsonify(customers)
  1. 结合 ChromeDriver 和 Selenium
  • 测试 ASP 页面(Connection 查询生成)。
    python from selenium.webdriver import Chrome driver = Chrome() driver.get('http://localhost/customers.asp') # ASP 使用 Connection 查询 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" conn.Open() rs = conn.Execute("SELECT CompanyName FROM Customers")[0] with open('customers.txt', 'w') as f: for _ in tqdm(range(rs.RecordCount), desc="Writing"): if not rs.EOF: f.write(f"{str(rs.Fields('CompanyName').Value)}\n") rs.MoveNext() conn.Close()
    • 保存为 ado_connection.py,通过 Windows 任务计划程序运行。
  1. 结合 Traefik
  • Traefik 代理 ASP 网站(Connection 提供数据)。
    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:\\Northwind.mdb" conn.Open() rs = conn.Execute("SELECT CompanyName FROM Customers")[0] names = [str(rs.Fields("CompanyName").Value) for _ in range(rs.RecordCount) if not rs.EOF and (rs.MoveNext() or True)] print(f"Names: {repr(names)}") conn.Close()
  1. 结合 ==is
  • 检查连接状态:
    python if conn.State == 1: # 值比较 print("Connection open") if conn is not None: # 身份比较 print("Connection exists")
  1. 结合 str()repr()
  • 调试连接状态:
    python print(str(conn.State)) # 用户友好 print(repr(conn.State)) # 调试

六、注意事项

  1. 连接字符串
  • 确保 ProviderData Source 正确,参考 ConnectionStrings.com
  • 检查数据库版本(如 Access 使用 Microsoft.ACE.OLEDB.12.0)。
  1. 错误处理
  • ASP:
    asp On Error Resume Next conn.Open If conn.Errors.Count > 0 Then Response.Write "错误:" & conn.Errors(0).Description
  • Python:
    python try: conn.Open() except Exception as e: print(f"错误:{e}")
  1. 性能
  • 使用连接池(ASP 全局变量)减少重复连接开销。
  • 设置 ConnectionTimeoutCommandTimeout 避免长时间等待。
  1. 调试(类似 console.log)
  • ASP:Response.Write conn.ConnectionString.
  • Python:print(repr(conn.State)).
  1. 事务管理
  • 总是搭配 BeginTransCommitTrans/RollbackTrans 确保数据一致性。
  1. 现代替代
  • Python:pyodbcsqlalchemy
  • .NET:ADO.NET 或 Entity Framework。

七、总结

  • ADO Connection 对象:管理数据库连接,执行命令,支持事务。
  • 关键步骤:设置连接字符串、打开连接、执行操作、关闭连接。
  • 结合上下文
  • REST API:返回查询结果 JSON。
  • ChromeDriver:测试页面。
  • Cron:定时处理数据。
  • Traefik:代理 ASP 服务。
  • 列表推导式:处理查询结果。
  • 调试:使用 Response.Write(ASP)或 print(repr())(Python)。

如果需要更复杂的 Connection 示例(如连接池、复杂事务)或特定调试帮助,请提供更多细节!

类似文章

发表回复

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