ADO 添加记录

ADO 添加记录(Add Record)简介

ADO(ActiveX Data Objects) 中,添加记录是指通过 Recordset 对象的 AddNew 方法或通过 Connection/Command 对象的 Execute 方法向数据库表插入新数据。这在经典 ASP、VBA、VB6 或 Python(通过 pywin32)等环境中非常常见,适用于创建新记录,如添加用户、订单等。

本教程聚焦 ADO 的记录添加功能,详细讲解 AddNew 和 SQL INSERT 的用法,并结合上下文(如 REST API、ChromeDriver、Cron、Traefik、列表推导式)提供实用示例。假设你已熟悉 ADO 的 ConnectionRecordset查询(参考前文)。


一、ADO 添加记录核心概念

  • 方法
  • Recordset.AddNew:打开可编辑的 Recordset,添加新记录并保存。
  • Connection.Execute:执行 SQL INSERT 语句,直接插入记录。
  • Command.Execute:使用参数化 INSERT 语句,防止 SQL 注入。
  • 要求
  • Recordset 需使用可编辑游标(如 adOpenKeysetadOpenDynamic)和可写锁(adLockOptimisticadLockPessimistic)。
  • 数据库表需允许插入操作(检查权限和表结构)。
  • 适用场景
  • Web 表单提交(如 ASP 页面添加用户)。
  • 批量数据导入(Python 脚本)。
  • 定时任务插入记录(Cron/任务计划程序)。

二、ADO 添加记录方法

1. 使用 Recordset.AddNew

要求

  • 游标类型:adOpenKeyset=1adOpenDynamic=2
  • 锁类型:adLockOptimistic=3adLockPessimistic=2
  • 调用 AddNew 创建新记录,设置字段值,调用 Update 保存。

ASP 示例(添加新客户):

<%@ Language=VBScript %>
<html>
<head>
    <title>ADO 添加记录</title>
</head>
<body>
    <h2>添加客户</h2>
<%
    ' 创建连接和记录集
    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 "Customers", conn, 1, 3  ' adOpenKeyset, adLockOptimistic

    ' 添加新记录
    rs.AddNew
    rs("CustomerID") = "XYZ01"  ' 必须唯一
    rs("CompanyName") = "XYZ Corp"
    rs("ContactName") = "John Doe"
    rs("Country") = "USA"
    rs.Update

    Response.Write "添加成功!"

    ' 清理资源
    rs.Close
    conn.Close
    Set rs = Nothing
    Set conn = Nothing
%>
</body>
</html>
  • 关键点
  • rs.Open "Customers", conn, 1, 3:使用可编辑游标和锁。
  • rs.AddNew:创建新记录。
  • rs.Update:保存到数据库。
  • 调试(类似 console.log)Response.Write rs("CompanyName").

2. 使用 Connection.Execute(SQL INSERT)

直接执行 SQL INSERT 语句,适合简单插入。

ASP 示例

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

conn.Execute "INSERT INTO Customers (CustomerID, CompanyName, ContactName, Country) VALUES ('XYZ02', 'XYZ Corp 2', 'Jane Doe', 'Canada')"

Response.Write "插入成功!"
conn.Close
Set conn = Nothing
%>
  • 关键点
  • 简单但不安全(易受 SQL 注入攻击)。
  • 不返回记录集,适合非查询操作。

3. 使用 Command.Execute(参数化插入)

参数化查询防止 SQL 注入,适合动态输入。

ASP 示例

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

Set cmd = Server.CreateObject("ADODB.Command")
cmd.ActiveConnection = conn
cmd.CommandText = "INSERT INTO Customers (CustomerID, CompanyName, ContactName, Country) VALUES (?, ?, ?, ?)"
cmd.Parameters.Append cmd.CreateParameter("CustomerID", 200, 1, 5, "XYZ03")  ' adVarChar
cmd.Parameters.Append cmd.CreateParameter("CompanyName", 200, 1, 40, "XYZ Corp 3")
cmd.Parameters.Append cmd.CreateParameter("ContactName", 200, 1, 30, "Alice Smith")
cmd.Parameters.Append cmd.CreateParameter("Country", 200, 1, 15, "UK")
cmd.Execute

