VB6.0连接Oracle 11g执行查询时遇ORA-00911无效字符错误求助
解决方案:VB6连接Oracle 11g处理含&的IN条件
优先方案:使用参数化查询(推荐)
直接拼接SQL不仅易引发语法错误,还存在SQL注入风险,参数化查询可彻底规避这些问题:
Dim cmd As New ADODB.Command Dim conn As ADODB.Connection Set conn = New ADODB.Connection conn.Open "你的Oracle连接字符串" With cmd .ActiveConnection = conn .CommandText = "SELECT * FROM 表名 WHERE 字段名 IN (:param1, :param2)" ' 添加参数,值含&无需特殊处理 .Parameters.Append .CreateParameter("param1", adVarChar, adParamInput, 50, "A&B") .Parameters.Append .CreateParameter("param2", adVarChar, adParamInput, 50, "C&D") Dim rs As ADODB.Recordset Set rs = .Execute ' 处理结果集 rs.Close Set rs = Nothing End With conn.Close Set conn = Nothing Set cmd = Nothing
若必须拼接SQL:正确转义单引号和&符号
因特殊需求需拼接SQL时,需注意两点:
- VB6中字符串内的单引号需用两个连续单引号转义(Oracle识别为一个实际单引号)
- 用Oracle的
chr(38)生成&字符,避免与VB6的&字符串连接符冲突
示例代码:
Dim conn As ADODB.Connection Dim sqlStr As String Dim rs As ADODB.Recordset Set conn = New ADODB.Connection conn.Open "你的Oracle连接字符串" ' 示例IN条件值 Dim value1 As String: value1 = "A&B" Dim value2 As String: value2 = "C&D" ' 转义单引号后拼接 sqlStr = "SELECT * FROM 表名 WHERE 字段名 IN ('" & Replace(value1, "'", "''") & "', '" & Replace(value2, "'", "''") & "')" ' 若&为动态生成,也可直接嵌入chr(38) ' sqlStr = "SELECT * FROM 表名 WHERE 字段名 IN ('A' || chr(38) || 'B', 'C' || chr(38) || 'D')" Set rs = conn.Execute(sqlStr) ' 处理结果集 rs.Close Set rs = Nothing conn.Close Set conn = Nothing
额外选项:关闭Oracle变量解析(不推荐)
若不想处理&符号,可先执行SET DEFINE OFF关闭Oracle对&作为变量占位符的解析,但可能影响其他依赖变量的SQL,谨慎使用:
conn.Execute "SET DEFINE OFF" ' 再执行目标查询SQL
内容的提问来源于stack exchange,提问作者dandy
相关产品推荐
相关产品推荐

