ODBC 连接凭据如何存储在 MS Access 中? [关闭]

Posted

技术标签:

【中文标题】ODBC 连接凭据如何存储在 MS Access 中? [关闭]【英文标题】:How are ODBC connection credentials stored in MS Access? [closed] 【发布时间】:2017-10-01 23:48:53 【问题描述】:

我有一个 Access 数据库,它使用登录表单通过 ADODB.Connection 建立到 SQL Server 的连接。连接字符串包含输入到登录表单中的用户凭据。

在正常的 Access 情况下,如果通过连接字符串中的用户凭据提交直通查询,Access 会保存凭据以供会话期间其他查询使用,即使这些查询不包含凭据。

我想知道如何使用 ADODB.Connection 登录用户,然后让 Access 在发送传递查询时自动使用凭据。

【问题讨论】:

呃……谷歌?兵?雅虎?狗堆?阿尔塔维斯塔? 如果您想要的是一个在启动时打开并在应用程序的整个生命周期内保持打开和经过身份验证的连接,请确保您可以拥有它 - 在启动时运行一个宏并打开一个全局连接,然后到处使用它。不过那是很糟糕的做法。对象,尤其是数据库连接,应该尽可能短。你知道如何声明一个Const,这样你就不需要每次需要它们时都输入整个连接字符串和凭据? 【参考方案1】:

如果您将保存的查询用于 PT 查询,则默认情况下此操作无需任何努力。链接表也是如此。

因此,如果您的所有 PT 查询以及所有链接表都不包含登录名/密码,那么当您注意到执行具有登录名/密码的“任何内容”时,现在每个查询、链接表和PT 查询将自动使用缓存的登录名/密码。

因此要执行一个 PT 查询,你现在可以随时去:

With CurrentDb.QueryDefs("MyPass") 
  qdfPass.SQL = "exec sp_myProc" 
  qdfPass.Execute 
End With

以上内容很棒,因为您不再在代码中弄乱连接字符串。以上是比 ADO 示例少得多的代码。

因此,您必须使用内置的 DAO 对象来利用缓存的用户/密码。没有办法使用 ADO 和 ADO reocrdsets,然后“获取”或“使用”Access 作为连接字符串的缓存登录名/密码。

因此,使用 Access 自动缓存登录名/密码是避免在与 SQL 服务器的任何连接中包含登录名/用户的好方法。这种方法意味着您保存的连接字符串中没有一个必须包含登录名/用户。

这也意味着您永远不必在几乎所有代码中弄乱连接字符串。一种在应用程序中集中连接“概念”的好方法,并且在一次登录后永远不必在此类代码中包含登录/用户。

但是,据我所知,在 VBA 中以字符串形式获取或获取包含此信息的缓存连接是不可能的。

上面的结果意味着如果可能的话最好使用 DAO 而不是 ADO,因为那样你的应用程序中的任何实际代码都不必提供或处理连接字符串。

您可以使用此代码缓存登录/用户:

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

我还应该指出,一旦您执行上述操作,就无法清除密码缓存。这强烈建议您必须退出应用程序才能允许其他用户登录。您不必退出应用程序,但是使用错误登录/用户提供给上述例程的任何连接字符串将继续返回 True 并建议您进行有效登录,因为如果上述失败,则 Access 将使用工作缓存上面的登录名/密码,因此总是返回真——即使是不正确的登录名/用户。 (因此传递正确的登录/用户将缓存并返回 true - 不正确的登录/用户仍将返回 true 但使用之前的缓存用户!!)。

这在很大程度上表明,作为一种“通用”应用程序设计方法如果您将使用 Access 的这个出色的缓存功能,然后您只能使用内置的在基于 DAO 的对象中。

【讨论】:

以上是关于ODBC 连接凭据如何存储在 MS Access 中? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 MySQl 的 ODBC 连接器在 MS Access 中的 VBA 中执行和查询?

带有“返回记录:否”的 MS Access 直通查询截断 ODBC 连接字符串

如何让 ms-access 以其他用户身份连接到 ms-sql?

MS Access中的ODBC连接失败

MS Access 中通过 ODBC 连接 MS SQL 表的查询非常慢

从 MS Access 中的 ODBC 连接中提取 UID