Response.Write "参数化插入成功!"
conn.Close
Set conn = Nothing
%>
  • 关键点
  • adVarChar=200:指定参数类型。
  • 更安全,适合用户输入场景。

4. Python(通过 pywin32)

安装 pywin32

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

示例:使用 Recordset.AddNew

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("Customers", conn, 1, 3)  # adOpenKeyset, adLockOptimistic

# 添加新记录
rs.AddNew()
rs.Fields("CustomerID").Value = "XYZ04"
rs.Fields("CompanyName").Value = "XYZ Corp 4"
rs.Fields("ContactName").Value = "Bob Brown"
rs.Fields("Country").Value = "Australia"
rs.Update()

print("添加成功!")

# 清理资源
rs.Close()
conn.Close()
  • 调试print(repr(rs.Fields))print(str(rs.Fields("CompanyName").Value)).

示例:参数化插入

import win32com.client

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

cmd = win32com.client.Dispatch("ADODB.Command")
cmd.ActiveConnection = conn
cmd.CommandText = "INSERT INTO Customers (CustomerID, CompanyName, ContactName, Country) VALUES (?, ?, ?, ?)"
cmd.Parameters.Append(cmd.CreateParameter("CustomerID", 200, 1, 5, "XYZ05"))
cmd.Parameters.Append(cmd.CreateParameter("CompanyName", 200, 1, 40, "XYZ Corp 5"))
cmd.Parameters.Append(cmd.CreateParameter("ContactName", 200, 1, 30, "Eve Green"))
cmd.Parameters.Append(cmd.CreateParameter("Country", 200, 1, 15, "Germany"))
cmd.Execute()

print("参数化插入成功!")
conn.Close()

三、结合上下文的应用

  1. 结合 REST API
  • ASP:通过表单提交添加记录,返回 JSON 确认。 <% If Request.Form("submit") <> "" Then 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 "Customers", conn, 1, 3 rs.AddNew rs("CustomerID") = Request.Form("customer_id") rs("CompanyName") = Request.Form("company") rs("ContactName") = Request.Form("contact") rs("Country") = Request.Form("country") rs.Update Response.ContentType = "application/json" Response.Write "{""status"":""success""}" rs.Close conn.Close End If %> <form method="post"> Customer ID: <input name="customer_id"><br> Company: <input name="company"><br> Contact: <input name="contact"><br> Country: <input name="country"><br> <input type="submit" name="submit" value="Add"> </form>
  • Python(Flask)from flask import Flask, request, jsonify import win32com.client app = Flask(__name__) @app.route('/customers', methods=['POST']) def add_customer(): 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("Customers", conn, 1, 3) rs.AddNew() rs.Fields("CustomerID").Value = request.json["customer_id"] rs.Fields("CompanyName").Value = request.json["company"] rs.Fields("ContactName").Value = request.json["contact"] rs.Fields("Country").Value = request.json["country"] rs.Update() conn.Close() return jsonify({"status": "success"})
  1. 结合 ChromeDriver 和 Selenium
  • 测试 ASP 表单(添加记录后验证页面)。
    python from selenium.webdriver import Chrome from selenium.webdriver.common.by import By driver = Chrome() driver.get('http://localhost/add_customer.asp') driver.find_element(By.NAME, 'customer_id').send_keys('XYZ06') driver.find_element(By.NAME, 'company').send_keys('XYZ Corp 6') driver.find_element(By.NAME, 'contact').send_keys('Tom White') driver.find_element(By.NAME, 'country').send_keys('France') driver.find_element(By.NAME, 'submit').click() print(driver.find_element(By.TAG_NAME, 'body').text) # 检查结果 driver.quit()
  1. 结合 Linux Cron(Windows 任务计划程序)
  • 定时批量添加记录。 python import win32com.client from tqdm import tqdm customers = [ {"CustomerID": "XYZ07", "CompanyName": "XYZ Corp 7", "ContactName": "Sara Blue", "Country": "Japan"}, {"CustomerID": "XYZ08", "CompanyName": "XYZ Corp 8", "ContactName": "Mike Red", "Country": "Brazil"} ] 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("Customers", conn, 1, 3) for customer in tqdm(customers, desc="Adding customers"): rs.AddNew() for key, value in customer.items(): rs.Fields(key).Value = value rs.Update() print("批量添加完成!") rs.Close() conn.Close()
    • 保存为 ado_add.py,通过 Windows 任务计划程序运行。
  1. 结合 Traefik
  • Traefik 代理 ASP 网站(添加记录的表单)。
    yaml services: asp: image: my-asp-app labels: - "traefik.http.routers.asp.rule=Host(`asp.example.com`)" - "traefik.http.routers.asp.entrypoints=websecure"
  1. 结合列表推导式
  • 批量添加记录并验证。
    python import win32com.client customers = [ {"CustomerID": "XYZ09", "CompanyName": "XYZ Corp 9", "ContactName": "Lisa Black", "Country": "China"}, {"CustomerID": "XYZ10", "CompanyName": "XYZ Corp 10", "ContactName": "Paul Green", "Country": "India"} ] 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("Customers", conn, 1, 3) [rs.AddNew() or [rs.Fields(key).Update(value) for key, value in customer.items()] or rs.Update() for customer in customers] print("添加完成!") rs.Close() conn.Close()
  1. 结合 ==is
  • 检查记录集状态:
    python if rs.State == 1: # 值比较 print("Recordset open") if rs is not None: # 身份比较 print("Recordset exists")
  1. 结合 str()repr()
  • 调试添加的记录:
    python rs.MoveLast() print(str(rs.Fields("CompanyName").Value)) # 用户友好 print(repr(rs.Fields("CompanyName").Value)) # 调试

