會(huì)員登錄 - 用戶注冊(cè) - 網(wǎng)站地圖 Office中國(guó)(office-cn.net),專業(yè)Office論壇
當(dāng)前位置:主頁(yè) > 技巧 > Access技巧 > 查詢視圖 > 正文

JET SQL字符串中單引號(hào)的問(wèn)題

時(shí)間:2005-02-04 00:00 來(lái)源:Access911 作者:cg1 閱讀:


Function about_inverted_comma()
    Dim rs As New ADODB.Recordset
    Dim strSQL As String
    strSQL = "select * from 表1 where g=''"
    '其實(shí)非常簡(jiǎn)單,如果要匹配空字符,可以連續(xù)用兩個(gè)單引號(hào) ''
    '如果要匹配 g 字段中得一個(gè)單引號(hào),你可以將要匹配得單引號(hào)乘以 2 ,
    '而兩邊仍然以一邊一個(gè)單引號(hào)將字符包含起來(lái),表示這是匹配字符串。
    '比如我要匹配一個(gè)單引號(hào)就用以下代碼:
    strSQL = "select * from 表1 where g=''''"
    '要匹配2個(gè)單引號(hào)用以下代碼:
    strSQL = "select * from 表1 where g=''''''"
    rs.CursorLocation = adUseClient
    rs.Open strSQL, CurrentProject.Connection, 1, 1
    Debug.Print rs.RecordCount
    rs.Close
End Function

 

說(shuō)明:
在JET SQL中,為了表示字符串,首先我們需要用兩個(gè)引號(hào)把字符串引起來(lái)。例如 'abc', JET SQL編譯器把它解釋為字符串a(chǎn)bc。而當(dāng)您需要表示一個(gè)單引號(hào) ' 的時(shí)候,如果只用三個(gè)引號(hào) ''',JET SQL的編譯器會(huì)無(wú)法解析辨認(rèn)中間的引號(hào)是一個(gè)正常的字符還是一個(gè)特殊字符(如果是特殊字符,編譯器會(huì)認(rèn)為和左右的兩個(gè)引號(hào)之間有關(guān)系)

為了解決這種情況,JET SQL中使用轉(zhuǎn)義字符(其他語(yǔ)言中也有這個(gè)概念)對(duì)特殊字符進(jìn)行轉(zhuǎn)義。在 '''' 中:第一個(gè)和第四個(gè)引號(hào)高速編譯器中間是字符串,第二個(gè)引號(hào)是一個(gè)轉(zhuǎn)義字符,表示后面的第三個(gè) ' 不是一個(gè)特殊字符,而是一個(gè)普通的引號(hào)!所以'''' 經(jīng)過(guò)JET SQL引擎編譯后的輸出是一個(gè)普通的單引號(hào) '

另,關(guān)于 VBA 中的字符串表達(dá)式也有相同的概念
在VBA中,為了表示字符串,首先我們需要用兩個(gè)引號(hào)把字符串引起來(lái)。例如 "abc", VBA編譯器把它解釋為字符串a(chǎn)bc。而當(dāng)您需要表示一個(gè)單引號(hào) " 的時(shí)候,如果只用三個(gè)引號(hào) """,VBA的編譯器會(huì)無(wú)法解析辨認(rèn)中間的引號(hào)是一個(gè)正常的字符還是一個(gè)特殊字符(如果是特殊字符,編譯器會(huì)認(rèn)為和左右的兩個(gè)引號(hào)之間有關(guān)系)

為了解決這種情況,VBA中使用轉(zhuǎn)義字符(其他語(yǔ)言中也有這個(gè)概念)對(duì)特殊字符進(jìn)行轉(zhuǎn)義。在 """" 中:第一個(gè)和第四個(gè)引號(hào)高速編譯器中間是字符串,第二個(gè)引號(hào)是一個(gè)轉(zhuǎn)義字符,表示后面的第三個(gè) " 不是一個(gè)特殊字符,而是一個(gè)普通的引號(hào)!所以"""" 經(jīng)過(guò)VBA編譯器編譯后的輸出是一個(gè)普通的雙引號(hào) "

在日常操作中,為了避免出現(xiàn)雙引號(hào)的問(wèn)題,我們還可以直接寫一個(gè)函數(shù)來(lái)解決問(wèn)題
Function CheckSQL(ByVal strSQL As String) As String
    If IsNull(strSQL) = False Then
        strSQL = Replace(strSQL, "'", "''")
    Else
        strSQL = ""
    End If
    CheckSQL = strSQL
End Function

 

該函數(shù)應(yīng)用如下:
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 = "帶 ' (單引號(hào))的條件"
    strSQL = "select * from 表1 where g='" & strCondition & "'"
    '上述語(yǔ)句可能導(dǎo)致 JET SQL 錯(cuò)誤,下面使用函數(shù)過(guò)濾單引號(hào)
    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

 

(責(zé)任編輯:admin)

頂一下
(0)
0%
踩一下
(0)
0%
發(fā)表評(píng)論
請(qǐng)自覺遵守互聯(lián)網(wǎng)相關(guān)的政策法規(guī),嚴(yán)禁發(fā)布色情、暴力、反動(dòng)的言論。
評(píng)價(jià):