ADO Recordset(记录集)

ADO Recordset(记录集)简介

ADO(ActiveX Data Objects) 中,Recordset 对象 是用于处理数据库查询结果的核心组件。它表示从数据库中检索出的一组记录(行),允许开发者遍历、操作(增删改查)、排序、过滤数据。Recordset 是 ADO 的关键对象之一,广泛用于经典 ASP、VBA、VB6 和 Python(通过 pywin32)等环境中,特别是在与数据库交互的场景中。

本教程聚焦 ADO Recordset,详细讲解其用法、属性、方法,并结合上下文(如 REST API、ChromeDriver、Cron、Traefik、Python 列表推导式)提供实用示例。假设你已了解 ADO 连接(参考之前的 ADO 数据库连接教程)。


一、ADO Recordset 核心概念

  • 定义:Recordset 是一个内存中的数据表,包含从数据库查询返回的记录(行)和字段(列)。
  • 用途
  • 遍历查询结果。
  • 添加、更新、删除记录。
  • 排序、过滤或分页数据。
  • 游标类型
  • Forward-only(只进):只允许向前遍历,性能最高(默认)。
  • Static(静态):数据快照,不反映数据库变化。
  • Keyset(键集):支持更新,反映部分数据库变化。
  • Dynamic(动态):反映数据库实时变化,性能最低。
  • 锁类型
  • ReadOnly(只读):默认,仅读取。
  • Optimistic(乐观锁):更新时检查冲突。
  • Pessimistic(悲观锁):锁定记录直到更新完成。
  • 常见场景:Web 应用(ASP)、Excel 数据处理(VBA)、自动化脚本(Python)。

二、Recordset 核心属性和方法

  1. 常用属性
  • Fields:访问记录的字段(如 rs.Fields("ColumnName"))。
  • EOF:是否到达记录集末尾(True 表示无更多记录)。
  • BOF:是否在记录集开头之前。
  • RecordCount:记录数(需适当游标类型)。
  • CursorType:游标类型(如 adOpenStatic)。
  • LockType:锁类型(如 adLockOptimistic)。
  • CursorLocation:游标位置(adUseClientadUseServer)。
  1. 常用方法
  • Open(source, connection, cursor_type, lock_type):打开记录集。
  • MoveNext()MoveFirst()MoveLast():移动游标。
  • AddNew():添加新记录。
  • Update():保存更改。
  • Delete():删除当前记录。
  • Find(criteria):查找记录。
  • Sort:排序记录。
  • Filter:过滤记录。
  • Close():关闭记录集。
  1. 常量(需引用 ADO 库或手动定义):
  • 游标类型:adOpenForwardOnly=0, adOpenStatic=3, adOpenKeyset=1, adOpenDynamic=2
  • 锁类型:adLockReadOnly=1, adLockOptimistic=3, adLockPessimistic=2
  • 游标位置:adUseClient=3, adUseServer=2

三、基本用法示例

1. 经典 ASP(VBScript)

假设使用 Microsoft Access 数据库(Northwind.mdb)。

查询并遍历记录集

<%
' 创建连接和记录集
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Northwind.mdb"

Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open "SELECT * FROM Customers", conn, 3, 3  ' adOpenStatic, adLockOptimistic

' 遍历记录
Do Until rs.EOF
    Response.Write rs.Fields("CompanyName") & "<br>"
    rs.MoveNext
Loop

' 清理资源
rs.Close
conn.Close
Set rs = Nothing
Set conn = Nothing
%>
  • 输出:逐行显示客户的公司名称。
  • 调试(类似 console.log)Response.Write rs.Fields("CompanyName").Value

添加记录

rs.Open "Customers", conn, 1, 3  ' adOpenKeyset, adLockOptimistic
rs.AddNew
rs("CompanyName") = "New Company"
rs("ContactName") = "John Doe"
rs.Update

更新记录

rs.Find "CustomerID='ALFKI'"
If Not rs.EOF Then
    rs("CompanyName") = "Updated Company"
    rs.Update
End If

删除记录

rs.Find "CustomerID='ALFKI'"
If Not rs.EOF Then
    rs.Delete
    rs.Update
End If

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.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Northwind.mdb")

rs = win32com.client.Dispatch("ADODB.Recordset")
rs.Open("SELECT * FROM Customers", conn, 3, 3)  # adOpenStatic, adLockOptimistic

# 遍历记录
while not rs.EOF:
    print(rs.Fields("CompanyName").Value)
    rs.MoveNext()

# 清理资源
rs.Close()
conn.Close()
  • 调试(类似 console.log)print(repr(rs.Fields))print(str(rs.Fields("CompanyName").Value)).

添加记录

