Как принудительно заставить Access изменить имя пользователя и пароль для соединения с ODBC без DSN? - PullRequest
1 голос
/ 08 декабря 2011

Введение

У меня есть клиент Access 2010 с серверной частью MySQL. Я хочу использовать имя пользователя MySQL по умолчанию для первоначального подключения к внутренней БД, проверки пароля и т. Д., А затем переключиться на пользовательское имя пользователя MySQL.

Я уже создал код для изменения строки подключения и повторного соединения таблиц MySQL с новым именем пользователя, но Access досадно запоминает исходное имя пользователя и пароль и использует его.

Вопрос

Как заставить MS Access 2010 забыть исходное имя пользователя и пароль для подключения к ODBC и использовать новое в строке подключения?

Тиражирование

Чтобы воссоздать мою проблему

  • MySQL:
    • Создать новую схему под названием «тест»
    • Создайте 3 таблицы на новой схеме:
      • "table1"
      • "table2"
      • "Таблица3"
    • Создайте двух новых пользователей, которые имеют доступ к этой схеме:
      • Имя: «SQLUser1», пароль: «Pass01»
      • Имя: «SQLUser2», пароль: «Pass02»
  • Конец доступа:
    • Создание нового проекта MS Access 2010
    • Создать новую пустую форму
      • Добавьте 2 кнопки с именами "Cmd_User1" и "Cmd_User2"
    • Добавьте пример кода ниже
      • Вам потребуется исправить имя сервера (sServer = "MySQL") в функции GenConString ().
    • Запустить форму
    • Нажмите кнопку «Cmd_User1»
    • Нажмите кнопку «Cmd_User2»
  • Теперь проверьте журналы MySQL, и для обоих подключений будет использоваться пользователь: «SQLUser1»: (

Пример кода:

Option Compare Database
Option Explicit

Private Sub Cmd_User1_Click()
    'Remove all existing tables
    Call RemoveAllTables
    'Connect the tables
    Call AttachDSNLessTable("table1", "table2", GenConString("SQLUser1", "Pass01"))
    Call AttachDSNLessTable("table2", "table2", GenConString("SQLUser1", "Pass01"))
    Call AttachDSNLessTable("table3", "table3", GenConString("SQLUser1", "Pass01"))
End Sub

Private Sub Cmd_User2_Click()
    'Remove all existing tables
    Call RemoveAllTables
    'Connect the tables
    Call AttachDSNLessTable("table1", "table1", GenConString("SQLUser2", "Pass02"))
    Call AttachDSNLessTable("table2", "table2", GenConString("SQLUser2", "Pass02"))
    Call AttachDSNLessTable("table3", "table3", GenConString("SQLUser2", "Pass02"))
End Sub

Private Sub RemoveAllTables()
    Dim bFound As Boolean, TblDef As DAO.TableDef
    bFound = True 'Force to loop once
    While (bFound = True)
        bFound = False
        For Each TblDef In CurrentDb.TableDefs
            If Not (TblDef.Connect = "") Then
                Call CurrentDb.TableDefs.Delete(TblDef.Name)
                bFound = True
            End If
        Next TblDef
    Wend
End Sub

Private Function AttachDSNLessTable(stLocalTableName As String, stRemoteTableName As String, stConnect As String)
    On Error GoTo AttachDSNLessTable_Err

    Set td = CurrentDb.CreateTableDef(stLocalTableName, dbAttachSavePWD, stRemoteTableName, stConnect)
    CurrentDb.TableDefs.Append td
    AttachDSNLessTable = True
    Exit Function

AttachDSNLessTable_Err:
    AttachDSNLessTable = False
    MsgBox "AttachDSNLessTable encountered an unexpected error: " & Err.Description
End Function

Private Function GenConString(ByVal sUserName As String, ByVal sPassword As String) As String
    Dim sConString As String, sServer As String, sDatabase As String, iPort As Integer
    'Pull back all the required fields
    sServer = "MySQL"
    sDatabase = "test"
    iPort = "3306"
    'Generate connection string
    sConString = "ODBC;Driver={MySQL ODBC 5.1 Driver}; " _
                & "Server=" & sServer & "; " _
                & "Database=" & sDatabase & "; " _
                & "UID=" & sUserName & "; " _
                & "PWD=" & sPassword & "; " _
                & "Port=" & iPort & "; " _
                & "Option=3"
    'Return new connection string
    GenConString = sConString
End Function

1 Ответ

1 голос
/ 10 декабря 2011

Я считаю, что ваш лучший подход - использовать только одно соединение с вашей базой данных MySQL, используя ваше второе имя пользователя. Что касается исходного соединения, когда вы проверяете пароли и т. Д., Не могли бы вы сохранить сквозной запрос с первым именем пользователя и выполнить с этим?

...