Подключение драйвера ODBC mySQL (источник данных не найден)
Формулировка задачи:
При попытке подключения к драйверу через Excel (Данные -> источник внешних данных) получаю "В указанном DSN архитектура приложения не соответствует друг другу".
Если через VBA, то ошибка "Источник данных не найден и не указан драйвер, используемый по-умолчанию".
Вся информация о проведенных настройках на скриншотах.
ОС: Windows 7 x64.
MySQL 5.5 x32, user: root, pass: 333. Имя базы данных: testme.
Query Browser подключается без ошибок.
Драйвер mysql-connector-odbc-5.1.10-winx64.
Что я упускаю?
Решение задачи: «Подключение драйвера ODBC mySQL (источник данных не найден)»
textual
Листинг программы
Option Explicit
Private Sub testADO()
Const adUseClient = 3, adOpenKeyset = 1, adOpenDynamic = 2, adOpenStatic = 3, adLockOptimistic = 3
Dim oConnect As Object, oRecordSet As Object
Dim fld
Set oConnect = CreateObject("ADODB.Connection")
Set oRecordSet = CreateObject("ADODB.Recordset")
oConnect.Open "DRIVER={MySQL ODBC 5.1 Driver};SERVER=localhost;DATABASE=tst;USER=root;PASSWORD=1;"
oRecordSet.CursorLocation = adUseClient
oConnect.Execute "DROP TABLE IF EXISTS my_ado"
oConnect.Execute "CREATE TABLE my_ado(id int not null auto_increment primary key," & _
"name char(20)," & _
"dsc varchar(25)," & _
"txt text, dt date, tm time, ts timestamp) engine=myisam default character set=utf8"
oConnect.Execute "INSERT INTO my_ado(id, name, dsc, txt, dt, tm, ts) values(null, 'Первое имя', 'Первое описание', 'Длинный текст, - такой, насколько не будет лениво стучать по клавишам',20120101, 1020, 201201011010)"
oConnect.Execute "INSERT INTO my_ado(id, name, dsc, txt, dt, tm, ts) values(7, 'Второе имя id=7', 'Описание для второго', 'Длинный текст, - такой насколько не будет лениво стучать по клавишам',20120101, 1020, 201201011010)"
oConnect.Execute "INSERT INTO my_ado values(null, 'Удалим', 'эту запись','т.е в окончательном наборе эта запись будет отсутствовать!!!!!!!!!!!!',20120102, 1030, 201201011020)"
oConnect.Execute "INSERT INTO my_ado(dsc, name, txt, dt, tm, ts) values('последняя', 'На этот раз','запись, но после добавления переместится чуть выше',20120101, 1020, 201201011010)"
oRecordSet.Open "SELECT * FROM my_ado", oConnect
Debug.Print "Всего записей в наборе - " & oRecordSet.RecordCount
oRecordSet.MoveFirst
Debug.Print String(50, "-") & " Таблица, заполненная insert'ами " & String(50, "-")
For Each fld In oRecordSet.fields
Debug.Print fld.Name,
Next
Debug.Print
Do Until oRecordSet.EOF
For Each fld In oRecordSet.fields
Debug.Print fld.Value,
Next
oRecordSet.MoveNext
Debug.Print
Loop
oRecordSet.Close
InputBox ("Это только для организации паузы" & vbNewLine & _
"переключаемся на окно с mysql и вводим" & vbNewLine & _
"insert into my_ado(id, name) values(3, 'Третья запись'")
' Обновление этой записи в RecordSet
oRecordSet.Open "SELECT * FROM my_ado", oConnect
Debug.Print "Всего записей в наборе - " & oRecordSet.RecordCount
oRecordSet.MoveFirst
Debug.Print String(50, "-") & "После добавления сторонней записи из клиента MYSQL" & String(50, "-")
For Each fld In oRecordSet.fields
Debug.Print fld.Name,
Next
oRecordSet.Close
Debug.Print
Debug.Print String(50, "-") & "обновление записи добавленной сторонним приложением (добавлено в клиенте MYSQL)" & String(50, "-")
oRecordSet.CursorLocation = adUseClient 'нужно для перемещения по данным
oRecordSet.Open "SELECT * FROM my_ado", oConnect, adOpenDynamic, adLockOptimistic
oRecordSet.Find "id=3"
oRecordSet.fields("txt") = "В поле name - просто бред собачий"
oRecordSet.Update
Do Until oRecordSet.EOF
For Each fld In oRecordSet.fields
Debug.Print fld.Value,
Next
oRecordSet.MoveNext
Debug.Print
Loop
oRecordSet.Close
' Заполнение через RecordSet
oRecordSet.Open "select * from my_ado", oConnect, adOpenDynamic, adLockOptimistic
oRecordSet.AddNew
oRecordSet!Name = "Добавим в recorset"
oRecordSet!txt = "Эта запись была добавлена в ранее полученный recordset, поле timestamp будет заполнено правильным значением"
oRecordSet.Update
oRecordSet.Close
' Обновление первой записи в RecordSet
oRecordSet.Open "SELECT * FROM my_ado"
oRecordSet!Name = "Этого не увидим"
oRecordSet!txt = "Это просто так, будет заменен!!!"
oRecordSet.Update
oRecordSet.Close
' Обновление еще раз первой записи в RecordSet
oRecordSet.Open "SELECT * FROM my_ado"
oRecordSet!Name = "А увидим именно это"
oRecordSet!txt = "Обновленный второй раз текст в этом поле - [txt]"
oRecordSet.Update
oRecordSet.Close
' Удаление записи в RecordSet
oRecordSet.Open "SELECT * FROM my_ado"
oRecordSet.MoveNext
oRecordSet.MoveNext
oRecordSet.Delete
oRecordSet.Close
oRecordSet.Open "SELECT * FROM my_ado", oConnect
Debug.Print "Всего записей в наборе - " & oRecordSet.RecordCount
oRecordSet.MoveFirst
Debug.Print String(50, "-") & "Окончательная таблица после всех произведенных изменений " & String(50, "-")
For Each fld In oRecordSet.fields
Debug.Print fld.Name,
Next
Debug.Print
Do Until oRecordSet.EOF
For Each fld In oRecordSet.fields
Debug.Print fld.Value,
Next
oRecordSet.MoveNext
Debug.Print
Loop
oRecordSet.Close
oConnect.Close
End Sub
Объяснение кода листинга программы
- Подключение к базе данных MySQL с использованием ODBC-драйвера
- Создание таблицы
my_adoс несколькими полями - Вставка нескольких записей в таблицу
my_adoс использованием оператора INSERT INTO - Выборка всех записей из таблицы
my_adoи вывод их на экран - Обновление записи в таблице
my_adoс использованием оператора UPDATE - Добавление новой записи в таблицу
my_adoчерез объект RecordSet - Обновление первой записи в таблице
my_adoчерез объект RecordSet - Удаление записи из таблицы
my_adoчерез объект RecordSet - Повторное выборка всех записей из таблицы
my_adoи вывод их на экран - Закрытие всех открытых объектов, включая соединение и объект RecordSet
- Вывод на экран окончательной таблицы
my_adoпосле всех произведенных изменений