【问题标题】:How do I escape all special characters in Access Jet SQL?如何转义 Access Jet SQL 中的所有特殊字符?
【发布时间】:2009-10-14 23:50:15
【问题描述】:

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

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

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

【问题讨论】:

    标签: sql ms-access vba escaping jet


    【解决方案1】:

    您似乎遇到了一些问题:您无法使用 SQL DDL 创建包含任何这些字符的(可用)密码(注意 Wikipedia 认为这是SQL DCL)。

    下面是一些重现测试场景的代码:

    • 创建一个新的工作组(在 temp 文件夹)
    • 使用 工作组
    • 用数据创建一个新表
    • 用名字创建一个新用户, 使用字母数字的密码和 PID 贯穿始终的字符
    • 将表上的权限授予 用户
    • 使用新的打开一个测试连接 用户凭据
    • 测试用户可以查询 表

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

    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
    

    如果无法转义“特殊”字符,那么使用 SQL DDL/DCL 似乎无法完成,我认为这意味着根本无法使用 ADO 完成。

    所以,任何人都有替代方案,例如道?

    【讨论】:

      【解决方案2】:

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

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

      这是做这种事情的常用方法。不过,这可能不起作用,因为用户级安全 UI 可能不接受引号(我没有尝试过)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-07-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多