ADO 通过 GetString() 加速脚本

ADO 通过 GetString() 加速脚本简介

ADO(ActiveX Data Objects) 中,GetString()Recordset 对象的一个方法,用于快速将记录集中的数据格式化为字符串,通常用于生成 HTML 表格、CSV 或其他文本输出。相比逐行遍历记录集(如使用 MoveNext 循环),GetString() 显著提高性能,因为它一次性处理整个记录集,减少了逐行访问的开销。这在经典 ASP、VBA、VB6 或 Python(通过 pywin32)中特别适合快速生成大量数据的输出。

本教程聚焦 Recordset.GetString() 方法,讲解如何使用它加速脚本,特别是在显示查询结果时,并结合上下文(如 REST API、ChromeDriver、Cron、Traefik、列表推导式)提供实用示例。假设你已熟悉 ADO 的 ConnectionRecordset查询 等(参考前文)。


一、GetString() 核心概念

  • 作用:将 Recordset 的数据格式化为字符串,通常用于快速生成 HTML、CSV 或其他文本格式。
  • 性能优势
  • 避免逐行遍历(rs.MoveNext),减少脚本执行时间。
  • 一次性提取所有记录,适合大数据量显示。
  • 语法
  str = rs.GetString(StringFormat, NumRows, ColumnDelimiter, RowDelimiter, NullExpr)
  • StringFormat:输出格式(通常 adClipString=2)。
  • NumRows:要处理的行数(默认 -1,表示所有行)。
  • ColumnDelimiter:列分隔符(如 "," 用于 CSV,"</td><td>" 用于 HTML)。
  • RowDelimiter:行分隔符(如 "\n""</tr><tr>")。
  • NullExpr:空值的替换字符串(如 "")。
  • 要求
  • Recordset 必须打开,建议使用客户端游标(adUseClient=3)以支持 GetString
  • 适合只读场景(adLockReadOnly)。
  • 适用场景
  • Web 页面快速显示表格(ASP)。
  • 导出 CSV 文件(Python)。
  • 批量数据处理(Cron 任务)。

二、GetString() 用法

1. 经典 ASP(VBScript)

使用 GetString() 生成 HTML 表格或 CSV 输出,加速数据展示。

示例:生成 HTML 表格

<%@ Language=VBScript %>
<html>
<head>
    <title>ADO GetString 加速</title>
</head>
<body>
    <h2>客户列表</h2>
    <table border="1">
        <tr>
            <th>公司名称</th>
            <th>联系人</th>
            <th>国家</th>
        </tr>
        <tr><td>
<%
    ' 创建连接和记录集
    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.CursorLocation = 3  ' adUseClient
    rs.Open "SELECT CompanyName, ContactName, Country FROM Customers", conn, 3, 1  ' adOpenStatic, adLockReadOnly

    ' 使用 GetString 生成 HTML
    Response.Write Replace(Replace(rs.GetString(2, -1, "</td><td>", "</td></tr><tr><td>", ""), "&", "&amp;"), "<", "&lt;")
    ' 注意:手动编码防止 XSS(或使用 Server.HTMLEncode)

    ' 清理资源
    rs.Close
    conn.Close
    Set rs = Nothing
    Set conn = Nothing
%>
        </td></tr>
    </table>
</body>
</html>
  • 输出:HTML 表格,快速显示所有客户。
  • 关键点
  • rs.CursorLocation = 3:客户端游标支持 GetString
  • GetString(2, -1, "</td><td>", "</td></tr><tr><td>", ""):生成 HTML 格式,列用 </td><td> 分隔,行用 </td></tr><tr><td> 分隔。
  • 调试(类似 console.log)Response.Write rs.GetString() 查看原始输出。
  • 性能对比
  • 传统循环:
    asp Do Until rs.EOF Response.Write "<tr><td>" & Server.HTMLEncode(rs("CompanyName")) & "</td><td>" & Server.HTMLEncode(rs("ContactName")) & "</td><td>" & Server.HTMLEncode(rs("Country")) & "</td></tr>" rs.MoveNext Loop
  • GetString 更快,适合大数据集(数百行以上)。

示例:生成 CSV

<%
Response.ContentType = "text/csv"
Response.AddHeader "Content-Disposition", "attachment;filename=customers.csv"

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.CursorLocation = 3
rs.Open "SELECT CompanyName, ContactName, Country FROM Customers", conn, 3, 1

Response.Write "CompanyName,ContactName,Country" & vbCrLf
Response.Write rs.GetString(2, -1, ",", vbCrLf, "")

rs.Close
conn.Close
Set rs = Nothing
Set conn = Nothing
%>
  • 输出:浏览器下载 customers.csv,内容如:
  CompanyName,ContactName,Country
  Alfreds Futterkiste,Maria Anders,Germany
  Ana Trujillo Emparedados,Ana Trujillo,Mexico
  ...

2. Python(通过 pywin32)

安装 pywin32

pip install pywin32 -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com

示例:生成 CSV 输出

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.CursorLocation = 3  # adUseClient
rs.Open("SELECT CompanyName, ContactName, Country FROM Customers", conn, 3, 1)  # adOpenStatic, adLockReadOnly

# 使用 GetString
csv_data = rs.GetString(2, -1, ",", "\n", "")
with open("customers.csv", "w", encoding="utf-8") as f:
    f.write("CompanyName,ContactName,Country\n")
    f.write(csv_data)

