ODBC 连接凭据如何存储在 MS Access 中?
How are ODBC connection credentials stored in MS Access?
我有一个 Access 数据库,它使用登录表单通过 ADODB.Connection 建立到 SQL 服务器的连接。连接字符串包含在登录表单中输入的用户凭据。
在正常的 Access 情况下,如果通过连接字符串中的用户凭据提交传递查询,Access 会保存凭据以供会话期间的其他查询使用,即使这些查询不包含凭据。
我想知道如何使用 ADODB.Connection 登录用户,然后让 Access 在发送传递查询时自动使用凭据。
如果您对 PT 查询使用了已保存的查询,则默认情况下这可以毫不费力地工作。链接的 tables.
也是如此
因此,如果您所有的 PT 查询以及所有链接的 table 都不包含 logon/password,那么正如您所注意到的,一旦您执行了具有 [=42= 的“任何内容” ],然后现在每个查询,链接 table,PT 查询将自动使用缓存的 logon/password。
因此要执行 PT 查询,您现在可以随时前往:
With CurrentDb.QueryDefs("MyPass")
qdfPass.SQL = "exec sp_myProc"
qdfPass.Execute
End With
以上内容很棒,因为您不再在代码中弄乱连接字符串。以上代码远少于 ADO 示例。
所以你必须使用内置的 DAO 对象来利用缓存 user/password。没有一种方法可以使用 ADO 和 ADO reocrdsets,然后“获取”或“利用”Access 作为连接字符串的缓存 logon/password。
因此,使用 Access 自动缓存 logon/password 是避免必须在与 SQL 服务器的任何连接中包含 logon/user 的好方法。这种方法意味着 NONE 您保存的连接字符串必须包含 logon/user.
这也意味着您永远不必在几乎所有代码中弄乱连接字符串。一种在应用程序中集中连接 "concept" 的好方法,并且在一次登录后永远不必在此类代码中包含 logon/user。
然而,据我所知,在 VBA 中获取或获取包含此信息的缓存连接是不可能的。
以上结果意味着您最好尽可能使用 DAO 而不是 ADO,因为那时应用程序中的 none 实际代码必须提供或处理连接字符串。
您可以使用此代码缓存 logon/user:
Function TestLogin(strCon As String) As Boolean
' return true for a correct logon
On Error GoTo TestError
Dim dbs As DAO.Database
Dim qdf As DAO.QueryDef
Set dbs = CurrentDb()
Set qdf = dbs.CreateQueryDef("")
qdf.Connect = strCon
qdf.ReturnsRecords = False
'Any VALID SQL statement that runs on server will work below.
qdf.SQL = "SELECT 1"
qdf.Execute
TestLogin = True
Exit Function
TestError:
TestLogin = False
Exit Function
End Function
我还应该指出,一旦您执行了上述操作,就没有清除密码缓存的可能方法。这强烈建议您必须退出应用程序以允许不同的用户登录。您不必退出应用程序,但提供给上述例程的任何带有不正确 logon/user 的连接字符串将继续 return True 并建议您进行有效登录,因为如果上述失败,则Access 将使用工作缓存 logon/password 作为上述内容,因此始终 return 为真——即使是不正确的 logon/user。 (因此传递正确的 logon/user 将缓存并且 return 为真 - 不正确的 logon/user 仍将 return 为真但使用以前的缓存用户!!)。
这非常表明,作为 "genera" 应用程序设计方法 IF 您将使用这个出色的缓存功能Access,那么您只能使用基于 DAO 的内置对象。
我有一个 Access 数据库,它使用登录表单通过 ADODB.Connection 建立到 SQL 服务器的连接。连接字符串包含在登录表单中输入的用户凭据。
在正常的 Access 情况下,如果通过连接字符串中的用户凭据提交传递查询,Access 会保存凭据以供会话期间的其他查询使用,即使这些查询不包含凭据。
我想知道如何使用 ADODB.Connection 登录用户,然后让 Access 在发送传递查询时自动使用凭据。
如果您对 PT 查询使用了已保存的查询,则默认情况下这可以毫不费力地工作。链接的 tables.
也是如此因此,如果您所有的 PT 查询以及所有链接的 table 都不包含 logon/password,那么正如您所注意到的,一旦您执行了具有 [=42= 的“任何内容” ],然后现在每个查询,链接 table,PT 查询将自动使用缓存的 logon/password。
因此要执行 PT 查询,您现在可以随时前往:
With CurrentDb.QueryDefs("MyPass")
qdfPass.SQL = "exec sp_myProc"
qdfPass.Execute
End With
以上内容很棒,因为您不再在代码中弄乱连接字符串。以上代码远少于 ADO 示例。
所以你必须使用内置的 DAO 对象来利用缓存 user/password。没有一种方法可以使用 ADO 和 ADO reocrdsets,然后“获取”或“利用”Access 作为连接字符串的缓存 logon/password。
因此,使用 Access 自动缓存 logon/password 是避免必须在与 SQL 服务器的任何连接中包含 logon/user 的好方法。这种方法意味着 NONE 您保存的连接字符串必须包含 logon/user.
这也意味着您永远不必在几乎所有代码中弄乱连接字符串。一种在应用程序中集中连接 "concept" 的好方法,并且在一次登录后永远不必在此类代码中包含 logon/user。
然而,据我所知,在 VBA 中获取或获取包含此信息的缓存连接是不可能的。
以上结果意味着您最好尽可能使用 DAO 而不是 ADO,因为那时应用程序中的 none 实际代码必须提供或处理连接字符串。
您可以使用此代码缓存 logon/user:
Function TestLogin(strCon As String) As Boolean
' return true for a correct logon
On Error GoTo TestError
Dim dbs As DAO.Database
Dim qdf As DAO.QueryDef
Set dbs = CurrentDb()
Set qdf = dbs.CreateQueryDef("")
qdf.Connect = strCon
qdf.ReturnsRecords = False
'Any VALID SQL statement that runs on server will work below.
qdf.SQL = "SELECT 1"
qdf.Execute
TestLogin = True
Exit Function
TestError:
TestLogin = False
Exit Function
End Function
我还应该指出,一旦您执行了上述操作,就没有清除密码缓存的可能方法。这强烈建议您必须退出应用程序以允许不同的用户登录。您不必退出应用程序,但提供给上述例程的任何带有不正确 logon/user 的连接字符串将继续 return True 并建议您进行有效登录,因为如果上述失败,则Access 将使用工作缓存 logon/password 作为上述内容,因此始终 return 为真——即使是不正确的 logon/user。 (因此传递正确的 logon/user 将缓存并且 return 为真 - 不正确的 logon/user 仍将 return 为真但使用以前的缓存用户!!)。
这非常表明,作为 "genera" 应用程序设计方法 IF 您将使用这个出色的缓存功能Access,那么您只能使用基于 DAO 的内置对象。