>
На главную страницу
Оглавление статей
ВНИМАНИЕ! Материал статьи устарел. Новые версии MS Access не поддерживают изложенную в статье методику. Статья сохранена для разработчиков приложений под MS Access 2003 и ниже.
Если Вы выбрали MS Access 2003 и ниже как платформу для своих приложений, но Вас не устраивает mdb-файл в качестве сервера базы данных — эта статья для Вас. Из неё Вы узнаете, как подключить MS Access к MySQL. Как Вы уже догадались, я хочу предложить Вам использовать в качестве сервера баз данных MySQL. Моя программа некоторое время работал на связке MS Access+MySQL, и я хочу поделиться некоторыми нюансами организации взаимодействия MS Access-приложения и сервера баз данных MySQL
Преимущества MySQL перед mdb-файлом слишком очевидны, чтоб долго на них останавливаться. Это преимущество полноценного SQL-сервера перед файл-серверной рептилией. Для работы с базой данных , хранящейся в файле mdb, нужно иметь полный доступ к нему. Вот тебе, бабушка, и удалённый доступ, и надёжность данных. Мне приходилось в двух организациях менять сетевые карты всем клиентским компьютерам, чтоб файл mdb не разрушался, выдавая Нераспознаваемый формат базы данных (хорошо хоть MS Access, начиная с версии 2000, научился их восстанавливать). О транзакциях, триггерах и других чертах современной базы данных разговор даже не идёт: эти черты даже не имитируются в mdb-файлах.
Но MS Access может взаимодействовать и с другими SQL-серверами, и Microsoft подталкивает нас к взаимодействию с MS SQL Server, снабжая нас для этого всем необходимым. Но я выбрал "мускул", руководствуясь следующими причинами.
То есть MySQL — это сервер, который всегда с тобой
ВНИМАНИЕ! Материал статьи устарел. Новые версии MS Access не поддерживают изложенную в статье методику. Статья сохранена для разработчиков приложений под MS Access 2003 и ниже.
Вам предстоит проделать следующее:
Идёте на страницу http://dev.mysql.com/downloads/, первый раздел MySQL Community Server, выбираете рекомендуемый, т.е. Current Release (Recommended) (на 8 февраля 2007 это был MySQL 5.0), и скачиваете версию для операционной системы Вашего сервера.
Для Windows есть три типа дистибутива
При установке с дистибутива следуйте инструкциям инсталлятора; ряд настроек мы всё равно зададим сами в конфигурационнома файле — об этом следующий параграф.
Запускается MySQL под WIndows двумя способами:
При работе MySQL под Windows Вы можете конфигурировать его параметры с помощью файла мy.ini
О конфигурационном файле мy.ini и его параметрах Вы можете прочитать в документации (http://dev.mysql.com/doc/refman/5.0/en/instance-manager-configuration-files.html). Данный файл размещается в корневой папке сервера MySQL (в моём примере это G:\MySQL).
Приведу пример конфигурационного файла мy.ini, позволяющий подерживать кириллицу. В этом файле позволяются комментарии, начинающиеся с # — чем я и воспользуюсь для отметки строк, отвечающих за кириллицу.
Вам придётся изменить в этом файле пути для своего сервера, о чём смотрите комментарии.
Итак, конфигурационный файл мy.ini.
[client] port = 3306 #Конфигурационные параметры для сервера MySQL [mysqld] port = 3306 socket = /tmp/mysql.sock skip-locking key_buffer = 16K max_allowed_packet = 1M table_cache = 4 sort_buffer_size = 64K read_buffer_size = 256K read_rnd_buffer_size = 256K net_buffer_length = 2K thread_stack = 64K # Установка кириллицы на сервере default-character-set=cp1251 #Указание кодировки character-sets-dir=g:/mysql/share/charsets #Указание пути к папке кодировок (скорректируйте для своего сервера!) server-id = 1 # Конфигурационные параметры для программы резервного копирования [mysqldump] quick max_allowed_packet = 16M # Установка кириллицы на сервере default-character-set=cp1251 #Указание кодировки character-sets-dir=g:/mysql/share/charsets #Указание пути к папке кодировок (скорректируйте для своего сервера!) # Конфигурационные параметры для программы-клиента mysql.exe [mysql] no-auto-rehash # Установка кириллицы на сервере default-character-set=cp1251 #Указание кодировки character-sets-dir=g:/mysql/share/charsets #Указание пути к папке кодировок (скорректируйте для своего сервера!) [isamchk] key_buffer = 8M sort_buffer_size = 8M [myisamchk] key_buffer = 8M sort_buffer_size = 8M [mysqlhotcopy] interactive-timeout
Подключение к базе данных осуществляется от имени пользователя. После инсталляции на сервере присутсвует один пользователь root@localhost с пустым паролем (в ранних версиях был ещё один — root@'%', но в последних версиях его уже нет. Думаю, по соображениям безопасности). Так что первіе действия Вам придётся осуществить на сервере.
Входите в командную строку Windows (Start/Пуск → Run/Выполнить → cmd), устанавливаете текущим каталогом подкаталог bin каталога MySQL (в моём случае это G:\mysql\bin):F:\>G: G:\>cd mysql\bin
и набираете команду подключения к MySQL
G:\mysql\bin>mysql -urootХост и порт приняли значения по умолчанию — соответственно localhost и 3306, пароля у root пока нет (сейчас мы это исправим). И появилось приглашение MySQL вводить команды SQL:
G:\mysql\bin>mysql -uroot Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2 to server version: 5.0.27-community Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql>
Первое, что мы проделаем — изменим пароль root: это очевидное требование безопасности.
mysql> update mysql.user set password=Password('ВашПароль') where user='root' and host='localhost';
Query OK, 0 rows affected (0.06 sec)
Rows matched: 1 Changed: 0 Warnings: 0
mysql> flush privileges;
Query OK, 0 rows affected (0.08 sec)
mysql>
Пароль изменён. Но наш сеанс идёт ещё под старым паролем. Прервём наш сеанс и зайдём уже с новым паролем.
mysql> quit; Bye G:\mysql\bin>mysql -uroot -p Enter password: *********Если мы нигде не ошиблись — мы снова видим приглашение MySQL и начинаем работу. Предполагается, что приложение работает в локальной сети, IP-адреса в которой начинаются с 192.168 (в противном случае надо скорректировать нижеследующую инструкцию grant).
mysql> /*создадим пользователя, под которыми будет заходить приложение MS Access */ mysql> grant all privileges on ИмяБазыДанных.* to 'логин'@'192.168%' identified by 'пароль'; Query OK, 0 rows affected (0.03 sec) mysql> /*Создадим базу данных нашего приложения*/ mysql> create database ИмяБазыДанных; Query OK, 1 row affected (0.00 sec) mysql> /*Создаём таблицы*/ mysql>
Создавать таблицы в командной строке MySQL слишком утомительно. Поэтому Вам лучше выбрать один из двух оптимальных путей.
G:\mysql\bin>mysql -uroot -p ИмяБазыДанных<Путь к файлу с инструкциями create tableУ Вас будет запрошен пароль и, если Вы нигде не ошиблись, таблицы будут созданы
Идёте на страницу http://dev.mysql.com/downloads/, ищете раздел Connector/ODBC - MySQL ODBC driver, выбираете рекомендуемый, т.е. Generally Available (GA) release (на 8 февраля 2007 это Connector/ODBC 3.51 ), и скачиваете инсталлятор.
Запускаете инсталлятор, никаких значимых для установки вопросов он не задаст. О каких-либо проблемах с установкой этого драйвера я даже не слышал.
MS Access 2003 имеет дефект работы с ODBC под Windows 2000 (под XP не пробовал, но, насколько мне известно, ситуация идентична). Лечится это установкой пакета обновлений Jet 4.0 SP8 для Windows 2000 Этот пакет имеет версии для различных языковых версий Windows (обратите внимание — не MS Access, а именно Windows). Скажем, для русскоязычной версии Windows 2000 пакет обновлений Jet 4.0 SP8 находится по адресу
http://www.microsoft.com/downloads/details.aspx?FamilyID=1e268b39-533e-48b0-b8d7-1781befde1f8&DisplayLang=ru
Для русскоязычной версии Windows XP пакет обновлений Jet 4.0 SP8 находится по адресу
http://www.microsoft.com/downloads/details.aspx?FamilyID=2deddec4-350e-4cd0-a12a-d7f70a153156&DisplayLang=ru
Вручную создавать источник ODBC и подключать к нему таблицы — это не методы профессиональной разработки. Приведу примеры кода VBA для создания источника ODBC и подключения к нему таблиц
Создаётся или перезаписывается ODBC-источник следующей инструкцией:
DBEngine.RegisterDatabase ИмяИсточникаODBC, ИмяODBC-драйвера, True, СтрокаПараметровПодключения
Строка параметров подключения может содержать следующие параметры (см. http://dev.mysql.com/doc/refman/5.0/en/myodbc-configuration-connection-parameters.html):
Параметр | Значение по умолчанию | Комментарий |
---|---|---|
user |
ODBC (on Windows) | Логин пользователя |
server |
localhost |
Хост, на котором запущен MySQL сервер, к которому мы обращаемся |
database |
База данных по умолчанию. | |
option | 0 | Указание опций источника ODBC. Возможные значения этого параметра приведены в таблице на стр. http://dev.mysql.com/doc/refman/5.0/en/myodbc-configuration-connection-parameters.html |
port | 3306 | TCP/IP порт, используемый, если MySQL-сервер не на localhost. |
stmt | SQL-инструкция, выполняемая при подключении к MySQL. Важное применение — установка кодировки (в нашем случае — cp1251), которую будет применять к данным MS Access | |
password | Пароль, соответствующий логину (user). | |
socket | The Unix socket file or Windows named pipe to connect to if server is localhost. |
Пример
Dim connect as String connect="server=192.168.1.1;user=manager;password=zorro;port=3306;stmt=set names cp1251" DBEngine.RegisterDatabase "tm", "MySQL ODBC 3.51 Driver", True, connect
Обратите внимание на параметр stmt: именно он позволяет MS Access корректно поддерживать кириллицу.
'Удаление всех связанных таблиц Function Drop_linked_tables() As Boolean On Error GoTo oblom Dim TD As TableDef Dim tableName As String For Each TD In CurrentDb.TableDefs If (left(TD.connect, 5) = "ODBC;") Or (left(TD.connect, 10) = ";DATABASE=") Then tableName = TD.Name CurrentDb.TableDefs.Delete (tableName) End If Next TD CurrentDb.TableDefs.Refresh Drop_linked_tables = True Exit Function oblom: Drop_linked_tables = False End Function
'Подключение таблиц MySQL через ODBC Function StartConnectMySQL(ByVal login As String,ByVal odbcName As String,ByVal db As String) As Boolean On Error GoTo oblom Call Drop_linked_tables 'Удалили все связанные таблицы Dim newTD As TableDef Dim ws As Workspace Set ws = CreateWorkspace("ws_MySQL", "", "", dbUseODBC) Dim connect As String connect = "ODBC;database=" & db & ";DSN=" & odbcName Dim MySQL As DAO.Connection Set MySQL = ws.OpenConnection(odbcName, dbDriverComplete, False, connect) Dim query As String query = "use " & db MySQL.Execute (query) query = "show tables" Dim rst As DAO.Recordset Set rst = MySQL.OpenRecordset(query, dbOpenDynaset) Do While Not rst.EOF Set newTD = CurrentDb.CreateTableDef(rst(0)) newTD.connect = "ODBC;DSN=" & odbcName & ";database=" & db newTD.SourceTableName = rst(0) CurrentDb.TableDefs.Append newTD rst.MoveNext Loop StartConnectMySQL = True Exit Function oblom: StartConnectMySQL = False End Function
ВНИМАНИЕ! Материал статьи устарел. Новые версии MS Access не поддерживают изложенную в статье методику. Статья сохранена для разработчиков приложений под MS Access 2003 и ниже.
Мы рассмотрели весь процесс перехода приложения MS Access 2003 и ниже на взаимодействие c MySQL. Результат окупает усилия, которые потребуются от вас на этом пути: Вы получите приложение, где уже решены следующие задачи:
Кроме того, Вам теперь доступны следующие возможности:
Надеюсь, я чем-то помог Вам на пути к этим возможностям...
10 февраля 2007 г. Бибрка, Украина
Присылайте комментарии, он будут опубликованы под текстом статьи.