VB编写SQL查询字符串时双引号转义异常问题解决问询
问题根因
你遇到的问题本质是需要同时满足VB字符串转义规则和SQL语法转义规则两层要求,两类规则的转义逻辑不能混淆:
- VB语言中,双引号是字符串字面量的边界符,要在字符串内容里输出1个双引号,需要在代码中写2个连续双引号,编译后只会保留1个双引号在最终的字符串值中。
- 标准SQL中,使用单引号包裹的字符串内,双引号属于普通字符,不需要额外转义。
正确写法
方案1:保留XML属性双引号写法
你之前用Chr(34)的写法是可行的,只是你贴的代码漏了VB字符串末尾的闭合双引号,修正后代码如下:
Dim sSql As String ' Chr(34) 对应双引号字符,拼接后最终SQL里只会保留1个双引号 sSql = "SELECT thing FROM example where xml NOT LIKE '%<FUNDED YESNO=" & Chr(34) & "YES" & Chr(34) & ">%'"
用VB原生双引号转义的写法也可以,编译后效果和上面完全一致:
Dim sSql As String ' VB里两个连续双引号最终会转为1个双引号,传到SQL侧就是正确的属性格式 sSql = "SELECT thing FROM example where xml NOT LIKE '%<FUNDED YESNO=""YES"">%'"
方案2:用单引号替换XML属性引号(更省心)
XML规范允许属性使用单引号包裹,你可以直接把属性引号换成单引号,完全避开双引号转义的冲突:
Dim sSql As String ' SQL里单引号包裹的字符串中要输出单引号,只需要写2个连续单引号即可,VB侧不需要额外处理单引号 sSql = "SELECT thing FROM example where xml NOT LIKE '%<FUNDED YESNO=''YES''>%'"
验证方法
拼接完SQL字符串后,可以在VB中用Debug.Print sSql输出最终拼接结果,直接确认传到SQL侧的语句是否符合预期。
注:如果业务场景允许,更推荐使用参数化查询传递LIKE条件,既可以避免SQL注入风险,也不需要手动处理各类字符转义问题。
内容的提问来源于stack exchange,提问作者TangoKilo
相关产品推荐
相关产品推荐

