13 Поддержка MySQL ODBC

MySQL предоставляет поддержку интерфейса ODBC с помощью пакета MyODBC. Эта глава научит Вас, как установить и использовать MyODBC. Здесь Вы также найдете список общих программ, которые, как известно, работают с MyODBC.

13.1 Как ставить MyODBC

MyODBC представляет собой 32-bit ODBC (2.50) level 0 (с возможностями level 1 и level 2) драйвер для соединения ODBC-приложений с СУБД MySQL. MyODBC работает под Windows95, Windows98, NT и на некоторых Unix-системах.

MyODBC публично доступен, и Вы можете спокойно скачать его новейшую версию с http://www.mysql.com/downloads/api-myodbc.html.

Если Вы имеете проблему с MyODBC, и Ваша программа также работает с OLEDB, Вы должны попробовать драйвер для OLEDB, который Вы можете найти в разделе Contrib.

Обычно Вы должны установить MyODBC только на системах с Windows. Под Unix MyODBC Вам понадобится только, если Вы имеете программу подобную ColdFusion, которая выполняется на Unix-машине и использует ODBC, чтобы соединиться с базами данных.

Если Вы хотите устанавливать MyODBC под Unix, Вы будете также нуждаться в диспетчере ODBC. MyODBC, как известно, работает с большинством Unix ODBC-диспетчеров. Вы можете найти список ODBC-секции ссылок на страничке MySQL. Подробности в разделе "1.2.3 Хорошие ссылки по MySQL ".

Чтобы установить MyODBC в Windows, Вы должны загрузить соответствующий файл MyODBC .zip (для Windows9x или NT/Win2000), распаковывать его с помощью WINZIP или другой подобной программы и выполнить файл SETUP.EXE.

В Windows NT Вы можете получать следующую ошибку при попытке установить MyODBC:

An error occurred while copying C:\WINDOWS\SYSTEM\MFC30.DLL. Restart
Windows and try installing again (before running any applications
which use ODBC)

Проблема в этом случае состоит в том, что некоторая другая программа использует ODBC, а также из-за того, как неудобно устроена Windows, Вы не можете в этом случае установить новые ODBC-драйверы программой установки Microsoft ODBC setup. В большинстве случаев Вы можете продолжать установку, нажав кнопку Ignore, чтобы копировать остальную часть файлов MyODBC. Если это не работает, решение состоит в том, чтобы перезагрузить Ваш компьютер в safe mode (выберите это, нажимая F8 перед запуском Windows после перезагрузки), установить MyODBC и перезагрузиться назад в нормальный режим работы.

