Эта глава содержит общую информацию относительно ODBC и MyODBC.
Open Database Connectivity (ODBC) представляет собой интерфейс прикладной программы (API) для доступа к базам данных. Это основано на спецификациях Call-Level Interface (CLI) от X/Open и ISO/IEC для API баз данных. Как язык доступа к базам данных применяется Structured Query Language (SQL).
ODBC разработан для максимальной способности к взаимодействию, то есть одна прикладная программа может без изменения своего исходного текста работать через интерфейс с какой угодно СУБД. Прикладные программы вызывают функции интерфейса ODBC, которые выполнены в специфических для базы данных модулях, названных драйверами. Использование драйверов изолирует прикладные программы от специфических для базы данных обращений. Подробнее об этом можно почитать на http://www.microsoft.com/data.
Первое и главное: ODBC является спецификацией для API базы данных. Этот API независим от любой СУБД, операционной системы или языка программирования.
ODBC API основан на спецификациях CLI от X/Open и ISO/IEC. ODBC 3.x полностью соответствует обоим этим спецификациям, более ранние версии ODBC были основаны на предварительных версиях этих спецификаций, но полностью не выполняли их, зато добавили свойства, нужные только разработчикам оконных приложений, например, прокручиваемые курсоры.
Разработчики драйверов для СУБД выполняют функции ODBC API. Приложения вызывают функции в этих драйверах, чтобы обратиться к данным способом, независимым от базы данных. Администратор драйверов (Driver Manager) управляет связью между прикладными программами и драйверами.
Имеются два архитектурных требования:
ODBC успешно решает эти проблемы следующим способом:
Архитектура MyODBC имеет 5 главных компонентов как показано ниже:
Как описано ранее, MySQL AB поддерживает два драйвера ODBC с открытыми исходными текстами, а именно MyODBC и MySQL ODBC 3.51, для работы с MySQL через ODBC API.
MySQL AB распространяет все свои программы под General Public License (GPL). Самую свежую версию MyODBC или MyODBC 3.51 (двоичные коды и исходные тексты) можно скачать с http://www.mysql.com. Подробно о MySQL ODBC рассказано на http://www.mysql.com/downloads/api-myodbc.html.
Для установки MyODBC на Windows Вы должны скачать соответствующий дистрибутивный файл для Вашей операционной системы с http://www.mysql.com/downloads/api-myodbc.html, распаковать его и выполнить файл SETUP.EXE.
MyODBC 3.51
поставляется в виде исходников с
Makefile, который использует nmake. В дистрибутиве
есть WIN_Makefile для формирования нормальной версии и
WIN_Makefile_debug для формирования отладочной версии драйвера и
DLL-библиотек. Для построения драйвера:
Скачайте исходники и распакуйте их в какой-нибудь каталог, скажем,
myodbc3-src. Дальше выполните следующие команды для
создания нормальной версии:
Command> cd myodbc3-src
Command> nmake -f Win_Makefile
Command> nmake -f Win_Makefile install
nmake -f Win_Makefile формирует версию драйвера и помещает
двоичные файлы в подкаталог release. Команда
nmake -f Win_Makefile install инсталлирует (вообще-то просто
копирует) библиотеку драйвера и его DLL (myodbc3.lib и
myodbc3.dll) в системный каталог ОС. Аналогично Вы можете
сформировать версию для отладки, используя Win_Makefile_Debug:
Command> nmake -f Win_Makefile_debug
Command> nmake -f Win_Makefile_debug install
Вы можете oчищать и восстанавливать драйвер, используя команды:
Command> nmake -f Win_Makefile clean
Command> nmake -f Win_Makefile install
ОБРАТИТЕ ВНИМАНИЕ: Удостоверитесь, что определили правильные библиотеки пользователей MySQL и путь файлов заголовка в Makefile. Это принимает заданный по умолчанию путь C:\mysql\include и C:\mysql\lib\opt (для обычных DLL) или C:\mysql\lib\debug для отладочной версии.
Тестирование библиотек драйвера: после того, как
библиотеки драйвера скопированы в системный каталог, Вы можете проверить
качество их построения используя выборки, обеспеченные в подкаталоге
samples каталога исходного текста:
Command> cd samples
Command> nmake -f Win_Makefile all
MyODBC
распространяется в исходниках как VC Project для
Windows. Можно формировать драйвер, используя прямые файлы проекта VC (.dsp и
.dsw), имеющиеся в дистрибутиве.
Чтобы формировать драйвер самостоятельно под Linux, Вы должны иметь:
Как только Вы поимеете все требуемые файлы и распакуете исходные файлы в отдельный каталог, начинайте сборку драйвера как показано ниже.
Единственные требуемые параметры; --with-mysql-libs=DIR
и
--with-mysql-includes=DIR
. Здесь DIR
задает
каталог, где искать библиотеки и включаемые файлы mysql.
При использовании iodbc
, если iodbc
не
установлен в заданное по умолчанию расположение (/usr/local), Вам
придется использовать --with-iodbc=DIR
или, если заголовки
iODBC не находятся в DIR/include, придется использовать опцию
--with-iodbc-includes=INCDIR
. То же самое касается и библиотек:
если они не в DIR/lib, примените явное указание параметром
--with-iodbc-libs=LIBDIR
.
При использовании unixODBC
для создания configure
ищите unixODBC
вместо iODBC
и используйте параметр
--with-unixODBC=DIR
. Здесь DIR
задает то место, где
установлен unixODBC.
Если звголовки и библиотеки unixODBC расположены не там, где надо (а надо
в DIR/include и DIR/lib соответственно), укажите на них
параметрами --with-unixODBC-libs=LIBDIR
и
--with-unixODBC-includes=INCDIR
.
Вы можете определять другой префикс вместо /usr/local для
установки, например, хранить MyODBC-драйверы в /usr/local/odbc/lib,
для этого надо указать параметр --prefix=/usr/local/odbc
.
Окончательно пример настройки выглядит так:
$ ./configure --prefix=/usr/local --with-iodbc=/usr/local \
--with-mysql-libs=/usr/local/mysql/lib/mysql \
--with-mysql-includes=/usr/local/mysql/include/mysql
Для построения библиотек драйвера Вы должны только выполнить:
$ make
Это должно сформировать библиотеки. Если происходят какие-то ошибки, исправьте их и продолжите построение. Если Вы не можете собрать пакет, пошлите детальный отчет по e-mail на myodbc@lists.mysql.com.
$ make install
Устанавливает следующий набор библиотек:
Обратите внимание
, если Вы пробуете
использовать make из SUN
, Вы закончите с ошибками. С
другой стороны, Make от GNU
должен работать прекрасно
на всех платформах.
Если Вы хотите формировать драйвер на Mac OS (Darwin), то используйте
следующий пример выбора конфигурации:
$ ./configure --prefix=/usr/local --with-unixodbc=/usr/local \
--with-mysql-libs=/usr/local/mysql/lib/mysql \
--with-mysql-includes=/usr/local/mysql/include/mysql \
--disable-shared --enable-gui=no --host=powerpc-apple
Это предполагает, что unixodbc и mysql установлены в заданные по умолчанию расположения. Если это не так, сконфигурируйте все соответственно.
На большинстве платформ MySQL не формирует или поддерживает .so файлы, так как формирование с общедоступными библиотеками вызывало проблемы в прошлом.
В таких случаях пользователь должен скачать дистрибутив MySQL и
скомпилировать его с помощью:
--without-server --enable-shared
Если Вы все же хотите формировать общедоступные библиотеки драйвера, Вы
должны определить опцию настройки --enable-shared
.
Если Вы конфигурировали пакет с опцией --disable-shared
, то Вы можете формировать .so-файл, используя следующее:
$ cd MyODBC-3.51.01
$ make
$ cc -bundle -undefined error -o .libs/libmyodbc3-3.51.01.so *.o \
-lz -lc -lmysqlclient -L/usr/local/mysql/lib/mysql/ \
-compatibility_version 2 -current_version 2.0
Это формирует и помещает файл libmyodbc3-3.51.01.so в каталог .libs
Скопируйте этот файл в каталог библиотек MyODBC (/usr/local/lib или что
Вы там определили в --prefix).
$ cd .libs
$ cp libmyodbc3-3.51.01.so /usr/local/lib
$ cd /usr/local/lib
$ ln -s libmyodbc3-3.51.01.so libmyodbc3.so
Предостережение: Вы должны читать этот раздел только, если Вы
заинтересованы в разработке пакета. Если Вы только хотите получить
MyODBC 3.51
, Вы должны использовать стандартный дистрибутив
(исходный текст или двоичные модули).
Чтобы получить самое современное дерево исходных текстов для разработчиков, сделайте следующее:
BitKeeper
с
http://www.bitmover.com/cgi-bin/download.cgi. Вам нужен
Bitkeeper 2.0
или более новый, чтобы обратиться к архиву.
shell> bk clone bk://work.mysql.com:7002/myodbc-3.51
В вышеупомянутых примерах исходное дерево будет установлено в подкаталог
myodbc-3.51 Вашего текущего каталога.
GNU autoconf 2.13
,
automake 1.4
, libtool
и m4
, чтобы
выполнить следующий набор команд:
shell> cd myodbc-3.51
shell> bk -r edit
shell> aclocal; autoheader; autoconf; automake;
shell> ./configure # Здесь напишите параметры
shell> make
Под Windows используйте WIN-Makefile и WIN-Makefile_debug.
make install
. Эта команда
установит драйвер MyODBC 3.51
на Вашей системе. Если Вы
установили последние версии требуемых инструментальных средств GNU, и они
разрушаются при попытке обработать файлы конфигурации, пожалуйста, сообщите
об этом на myodbc@lists.mysql.com. Однако, если Вы выполняете
aclocal
и получаете ошибку "command not found" или подобную
проблему, не сообщайте об этом. Вместо этого, удостоверьтесь, что все
необходимые инструментальные средства установлены, и что Ваша переменная PATH
задана правильно, так что оболочка может найти их.
bk clone
скачает дерево исходных
текстов, Вы должны периодически выполнять bk pull
, чтобы
получить очередные модификации.
bk sccstool
. Если Вы видите некоторый странный диф или
непонятный код, спрашивайте по e-mail
myodbc@lists.mysql.com. Также, если Вы думаете, что имеете лучшую идею
относительно того, как что-то сделать, пришлите патч на тот же адрес. Патч
изготовляется командой bk diffs
после внесения правок в исходные
тексты. Если Вы не имеете времени писать код, пошлите описание своей идеи.
BitKeeper
имеет хорошую утилиту справочника, к которой Вы
можете обращаться через bk helptool
.Драйвер MySQL ODBC может использоваться на всех основных платформах, поддерживаемых MySQL:
Вообще, MyODBC (3.51) поддержан на всех платформах, которые MySQL поддерживает. Если двоичный дистрибутив не доступен для специфической платформы, то Вы можете формировать драйвер самостоятельно, скачав его исходники. А чтобы это стало простым для других пользователей, пошлите готовые двоичные модули на myodbc@lists.mysql.com.
MySQL обеспечивает семейство пользователей своих пакетов списком рассылки, где новички получают решения от опытных пользователей, посылая запросы на myodbc@lists.mysql.com.
Чтобы подписаться на список рассылки MyODBC, пошлите сообщение на myodbc-subscribe@lists.mysql.com. Чтобы отписаться от списка рассылки MyODBC, пошлите сообщение на myodbc-unsubscribe@lists.mysql.com. Вы можете также просматривать архив списка рассылки на http://lists.mysql.com .
Есть возможность получить поддержку пакета. Если Вы хотите, чтобы:
Вы должны получить контракт поддержки от MySQL AB
. Фирма
MySQL AB
поддерживает различные типы лицензий поддержки, чтобы
помочь Вам выбрать именно то, что нужно. Для получения большего количества
информации относительно поддержки MySQL, посетите сайт
https://order.mysql.com или пошлите
e-mail на licensing@mysql.com.
Как только Вы купите поддержку, Вы сможете посылать запросы или отчеты об ошибках, используя MySQL support wizard на http://support.mysql.com, затем группа разработки MySQL начнет работать над Вашей проблемой немедленно.
Если Вы сталкиваетесь с трудностями с MyODBC
или с
MyODBC 3.51
, Вы должны запустить создание файла протокола из
ODBC Manager
(протокол Вы получаете при запросе файлов
регистрации из ODBC ADMIN
) или протокол MyODBC
(или
MyODBC 3.51
).
Для получения трассировки ODBC через Driver Manager, Вы должны сделать следующее:
Start
, укажите на
Settings
и запустите
Control Panel
.
Microsoft Windows 2000
,
сделайте двойной щелчок на Administrative Tools
и сделайте двойной щелчок на Data Sources (ODBC)
.
На компьютерах с более ранней версией Microsoft Windows
дважды щелкните на 32-bit ODBC
или на ODBC
.
Появится диалоговое окно ODBC Data Source Administrator
.Tracing
диалогового окна
ODBC Data Source Administrator
нужна, чтобы
сконфигурировать путь ODBC-обращения к функции трассировки.
Tracing
, Driver Manager
регистрирует
все ODBC-обращения к функциям для всех впоследствии выполненных программ.
TRACE
в файле настроек ODBC.INI
.
Установите трассировку в ON
или в OFF
, используя
параметры TRACE или TRACEFILE в odbc.ini. Например, так:
TraceFile = /tmp/odbc.trace
Trace = 1
Здесь TRACEFILE определяет имя и полный путь файла протокола, а TRACE
установлен в ON или в OFF. Вы можете также использовать 1 или YES для ON и 0
или NO для OFF.unixODBC
, то следуйте командам из HOWTO-ODBCConfig на
http://www.unixodbc.org/config.html для трассировки вызовов unixODBC.
MyODBC
или MyODBC
3.51
, надо сделать следующее:
MyODBC 3.51
(или myodbcd.dll
для MyODBC
). Самый простой способ сделать это состоит в том,
чтобы получить myodbc3d.dll (или myodbcd.dll) из
дистрибутива MyODBC 3.51
и скопировать поверх
myodbc3.dll (или myodbc.dll), который, скорей всего,
расположен в каталоге C:\windows\system32 или в
C:\winnt\system32. Обратите внимание, что Вы, вероятно, захотите
восстановить старый файл myodbc.dll после окончания отладки,
поскольку он работает намного быстрее, чем myodbc3d.dll (или
myodbcd.dll), так что сделайте резервную копию оригинальной DLL.
Trace MyODBC
на экране
конфигурирования соединения через MyODBC. Протокол будет записан в файл
C:\myodbc.log. Если опция трассировки отсутствует на вышеупомянутом
экране, это означает, что Вы не используете драйвер myodbcd.dll. Под
Linux или если Вы используете связь DSN-Less, Вы должны обеспечить в строке
подключения параметр OPTION=4
.
Большинство программ должно работать с MyODBC, но для каждой из перечисленных ниже это было проверено непосредственно.
Microsoft Data
Access Components
) с
http://www.microsoft.com/data. Это устранит следующую ошибку в Access:
когда Вы экспортируете данные в MySQL, имена таблицы и столбца не определены.
Другой путь обхода этой ошибки состоит в том, чтобы поставить MyODBC не ниже
2.50.33 и MySQL не ниже 3.23, которые вместе обеспечивают обход этой ошибки.
Вы должны также получить и применить Microsoft Jet 4.0 Service Pack 5 (SP5),
который может быть найден на
http://support.microsoft.com/default.aspx?scid=kb;EN-US;q239114. Это
исправит ряд ситуаций, в которых столбцы помечаются как удаленные
(#deleted#
) в Access. Обратите внимание, что, если Вы
используете MySQL 3.22, Вы должны применить патч для MDAC и использовать
MyODBC 2.50.32 или 2.50.34 и выше для решения проблемы.
Return
matching rows
. Для Access 2.0 Вы должны дополнительно включить опцию
Simulate ODBC 1.0
.
TIMESTAMP(14)
или
просто TIMESTAMP
рекомендуются вместо других вариантов
TIMESTAMP(X)
.
#DELETED#
.
DOUBLE
с плавающей точкой. Access
рушится при сравнении с single-полями с плавающей точкой. Это приводит к
тому, что новые или модифицируемые строки могут обнаруживаться как
#DELETED#
, или Вы не можете находить или модифицировать строки.
BIGINT
как один из
столбца, через MyODBC, то результаты будут отображаться как
#DELETED
. Обойти это можно так:
TIMESTAMP
как тип
данных, предпочтительно TIMESTAMP(14)
.
Change BIGINT columns to INT
в диалоге опций
соединения в ODBC DSN Administrator.
#DELETED#
, но новые
записи будут отображаться правильно.
Another user has changed your data
после добавления столбца TIMESTAMP
, следующий прием
может помочь: не используйте представление листа данных таблицы. Создайте
взамен форму с полями, которые Вы хотите видеть, и используйте вид
form
листа данных. Вы должны установить реквизит
DefaultValue
для столбца TIMESTAMP
в
NOW()
. Стоит сделать столбец TIMESTAMP
скрытым.
Query|SQLSpecific|Pass-Through
из меню Access.
BLOB
как OLE
OBJECTS
. Если Вы хотите иметь столбцы MEMO
вместо этого,
Вы должны изменить тип столбца на TEXT
с помощью
команды ALTER TABLE
.
DATE
правильно.
Если Вы имеете проблему с ними, измените столбцы на DATETIME
: с
ними путаницы нет.
BYTE
,
Access пробует экспортировать это как TINYINT
вместо
TINYINT UNSIGNED
. Это задаст Вам проблем, если Вы имеете
значения > 127 в этом столбце!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(*)
для
подобного запроса, чтобы получить правильное число строк.
Return matching rows
.
Don't optimize column widths
и Return matching rows
. Тогда все должно работать.
Active
или метод Open
. Обратите внимание, что
Active
запускается автоматически при выдаче запроса
SELECT * FROM ...
, что медленно, если Ваши таблицы большие.
ENUM
вместо VARCHAR
: проблемы с протоколом.
CONCAT()
. Например:
select CONCAT(rise_time), CONCAT(set_time) from sunrise_sunset;
Значения, полученные как строки этим способом, должны быть правильно
распознаны как значения времени Excel97. Цель CONCAT()
в этом
примере состоит в том, чтобы ввести в заблуждение ODBC в плане того, что
столбец имеет строковый тип. Без CONCAT()
ODBC знает, что
столбец имеет тип time, а Excel не понимает этого. Обратите внимание, что это
ошибка в Excel, поскольку он автоматически преобразовывает строку в time,
хотя никто его об этом не просит. Это было бы большим удобством, если
источником является текстовый файл, но просто глупо, когда в качестве
источника данных выступает ODBC-подключение, которое сообщает точные типы
для каждого столбца.MyODBC
и Add-in Microsoft Query help. Например, создайте
базу данных с таблицей, содержащей 2 столбца текста:
mysql
.
Don't optimize column width
при соединении с MySQL. Также
имеется некоторый потенциально полезный Delphi-код, который устанавливает
ODBC-вход и BDE-вход для MyODBC (BDE-вход требует BDE Alias
Editor, который можно свободно скачать с Delphi Super Page.
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);
Return matching rows
.
SHOW PROCESSLIST
не
будут работать правильно. Установите опцию OPTION=16834
в строке
подключения ODBC или задайте параметр Change BIGINT columns to INT
на экране соединения MyODBC. Вы можете также устанавливать опцию
Return matching rows
.
[Microsoft][ODBC Driver Manager] Driver
does not support this parameter
, причина может быть в том, что Вы
имеете BIGINT
в Вашем результате. Попробуйте установить параметр
Change BIGINT columns to INT
на экране соединения MyODBC.
Don't optimize column widths
.