DSN-соединение без подключения к серверу mysql в ms-access без запоминания имени пользователя и пароля - PullRequest
1 голос
/ 17 апреля 2011

Для простоты распространения я хочу, чтобы все связанные таблицы MySQL были без DSN. Я также хочу иметь возможность легко связать таблицы с другим сервером (в целях тестирования), поэтому я делаю настройку ссылок в коде vba. Это код, который я использую для установки / обновления любых ссылок:

Private Sub relink_mysql_tables(mysql_connection As String)
    Dim db As Database
    Set db = CurrentDb()
    Dim tbldef As TableDef
    For Each tbldef In db.TableDefs
        If (tbldef.Attributes And TableDefAttributeEnum.dbAttachedODBC) Then
            tbldef.Connect = mysql_connection
            tbldef.RefreshLink
        End If
    Next
End Sub

Строка mysql_connection, которую я использую:

DRIVER={MySQL ODBC 5.1 Driver};Server=myserver;Database=mydatabase;Uid=myusername;Pwd=mypassword;Option=3

Это все прекрасно, все работает, пока я не закрою ms-access и не открою его снова Имя пользователя и пароль, кажется, забыты. Например, если я пытаюсь открыть связанную таблицу, у меня появляется всплывающее окно ODBC Connector с просьбой ввести имя пользователя и пароль.

Я заметил, что после запуска приведенного выше кода перекомпоновки, если я наведу указатель мыши на связанную таблицу (в данном случае таблицу с именем «тендер»), она покажет текущую строку подключения, но без имени пользователя и пароля:

ODBC;DRIVER={MySQL ODBC 5.1 Driver};Server=myserver;Database=mydatabase;Option=3;TABLE=tender

Я читал в другом месте, что добавление "; Persist Security Info = True" в строку подключения будет работать, но это не так! Имя пользователя и пароль все еще забываются при следующем перезапуске ms-access. Мое текущее решение состоит в том, чтобы перезапускать код перекомпоновки каждый раз, когда база данных запускается, но это кажется мне ненужными накладными расходами. Способ доступа для запоминания имени пользователя и пароля в связанных таблицах?

Кстати, я использую Mysql5.5 и Access2007.

1 Ответ

2 голосов
/ 22 апреля 2011

Я нашел ответ с помощью этой статьи о Microsoft . Вместо использования метода RefreshLink удалите и заново создайте ссылку с параметром dbAttachedODBC:

Public Sub relink_mysql_tables(mysql_connection As String)

Dim db As Database
Dim tblDef As TableDef
Dim sLocalTableName As String
Dim sRemoteTableName As String    

' new collection '
Dim newTableDefs As New Collection

' current database '
Set db = CurrentDb()

' create new table defs '
For Each tblDef In db.TableDefs
    If (tblDef.Attributes And TableDefAttributeEnum.dbAttachedODBC) Then
        sLocalTableName = tblDef.Name
        sRemoteTableName = tblDef.SourceTableName

        ' create new linked table def '
        Set tblDef = db.CreateTableDef(sLocalTableName, dbAttachSavePWD, sRemoteTableName, mysql_connection)
        newTableDefs.Add tblDef         

    End If
Next

' delete old table defs '
For Each tblDef In newTableDefs
    db.TableDefs.Delete tblDef.Name
Next

' add new table defs to current database '
For Each tblDef In newTableDefs
    db.TableDefs.Append tblDef
Next

Строка подключения такая же, как и раньше, но с добавлением префикса «ODBC;»:

ODBC;DRIVER={MySQL ODBC 5.1 Driver};Server=myserver;Database=mydatabase;Uid=myusername;Pwd=mypassword;Option=3
...