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

MS Access VBA SQL追加含特殊字符字符串时出现语法错误

问题分析与解决方法

错误原因

你遇到的运行时错误'3075',根源是字符串中的单引号未转义。比如选中项里的Maeer's,单引号在SQL语法中是字符串的边界标记,当直接拼接到SQL语句里时,会被解析为字符串提前结束,导致后续内容语法混乱。你的代码直接将列表项内容拼接进SQL,没有处理这类特殊字符,所以触发报错。

解决方案

方法1:转义单引号

使用Access的Replace函数,将字符串中的单个单引号替换为两个单引号(SQL语法中用两个连续单引号表示一个实际的单引号)。修改代码中的SQL拼接行:

Private Sub Command101_Click()
DoCmd.SetWarnings False
code1 = "INSERT INTO tmp_education_list ( education ) "
If Me.Frame97 = 1 Then

    For i = 0 To Me.List96.ListCount - 1
        ' 替换单引号为两个单引号以转义
        Dim escapedText As String
        escapedText = Replace(Me.List96.ItemData(i), "'", "''")
        sqlstr = code1 & "VALUES('" & escapedText & "');"
        DoCmd.RunSQL sqlstr
    Next i ' 注意此处变量名保持和循环变量一致,原代码的Next I建议改为Next i
End If
DoCmd.Requery "Text135"
DoCmd.SetWarnings True
End Sub

方法2:使用参数化查询(更安全规范)

参数化查询能彻底避免特殊字符问题,同时防止SQL注入,是更推荐的写法:

Private Sub Command101_Click()
    DoCmd.SetWarnings False
    If Me.Frame97 = 1 Then
        Dim db As DAO.Database
        Dim qdf As DAO.QueryDef
        Set db = CurrentDb
        
        ' 创建带参数的插入查询
        Set qdf = db.CreateQueryDef("", "INSERT INTO tmp_education_list (education) VALUES ([@Education])")
        
        For i = 0 To Me.List96.ListCount - 1
            ' 给参数赋值,无需手动处理特殊字符
            qdf.Parameters("@Education") = Me.List96.ItemData(i)
            qdf.Execute dbFailOnError ' 执行查询并捕获错误
        Next i
        
        ' 释放对象
        Set qdf = Nothing
        Set db = Nothing
    End If
    DoCmd.Requery "Text135"
    DoCmd.SetWarnings True
End Sub

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 22:15:36