JETSQL字符串中單引號的問題

字號:

Function about_inverted_comma()
    Dim rs As New ADODB.Recordset
    Dim strSQL As String
    strSQL = "select * from 表1 where g=''"
    '其實非常簡單,如果要匹配空字符,可以連續(xù)用兩個單引號 ''
    '如果要匹配 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編譯器把它解釋為字符串a(chǎn)bc。而當(dāng)您需要表示一個單引號 ' 的時候,如果只用三個引號 ''',JET SQL的編譯器會無法解析辨認(rèn)中間的引號是一個正常的字符還是一個特殊字符(如果是特殊字符,編譯器會認(rèn)為和左右的兩個引號之間有關(guān)系)
    為了解決這種情況,JET SQL中使用轉(zhuǎn)義字符(其他語言中也有這個概念)對特殊字符進(jìn)行轉(zhuǎn)義。在 '''' 中:第一個和第四個引號高速編譯器中間是字符串,第二個引號是一個轉(zhuǎn)義字符,表示后面的第三個 ' 不是一個特殊字符,而是一個普通的引號!所以'''' 經(jīng)過JET SQL引擎編譯后的輸出是一個普通的單引號 '
    另,關(guān)于 VBA 中的字符串表達(dá)式也有相同的概念
    在VBA中,為了表示字符串,首先我們需要用兩個引號把字符串引起來。例如 "abc", VBA編譯器把它解釋為字符串a(chǎn)bc。而當(dāng)您需要表示一個單引號 " 的時候,如果只用三個引號 """,VBA的編譯器會無法解析辨認(rèn)中間的引號是一個正常的字符還是一個特殊字符(如果是特殊字符,編譯器會認(rèn)為和左右的兩個引號之間有關(guān)系)
    為了解決這種情況,VBA中使用轉(zhuǎn)義字符(其他語言中也有這個概念)對特殊字符進(jìn)行轉(zhuǎn)義。在 """" 中:第一個和第四個引號高速編譯器中間是字符串,第二個引號是一個轉(zhuǎn)義字符,表示后面的第三個 " 不是一個特殊字符,而是一個普通的引號!所以"""" 經(jīng)過VBA編譯器編譯后的輸出是一個普通的雙引號 "
    在日常操作中,為了避免出現(xiàn)雙引號的問題,我們還可以直接寫一個函數(shù)來解決問題
    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 = "帶 ' (單引號)的條件"
    strSQL = "select * from 表1 where g='" & strCondition & "'"
    '上述語句可能導(dǎo)致 JET SQL 錯誤,下面使用函數(shù)過濾單引號
    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