ADO Record 对象

ADO Record 对象中文讲解

ADO(ActiveX Data Objects) 中,Record 对象 是一个用于处理单一记录或文件系统资源(如文件夹、文件)的对象,主要用于 ADO 的 Recordset 之外的场景,特别是在处理非表格数据(如文件、目录)或需要操作单条记录时。相比 Recordset 对象(用于处理多条记录),Record 对象更轻量,专注于单个数据实体。它在经典 ASP、VBA、VB6 或 Python(通过 pywin32)等环境中适用于特殊场景,如访问文件系统或处理数据库中的单行数据。

本教程详细讲解 ADO Record 对象 的用法、属性、方法,并结合上下文(如 REST API、ChromeDriver、Cron、Traefik、列表推导式)提供实用示例。假设你已熟悉 ADO 的 ConnectionRecordsetCommandErrorFieldParameterProperty 对象(参考前文)。


一、ADO Record 对象核心概念

  • 作用
  • 表示数据库中的单条记录或文件系统中的单一资源(如文件或文件夹)。
  • 提供对记录字段或文件属性的访问和操作。
  • 支持非表格数据处理(如通过 ADO 的 Stream 对象处理文件内容)。
  • 与 Recordset 的区别
  • Recordset:处理多条记录,适合表格数据。
  • Record:处理单条记录或非表格资源,适合文件系统或轻量操作。
  • 适用场景
  • 访问文件系统(如读取文件内容、列出文件夹)。
  • 操作数据库单条记录(如获取或更新)。
  • 处理与数据库关联的资源(如 SQL Server 的 FILESTREAM)。
  • 关键点
  • Record 对象通常与特定提供程序(如 Microsoft Jet、ADsDSOObject)一起使用。
  • 需要支持 Record 功能的提供程序(如 ADsDSOObject 用于 Active Directory)。

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

  1. 主要属性
  • Fields:包含 Field 对象集合,表示记录的字段或资源属性。
  • RecordType:记录类型(如 adSimpleRecord=0 表示简单记录,adCollectionRecord=1 表示集合如文件夹)。
  • Source:记录的来源(如 SQL 查询或文件路径)。
  • State:对象状态(如 adStateOpen=1 表示打开)。
  • ParentURL:父资源路径(文件系统场景)。
  1. 主要方法
  • Open(Source, ActiveConnection, Mode, CreateOptions, Options, UserName, Password):打开记录(数据库记录或文件系统资源)。
  • Close():关闭记录。
  • MoveRecord(Dest, UserName, Password, Options):移动文件或记录。
  • CopyRecord(Dest, UserName, Password, Options):复制文件或记录。
  • DeleteRecord():删除记录或资源。
  • GetChildren():获取子记录(如文件夹中的文件)。
  1. 常用常量(需引用 ADO 库或手动定义):
  • 记录类型:
    • adSimpleRecord=0:简单记录(如单条数据库记录)。
    • adCollectionRecord=1:集合记录(如文件夹)。
  • 打开模式:
    • adModeRead=1:只读。
    • adModeWrite=2:只写。
    • adModeReadWrite=3:读写。
  • 打开选项:
    • adOpenRecordUnspecified=-1:默认。
    • adOpenSource=0x800000:打开源记录。

三、Record 对象用法

1. 经典 ASP(VBScript)

Record 对象常用于文件系统操作或处理 Active Directory 数据,以下以文件系统为例(需要支持的文件系统提供程序,如 MSDataShapeADsDSOObject)。

示例:访问文件系统

<%@ Language=VBScript %>
<html>
<head>
    <title>ADO Record 示例</title>
</head>
<body>
    <h2>文件夹内容</h2>
<%
    On Error Resume Next
    Set rec = Server.CreateObject("ADODB.Record")
    ' 使用文件系统提供程序
    rec.Open "C:\TestFolder", "Provider=MSDAOSP;Data Source=MSDataShape", 3  ' adModeReadWrite

    If rec.State = 1 Then  ' adStateOpen
        Response.Write "文件夹名称:" & Server.HTMLEncode(rec.Fields("Name").Value) & "<br>"
        Set rs = rec.GetChildren  ' 获取子文件/文件夹
        Do Until rs.EOF
            Response.Write Server.HTMLEncode(rs.Fields("Name").Value) & "<br>"
            rs.MoveNext
        Loop
        rs.Close
    Else
        Response.Write "打开失败!"
    End If

    If Err.Number <> 0 Then
        Response.Write "错误:" & Server.HTMLEncode(Err.Description)
    End If

    rec.Close
    Set rec = Nothing
