ADO 显示

ADO 显示(展示查询结果)

ADO(ActiveX Data Objects) 中,“显示”通常指的是从 Recordset 对象中提取数据并将其呈现给用户,例如在经典 ASP 网页中显示数据库查询结果,或在 Python 脚本中输出到控制台、文件等。ADO 本身不直接负责渲染(不像前端框架),但通过 Recordset 的数据遍历和字段访问,可以轻松将数据格式化为 HTML、JSON 或其他形式进行展示。

本教程聚焦如何使用 ADO 的 Recordset 显示数据库查询结果,涵盖 ASP 和 Python 示例,并结合上下文(如 REST API、ChromeDriver、Cron、Traefik、列表推导式等)提供实际应用场景。假设你已熟悉 ADO 的 ConnectionRecordset(参考前文)。


一、ADO 显示的核心概念

  • 目标:从 Recordset 中提取数据(Fields),以用户友好的方式展示(如 HTML 表格、JSON、控制台输出)。
  • 关键对象
  • Recordset.Fields:访问每行记录的字段值(rs.Fields("ColumnName")rs.Fields(0))。
  • Recordset.EOF:检查是否到达记录集末尾。
  • Recordset.MoveNext:移动到下一条记录。
  • 显示方式
  • ASP:生成 HTML(如表格、列表)或 JSON。
  • Python:输出到控制台、文件,或通过 Web 框架(如 Flask)返回 JSON。
  • 常见场景
  • Web 页面显示数据库内容(ASP)。
  • 自动化脚本输出(Python)。
  • 测试和调试(类似 JavaScript 的 console.log)。

二、基本显示示例

1. 经典 ASP(VBScript)

使用 Recordset 显示查询结果为 HTML 表格,假设连接到 Microsoft Access 数据库(Northwind.mdb)。

示例:显示客户列表为 HTML 表格

<%@ Language=VBScript %>
<html>
<head>
    <title>ADO 显示客户</title>
</head>
<body>
    <h2>客户列表</h2>
    <table border="1">
        <tr>
            <th>公司名称</th>
            <th>联系人</th>
            <th>国家</th>
        </tr>
<%
    ' 创建连接和记录集
    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 CompanyName, ContactName, Country FROM Customers", conn

    ' 遍历并显示
    Do Until rs.EOF
        Response.Write "<tr>"
        Response.Write "<td>" & Server.HTMLEncode(rs("CompanyName")) & "</td>"
        Response.Write "<td>" & Server.HTMLEncode(rs("ContactName")) & "</td>"
        Response.Write "<td>" & Server.HTMLEncode(rs("Country")) & "</td>"
        Response.Write "</tr>"
        rs.MoveNext
    Loop

    ' 清理资源
    rs.Close
    conn.Close
    Set rs = Nothing
    Set conn = Nothing
%>
    </table>
</body>
</html>
  • 输出:浏览器显示一个 HTML 表格,列出客户的公司名称、联系人和国家。
  • 关键点
  • Server.HTMLEncode:防止 XSS 攻击,编码特殊字符。
  • Response.Write:类似 JavaScript 的 console.log,用于输出 HTML。
  • 调试:添加 Response.Write rs.Fields("CompanyName").Value 检查单行数据。

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 CompanyName, ContactName, Country FROM Customers", conn)

# 显示记录
print(f"{'Company':<30} {'Contact':<20} {'Country':<20}")
print("-" * 70)
while not rs.EOF:
    print(f"{str(rs.Fields('CompanyName').Value):<30} {str(rs.Fields('ContactName').Value):<20} {str(rs.Fields('Country').Value):<20}")
    rs.MoveNext()

# 清理资源
rs.Close()
conn.Close()
  • 输出(控制台):
  Company                       Contact             Country
  ----------------------------------------------------------------------
  Alfreds Futterkiste          Maria Anders        Germany
  Ana Trujillo Emparedados     Ana Trujillo        Mexico
  ...
  • 关键点
  • 使用 str() 格式化字段值,类似 str() vs repr()(前文介绍)。
  • print(repr(rs.Fields)) 用于调试字段信息,类似 console.log

