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

时间:2009-10-14 23:50:15

标签: sql ms-access vba escaping jet

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

  • 创建一个新的工作组(在temp 文件夹)
  • 使用。创建一个新数据库 工作组
  • 创建一个包含数据的新表
  • 创建一个名为的新用户, 使用字母数字的密码和PID
  • 中的人物
  • 授予桌面权限 用户
  • 使用new打开测试连接 用户凭据
  • 测试用户可以查询 表

发布的代码工作正常。但是,在两个地方(创建用户和打开测试连接时)编辑密码以添加非字母字符(例如引用)会在其中一个地方引发错误。

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完成。

所以,任何人都有另一种选择,例如DAO?

答案 1 :(得分:0)

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

  Dim strPassword As String

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

这是做这种事情的通常方式。但是,这可能无法解决问题,因为用户级安全UI可能不接受引号(我还没有尝试过)。