%>
</body>
</html>
  • 输出(假设 C:\TestFolder 包含文件):
  文件夹名称:TestFolder
  file1.txt
  file2.doc
  subfolder
  • 关键点
  • rec.Open:使用文件系统提供程序打开文件夹。
  • rec.GetChildren:返回子文件的 Recordset。
  • 调试(类似 console.log)Response.Write rec.Fields("Name").Value.

示例:操作数据库单条记录

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

Set rec = Server.CreateObject("ADODB.Record")
rec.Open "SELECT CustomerID, CompanyName FROM Customers WHERE CustomerID='ALFKI'", conn, 3  ' adModeReadWrite

If rec.State = 1 Then
    Response.Write "原始公司名称:" & Server.HTMLEncode(rec.Fields("CompanyName").Value) & "<br>"
    rec.Fields("CompanyName").Value = "Updated Corp"
    rec.Close
    Response.Write "更新成功!"
Else
    Response.Write "记录未找到!"
End If

conn.Close
Set rec = Nothing
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

# 创建 Record 对象
rec = win32com.client.Dispatch("ADODB.Record")

try:
    # 打开文件夹
    rec.Open("C:\\TestFolder", "Provider=MSDAOSP;Data Source=MSDataShape", 3)  # adModeReadWrite
    if rec.State == 1:  # adStateOpen
        print(f"文件夹名称:{rec.Fields('Name').Value}")
        rs = rec.GetChildren()  # 获取子文件
        while not rs.EOF:
            print(str(rs.Fields("Name").Value))
            rs.MoveNext()
        rs.Close()
    else:
        print("打开失败!")
except Exception as e:
    print(f"错误:{e}")

rec.Close()
  • 输出(假设文件夹存在):
  文件夹名称:TestFolder
  file1.txt
  file2.doc
  subfolder
  • 调试print(repr(rec.Fields('Name').Value)).

示例:操作数据库单条记录

import win32com.client

conn = win32com.client.Dispatch("ADODB.Connection")
conn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Northwind.mdb")

rec = win32com.client.Dispatch("ADODB.Record")
try:
    rec.Open("SELECT CustomerID, CompanyName FROM Customers WHERE CustomerID='ALFKI'", conn, 3)  # adModeReadWrite
    if rec.State == 1:
        print(f"原始公司名称:{rec.Fields('CompanyName').Value}")
        rec.Fields("CompanyName").Value = "Updated Corp Python"
        print("更新成功!")
    else:
        print("记录未找到!")
except Exception as e:
    print(f"错误:{e}")

rec.Close()
conn.Close()

