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 核心属性和方法
- 常用属性:
Fields
:访问记录的字段(如rs.Fields("ColumnName")
)。EOF
:是否到达记录集末尾(True
表示无更多记录)。BOF
:是否在记录集开头之前。RecordCount
:记录数(需适当游标类型)。CursorType
:游标类型(如adOpenStatic
)。LockType
:锁类型(如adLockOptimistic
)。CursorLocation
:游标位置(adUseClient
或adUseServer
)。
- 常用方法:
Open(source, connection, cursor_type, lock_type)
:打开记录集。MoveNext()
、MoveFirst()
、MoveLast()
:移动游标。AddNew()
:添加新记录。Update()
:保存更改。Delete()
:删除当前记录。Find(criteria)
:查找记录。Sort
:排序记录。Filter
:过滤记录。Close()
:关闭记录集。
- 常量(需引用 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()
四、结合上下文的应用
- 结合 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 %>
- 结合 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()
- 结合 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 任务计划程序运行。
- 保存为
- 结合 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"
- 结合列表推导式:
- 使用列表推导式处理 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()
- 结合
==
和is
:
- 检查 Recordset 状态:
python if rs.State == 1: # 值比较,检查记录集是否打开 print("Recordset open") if rs is not None: # 身份比较 print("Recordset exists")
- 结合
str()
和repr()
:
- 格式化 Recordset 字段:
python while not rs.EOF: print(str(rs.Fields("CompanyName").Value)) # 用户友好输出 print(repr(rs.Fields("CompanyName").Value)) # 调试输出 rs.MoveNext()
五、注意事项
- 游标和锁类型:
- 默认:
adOpenForwardOnly
,adLockReadOnly
(只读、只进)。 - 更新记录需
adOpenKeyset
或adOpenDynamic
和adLockOptimistic
。 - 客户端游标(
rs.CursorLocation = 3
)支持RecordCount
和排序。
- 错误处理:
- 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}")
- 性能优化:
- 使用客户端游标(
adUseClient
)减少服务器负载。 - 限制查询范围(如
TOP 10
)避免大记录集。 - 关闭记录集和连接:
rs.Close()
,conn.Close()
。
- 调试(类似 console.log):
- ASP:
Response.Write rs.Fields(0).Value
。 - Python:
print(repr(rs.Fields))
或print(str(rs.Fields("CompanyName").Value))
。
- 现代替代:
- Python:
pyodbc
或sqlalchemy
更高效。 - .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)。
如果需要更详细的操作(如分页、事务)、特定数据库示例,或结合其他工具的集成,请提供更多细节!