代码之家  ›  专栏  ›  技术社区  ›  DGM

如何转义Access Jet SQL中的所有特殊字符?

  •  2
  • DGM  · 技术社区  · 15 年前

    我正在尝试使用DDL语句更改密码,如:

    CurrentProject.Connection.Execute "ALTER USER barney PASSWORD "[]!@#$%^ oldpassword"
    

    是的,这是一个令人讨厌的密码,但有人尝试了类似的东西。请注意,密码的开头引号不是此处sql语法的一部分。我需要像这样的东西 mysql_real_escape_string() 但是对于VBA。有什么提示吗?

    2 回复  |  直到 15 年前
        1
  •  1
  •   onedaywhen    15 年前

    您似乎发现了一些问题:您无法使用SQLDDL创建包含这些字符的(可用)密码(请注意,Wikipedia认为这是错误的) SQL DCL ).

    • 创建一个新的工作组(在临时 文件夹)
    • 使用
    • 创建名为的新用户, 通篇
    • 将表上的特权授予
    • 使用新的
    • 桌子

    张贴的代码运行良好。但是,在两个位置(创建用户和打开测试连接时)编辑密码以添加非字母字符(例如引号)会在其中一个位置引发错误。

    On Error Resume Next
    Kill Environ$("temp") & "\MyDatabase.mdb"
    Kill Environ$("temp") & "\MyWorkgroup.mdw"
    On Error GoTo 0
    
    ' Create workgroup and db
    Dim cat 
    Set cat = CreateObject("ADOX.Catalog")
    With cat
      .Create _
          "Provider=Microsoft.Jet.OLEDB.4.0;" & _
          "Jet OLEDB:Engine Type=4;" & _
          "Data Source=" & _
          Environ$("temp") & "\MyWorkgroup.mdw;" & _
          "Jet OLEDB:Create System Database=-1"
      .Create _
          "Provider=Microsoft.Jet.OLEDB.4.0;" & _
          "Jet OLEDB:Engine Type=4;" & _
        "Data Source=" & _
        Environ$("temp") & "\MyDatabase.mdb;" & _
        "Jet OLEDB:System Database=" & _
        Environ$("temp") & "\MyWorkgroup.mdw;"
    
      ' Add table with data and user with privileges
      With .ActiveConnection
        .Execute "CREATE TABLE Test (data_col INTEGER);"
        .Execute "INSERT INTO Test VALUES (55);"
        .Execute "CREATE USER onedaywhen pwd H3sJaZ9k2m;"  ' <-- edit pwd
        .Execute "GRANT ALL PRIVILEGES ON Test TO onedaywhen;"
      End With
    End With
    
    ' Test user can connect and SELECT
    Dim con 
    Set con = CreateObject("ADODB.Connection")
    With con
      .ConnectionString = _
        "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Jet OLEDB:Engine Type=4;" & _
        "Data Source=" & _
        Environ$("temp") & "\MyDatabase.mdb;" & _
        "Jet OLEDB:System Database=" & _
        Environ$("temp") & "\MyWorkgroup.mdw;" & _
        "User ID=onedaywhen;Password=pwd;"  ' <-- edit pwd
      .Open
      MsgBox .Execute("SELECT * FROM Test;")(0)
    End With
    

    由于无法转义“特殊”字符,因此使用SQLDDL/DCL似乎无法实现这一点,我认为这意味着使用ADO根本无法实现。

    那么,有人有别的选择吗,例如DAO?

        2
  •  0
  •   David-W-Fenton    15 年前

    您应该能够使用Chr(34)在字符串中连接:

      Dim strPassword As String
    
      strPassword = Chr(34) & "[]!@#$%^"
      CurrentProject.Connection.Execute "ALTER USER barney PASSWORD " & strPassword & " oldpassword"
    

    推荐文章