2015-08-19 3 views
0

У меня есть база данных MS Access, которая подключается к другой базе данных через источник данных ODBC уровня пользователя.Вручную закрыть соединение DSN ODBC

При первом запуске подключения драйвер ODBC запрашивает у меня имя пользователя и пароль. База данных, к которой он подключается на сервере, зависит от имени пользователя, которое я использую.

Как только соединение будет установлено, доступ сохранит/сохранит его до тех пор, пока я не закрою базу данных Access.

Есть ли способ заставить Access закрыть все открытые соединения ODBC, требуя от меня снова предоставить учетные данные, когда я попытаюсь получить доступ к объекту на сервере. То, что я хочу сделать, - это переключить, к какой базе данных подключается ODBC-соединение, без полного закрытия Access и повторного открытия базы данных.

+0

Можете ли вы разместить код, который подключается к другой базе данных? – Andre

+0

Что такое внешняя база данных? Другая БД доступа? Если да, почему бы не использовать связанные таблицы вместо ODBC? – Parfait

+0

Внешняя база данных - KB_SQL. У меня есть таблицы, созданные как связанные таблицы в Access через источник данных ODBC DSN, поэтому нет кода в том, как это работает. Когда я обращаюсь к одной из этих таблиц (напрямую или как часть запроса Access), я затем аутентифицирую сервер KB_SQL.Однако проблема заключается в том, что с этого момента Access сохраняет соединение до закрытия базы данных. Я хочу, чтобы заставить это открытое соединение закрыться, чтобы я мог повторно аутентифицироваться, не закрывая Access. До сих пор мне не удалось найти какие-либо функции VBA, которые это сделают. – andshrew

ответ

1

две вещи:
1) Вы можете сделать процесс закрытия и повторного открытия доступа как можно более безболезненным для пользователей, выполнив:

' 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, ваше поведение должно происходить автоматически.
Просто измените строку .Connect всех таблиц, изменив часть «База данных = ...», и Access должен запросить учетные данные, когда к таблице будет обращаться в следующий раз.

+0

Я думаю, что вы здесь что-то делаете - есть несколько проблем со строкой подключения DSN-less (не указано сообщение об ошибке, используя [их пример] (http://kbs.custhelp.com/app/answers/detail/ a_id/748/kw/odbc), так что это отдельная проблема kb_sql, я думаю), но изменение ее для использования другого DNS-пользователя, указывающего на тот же сервер, снова запрашивает его для учетных данных, поэтому я думаю, что это говорит о том, что ваша идея будет работать , – andshrew

+0

Прошло некоторое время с тех пор, как вы опубликовали это, но я, наконец, смог полностью проверить ваше предложение, чтобы подтвердить, что он работает. Ваше предложение о соединении без DSN, в котором вы меняете «Database = ...» (или в моем случае «Server = ...») на нечто уникальное, тогда Access будет запрашивать у вас учетные данные и открывать новое соединение ... позволяя мне легко переключаться, с каким соединением связаны мои связанные таблицы. – andshrew

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 

Вам может понадобиться другой вид цикла, чем для каждого, так как вы изменяете коллекцию DB.TableDefs в петле.

+0

Спасибо за ваши предложения @ Andre451 - Я думаю, проблема заключается в том, что Access по-прежнему сохраняет базовый кеш соединения, который не выпущен до закрытия приложения. Когда я попробовал это, он воссоздает связанные таблицы без запроса учетных данных. С тех пор я сталкивался с этой страницей (https://blogs.office.com/2011/04/08/power-tip-improve-the-security-of-database-connections/), которая упоминает это поведение в Access поэтому, возможно, невозможно вручную очистить этот кеш. – andshrew

Смежные вопросы