Access开发培训
网站公告
·Access专家课堂QQ群号:151711184    ·Access快速开发平台下载地址及教程    ·欢迎加入Access专家课堂微信群!    ·如何快速搜索本站文章|示例|资料    
您的位置: 首页 > 技术文章 > Access数据库-模块/函数/VBA

FAQ:关于查询的变量含有单引号

时 间:2007-12-12 08:10:55
作 者:竹笛   ID:8  城市:上海  QQ:2851379730点击这里给张志发消息
摘 要:关于查询的变量含有单引号
正 文:

(Q)如果要查询的变量含有单引号,我把变量加入到SQL语句就会出问题,例如:

string name = textBox1.Text;
string sql = "Select * From Test Where Name = '" + name + "'";

如果界面上用户输了含有单引号的文本,我在执行这个sql语句就会出问题,有什么好的方法去解决查询问题?谢谢

(A)根据您的描述,我对您问题的理解是您在使用做SQL语句查询的过程中,对单引号语句的执行存在问题。不知道我理解得正确吗?如果我理解得不够准确,请让我知道尽可能多对问题的描述,以便我能全面理解您的问题并且能够更快解决问题。

从您的描述中,我不是很清楚您通过什么样的方式来连接数据库。通常来说Jet SQL中使用转义字符对特殊字符进行转义。在 '''' (4个单引号)中:第一个和第四个引号高速编译器中间是字符串,第二个引号是一个转义字符,表示后面的第三个 ' 不是一个特殊字符,而是一个普通的引号!所以'''' 经过JET SQL引擎编译后的输出是一个普通的单引号'

因此您可以试图将语句修改成:
string sql = "Select * From Test Where Name = '''' + name + ''''";

同时亦可参考:

Function about_inverted_comma()
Dim rs As New ADODB.Recordset
Dim strSQL As String
strSQL = "select * from 表1 where g=''"
'其实非常简单,如果要匹配空字符,可以连续用两个单引号 ''
'如果要匹配 g 字段中得一个单引号,你可以将要匹配得单引号乘以 2 ,
'而两边仍然以一边一个单引号将字符包含起来,表示这是匹配字符串。
'比如我要匹配一个单引号就用以下代码:
strSQL = "select * from 表1 where g=''''"
'要匹配2个单引号用以下代码:
strSQL = "select * from 表1 where g=''''''"
rs.CursorLocation = adUseClient
rs.Open strSQL, CurrentProject.Connection, 1, 1
Debug.Print rs.RecordCount
rs.Close
End Function



说明:
在JET SQL中,为了表示字符串,首先我们需要用两个引号把字符串引起来。例如 'abc', JET SQL编译器把它解释为字符串abc。而当您需要表示一个单引号 ' 的时候,如果只用三个引号 ''',JET SQL的编译器会无法解析辨认中间的引号是一个正常的字符还是一个特殊字符(如果是特殊字符,编译器会认为和左右的两个引号之间有关系)

为了解决这种情况,JET SQL中使用转义字符(其他语言中也有这个概念)对特殊字符进行转义。在 '''' 中:第一个和第四个引号高速编译器中间是字符串,第二个引号是一个转义字符,表示后面的第三个 ' 不是一个特殊字符,而是一个普通的引号!所以'''' 经过JET SQL引擎编译后的输出是一个普通的单引号 '

另,关于 VBA 中的字符串表达式也有相同的概念
在VBA中,为了表示字符串,首先我们需要用两个引号把字符串引起来。例如 "abc", VBA编译器把它解释为字符串abc。而当您需要表示一个单引号 " 的时候,如果只用三个引号 """,VBA的编译器会无法解析辨认中间的引号是一个正常的字符还是一个特殊字符(如果是特殊字符,编译器会认为和左右的两个引号之间有关系)

为了解决这种情况,VBA中使用转义字符(其他语言中也有这个概念)对特殊字符进行转义。在 """" 中:第一个和第四个引号高速编译器中间是字符串,第二个引号是一个转义字符,表示后面的第三个 " 不是一个特殊字符,而是一个普通的引号!所以"""" 经过VBA编译器编译后的输出是一个普通的双引号 "

在日常操作中,为了避免出现双引号的问题,我们还可以直接写一个函数来解决问题


Function CheckSQL(ByVal strSQL As String) As String
If IsNull(strSQL) = False Then
strSQL = Replace(strSQL, "'", "''")
Else
strSQL = ""
End If
CheckSQL = strSQL
End Function



该函数应用如下:

Function CheckSQL(ByVal strSQL As String) As String
If IsNull(strSQL) = False Then
strSQL = Replace(strSQL, "'", "''")
Else
strSQL = ""
End If
CheckSQL = strSQL
End Function

Function about_inverted_comma()
Dim rs As New ADODB.Recordset
Dim strSQL As String
Dim strCondition As String

strCondition = "带 ' (单引号)的条件"
strSQL = "select * from 表1 where g='" & strCondition & "'"
'上述语句可能导致 JET SQL 错误,下面使用函数过滤单引号
strSQL = "select * from 表1 where g='" & CheckSQL(strCondition) & "'"
rs.CursorLocation = adUseClient
rs.Open strSQL, CurrentProject.Connection, 1, 1
Debug.Print rs.RecordCount
rs.Close
End Function



Access软件网QQ交流群 (群号:483923997)       Access源码网店

常见问答:

技术分类:

相关资源:

专栏作家

关于我们 | 服务条款 | 在线投稿 | 友情链接 | 网站统计 | 网站帮助