MyTetra Share
Делитесь знаниями!
Подключение таблиц MySQL без DSN (ADOX или DAO)
19.07.2018
06:37
Раздел: VBA - Access - msa.polarcom.ru - 02 Внешние Данные

Подключение таблиц MySQL без DSN (ADOX или DAO)

По материалам https://support.microsoft.com/en-us/kb/230588

Требует установки MySQL ODBC драйвера

Установка драйвера ODBC MySQL:
   01. На страницу:
http://dev.mysql.com/downloads/connector/odbc
       (Проще скачивать с:
http://mirror.cogentco.com/pub/mysql/Connector-ODBC/)
   02. Находите желаеемую версию и скачиваете инсталлятор (Например:
mysql-connector-odbc-5.3.4-win32.msi).  
   03. Запускаете инсталлятор, все настройки по умолчанию.
   04. После установки можно сразу работать.

Модуль:

'--------------------------------------------------------------------

' Module : modLinkTablesMySQL

' Author : es

' Date : 21.08.2016

' Purpose : Подлинковка таблиц MySQL с автоматическим созданием DSN (ADOX или DAO)

'--------------------------------------------------------------------------

'Требуются ссылки на:

' Microsoft ADO Ext. for DDL and Security. (Version 2.1 or higher)

' Microsoft ActiveX Data Objects Library. (Version 2.1 or higher)

'--------------------------------------------------------------------


Public Sub LinkTablesMySQL_ADOX()

'Создание общей строки подключения и подлинковка таблиц MySQL

'--------------------------------------------------------------------------

Dim sDriver As String

Dim sServerAdr As String

Dim sServPort As String

Dim sDbName As String

Dim sUser As String

Dim sPassWord As String

Dim sConnect As String

Dim l&

'--------------------------------------------------------------------------

On Error GoTo LinkTablesMySQL_ADOX_Err

'Внимание - проверь версию драйвера! - Может уже... 5.5 или даже 6.2!?

'sDriver = "{MySQL ODBC 5.2 ANSI Driver}" 'ANSI Driver

sDriver = "{MySQL ODBC 5.3 Unicode Driver}" 'UNICODE Driver

'sServerAdr = "localhost"

sServerAdr = "127.0.0.1" ' Адрес (Имя) сервера

sServPort = "3306" ' Порт соединения = 3306 (Обычно так и есть)

sDbName = "codelibrary_db" ' Название базы

sUser = "root" ' Имя пользователя

sPassWord = "Pass_Word" ' Пароль



'Создаю строку подключения:

sConnect = "ODBC;DRIVER=" & sDriver & _

";SERVER=" & sServerAdr & _

";Port=" & sServPort & _

";DATABASE=" & sDbName & _

";USER=" & sUser & _

";PASSWORD=" & sPassWord & _

";OPTION=3" '& _

";stmt=set names cp1251"

'";stmt=set names utf8"

'Debug.Print sConnect


'--------------------------------------------------------------------

'Подключаем несколько таблиц по ADOX

l = LinkTable_ADOX("table_name_01", sConnect)

If l > 0 Then Err.Raise l

l = LinkTable_ADOX("table_name_01", sConnect)

If l > 0 Then Err.Raise l

l = LinkTable_ADOX("table_name_03", sConnect)

If l > 0 Then Err.Raise l

'--------------------------------------------------------------------------

'Подключаем пару таблиц по DAO

l = LinkTable_DAO("table_name_04", sConnect, "table_name_04_DAO")

If l > 0 Then Err.Raise l

l = LinkTable_DAO("table_name_05", sConnect, "table_name_05_DAO")

If l > 0 Then Err.Raise l


LinkTablesMySQL_ADOX_Bye:

Exit Sub


LinkTablesMySQL_ADOX_Err:

MsgBox "Ошибка " & Err.Number & vbCrLf & Err.Description & vbCrLf & "в процедуре: LinkTablesMySQL_ADOX", vbCritical, "Error in module modConnectMySQL_DAO"

Resume LinkTablesMySQL_ADOX_Bye

End Sub



Private Function LinkTable_ADOX(stRemTName As String, strConnect As String, Optional sLocalTName As String = "") As Long

'es 21.08.2016

'Подлинковка таблички MySQL Server с автоматическим созданием DSN (ADOX)

'При удачном подключениии возвращает = 0 (ноль), при неудачном = КОД ОШИБКИ (номер)

'-------------------------------------------------------------------------

'Аргументы:

' stRemTName = Имя таблицы на сервере

' strConnect = Строка подключения к серверу

' sLocalTName = Локальное Имя Таблицы

'-------------------------------------------------------------------------

Dim cat As New ADOX.Catalog

Dim tbl As New ADOX.Table

On Err GoTo LinkTable_ADOX_Err


'Если локальное имя не указанно

If sLocalTName = "" Then sLocalTName = stRemTName

'Открываем каталог текущей базы

Set cat.ActiveConnection = CurrentProject.Connection

'Если таблица с таким названием уже существует - Удаляем

For Each tbl In cat.Tables

If tbl.Name = sLocalTName Then cat.Tables.Delete tbl.Name

Next

'Установка параметров таблицы

With tbl

.Name = sLocalTName

Set .ParentCatalog = cat

.Properties("Jet OLEDB:Link Provider String") = strConnect

.Properties("Jet OLEDB:Remote Table Name") = stRemTName

.Properties("Jet OLEDB:Create Link") = True

End With

'Создаём новый обьект

cat.Tables.Append tbl


'Обновляем список таблиц

cat.Tables.Refresh

CurrentDb.TableDefs.Refresh

DoEvents


LinkTable_ADOX_Bye:

Set cat = Nothing

Set tbl = Nothing

Exit Function


LinkTable_ADOX_Err:

LinkTable_ADOX = Err.Number

Debug.Print "Error " & Err.Number & vbCrLf & Err.Description & vbCrLf & _

"in Function: esLinkTable_ADOX"

Resume LinkTable_ADOX_Bye

End Function



Private Function LinkTable_DAO(sSourceTblName As String, sConnectStr As String, Optional sLocalTblName As String = "") As Long

'es - 29.12.2012

'Создаёт подлинкованную таблицу по параметрам подключения с автоматическим созданием DSN (DAO)

'При удачном подключениии возвращает = 0 (ноль), при неудачном = КОД ОШИБКИ (номер)

'--------------------------------------------------------------------

'Аргументы:

' sSourceTblName = Имя Таблицы Исходное (на сервере)

' sConnectStr = Строка подключения к серверу:

' sLocalTblTName = Локальное Имя Таблицы (по умолчанию = sSourceTblName)

'--------------------------------------------------------------------

Dim tdf As New DAO.TableDef

If sLocalTblName = "" Then sLocalTblName = sSourceTblName

'Удаляем старую подлинковку (если была)

On Error Resume Next

CurrentDb.TableDefs.Delete sLocalTblName

Err.Clear

On Error GoTo LinkTable_DAO_Err

'Установка параметров создаваемой таблицы

With tdf

.Name = sLocalTblName

.Connect = sConnectStr

.SourceTableName = sSourceTblName

End With

'Создаём новый обьект Таблица

CurrentDb.TableDefs.Append tdf

DoEvents

CurrentDb.TableDefs.Refresh

LinkTable_DAO_Bye:

On Error Resume Next

Set tdf = Nothing

Exit Function


LinkTable_DAO_Err:

LinkTable_DAO = Err.Number

Debug.Print "Error " & Err.Number & vbCrLf & Err.Description & vbCrLf & _

"in procedure LinkTable_DAO", vbCritical, "Error!"

Resume LinkTable_DAO_Bye

End Function






Результат может быть таким:

Achtung!
Разрядность MySQL ODBC драйвера - должна совпадать с разрядностью MSO (а не СИСТЕМЫ).
Т.Е. Если система x64,а MSO=x32 (что довольно обычно), то - ставим драйвер - x32.

Для ADOX требуются ссылки на библиотеки:
    Microsoft ADO Ext. for DDL and Security. (Version 2.1 or higher)
    Microsoft ActiveX Data Objects Library. (Version 2.1 or higher)

 
MyTetra Share v.0.52
Яндекс индекс цитирования