手动关闭ODBC DSN连接

时间:2015-08-19 14:32:11

标签: database vba ms-access odbc

我有一个MS Access数据库,它通过用户级DNS ODBC数据源连接到另一个数据库。

首次启动连接时,ODBC驱动程序将提示我输入用户名和密码。然后它在服务器上连接的数据库取决于我使用的用户名。

建立连接后,Access将保持/保持活动状态,直到我关闭Access数据库。

有没有办法强制Access关闭所有打开的ODBC连接,要求我在下次尝试访问服务器上的对象时再次提供登录凭据。我想要做的是切换ODBC连接访问哪个数据库,而不必完全关闭Access并重新打开数据库。

2 个答案:

答案 0 :(得分: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就会在下次访问表时请求凭据。

答案 1 :(得分:0)

哦,链接表。我不认为这是可能的。
您可以尝试重置连接信息,但我怀疑它会起作用:

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集合。