四、结合上下文的应用

  1. 结合 REST API
  • ASP:返回 Record 字段值 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 rec = Server.CreateObject("ADODB.Record") rec.Open "SELECT CustomerID, CompanyName FROM Customers WHERE CustomerID='ALFKI'", conn, 3 If rec.State = 1 Then Response.Write "{""customer_id"":""" & Server.HTMLEncode(rec.Fields("CustomerID").Value) & """,""company"":""" & Server.HTMLEncode(rec.Fields("CompanyName").Value) & """}" Else Response.Write "{""error"":""Record not found""}" End If rec.Close conn.Close %>
  • Python(Flask)from flask import Flask, jsonify import win32com.client app = Flask(__name__) @app.route('/customer/<customer_id>') def get_customer(customer_id): conn = win32com.client.Dispatch("ADODB.Connection") conn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Northwind.mdb") rec = win32com.client.Dispatch("ADODB.Record") try: rec.Open(f"SELECT CustomerID, CompanyName FROM Customers WHERE CustomerID='{customer_id}'", conn, 3) if rec.State == 1: result = {"customer_id": str(rec.Fields("CustomerID").Value), "company": str(rec.Fields("CompanyName").Value)} else: result = {"error": "Record not found"} conn.Close() return jsonify(result) except Exception as e: conn.Close() return jsonify({"error": str(e)}), 500
  1. 结合 ChromeDriver 和 Selenium
  • 测试 ASP 页面(显示 Record 数据)。
    python from selenium.webdriver import Chrome driver = Chrome() driver.get('http://localhost/customer.asp') # ASP 使用 Record 显示 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.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Northwind.mdb") rec = win32com.client.Dispatch("ADODB.Record") rec.Open("SELECT CustomerID, CompanyName FROM Customers WHERE CustomerID='ALFKI'", conn, 3) with open("customer.txt", "w", encoding="utf-8") as f: if rec.State == 1: f.write(f"{str(rec.Fields('CustomerID').Value)}: {str(rec.Fields('CompanyName').Value)}\n") conn.Close()
    • 保存为 ado_record.py,通过 Windows 任务计划程序运行。
  1. 结合 Traefik
  • Traefik 代理 ASP 网站(显示 Record 数据)。
    yaml services: asp: image: my-asp-app labels: - "traefik.http.routers.asp.rule=Host(`asp.example.com`)" - "traefik.http.routers.asp.entrypoints=websecure"
  1. 结合列表推导式
  • 提取 Record 字段值。
    python import win32com.client conn = win32com.client.Dispatch("ADODB.Connection") conn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Northwind.mdb") rec = win32com.client.Dispatch("ADODB.Record") rec.Open("SELECT CustomerID, CompanyName FROM Customers WHERE CustomerID='ALFKI'", conn, 3) fields = {field.Name: str(field.Value) for field in rec.Fields} print(f"Fields: {repr(fields)}") conn.Close()
  1. 结合 ==is
  • 检查 Record 状态:
    python if rec.State == 1: # 值比较 print("Record open") if rec.Fields("CompanyName").Value is not None: # 身份比较 print("Field has value")
  1. 结合 str()repr()
  • 调试 Record 字段:
    python print(str(rec.Fields("CompanyName").Value)) # 用户友好 print(repr(rec.Fields("CompanyName").Value)) # 调试

五、注意事项

  1. 提供程序支持
  • Record 对象依赖提供程序支持(如 MSDAOSP 用于文件系统,Microsoft.Jet.OLEDB.4.0 用于数据库)。
  • 某些数据库(如 SQL Server)可能不支持 Record 对象。
  1. 错误处理
  • ASP:
    asp On Error Resume Next rec.Open "SELECT * FROM NonExistentTable", conn If Err.Number <> 0 Then Response.Write "错误:" & Err.Description
  • Python:
    python try: rec.Open("SELECT * FROM NonExistentTable", conn) except Exception as e: print(f"错误:{e}")
  1. 性能
  • Record 对象适合单条记录操作,不适合批量数据(使用 Recordset 更高效)。
  • 避免频繁打开/关闭 Record 对象。
  1. 调试(类似 console.log)
  • ASP:Response.Write rec.Fields("Name").Value.
  • Python:print(repr(rec.Fields('Name').Value)).
  1. 局限性
  • Record 对象在数据库操作中不如 Recordset 常用,主要用于特殊场景(如文件系统或 Active Directory)。
  • 不支持复杂查询或多行数据。
  1. 现代替代
  • Python:pyodbcsqlalchemy(更现代的数据库操作)。
  • .NET:ADO.NET 或 Entity Framework。
  • 文件系统:Python 的 ospathlib

六、总结

  • ADO Record 对象:处理单条记录或文件系统资源,适合轻量场景。
  • 关键步骤:打开 Record,访问 Fields 集合,操作数据或资源。
  • 结合上下文
  • REST API:返回单条记录 JSON。
  • ChromeDriver:测试 Record 显示页面。
  • Cron:定时检查记录。
  • Traefik:代理 ASP 服务。
  • 列表推导式:提取字段值。
  • 调试:使用 Response.Write(ASP)或 print(repr())(Python)。

如果需要更复杂的 Record 示例(如处理 Active Directory、文件操作)或特定调试帮助,请提供更多细节!

类似文章

发表回复

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