手动关闭 ODBC DSN 连接
Posted
技术标签:
【中文标题】手动关闭 ODBC DSN 连接【英文标题】:Manually Close ODBC DSN Connection 【发布时间】:2015-08-19 14:32:10 【问题描述】:我有一个 MS Access 数据库,它通过用户级 DNS ODBC 数据源连接到另一个数据库。
首次启动连接时,ODBC 驱动程序将提示我输入用户名和密码。然后它连接到服务器上的数据库取决于我使用的用户名。
一旦建立连接,Access 将保持/保持活动状态,直到我关闭 Access 数据库。
有没有办法强制 Access 关闭所有打开的 ODBC 连接,要求我在下次尝试访问服务器上的对象时再次提供登录凭据。我想要做的是切换 ODBC 连接正在访问的数据库,而不必完全关闭 Access 并重新打开数据库。
【问题讨论】:
能贴出连接其他数据库的代码吗? 什么是外部数据库?另一个访问数据库?如果是这样,为什么不使用链接表而不是 ODBC? 外部数据库是 KB_SQL。我通过 ODBC DSN 数据源在 Access 中将表设置为链接表,因此没有代码说明它是如何工作的。当我访问这些表之一(直接或作为访问查询的一部分)时,我将使用 KB_SQL 服务器进行身份验证。但是问题是,从那时起,Access 会保留连接,直到数据库关闭。我希望能够强制关闭此打开的连接,以便无需关闭 Access 即可重新进行身份验证。到目前为止,我还没有找到任何可以做到这一点的 VBA 函数。 【参考方案1】:两件事: 1) 您可以通过以下操作使关闭和重新打开 Access 的过程对您的用户尽可能轻松:
' Close and restart
Shell "restart.bat", vbNormalFocus
Application.Quit
restart.bat 由类似的东西组成
REM wait for Access to close
TIMEOUT 3
REM your actual command line goes here
msaccess.exe mydatabase.mdb
2) 你提到:
我想要做的是切换 ODBC 的哪个数据库 连接正在访问
你发布的链接给了我一个想法:
任何后续 ODBC 对象碰巧在三个上匹配 参数(ODBC 驱动程序、服务器和数据库)将重用缓存的 连接。
如果您将链接表从用户 DSN 切换到无 DSN 连接,您想要的行为应该会自动发生。 只需通过更改“Database=...”部分来更改所有表的 .Connect 字符串,Access 应在下次访问表时要求提供凭据。
【讨论】:
我认为您在这里遇到了一些问题 - DSN-less 连接字符串存在一些问题(未定义错误消息,使用 their example 所以我认为这是单独的 kb_sql 问题) - 但是将其更改为使用指向同一服务器的不同用户 DNS 确实会再次提示它输入凭据,因此我认为这表明您的想法可行。 您发布此内容已经有一段时间了,但我终于能够全面测试您的建议以确认它有效。您对无 DSN 连接的建议,您将Database=...
(或在我的情况下为 Server=...
)更改为独特的,然后 Access 将重新提示您输入凭据并打开一个全新的连接......允许我无缝切换我的链接表正在使用哪个连接进行身份验证。【参考方案2】:
哦,链接表。我认为这是不可能的。 您可以尝试重置连接信息,但我怀疑它会起作用:
Dim TD As TableDef
For Each TD In DB.TableDefs
' Linked table? You can also check the .Connect string more specifically for KB_SQL
If TD.Connect <> "" Then
TD.Connect = TD.Connect
TD.RefreshLink
End If
Next TD
一种可能实际可行的更激进的方法是删除表格链接并重新添加它们。
Dim TD As TableDef
Dim sConn As String, sName As String
For Each TD In DB.TableDefs
If TD.Connect <> "" Then
sName = TD.Name
sConn = TD.Connect
' Remove linked table
DB.TableDefs.Delete sName
' and add it as new link
DoCmd.TransferDatabase acLink, "ODBC Database", sConn, acTable, sName, sName
End If
Next TD
您可能需要与 For Each 不同的循环,因为您在循环中修改 DB.TableDefs 集合。
【讨论】:
感谢您的建议@Andre451 - 我认为问题在于 Access 仍在保留连接的底层缓存,该缓存在应用程序关闭之前不会释放。当我尝试这样做时,它正在重新创建链接表而不提示输入凭据。从那以后我遇到了this page,它在 Access 中提到了这种行为,所以也许无法手动清除这个缓存。以上是关于手动关闭 ODBC DSN 连接的主要内容,如果未能解决你的问题,请参考以下文章
在 RHEL 上使用 PHP 与 SQL Server 的无 DSN ODBC 连接