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交流群 (群号:54525238) Access源码网店
常见问答:
技术分类:
源码示例
- 【源码QQ群号19834647...(12.17)
- Access对子窗体数据进行批...(10.30)
- 最精简的组合框行来源数据快速输...(10.25)
- Access仿平台的多值选择器...(10.24)
- 【Access日期区间段查询】...(10.22)
- 【Access源码示例】VBA...(10.12)
- Access累乘示例,Acce...(10.09)
- 数值8.88,把整数8去掉,转...(10.08)
- 【Access自定义函数】一个...(09.30)
- 【Access选项卡示例】Ac...(09.09)
学习心得
最新文章
- Access快速开发平台--对上传...(11.22)
- Access快速开发平台企业版--...(11.18)
- 不会用多表联合查询,多表查询没结果...(11.16)
- 【案例分享】主键字段值含有不间断空...(11.16)
- Access快速开发平台--后台D...(11.14)
- 微软Access邀测新Monaco...(11.12)
- Access列表框左右互选、列表框...(11.11)
- 高效率在导入数据前删除记录(11.10)
- Access报价单转订单示例代码(11.08)
- Access系统自带的日期选择器不...(11.08)