Access911.net   |   a9BBS   |   OTaA System  
  搜索文章:  
Access911欢迎您光临  
   主页      上传      繁體版       论坛     
设为首页  |  加入收藏   
  
你现在的位置:文章索引 -> 文章分类 -> 查询  
 首页|  近日更新|  下载  |  文章索引  |  搜索|  术语|  承接工程|  
 
系统正在加载内容,请耐心等待...
 
 查询
 窗体
 报表
 
 
 VBA
 函数
 ADO/DAO/ADO.NET
 API
 ADP
 安全
 发布
 OA
 ASP/ASP.NET
 其他语言
 控件
 DELPHI
 C#/VS.NET2005
 本站
 其他
 小例程
 常用软件
 参考文档
 业主作品
 网友大作
 
 
友情链接
 access911.net
 AppleVB
 我家网
 911静态资料2
 a9 BBS
 911搜什么
 MCSE技术论坛
 CSharp911.net
 BBS新闻列表
 911静态资料
 911搜C S D N
 911搜全国公交线路
 Office中国
 Java 编程资料站
 Access开发在线
 Access软件网
 CSDN
 MS Support
 上海朋扬电脑
 access爱好者
 交流中心
 ezlavie
 艾赛思俱乐部
 设计在线
 搜CSDN V2
 搜CSDN V3
 oaup
 宇宙网络
 
访问人次
 1004260
 
站长 E-Mail
 net911@sina.com
 access911@gmail.com
 
RSS 订阅

显示附加信息 >>>

新手来看:关于JET SQL字符串中包含单引号得问题

作者:cg1  摘自:access911.net  :cg1  更新日期:2004-5-3  浏览人次:

 

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


本站文章旨在为该问题提供解决思路及关键性代码,并不能完成应该由网友自己完成的所有工作,请网友在仔细看文章并理解思路的基础上举一反三、灵活运用。

access911.net 原创文章,作者本人对文章保留一切权利。
如需转载必须征得作者同意并注明本站链接

 

 
相关文章
     没有手动相关文章
 
评论
     查看或发表更多的评论,请单击这里。
 
 
 
 
 
   
  Access911.net   |   a9BBS   |   OTaA System   |
建站日期:2000年4月2日  |  设计施工:陈格 ( access911 & cg1 )
 Copyright © 2000 - 2003 COMET, 陈格 保留所有权利