rs.Open("Customers", conn, 1, 3)  # adOpenKeyset, adLockOptimistic
rs.AddNew()
rs.Fields("CompanyName").Value = "New Company"
rs.Fields("ContactName").Value = "John Doe"
rs.Update()

四、结合上下文的应用

  1. 结合 REST API
  • 在 ASP 中,使用 Recordset 查询数据并返回 JSON。
    asp <% Set conn = Server.CreateObject("ADODB.Connection") conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Northwind.mdb" Set rs = Server.CreateObject("ADODB.Recordset") rs.Open "SELECT * FROM Customers", conn Response.ContentType = "application/json" Response.Write "[" Do Until rs.EOF Response.Write "{""name"":""" & rs("CompanyName") & """}" rs.MoveNext If Not rs.EOF Then Response.Write "," Loop Response.Write "]" rs.Close conn.Close %>
  1. 结合 ChromeDriver 和 Selenium
  • 测试 ASP 页面(由 Recordset 提供数据)。
    python from selenium.webdriver import Chrome driver = Chrome() driver.get('http://localhost/test.asp') # ASP 使用 Recordset print(driver.find_element(By.TAG_NAME, 'body').text) driver.quit()
  1. 结合 Linux Cron(Windows 任务计划程序)
  • 定时运行 Python 脚本处理 Recordset 数据。 python import win32com.client from tqdm import tqdm conn = win32com.client.Dispatch("ADODB.Connection") conn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Northwind.mdb") rs = conn.Execute("SELECT * FROM Customers") names = [rs.Fields("CompanyName").Value for _ in tqdm(range(rs.RecordCount), desc="Processing") if not rs.EOF and (rs.MoveNext() or True)] print(names) conn.Close()
    • 保存为 ado_recordset.py,通过 Windows 任务计划程序运行。
  1. 结合 Traefik
  • Traefik 代理 ASP 网站(Recordset 提供数据)。
    yaml services: asp: image: my-asp-app labels: - "traefik.http.routers.asp.rule=Host(`asp.example.com`)" - "traefik.http.routers.asp.entrypoints=websecure"
  1. 结合列表推导式
  • 使用列表推导式处理 Recordset 数据。
    python import win32com.client conn = win32com.client.Dispatch("ADODB.Connection") conn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Northwind.mdb") rs = conn.Execute("SELECT CompanyName FROM Customers") 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)}") # 调试使用 repr() conn.Close()
  1. 结合 ==is
  • 检查 Recordset 状态:
    python if rs.State == 1: # 值比较,检查记录集是否打开 print("Recordset open") if rs is not None: # 身份比较 print("Recordset exists")
  1. 结合 str()repr()
  • 格式化 Recordset 字段:
    python while not rs.EOF: print(str(rs.Fields("CompanyName").Value)) # 用户友好输出 print(repr(rs.Fields("CompanyName").Value)) # 调试输出 rs.MoveNext()

五、注意事项

  1. 游标和锁类型
  • 默认:adOpenForwardOnly, adLockReadOnly(只读、只进)。
  • 更新记录需 adOpenKeysetadOpenDynamicadLockOptimistic
  • 客户端游标(rs.CursorLocation = 3)支持 RecordCount 和排序。
  1. 错误处理
  • ASP:If conn.Errors.Count > 0 Then Response.Write conn.Errors(0).Description
  • Python:try-except 捕获 COM 错误。
    python try: rs.Open("SELECT * FROM NonExistentTable", conn) except Exception as e: print(f"Error: {e}")
  1. 性能优化
  • 使用客户端游标(adUseClient)减少服务器负载。
  • 限制查询范围(如 TOP 10)避免大记录集。
  • 关闭记录集和连接:rs.Close(), conn.Close()
  1. 调试(类似 console.log)
  • ASP:Response.Write rs.Fields(0).Value
  • Python:print(repr(rs.Fields))print(str(rs.Fields("CompanyName").Value))
  1. 现代替代
  • Python:pyodbcsqlalchemy 更高效。
  • .NET:ADO.NET 或 Entity Framework。

六、总结

  • ADO Recordset 是处理数据库查询结果的核心,允许遍历、增删改查、排序、过滤。
  • 关键步骤:打开记录集(Open)、操作数据(MoveNext, AddNew, Update)、关闭资源。
  • 结合上下文
  • REST API:返回 JSON 数据。
  • ChromeDriver:测试 Recordset 驱动的页面。
  • Cron:定时处理记录。
  • Traefik:代理 ASP 服务。
  • 列表推导式:处理查询结果。
  • 调试:使用 Response.Write(ASP)或 print(repr())(Python)。

如果需要更详细的操作(如分页、事务)、特定数据库示例,或结合其他工具的集成,请提供更多细节!

类似文章

发表回复

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