You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Access 2016调用Recordset.Edit遇含变音字符数据触发3167错误

解决Access 2016连PostgreSQL时含变音字符的记录编辑报错问题

问题根源

当group字段包含变音字符(如Motörhead)时,VBA代码触发运行时错误3167(Record deleted),但实际记录仍存在。核心原因是字符串拼接导致的字符编码不匹配,ODBC驱动在传递含特殊字符的查询条件时,无法正确匹配PostgreSQL中的记录,后续执行rs.Edit时因记录集状态异常报错。


解决方案

1. 使用参数化查询(推荐,彻底解决问题)

字符串拼接不仅会引发字符匹配问题,还存在SQL注入风险。改用参数化查询让ODBC驱动自动处理字符编码:

Dim rs As Recordset
Dim qdf As QueryDef
Dim dbs As Database

Set dbs = CurrentDb
' 创建临时参数化查询,注意PostgreSQL中group是关键字,需用双引号转义
Set qdf = dbs.CreateQueryDef("")
qdf.SQL = "SELECT * FROM public_SomeTable WHERE projectnumber = ? AND ""group"" = ?"
' 绑定参数值
qdf.Parameters(0) = projektnumber
qdf.Parameters(1) = group

Set rs = qdf.OpenRecordset(dbOpenDynaset)
If Not rs.EOF Then
    rs.Edit
    rs!cost = cost
    rs.Update
End If

' 清理对象
rs.Close
Set rs = Nothing
Set qdf = Nothing
Set dbs = Nothing

2. 调整ODBC驱动编码设置

打开PostgreSQL ODBC数据源配置:

  • 切换到「驱动」选项卡,将「客户端编码」设置为与PostgreSQL数据库一致的编码(通常为UTF8)
  • 确认Access数据库的编码为UTF-8:依次点击「文件」→「选项」→「高级」→确认「默认数据库编码」为UTF-8

3. 临时修复:显式转义特殊字符

如果无法立即重构查询,可对含变音字符的字段进行编码转换后再拼接:

Dim rs As Recordset
Dim dbs As Database
Dim escapedGroup As String

' 将字符串转换为适配PostgreSQL的UTF-8编码
escapedGroup = StrConv(group, vbUnicode)

Set dbs = CurrentDb
Set rs = dbs.OpenRecordset("public_SomeTable", dbOpenDynaset)
rs.FindFirst "projectnumber = '" & projektnumber & "' AND ""group"" = '" & escapedGroup & "'"

If Not rs.EOF Then
    rs.Edit
    rs!cost = cost
    rs.Update
End If

rs.Close
Set rs = Nothing
Set dbs = Nothing

额外排查建议

  • 检查PostgreSQL表中group字段的collation设置,确保使用支持变音字符排序的规则(如utf8_unicode_ci)
  • 升级psqlODBC驱动到最新稳定版,旧版本对特殊字符的处理存在兼容性bug

内容的提问来源于stack exchange,提问作者mbeyss

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 13:21:33