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)。
  2. 常用方法

    • Open(source, connection, cursor_type, lock_type):打开记录集。
    • MoveNext()MoveFirst()MoveLast():移动游标。
    • AddNew():添加新记录。
    • Update():保存更改。
    • Delete():删除当前记录。
    • Find(criteria):查找记录。
    • Sort:排序记录。
    • Filter:过滤记录。
    • Close():关闭记录集。
  3. 常量(需引用 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。
      <%
      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
      %>
      
  2. 结合 ChromeDriver 和 Selenium

    • 测试 ASP 页面(由 Recordset 提供数据)。
      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()
      
  3. 结合 Linux Cron(Windows 任务计划程序)

    • 定时运行 Python 脚本处理 Recordset 数据。
      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 任务计划程序运行。
  4. 结合 Traefik

    • Traefik 代理 ASP 网站(Recordset 提供数据)。
      services:
        asp:
          image: my-asp-app
          labels:
            - "traefik.http.routers.asp.rule=Host(`asp.example.com`)"
            - "traefik.http.routers.asp.entrypoints=websecure"
      
  5. 结合列表推导式

    • 使用列表推导式处理 Recordset 数据。
      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()
      
  6. 结合 ==is

    • 检查 Recordset 状态:
      if rs.State == 1:  # 值比较,检查记录集是否打开
          print("Recordset open")
      if rs is not None:  # 身份比较
          print("Recordset exists")
      
  7. 结合 str()repr()

    • 格式化 Recordset 字段:
      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 和排序。
  2. 错误处理

    • ASP:If conn.Errors.Count > 0 Then Response.Write conn.Errors(0).Description
    • Python:try-except 捕获 COM 错误。
      try:
          rs.Open("SELECT * FROM NonExistentTable", conn)
      except Exception as e:
          print(f"Error: {e}")
      
  3. 性能优化

    • 使用客户端游标(adUseClient)减少服务器负载。
    • 限制查询范围(如 TOP 10)避免大记录集。
    • 关闭记录集和连接:rs.Close(), conn.Close()
  4. 调试(类似 console.log)

    • ASP:Response.Write rs.Fields(0).Value
    • Python:print(repr(rs.Fields))print(str(rs.Fields("CompanyName").Value))
  5. 现代替代

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

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

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