print("CSV 生成成功!")
rs.Close()
conn.Close()
  • 输出:生成 customers.csv 文件。
  • 关键点
  • GetString(2, -1, ",", "\n", ""):生成 CSV 格式。
  • 调试print(repr(csv_data))print(str(csv_data)).

三、结合上下文的应用

  1. 结合 REST API
  • ASP:返回 JSON(结合 GetString 和手动解析)。 <% 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.CursorLocation = 3 rs.Open "SELECT CompanyName, ContactName FROM Customers", conn, 3, 1 csv_data = rs.GetString(2, -1, ",", "|", "") ' 使用 | 分隔行 Response.Write "[" first = True For Each row In Split(csv_data, "|") If row <> "" Then If Not first Then Response.Write "," cols = Split(row, ",") Response.Write "{""company"":""" & Server.HTMLEncode(cols(0)) & """,""contact"":""" & Server.HTMLEncode(cols(1)) & """}" first = False End If Next Response.Write "]" rs.Close conn.Close %>
  • 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 = win32com.client.Dispatch("ADODB.Recordset") rs.CursorLocation = 3 rs.Open("SELECT CompanyName, ContactName FROM Customers", conn, 3, 1) csv_data = rs.GetString(2, -1, ",", "|", "") customers = [{"company": row.split(",")[0], "contact": row.split(",")[1]} for row in csv_data.split("|") if row] conn.Close() return jsonify(customers)
  1. 结合 ChromeDriver 和 Selenium
  • 测试 ASP 页面(使用 GetString 生成表格)。
    python from selenium.webdriver import Chrome driver = Chrome() driver.get('http://localhost/customers.asp') # ASP 使用 GetString print(driver.find_element(By.TAG_NAME, 'table').text) driver.quit()
  1. 结合 Linux Cron(Windows 任务计划程序)
  • 定时导出排序后的 CSV。 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 = win32com.client.Dispatch("ADODB.Recordset") rs.CursorLocation = 3 rs.Open("SELECT CompanyName, ContactName FROM Customers ORDER BY CompanyName", conn, 3, 1) with open("sorted_customers.csv", "w", encoding="utf-8") as f: f.write("CompanyName,ContactName\n") f.write(rs.GetString(2, -1, ",", "\n", "")) print("CSV 导出完成!") conn.Close()
    • 保存为 ado_getstring.py,通过 Windows 任务计划程序运行。
  1. 结合 Traefik
  • Traefik 代理 ASP 网站(GetString 生成数据)。
    yaml services: asp: image: my-asp-app labels: - "traefik.http.routers.asp.rule=Host(`asp.example.com`)" - "traefik.http.routers.asp.entrypoints=websecure"
  1. 结合列表推导式
  • 解析 GetString 输出为列表。
    python 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.CursorLocation = 3 rs.Open("SELECT CompanyName FROM Customers", conn, 3, 1) csv_data = rs.GetString(2, -1, ",", "\n", "") names = [row for row in csv_data.split("\n") if row] print(f"Names: {repr(names)}") conn.Close()
  1. 结合 ==is
  • 检查记录集状态:
    python if rs.State == 1: # 值比较 print("Recordset open") if rs is not None: # 身份比较 print("Recordset exists")
  1. 结合 str()repr()
  • 调试 GetString 输出:
    python csv_data = rs.GetString(2, -1, ",", "\n", "") print(str(csv_data)) # 用户友好 print(repr(csv_data)) # 调试

四、注意事项

  1. 游标要求
  • GetString 需要客户端游标(rs.CursorLocation = 3)。
  • 使用 adOpenStaticadOpenKeyset 游标。
  1. 编码与 XSS
  • ASP:使用 Server.HTMLEncode 或手动替换特殊字符(如 &<.>)。
  • Python:确保输出文件使用正确编码(如 utf-8)。
  1. 性能
  • GetString 适合大数据量(数百行以上),比 MoveNext 循环快。
  • 限制查询范围(如 SELECT TOP 100)以减少内存使用。
  1. 错误处理
  • ASP:
    asp On Error Resume Next str = rs.GetString(2, -1, ",", vbCrLf, "") If Err.Number <> 0 Then Response.Write "错误:" & Err.Description
  • Python:
    python try: csv_data = rs.GetString(2, -1, ",", "\n", "") except Exception as e: print(f"Error: {e}")
  1. 调试(类似 console.log)
  • ASP:Response.Write rs.GetString().
  • Python:print(repr(rs.GetString())).
  1. 局限性
  • GetString 不支持复杂格式化(如嵌套 HTML 属性)。
  • 需手动处理空值或特殊字符。
  1. 现代替代
  • Python:pyodbcsqlalchemy 结合 Pandas 导出 CSV。
  • .NET:ADO.NET 或 Entity Framework.

五、总结

  • ADO GetString():快速将 Recordset 格式化为字符串,加速脚本执行。
  • 关键步骤:设置客户端游标、执行查询、使用 GetString 生成输出。
  • 性能优势:比逐行遍历快,适合 HTML 表格、CSV 导出。
  • 结合上下文
  • REST API:生成 JSON。
  • ChromeDriver:测试快速生成的页面。
  • Cron:定时导出 CSV。
  • Traefik:代理 ASP 服务。
  • 列表推导式:解析 GetString 输出。
  • 调试:使用 Response.Write(ASP)或 print(repr())(Python)。

If you need more complex scenarios (e.g., combining GetString with sorting/pagination, advanced CSV formatting) or specific debugging help, please provide additional details!

类似文章

发表回复

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