8.3.5 Программы, работающие с MyODBC
Большинство программ должно работать с MyODBC
, но для каждой из
перечисленных ниже мы либо провели тестирование сами, либо получили
подтверждение от пользователей, что она действительно работает:
- Программа
-
Комментарий
- Access
-
Чтобы заставить Access работать:
-
При использовании Access 2000 необходимо установить самую последнюю
версию (2.6 или выше) Microsoft MDAC (
Microsoft Data Access
Components
), которую можно найти на http://www.microsoft.com/data/.
Это позволит устранить ошибку в Access, которая проявляется в том, что
при экспорте данных в MySQL не указываются имена таблиц и столбцов.
Еще один способ обойти эту ошибку заключается в модернизации MyODBC
до
версии 2.50.33 и MySQL до версии 3.23.x - оба апгрейда вместе
обеспечивают обход данной ошибки!
Необходимо также получить и
использовать Microsoft Jet 4.0 Service Pack 5 (SP5), который можно
найти на http://support.microsoft.com/support/kb/articles/Q
239/1/14.ASP. Это позволит исключить некоторые случаи, когда столбцы в
Access отмечаются как #deleted#
. Следует учитывать, что при
использовании версии MySQL 3.22 необходимо применять патч для MDAC и
использовать MyODBC 2.50.32 или 2.50.34 и выше, чтобы обойти эту
проблему.
-
Для всех версий Access необходимо включить для MyODBC флаг опции
Return matching rows
. Для Access 2.0 следует дополнительно включить
Simulate ODBC 1.0.
-
Все таблицы, в которых вы хотите иметь возможность обновления, должны
содержать столбец типа
TIMESTAMP
для временных меток. Для максимальной
переносимости рекомендуется TIMESTAMP(14)
или просто TIMESTAMP
вместо
других вариантов TIMESTAMP(X)
.
-
Таблица должна иметь первичный ключ. Если не имеет, то новые или
обновленные строки могут выводиться как
#DELETED#
.
-
Используйте поля с числами с плавающей запятой только двойной точности
(типа
DOUBLE
). Access отказывается работать при сравнении чисел с
плавающей запятой одинарной точности. Проявляется это обычно в том,
что новые или обновленные строки могут выводиться как #DELETED#
или в
том, что вы не можете найти или обновить строки.
-
При связывании через MyODBC таблицы, один из столбцов которой имеет
тип
BIGINT
, результат будет выводиться как #DELETED#
. Обходное решение
заключается в следующем:
-
Добавьте еще один пустой столбец с
TIMESTAMP
в качестве типа
данных, предпочтительно TIMESTAMP(14)
.
-
Проверьте
Change BIGINT columns to INT
в диалоговом окне
опций подключения в Администраторе источников данных ODBC DSN
-
Удалите данную табличную связь из Access и создайте ее вновь.
После этого старые записи все равно будут представлены как #DELETED#
, а
заново добавленные/обновленные записи будут уже выводиться правильно.
-
Если после добавления столбца
TIMESTAMP
все еще появляется ошибка
Another user has changed your data
, то, возможно, поможет
следующий трюк. Не используйте режим работы ``Таблица''. Вместо этого
создайте форму с желаемыми полями и используйте режим работы
``Форма''. Следует установить свойство DefaultValue
для столбца
TIMESTAMP
в NOW()
. Возможно, было бы неплохо убрать столбец TIMESTAMP
из поля зрения, чтобы не смущать пользователей.
-
В некоторых случаях Access может создавать недопустимые запросы SQL,
которые MySQL не может понять. Это можно устранить путем выбора в меню
Access опции
Query|SQLSpecific|Pass-Through
.
-
Access под NT будет сообщать о столбцах
BLOB
как об объектах OLE. Если
вместо этого вы хотите иметь столбцы MEMO
, то необходимо изменить тип
столбца на TEXT
с помощью ALTER TABLE
.
-
Access не всегда может правильно обработать столбцы типа
DATE
. Если с
ними возникают проблемы, следует изменить тип этих столбцов на
DATETIME
.
-
Если Access содержит столбец, определенный как
BYTE
, то Access будет
пытаться экспортировать его как TINYINT
вместо TINYINT UNSIGNED
. Это
будет вызывать проблемы, если величины в данном столбце превышают 127!
- ADO
-
При написании программ с привлечением интерфейса ADO API и
MyODBC
необходимо обратить внимание на некоторые исходные свойства, которые не
поддерживаются сервером MySQL. Например, использование свойства
CursorLocation
как adUseServer
будет возвращать для свойства RecordCount
результат -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(*)
, чтобы получить правильное
количество строк.
- Активные серверные страницы (ASP)
-
Необходимо использовать флаг опции
Return matching rows
.
- BDE-приложения
-
Чтобы заставить их работать, следует установить флаги опций
Don't
optimize column widths
и Return matching rows
.
- Borland Builder 4
-
При запуске запроса можно использовать свойство
Active
или метод Open
.
Следует учитывать, что Active
будет начинать работу при автоматической
выдаче запроса SELECT * FROM ...
, что может оказаться не так уж и хорошо
для больших таблиц!
- ColdFusion (Под Unix)
-
Приведенные далее сведения взяты из документации по ColdFusion. Для
применения драйвера unixODBC с источником данных
MyODBC
следует
использовать следующую информацию. Корпорация Allaire подтвердила, что
версия MyODBC 2.50.26 работает с версией MySQL 3.22.27 и ColdFusion для
Linux (любая более новая версия также должна работать). Драйвер MyODBC
можно загрузить с http://www.mysql.com/downloads/api-myodbc.html
В версии
ColdFusion 4.5.1 можно использовать Администратор источников данных
ColdFusion для добавления источника данных MySQL. Однако данный драйвер не
включен в версию ColdFusion 4.5.1. Чтобы драйвер MySQL появился в
выпадающем списке источников данных ODBC, необходимо создать драйвер
MyODBC
и скопировать его в каталог `/opt/coldfusion/lib/libmyodbc.so'.
Каталог `Contrib' содержит программу `mydsn-xxx.zip', которая позволяет
создавать и удалять файл реестра DSN для драйвера MyODBC
для приложений
Coldfusion.
- DataJunction
-
Необходимо изменить эту программу для вывода
VARCHAR
вместо ENUM
,
поскольку экспорт ENUM
происходит таким образом, что вызывает неприятности
в MySQL.
- Excel
-
Работает. Несколько замечаний:
- Word
-
Для извлечения данных из MySQL в документы Word/Excel следует использовать
драйвер
MyODBC
и помощь встроенной программы Microsoft Query. Для
создания, например, базы данных db
с таблицей, содержащей 2 столбца с
текстом, необходимо выполнить следующие действия:
-
Вставьте строки, используя командную строку клиента
mysql
.
-
Создайте файл DSN, используя менеджер ODBC, например, my для созданной
выше базы данных
db
.
-
Откройте приложение Word.
-
Создайте новый пустой документ.
-
Используя панель инструментов вызванной базы данных, нажмите кнопку
Insert database.
-
Нажмите кнопку Get Data.
-
В окне Get Data справа нажмите кнопку Ms Query.
-
В окне Ms Query создайте новый источник данных, используя файл DSN
my.
-
Выберите новый запрос.
-
Выберите желаемый столбец.
-
Создайте фильтр (при желании).
-
Создайте сортировку (при желании).
-
Выберите Return Data to Microsoft Word.
-
Нажмите кнопку Finish.
-
Нажмите Insert data и выбирайте записи.
-
Нажмите Ok. Вы увидите выбранные строки в своем документе в Word.
- odbcadmin
-
Тестовая программа для ODBC.
- Delphi
-
Необходимо использовать версию BDE 3.2 или более новую. Установите поле
опции
Don't optimize column width
при подключении к MySQL. Кроме того,
ниже приводится потенциально полезный код Delphi, который устанавливает
вхождения для драйвера MyODBC как в ODBC, так и в BDE. (Запись в BDE
требует наличия редактора псевдонимов BDE Alias Editor, который доступен
бесплатно на Delphi Super Page. Спасибо за это Брайену Брантону (Bryan
Brunton [email protected])):
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 3.0. Единственная обнаруженная
проблема состоит в том, что при изменениях схемы таблиц не обновляются
поля запросов. Хотя BDE не распознает первичных ключей, а только индекс
PRIMARY
, тем не менее, это не было проблемой.
- Vision
-
Необходимо использовать флаг опции
Return matching rows
.
- Visual Basic
-
Чтобы обеспечить возможность обновить таблицу, для нее необходимо
определить первичный ключ. Visual Basic с ADO не обрабатывает больших
целых чисел. Это означает, что некоторые запросы вроде
SHOW PROCESSLIST
не будут работать правильно. Для устранения данной проблемы нужно добавить
опцию OPTION=16834
в строке подключения ODBC или установить опцию Change
BIGINT columns to IN
T в окне подключения 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
.
Add your own comment.