ODBC连接凭证如何存储在MS Access中?

时间:2017-10-01 23:48:53

标签: sql-server vba ms-access access-vba ado

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

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

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

1 个答案:

答案 0 :(得分:3)

如果您使用保存的查询进行PT查询,则默认情况下无需任何工作。链表也是如此。

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

因此,要执行PT查询,您现在可以随时进行:

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

上面很棒,因为你不再乱用代码中的连接字符串了。以上是远低于ADO示例的FAR代码。

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

因此,使用Access自动缓存登录/密码是一种很好的方法,可以避免在与SQL Server的任何连接中包含登录/用户。这种方法意味着您保存的连接字符串中的NONE必须包含登录/用户。

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

然而,据我所知,无法在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

我还应该指出,你执行上面的ONCE,没有任何可能的方法来清除密码缓存。这强烈建议您必须退出应用程序以允许其他用户登录。您没有必要退出应用程序,但使用INCORRECT登录/用户提供给上述例程的任何连接字符串将继续返回True并建议您具有有效登录,因为如果上面的失败,则Access将使用工作缓存上面的登录/密码,因此总是返回true - 即使是不正确的登录/用户。 (因此传递正确的登录/用户将缓存并返回true - 不正确的登录/用户将STILL返回true但使用以前的缓存用户!!)。

这充分表明,作为“通用”应用程序设计方法 IF ,您将使用Access的这个强大的缓存功能,那么您只能使用构建在基于DAO的对象中。