四、注意事项

  1. 游标和锁类型
  • 必须使用 adOpenKeysetadOpenDynamicadLockOptimistic/adLockPessimistic
  • 否则报错:Operation is not allowed in this context.
  1. 字段约束
  • 确保字段值符合数据库约束(如 CustomerID 唯一、长度限制)。
  • 检查必填字段和数据类型。
  1. SQL 注入
  • 使用 Command 对象参数化查询,避免拼接用户输入:
    asp ' 错误示例 conn.Execute "INSERT INTO Customers (CustomerID) VALUES ('" & Request("id") & "')"
  1. 错误处理
  • ASP:
    asp On Error Resume Next rs.Update If Err.Number <> 0 Then Response.Write "错误:" & Err.Description
  • Python:
    python try: rs.Update() except Exception as e: print(f"Error: {e}")
  1. 调试(类似 console.log)
  • ASP:Response.Write rs.Fields("CustomerID").Value.
  • Python:print(repr(rs.Fields)).
  1. 性能
  • 批量插入时,考虑事务(conn.BeginTrans, conn.CommitTrans)。
  • 避免频繁打开/关闭 Recordset。
  1. 现代替代
  • Python:pyodbcsqlalchemy.
  • .NET:ADO.NET 或 Entity Framework.

五、总结

  • ADO 添加记录:通过 Recordset.AddNew、SQL INSERTCommand.Execute 实现。
  • 关键步骤:打开可编辑 Recordset、设置字段值、保存更改。
  • 结合上下文
  • REST API:处理表单提交,返回 JSON。
  • ChromeDriver:测试添加表单。
  • Cron:定时批量插入。
  • Traefik:代理 ASP 服务。
  • 列表推导式:批量添加记录。
  • 调试:使用 Response.Write(ASP)或 print(repr())(Python)。

如果需要更复杂的添加场景(如批量插入优化、事务处理)或特定调试帮助,请提供更多细节!

类似文章

发表回复

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