RussianLDP Рейтинг@Mail.ru
WebMoney: 
WMZ Z294115950220 
WMR R409981405661 
WME E134003968233 
Visa 
4274 3200 2453 6495 

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 и перезагрузиться назад в нормальный режим работы.

  • Чтобы сделать соединение с Unix-системой из Windows, приложением ODBC (которое не поддерживает напрямую MySQL), Вы должно сначала установить MyODBC на машине Windows.
  • Пользователь и Windows-машина должны иметь привилегии доступа к серверу MySQL на Unix-машине. Это должно быть установлено с помощью команды GRANT. Подробности в разделе "10.1 Синтаксис GRANT и REVOKE".
  • Вы должны создать запись ODBC DSN следующим образом:
    • Откройте Control Panel на Windows-системе.
    • Дважды щелкните по пиктограмме ODBC Data Sources 32 bits.
    • Нажмите метку User DSN.
    • Нажмите кнопку Add.
    • Выберите MySQL на экране Create New Data Source и нажмите кнопку Finish.
    • Показывается экран конфигурации значений по умолчанию драйвера MySQL. Подробности в разделе "13.2 Как заполнять поля в программе администрирования ODBC".
  • Теперь запустите Ваше приложение, и выберите ODBC-драйвер DSN, который Вы определили в администраторе ODBC.

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

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

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

  • Использовать IP-адрес сервера.
  • Добавить в файл \windows\lmhosts следующую информацию:
    ip hostname
    
    Например:
    194.216.84.21 my_hostname
    
  • Настроить PC для использования DNS.

Пример того, как заполнить поля в 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. В большинстве случаев это может быть решено следующим образом:

  • Добавьте первичный ключ для таблицы, если он еще не имеется.
  • Добавьте столбец timestamp, если его еще нет.
  • Используйте только поля double float. Некоторые программы могут терпеть неудачу, когда они сравнивают single float.

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

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

Программа
Комментарий
Access
Чтобы работать с Access:
  • Если Вы используете Access 2000, Вы должны получить и установить самый новый (version 2.6 или выше) компонент Microsoft MDAC (Microsoft Data Access Components) с адреса http://www.microsoft.com/data. Это устранит следующую ошибку в Access: когда Вы экспортируете данные в MySQL, таблица и названия столбцов не определены. Другой способ обхода этой ошибки в том, чтобы обновить MyODBC до Version 2.50.33 и MySQL до Version 3.23.x, они вместе обеспечивают обход для этой проблемы! Вы должны также получить и применить Microsoft Jet 4.0 Service Pack 5 (SP5), который можно найти на http://support.microsoft.com/support/kb/articles/Q 239/1/14.ASP. Это устранит некоторые случаи, где столбцы отмечены как #deleted# в пакете Access. Обратите внимание, что, если Вы используете MySQL Version 3.22, Вы должны применить заплату MDAC и использовать MyODBC 2.50.32 или 2.50.34.
  • Установите поле опции MyODBC ``Return matching rows'' при соединении с сервером MySQL.
  • Вы должны иметь первичный ключ в таблице. Если его там нет, новые или модифицируемые строки могут быть показаны как #Deleted#.
  • Вы должны иметь timestamp во всех таблицах, которые Вы хотите модифицировать. Для максимальной мобильности рекомендуются TIMESTAMP(14) или простой TIMESTAMP вместо других вариантов на тему TIMESTAMP(X).
  • Используйте поля типа double float. Access терпит неудачу при сравнении с single float. Симптомы: новые или модифицируемые строки могут помечаться как #Deleted#, или Вы не можете находить строки модификаций.
  • Если Вы все еще получаете ошибку Another user has changed your data после добавления столбца TIMESTAMP, следующий прием может помочь Вам: Не используйте просмотр листа данных table. Создайте взамен форму с полями, которые Вы хотите обрабатывать, и используйте эту форму для просмотра в формате form. Вы должны установить реквизит DefaultValue для столбца TIMESTAMP в значение NOW(). Неплохо скрыть столбец TIMESTAMP, чтобы не запутывать Ваших пользователей.
  • Access под NT покажет BLOB-столбцы как OLE OBJECTS. Если Вы хотите взамен иметь столбцы MEMO, Вы должны изменить столбец на TEXT через ALTER TABLE.
  • Access не может всегда правильно обрабатывать столбцы DATE. Если Вы имеете проблему с этим, измените столбцы на DATETIME.
  • В некоторых случаях Access может генерировать запрещенные запросы SQL, которые MySQL не может понимать. Вы можете исправить это выбором "Query|SQLSpecific|Pass-Through" из меню Access.
  • Если Вы имеете в Access столбец, определенный как BYTE, Access попробует экспортировать его как TINYINT вместо TINYINT UNSIGNED. Это задаст Вам проблем, если Вы имеете значения > 127!
  • Если Вы используете Access 7.0, Вы должны использовать флажок Return matching rows.
  • Если Вы используете Access 2.0, Вы должны использовать флажки Return matching rows и Simulate ODBC 1.0.
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
Работает. Некоторые советы:
  • Если Вы имеете проблемы с датами, попробуйте выбирать их как строки, используя функцию CONCAT(). Например:
    select CONCAT(rise_time), CONCAT(set_time) from sunrise_sunset;
    
    Значения, найденные как строки, этим способом должны быть правильно распознаны как значения времени Excel97. Цель CONCAT() в этом примере состоит в том, чтобы ввести в заблуждение ODBC, чтобы тот принял столбец за строковый. Без CONCAT() ODBC знает, что столбец имеет тип времени, а Excel этого не понимает. Обратите внимание, что это ошибка в Excel. Она происходит потому, что он автоматически преобразовывает строку во время. Это хорошо, если источником был текстовый файл, но просто глупо, когда источником является ODBC-соединение, которое сообщает точные типы для каждого столбца.
Word
Чтобы получать данные из MySQL в документах Word/Excel, Вы должны использовать драйвер MyODBC и Add-in Microsoft Query help. Например, создайте базу данных с таблицей, содержащей 2 столбца текста:
  • Вставьте строки, используя клиента mysql.
  • Создайте DSN-файл, используя драйвер MyODBC, например, my для db выше.
  • Откройте приложение Word.
  • Создайте пустой новый документ.
  • На полосе инструментов Database, нажмите кнопку insert database.
  • Нажмите кнопку Get Data.
  • На правой стороне экрана Get Data нажмите кнопку Ms Query.
  • В Ms Query создайте New Data Source, используя DSN-файл my.
  • Выберите новый запрос.
  • Выберите столбцы, которые Вы хотите.
  • Сделайте фильтр, если Вы хотите его использовать.
  • Сделайте Sort, если Вы хотите его использовать.
  • Выберите Return Data в Microsoft Word.
  • Нажмите кнопку Finish.
  • Нажмите Insert data и выберите записи.
  • Нажмите OK, и Вы увидите строки в Вашем документе Word.
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-сервере.

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

Поиск

 

Найди своих коллег!