三、进阶显示方式

  1. JSON 输出(REST API)
  • ASP 示例:将 Recordset 数据格式化为 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 = Server.CreateObject("ADODB.Recordset") rs.Open "SELECT CompanyName, ContactName FROM Customers", conn 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 %>
    • 输出[{"company":"Alfreds Futterkiste","contact":"Maria Anders"}, ...]
  • 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.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Northwind.mdb") rs = conn.Execute("SELECT CompanyName, ContactName FROM Customers") 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) if __name__ == '__main__': app.run()
    • 输出:访问 http://localhost:5000/customers,返回 JSON 数据。
  1. 排序和过滤
  • 排序Sort 属性):
    asp rs.Open "SELECT * FROM Customers", conn, 3 ' adOpenStatic rs.Sort = "CompanyName ASC" Do Until rs.EOF Response.Write rs("CompanyName") & "<br>" rs.MoveNext Loop
  • 过滤Filter 属性):
    asp rs.Filter = "Country='USA'" Do Until rs.EOF Response.Write rs("CompanyName") & "<br>" rs.MoveNext Loop
  1. 分页显示
  • 使用 PageSizeAbsolutePage 实现分页。
    asp rs.Open "SELECT * FROM Customers", conn, 3 ' adOpenStatic rs.PageSize = 10 ' 每页 10 条 rs.AbsolutePage = 1 ' 第一页 For i = 1 To rs.PageSize If rs.EOF Then Exit For Response.Write rs("CompanyName") & "<br>" rs.MoveNext Next

四、结合上下文的应用

  1. 结合 REST API
  • 如上 JSON 示例,ADO Recordset 数据可直接用于 REST API 响应,结合 Flask 或 ASP。
  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, 'table').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 CompanyName FROM Customers") 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_display.py,通过 Windows 任务计划程序运行。
  1. 结合 Traefik
  • Traefik 代理 ASP 网站(Recordset 生成 HTML/JSON)。
    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)}") # 调试 conn.Close()
  1. 结合 ==is
  • 检查 Recordset 状态:
    python if rs.State == 1: # 值比较,记录集打开 print("Recordset open") if rs is not None: # 身份比较 print("Recordset exists")
  1. 结合 str()repr()
  • 格式化输出:
    python while not rs.EOF: print(str(rs.Fields("CompanyName").Value)) # 用户友好 print(repr(rs.Fields("CompanyName").Value)) # 调试 rs.MoveNext()

五、注意事项

  1. 字符编码
  • ASP:使用 Server.HTMLEncode 防止 XSS。
  • Python:确保字段值使用 str() 转换为字符串。
  1. 性能优化
  • 使用客户端游标(rs.CursorLocation = 3)支持 RecordCount 和分页。
  • 限制查询范围(如 SELECT TOP 10)。
  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. 调试(类似 console.log)
  • ASP:Response.Write rs.Fields("CompanyName").Value
  • Python:print(repr(rs.Fields))
  1. 现代替代
  • Python:pyodbcsqlalchemy
  • .NET:ADO.NET 或 Entity Framework。

六、总结

  • ADO Recordset 显示:通过遍历 FieldsMoveNext,将数据格式化为 HTML、JSON 或控制台输出。
  • 关键步骤:打开记录集、遍历数据、格式化输出、关闭资源。
  • 结合上下文
  • REST API:返回 JSON。
  • ChromeDriver:测试显示页面。
  • Cron:定时输出数据。
  • Traefik:代理 ASP 服务。
  • 列表推导式:处理 Recordset 数据。
  • 调试:使用 Response.Write(ASP)或 print(repr())(Python)。

如果需要更复杂的显示方式(如分页 UI、CSV 输出)或特定调试帮助,请提供更多细节!

类似文章

发表回复

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