Введение
У меня есть клиент 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