Обратите внимание, что имеются другие опции конфигурации на экране MySQL (trace, don't prompt on connect, etc), которые Вы можете опробовать, если сталкиваетесь с проблемами.

13.2 Как заполнять поля в программе администрирования ODBC

Имеются три возможности для определения имени сервера в Windows95:

Пример того, как заполнить поля в ODBC setup:

Windows DSN name:   test
Description:        This is my test database
MySql Database:     test
Server:             194.216.84.21
User:               monty
Password:           my_password
Port:

Значение для поля Windows DSN name: любое имя, которое является уникальным в Вашей Windows ODBC-установке.

Вы не должны определить значения для полей Server, User, Password или Port на экране установки ODBC. Однако, если Вы это сделаете, значения будут использоваться как значения по умолчанию позже, когда Вы попытаетесь сделать соединение. Тогда их можно поменять.

Если номер порта явно не задан, используется заданный по умолчанию порт (3306).

Если Вы определяете опцию Read options from C:\my.cnf, группы client и odbc будут читаться из файла C:\my.cnf.

13.3 Параметры соединения для MyODBC

Можно определять следующие параметры для MyODBC в разделе [Servername] файла ODBC.INI или через аргумент InConnectionString в вызове SQLDriverConnect().

ПараметрЗначение по умолчанию Комментарий
userODBC (в Windows)username используемый, чтобы соединиться с MySQL.
serverlocalhostИмя хоста сервера MySQL.
databaseЗаданная по умолчанию база данных
option0Целое число, которым Вы можете определять, как MyODBC должен работать. Подробности ниже.
port3306Порт TCP/IP, чтобы использовать, если server не localhost.
stmtКоманда, которая будет выполнена при установлении соединения с MySQL.
passwordПароль для комбинации параметров server и user.
socketСокет или именованный канал Windows.

Параметр option используется, чтобы сообщить MyODBC, что клиент не на 100% ODBC-совместим. В Windows обычно устанавливаются опции на экране соединения, но можно также устанавливать это в параметре option. Следующие опции перечислены в том же самом порядке, в каком они появляются на экране соединения MyODBC:

BitНазначение
1Клиент не может обрабатывать возвращаемую MyODBC реальную ширину столбца.
2Клиент не может обрабатывать возвращаемое MySQL истинное значение числа обрабатываемых строк. Если этот флажок установлен MySQL возвращает найденные строки. Нужно иметь MySQL 3.21.14 или более новый, чтобы получить такую поддержку.
4Создает файл регистрации отладки c:\myodbc.log. Это аналогично указанию MYSQL_DEBUG=d:t:O,c::\myodbc.log в AUTOEXEC.BAT.
8Не устанавливать ограничение пакета для результатов и параметров.
16Не запрашивать ничего, даже если драйвер хотел бы что-то запросить.
32Моделировать драйвер ODBC 1.0 в некотором контексте.
64Игнорировать использование имени базы данных в 'database.table.column'.
128Принудительно использовать курсоры менеджера ODBC.
256Отключить использование расширенной выборки.
512Приводить поля CHAR к полной длине столбца.
1024SQLDescribeCol() возвратит полное имя столбца.
2048Использовать сжатый протокол сервера/клиента.
4096Сообщает, чтобы сервер игнорировал пробел после имени функции и перед '(' (необходимо для работы с PowerBuilder). Эта опция сделает все имена функций ключевыми словами!
8192Соединяться с именованными конвейерами с сервером mysqld под NT.
16384Изменить столбцы LONGLONG на INT (некоторые приложения не могут обрабатывать LONGLONG).
32768Вернуть 'user' как Table_qualifier и Table_owner из вызова SQLTables (экспериментально).
65536Читать параметры из групп client и odbc файла настроек my.cnf.
131072Добавляет некоторые дополнительные проверки безопасности (обычно не надо, но...).

Если Вы хотите иметь много опций, Вы должны сложить вышеупомянутые флажки. Например, установка option в 12 (4+8) дает Вам отладку без ограничений пакета.

По умолчанию MYODBC.DLL компилируется для оптимальной эффективности. Если Вы хотите отладить MyODBC (например, чтобы включить трассировку), Вы должны взамен использовать MYODBCD.DLL. Чтобы установить этот файл, скопируйте MYODBCD.DLL взамен установленной библиотеки MYODBC.DLL.

13.4 Как сообщать о проблемах с MyODBC

MyODBC был проверен с Access, Admndemo.exe, C++-Builder, Borland Builder 4, Centura Team Developer (прежде это был пакет Gupta SQL/Windows), ColdFusion (на Solaris и NT с svc pack 5), Crystal Reports, DataJunction, Delphi, ERwin, Excel, iHTML, FileMaker Pro, FoxPro, Notes 4.5/4.6, SBSS, Perl DBD-ODBC, Paradox, Powerbuilder, Powerdesigner 32 bit, VC++ и Visual Basic.

Если Вы знаете о любых других приложениях, которые работают с MyODBC, пожалуйста, напишите об этом на myodbc@lists.mysql.com!

С некоторыми программами Вы можете получать ошибку подобно: Another user has modifies the record that you have modified. В большинстве случаев это может быть решено следующим образом:

13.5 Программы, работающие с MyODBC

Большинство программ должны работать с MyODBC, но для каждой из тех, что перечислены ниже, это было проверено.

Программа
Комментарий
Access
Чтобы работать с Access:
ADO
Когда Вы программируете с API ADO и MyODBC, Вы должны принять во внимание некоторые заданные по умолчанию реквизиты, которые не обеспечиваются сервером MySQL. Например, использование реквизита CursorLocation Property как adUseServer возвратит для RecordCount Property результат -1. Сомневаюсь, что это входит в Ваши планы... Чтобы иметь правильное значение, Вы должны установить реквизит adUseClient так, как показано в коде на VB ниже:
Dim myconn As New ADODB.Connection
Dim myrs As New Recordset
Dim mySQL As String
Dim myrows As Long

myconn.Open "DSN=MyODBCsample"
mySQL = "SELECT * from user"
myrs.Source = mySQL
Set myrs.ActiveConnection = myconn
myrs.CursorLocation = adUseClient
myrs.Open
myrows = myrs.RecordCount

myrs.Close
myconn.Close
Другой вариант: использовать SELECT COUNT(*) для подобного запроса, чтобы получить правильное число строк.
Active server pages (ASP)
Вы должны использовать опцию Return matching rows.
BDE applications
Вы должны установить опции Don't optimize column widths и Return matching rows.
Borland Builder 4
Когда Вы начинаете запрос, Вы можете использовать реквизит Active или метод Open. Обратите внимание, что Active при запуске автоматически выдает запрос SELECT * FROM ..., который не может быть хорошим, если Ваши таблицы большие!
ColdFusion (под Unix)
Следующая информация поступила из документации на ColdFusion: Используйте следующую информацию, чтобы конфигурировать сервер ColdFusion для Linux, чтобы использовать драйвер unixODBC с MyODBC для источников данных MySQL. MyODBC Version 2.50.26 работает с MySQL Version 3.22.27 и Linux ColdFusion. Любая более новая версия должна также работать. Вы можете скачать MyODBC с http://www.mysql.com/downloads/api-myodbc.html ColdFusion Version 4.5.1 позволяет Вам через ColdFusion Administrator добавить источник данных MySQL. Однако, драйвер не включен в поставку ColdFusion Version 4.5.1. Прежде, чем драйвер MySQL появится в списке ODBC datasources, Вы должны сформировать и скопировать драйвер MyODBC в /opt/coldfusion/lib/libmyodbc.so. Каталог Contrib хранит программу mydsn-xxx.zip, которая позволяет Вам формировать и удалять файл записи DSN для MyODBC драйвера в Coldfusion.
DataJunction
Вы должны изменить таблицу для вывода VARCHAR вместо ENUM, поскольку пакет экспортирует последнее способом, который вызывает разрушение MySQL.
Excel
Работает. Некоторые советы:
Word
Чтобы получать данные из MySQL в документах Word/Excel, Вы должны использовать драйвер MyODBC и Add-in Microsoft Query help. Например, создайте базу данных с таблицей, содержащей 2 столбца текста:
odbcadmin
Тестовая программа для ODBC.
Delphi
Вы должны использовать BDE Version 3.2 или более новую. Установите поле опции `Don't optimize column width' при соединении с MySQL. Также имеется некоторый потенциально полезный код на Delphi, который устанавливает ODBC и BDE записи для MyODBC (BDE-запись требуется BDE Alias Editor, который свободно выкачивается с Delphi Super Page. (Спасибо за него Bryan Brunton bryan@flesherfab.com):
fReg:= TRegistry.Create;
  fReg.OpenKey('\Software\ODBC\ODBC.INI\DocumentsFab', True);
  fReg.WriteString('Database', 'Documents');
  fReg.WriteString('Description', ' ');
  fReg.WriteString('Driver', 'C:\WINNT\System32\myodbc.dll');
  fReg.WriteString('Flag', '1');
  fReg.WriteString('Password', '');
  fReg.WriteString('Port', ' ');
  fReg.WriteString('Server', 'xmark');
  fReg.WriteString('User', 'winuser');
  fReg.OpenKey('\Software\ODBC\ODBC.INI\ODBC Data Sources', True);
  fReg.WriteString('DocumentsFab', 'MySQL');
  fReg.CloseKey;
  fReg.Free;
  Memo1.Lines.Add('DATABASE NAME=');
  Memo1.Lines.Add('USER NAME=');
  Memo1.Lines.Add('ODBC DSN=DocumentsFab');
  Memo1.Lines.Add('OPEN MODE=READ/WRITE');
  Memo1.Lines.Add('BATCH COUNT=200');
  Memo1.Lines.Add('LANGDRIVER=');
  Memo1.Lines.Add('MAX ROWS=-1');
  Memo1.Lines.Add('SCHEMA CACHE DIR=');
  Memo1.Lines.Add('SCHEMA CACHE SIZE=8');
  Memo1.Lines.Add('SCHEMA CACHE TIME=-1');
  Memo1.Lines.Add('SQLPASSTHRU MODE=SHARED AUTOCOMMIT');
  Memo1.Lines.Add('SQLQRYMODE=');
  Memo1.Lines.Add('ENABLE SCHEMA CACHE=FALSE');
  Memo1.Lines.Add('ENABLE BCD=FALSE');
  Memo1.Lines.Add('ROWSET SIZE=20');
  Memo1.Lines.Add('BLOBS TO CACHE=64');
  Memo1.Lines.Add('BLOB SIZE=32');
  AliasEditor.Add('DocumentsFab','MySQL',Memo1.Lines);
C++ Builder
Проверялось с BDE Version 3.0. Единственая известная проблема состоит в том, что, когда изменяется схема таблицы, поля запроса не модифицируются. BDE, кажется, не распознает первичные ключи, только первичный индекс, хотя это не было проблемой.
Vision
Вы должны установить флажок опций Return matching rows.
Visual Basic
Чтобы модифицировать таблицу, Вы должны определить первичный ключ для таблицы. Visual Basic с ADO не может обрабатывать большие числа типа integer. Это означает, что некоторые запросы, подобно SHOW PROCESSLIST, не будут работать правильно. Устраняется это указанием опции OPTION=16834 в строке соединения ODBC или опции Change BIGINT columns to INT на экране соединения MyODBC. Вы можете также устанавливать Return matching rows.
VisualInterDev
Если Вы получаете ошибку [Microsoft][ODBC Driver Manager] Driver does not support this parameter, причина может быть в том, что Вы имеете BIGINT в Вашем результате. Попробуйте устанавливать опцию Change BIGINT columns to INT на экране соединения MyODBC.
Visual Objects
Вы должны использовать флажок опции Don't optimize column widths .

13.6 Как получать значение столбцов с AUTO_INCREMENT в ODBC

Общая проблема: как получить значение автоматически сгенерированный ID из INSERT. С ODBC Вы можете делать что-нибудь вроде этого (считается, что auto является полем с AUTO_INCREMENT):

INSERT INTO foo (auto,text) VALUES(NULL,'text');
SELECT LAST_INSERT_ID();

Или, если Вы только собираетесь вставлять ID в другую таблицу, Вы можете сделать так:

INSERT INTO foo (auto,text) VALUES(NULL,'text');
INSERT INTO foo2 (id,text) VALUES(LAST_INSERT_ID(),'text');

Для пользы некоторых ODBC-приложений (по крайней мере Delphi и Access), следующий запрос может использоваться, чтобы найти недавно вставленную строку:

SELECT * FROM tbl_name WHERE auto IS NULL;

13.7 Сообщение о проблемах с MyODBC

Если Вы сталкиваетесь с трудностями с MyODBC, Вы должны сделать файл протокола менеджера ODBC (файл регистрации, который Вы получаете при запросе файлов регистрации из ODBCADMIN) и протокол из MyODBC.

Чтобы получить протокол из MyODBC, Вы должны сделать:

  1. Гарантируйте, что Вы используете myodbcd.dll, а не myodbc.dll. Самый простой способ делать это состоит в том, чтобы получить myodbcd.dll из дистрибутива MyODBC и скопировать на место myodbc.dll, которая, вероятно, находится в Вашем каталоге C:\windows\system32 или C:\winnt\system32. Обратите внимание, что Вы, вероятно, захотите восстановить старый файл myodbc.dll, когда закончите тестирование, поскольку он куда быстрее myodbcd.dll.
  2. Отметьте флажок опции `Trace MyODBC' на экране соединения/настройки MyODBC. Протокол будет записан в файл C:\myodbc.log. Если опция трассировки не появилась при обращении к вышеупомянутому экрану, это означает, что Вы не используете драйвер myodbcd.dll.
  3. Запустите приложение и попробуйте смоделировать сбой.

Проверьте MyODBC trace file, чтобы выяснить, что именно могло пойти не так. Вы должны быть способны выяснить выданные запросы, ища после строки >mysql_real_query в файле myodbc.log.

Вы должны также попробовать дублировать запросы в mysql monitor или admndemo, чтобы выяснить, ошибка это MyODBC или MySQL.

Если Вы выясняете, что что-то пошло неправильно, пожалуйста, пошлите только релевантные строки (максимум 36 строк) на адрес myodbc@lists.mysql.com. Пожалуйста, никогда не посылайте целый файл протокола ODBC или MyODBC!

Если Вы неспособны выяснить, что неправильно, последняя опция должна сделать архив (tar или zip), который содержит файл трассировки MyODBC, файл протокола ODBC и файл README, который объясняет проблему. Вы можете посылать это на ftp://support.mysql.com/pub/mysql/secret. Только в MySQL AB имеют доступ к файлам, которые Вы загружаете, и там будут очень аккуратны с данными!

Если Вы можете создать программу, которая также показывает эту проблему, пожалуйста, загрузите ее туда же.

Если программа работает с некоторым другим SQL сервером, Вы должны сделать файл протокола ODBC с описанием действий, когда Вы делаете точно ту же самую вещь на другом SQL-сервере.

Не забудьте, что подробная информация, которую Вы можете обеспечить авторам, повышает вероятность того, что они смогут решить проблему!

Hosted by uCoz