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
相关产品推荐
相关产品推荐

