Автор: Алексей Паутов. Данный документ подготовлен в рамках некоммерческого проекта RussianLDP:MySQL ( http://www.botik.ru/~rldp/mysql.htm).
Имеется список всех системных переменных, которые используются MySQL непосредственно или косвенно. Большинство их также может быть найдено в других местах в этом руководстве.
Обратите внимание, что любые параметры в командной строке будут иметь приоритет над значениями, определенными в файлах конфигурации и системных переменных, а значения в файлах конфигурации всегда имеют приоритет над значениями в системных переменных.
Во многих случаях предпочтительно использовать файл выбора конфигурации вместо системных переменных, чтобы изменить поведение MySQL. Подробности в разделе "4.11 Файл опций my.cnf".
DBI_USER | Заданный по умолчанию пользователь для интерфейса Perl DBI. |
DBI_TRACE | Используется при трассировке Perl DBI. |
HOME | Заданный по умолчанию путь для файла
хронологии mysql , обычно $HOME/.mysql_history. |
LD_RUN_PATH | Используется, чтобы определить, где
находится Ваша библиотека libmysqlclient.so . |
MYSQL_DEBUG | Опции трассировки при отладке. |
MYSQL_HISTFILE | Путь к файлу хронологии
mysql . |
MYSQL_HOST | Заданное по умолчанию имя хоста,
используемое подсказкой командной строки mysql . |
MYSQL_PWD | Заданный по умолчанию пароль при
соединении с mysqld . Обратите внимание, что использование этой
возможности задания пароля опасно! |
MYSQL_TCP_PORT | Заданный по умолчанию порт TCP/IP. |
MYSQL_UNIX_PORT | Сокет по умолчанию. Используется
для связи с localhost . |
PATH | Используется оболочкой для поиска программ и утилит пакета MySQL. |
TMPDIR | Каталог, где будут созданы временные таблицы или файлы. |
TZ | Это должно быть установлено к Вашей зоне местного времени. Подробности в разделе "11.4.6 Проблемы часового пояса". |
UMASK_DIR | Создание каталога пользователя будет
выполнено с данной маской прав доступа. Обратите внимание, что это значение
будет использовано в операции AND с UMASK ! |
UMASK | То же самое, но для создания файлов. |
USER | Заданный по умолчанию пользователь в
Windows, чтобы использовать при соединении с mysqld .
|
Version 2, June 1991
Copyright © 1989, 1991 Free Software Foundation, Inc. 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too.
When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.
We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations.
Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and modification follow.
9.4 NO WARRANTY
If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the ``copyright'' line and a pointer to where the full notice is found.
one line to give the program's name and a brief idea of what it does. Copyright (C) yyyy name of author This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) 19yy name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details.
The hypothetical commands show w and show c should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than show w and show c; they could even be mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your school, if any, to sign a ``copyright disclaimer'' for the program, if necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. signature of Ty Coon, 1 April 1989 Ty Coon, President of Vice
This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License.
Version 2.1, February 1999
Copyright © 1991, 1999 Free Software Foundation, Inc. 59 Temple Place -- Suite 330, Boston, MA 02111-1307, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.]
The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users.
This license, the Lesser General Public License, applies to some specially designated software--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below.
When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things.
To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it.
For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights.
We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library.
To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others.
Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license.
Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs.
When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library.
We call this license the Lesser General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances.
For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License.
In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system.
Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library.
The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a ``work based on the library'' and a ``work that uses the library''. The former contains code derived from the library, whereas the latter must be combined with the library in order to run.
9.6 NO WARRANTY
If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License).
To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the ``copyright'' line and a pointer to where the full notice is found.
one line to give the library's name and an idea of what it does. Copyright (C) year name of author This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
Also add information on how to contact you by electronic and paper mail.
You should also get your employer (if you work as a programmer) or your school, if any, to sign a ``copyright disclaimer'' for the library, if necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. signature of Ty Coon, 1 April 1990 Ty Coon, President of Vice
That's all there is to it!
Автор: Алексей Паутов. Данный документ подготовлен в рамках некоммерческого проекта RussianLDP:MySQL ( http://www.botik.ru/~rldp/mysql.htm).
MySQL
, наиболее популярный сервер базы данных SQL с открытым
исходным текстом, разработан и поддерживается MySQL AB
.
MySQL AB
представляет собой коммерческую компанию, которая
формирует бизнес, обеспечивая услуги вокруг базы данных MySQL. Сайт
MySQL
(http://www.mysql.com)
обеспечивает самую свежую информацию относительно программного обеспечения
MySQL и MySQL AB.
MySQL AB
является шведской компанией владеющей
MySQL
. Занимается разработкой и поддержкой MySQL
.
Владеет правами на исходные тексты сервера и торговую марку
MySQL
.
MyODBC 2.50
представляет собой 32-битный
ODBC драйвер от MySQL AB
, основанный на
спецификации ODBC 2.50 Level 0 (с некоторыми возможностями
из level 1 и 2). Это один из наиболее популярных драйверов ODBC с открытым
исходным текстом, используемый многими пользователями, чтобы обратиться к
функциональным возможностям MySQL.
MyODBC 3.51
представляет собой 32-битный
ODBC драйвер, также известный как MySQL ODBC 3.51. Это расширенная версия
существующего MyODBC 2.50 с учетом спецификации ODBC 3.5x
level 1 (полный API ядра + возможности из level 2).
Это руководство содержит информацию относительно использования MySQL ODBC, MyODBC и MyODBC 3.51, чтобы исследовать возможности MySQL посредством ODBC API. Обратите внимание, что не все концепции и методы ODBC здесь охвачены: речь идет лишь о том, что действительно необходимо для работы с MySQL ODBC.
Это руководство подразумевает хорошее рабочее знание C, общее представление о СУБД и знакомство с MySQL. Для получения большего количества информации относительно функциональных возможностей и синтаксиса MySQL, обратитесь к сайту MySQL на http://www.mysql.com/documentation/index.html.
Эта глава содержит общую информацию относительно 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
.
Эта глава содержит информацию относительно разработки прикладных программ, которые используют MyODBC как интерфейс, чтобы обратиться к серверу MySQL.
В общем виде, чтобы работать с сервером MySQL из любой программы через ODBC/MyODBC, надо сделать следующее:
Большинство прикладных программ использует некоторое изменение этих шагов.
Источник данных идентифицирует путь для данных, который может включать
сетевую библиотеку, сервер, базу данных и другие атрибуты. В нашем случае
источник данных представляет собой путь к базе данных MySQL
.
Чтобы соединиться с источником данных, Driver Manager проверяет системный
реестр Windows для получения специфической информации подключения.
ODBC Driver Manager
и MyODBC Drivers
использует
вход системного реестра, созданный ODBC Data Source Administrator
. Этот вход содержит информацию относительно каждого источника данных
и связанного с ним драйвера. Прежде, чем Вы сможете соединяться с источником
данных, информация о подключении должна быть добавлена к системному реестру.
Чтобы добавлять и конфигурировать источники данных, используйте
ODBC Data Source Administrator
.
ODBC Administrator
модифицирует информацию о
подключениях к источникам данных. Поскольку Вы добавляете источники данных,
ODBC Administrator
модифицирует информацию
системного реестра для них.
Чтобы открыть ODBC Administrator
из Control Panel:
Start
, укажите на
Settings
и щелкните Control Panel
.
Administrative Tools
, а затем дважды щелкните
по Data Sources (ODBC)
. На компьютерах под
предыдущими версиями Microsoft Windows дважды щелкните по
32-bit ODBC
или по ODBC
.Чтобы добавить источник данных в Windows:
ODBC Data Source Administrator
.
ODBC Data Source Administrator
нажмите Add
. Откроется диалоговое окно
Create New Data Source
.
MySQL ODBC 3.51 Driver
и
нажмите на Finish
. Появится диалоговое окно
MySQL ODBC 3.51 Driver - DSN Configuration
.
Data Source Name
впечатайте имя
источника данных, к которому Вы хотите обращаться. Это может быть любое
имеющее силу имя, которое понравилось.
Description
введите описание
необходимое для DSN.
Host or Server Name (or IP)
напечатайте имя сервера MySQL, к которому Вы хотите обращаться. По умолчанию
это local host.
Database Name
укажите имя MySQL базы
данных, которая будет применяться как заданная по умолчанию база данных.
User
задайте имя пользователя базы
данных (user ID).
Password
надо задать пароль.
Port
напечатайте номер порта, если
это не значение по умолчанию 3306.
SQL Command
Вы можете вводить
факультативную команду SQL, которую серверу надлежит выполнить сразу
после установления подключения.Теперь нажмите OK
, чтобы добавить этот
источник данных. Обратите внимание:
при щелчке
на OK диалоговое окно Data Sources dialog, и ODBC Administrator
модифицирует информацию системного реестра. Имя пользователя
и строка подключения станут заданными по умолчанию значениями подключения для
этого источника данных. Вы можете также проверить, достаточны ли Ваши
параметры настройки, чтобы соединиться с сервером, используя кнопку
Test Data Source
. Эта возможность появилась
только начиная с MyODBC 3.51
.
Driver Options: Вы можете также видеть кнопку
Options
, которая отобразит диалог
дополнительных параметров, которые управляют поведением драйвера.
Обратите внимание, что параметры Driver Trace
Options
будут заблокированы (нарисованы серым цветом) при
использовании обычной версии DLL.
Чтобы изменить источник данных в Windows:
ODBC Data Source Administrator
. Выберите соответствующую вкладку DSN.
modify
и щелкните по
Configure
. Откроется диалоговое окно MySQL ODBC
3.51 Driver - DSN Configuration
.
OK
.Когда Вы закончите изменять информацию в этом диалоговом окне,
ODBC Administrator
модифицирует
информацию системного реестра.
Чтобы настроить источник данных в Unix:
В Unix
Вы можете конфигурировать DSN-входы
непосредственно в файле ODBC.INI. Имеется пример файла odbc.ini с myodbc как
DSN-имя для MyODBC 2.50 и myodbc3 для MyODBC 3.51 Drivers:
; ; odbc.ini configuration for MyODBC and MyODBC 3.51 Drivers ; [ODBC Data Sources] myodbc = MySQL ODBC 2.50 Driver DSN myodbc3 = MySQL ODBC 3.51 Driver DSNа [myodbc] Driver = /usr/local/lib/libmyodbc.so Description = MySQL ODBC 2.50 Driver DSN SERVER = localhost PORT = USER = root Password = Database = test OPTION = 3 SOCKET = [myodbc3] Driver = /usr/local/lib/libmyodbc3.so Description = MySQL ODBC 3.51 Driver DSN SERVER = localhost PORT = USER = root Password = Database = test OPTION = 3 SOCKET = [Default] Driver = /usr/local/lib/libmyodbc3.so Description = MySQL ODBC 3.51 Driver DSN SERVER = localhost PORT = USER = root Password = Database = test OPTION = 3 SOCKET =
Обратите внимание: если Вы используете unixODBC, то Вы можете использовать следующие инструментальные средства чтобы настроить DSN:
Можно определять следующие параметры для MyODBC или для
MyODBC 3.51 в секции [Data Source Name]
файла
ODBC.INI
или через параметр InConnectionString
в
вызове SQLDriverConnect()
.
Параметр | Значение по умолчанию | Комментарий |
user | ODBC (в Windows) | Имя пользователя для связи с MySQL. |
server | localhost | Имя сервера MySQL. |
database | База данных по умолчанию | |
option | 0 | Целое число, которым Вы можете определять как должен работать MyODBC 3.51. Описано чуть ниже. |
port | 3306 | Порт TCP/IP, чтобы использовать, если
server не равен localhost . |
stmt | Инструкция, которая будет выполнена, когда
установлено подключение к MySQL . | |
password | Пароль для комбинации server
user . | |
socket | Сокет или именованный канал Windows для связи. |
Параметр OPTION
используется, чтобы сообщить MyODBC
3.51, что пользователь не на 100% совместим с ODBC. Следующие
параметры перечислены в том же самом порядке, в каком они появляются в
MyODBC 3.51:
Бит | Описание |
1 | Пользователь не может обрабатывать ситуацию, когда MyODBC возвращает реальную ширину столбца. |
2 | Пользователь не может обрабатывать ситуацию, когда MySQL возвращает истинное число обработанных строк. Если этот параметр установлен, MySQL вернет число найденных строк. Нужно иметь MySQL 3.21.14 или более новый, чтобы это работало. |
4 | Создать протокол трассировки в файле c:\myodbc.log
(/tmp/myodbc.log). Это аналогично указанию
MYSQL_DEBUG=d:t:O,c::\myodbc.log в AUTOEXEC.BAT. |
8 | Не устанавливать ограничений пакета для результатов и параметров. |
16 | -Не запрашивать ничего, даже если драйвер хочет запросить. |
32 | Включить или отключить поддержку динамического курсора. Это не работает в MyODBC 2.50. |
64 | Игнорировать использование имени базы данных в формате database.table.column. |
128 | Использование экспериментальных курсоров ODBC manager. |
256 | Отключить использование расширенной (экспериментальной) выборки. |
512 | Дополнить поля типа CHAR до полной длины столбца. |
1024 | SQLDescribeCol() возвратит полностью квалифицированные имена столбцов. |
2048 | Использовать сжатый протокол клиент-сервер. |
4096 | Сервер должен игнорировать пробел между именем функции и
'(' (нужно для Power Builder). Это делает все ключевые
слова именами функций! |
8192 | Соединиться через именованный канал с сервером
mysqld под NT. |
16384 | Менять столбцы типа LONGLONG на столбцы INT (некоторые прикладные программы не могут корректно обрабатывать LONGLONG). |
32768 | Вернуть user как Table_qualifier и Table_owner из SQLTables. |
65536 | Читать параметры из групп client и
odbc в файле my.cnf |
131072 | Добавить некоторые дополнительные проверки безопасности (вроде бы не очень и надо, но...). |
262144 | Выключить использование транзакций |
524288 | Включить регистрацию запросов в файле c:\myodbc.sql (/tmp/myodbc.sql). Доступно только в режиме отладки в специальной версии драйвера. |
Если Вы хотите иметь много параметров, Вы должны сложить вышеупомянутые числа. Например, установка опции в 12 (4+8) дает Вам отладку без ограничений на размеры пакета.
По умолчанию MYODBC3.DLL компилируется для оптимальной
эффективности. Если Вы хотите отладить MyODBC 3.51
(например,
чтобы получить трассировку), используйте MYODBCD3.DLL
вместо
стандартного файла MYODBC3.DLL
.
Прикладная программа может быть связана с любом числом источников данных и драйверов. Они могут быть вариантами того же самого драйвера и ряда источников данных или несколькими подключениями с тем же самым драйвером и источником данных. Прикладная программа должна сделать следующее, чтобы соединиться с сервером MySQL через MyODBC:
Распределите дескриптор среды
Установите версию ODBC
Распределите дескриптор подключения
Установите факультативные атрибуты подключения перед подключением
Создайте подключение к серверу
Установите факультативные атрибуты подключения после подключением
Прежде, чем прикладная программа сможет использовать любую функцию ODBC, надо инициализировать ODBC-связь с помощью интерфейса и сопоставить с ней дескриптор среды. Он обеспечивает доступ к глобальной информации типа имеющих силу дескрипторов подключения и активных дескрипторов подключения.
Чтобы распределить правильный дескриптор среды, прикладная программа:
SQLHENV henv;
SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv) или SQLAllocEnv(&henv)
Если прикладная программа связана через Driver Manager, то это обращение
загружает Driver Manager. Он не вызывает SQLAllocHandle
в
драйвере потому, что пока не знает, который драйвер вызвать. Это откладывает
вызов SQLAllocHandle
в драйвере до получения вызовов из
прикладной программы, чтобы соединиться с источником данных: тогда-то будет
однозначно ясно, какой драйвер нужен.
Если прикладная программа связана непосредственно с драйвером, то это обращение загружает драйвер, и уже драйвер формирует информацию среды и возвращает распределенную структуру обратно прикладной программе.
Если Вы используете драйвер MyODBC 2.50, то Вы можете игнорировать этот раздел. Прежде, чем прикладная программа создаст соединение, необходимо установить атрибут SQL_ATTR_ODBC_VERSION среды, используя SQLSetEnvAttr:
SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER) SQL_OV_ODBC3, 0);
Этот атрибут заявляет, что прикладная программа следует спецификациям ODBC 2.x или ODBC 3.x при использовании следующих элементов:
ODBC 2.X | ODBC 3.X |
Идентификаторы типов в SQL | |
SQL_DATE | SQL_TYPE_DATE |
SQL_TIME | SQL_TYPE_TIME |
SQL_TIMESTAMP | SQL_TYPE_TIMESTAMP |
Идентификаторы типов в C | |
SQL_C_DATE | SQL_C_TYPE_DATE |
SQL_C_TIME | SQL_C_TYPE_TIME |
SQL_C_TIMESTAMP | SQL_C_TYPE_TIMESTAMP |
MyODBC 3.51 контролирует версию спецификации ODBC, для которой прикладная программа написана и отвечает соответственно. Например, если прикладная программа следует версии ODBC 2.x и вызывает SQLExecute до вызова SQLPrepare, драйвер вернет: SQLSTATE S1010 (Function sequence error). Если прикладная программа поддерживает спецификацию ODBC 3.x, то это возвращает: SQLSTATE HY010 (Function sequence error).
Дескриптор подключения обеспечивает доступ к информации относительно того, является ли подключение открытым или нет, имеют ли силу операторные и дескрипторные маркеры на подключении, и открыта ли сейчас транзакция.
Прежде, чем прикладная программа сможет соединиться с сервером MySQL или с драйвером, она должна распределить дескриптор подключения, следующим образом:
SQLHDBC hdbc; SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc); или SQLAllocConnect(henv, &hdbc);
Если прикладная программа связана через Driver Manager, то Driver Manager распределяет память, чтобы сохранить информацию относительно подключения и возвращает дескриптор подключения прикладной программе. С другой стороны, если Вы непосредственно компонуете программу через библиотеку драйверов вместо Driver Manager, то эту работу делает уже драйвер.
Атрибуты подключения представляют собой характеристики подключения. Например, они определяют, что транзакции происходят в уровне подключения, а уровень изоляции транзакции представляет собой атрибут подключения. Точно так же время ожидания входа в систему или число секунд, которые надо ждать при попытке соединиться перед тайм-аутом, тоже атрибуты подключения.
Атрибуты подключения установлены с помощью SQLSetConnectAttr, а их текущие параметры настройки могут быть получены с помощью SQLGetConnectAttr. Для прикладных программ драйвера MyODBC 2.50 Вы можете использовать SQLSetConnectOption и SQLGetConnectOption.
Атрибуты подключения могут быть установлены до или после подключения, в зависимости от типа атрибута. Время ожидания входа в систему SQL_ATTR_LOGIN_TIMEOUT применяется только при установлении связи и важно, только если установлено перед соединением.
Атрибуты, которые определяют, использовать ли библиотеку курсоров ODBC (SQL_ATTR_ODBC_CURSORS) и сетевой размер пакета (SQL_ATTR_PACKET_SIZE), должны быть установлены прежде, чем соединение создано потому что, библиотека курсоров ODBC находится между Driver Manager и драйвером, а следовательно должно быть загружена перед драйвером. Подробный перечень атрибутов подключения, поддерживаемых драйверами MyODBC, есть в разделе "4.5.1 SQLSetConnectAttr".
После распределения среды и дескрипторов подключения и установки факультативных атрибутов подключения, прикладная программа готова соединиться с сервером MySQL или драйвером MyODBC (через Driver Manager). Имеются две различных функции для этого:
SQLConnect самая простая функция подключения. Требует имя источника данных и принимает факультативные user ID и пароль. Прикладная программа передает следующую информацию драйверу через SQLConnect:
DSN:
имя источника данных.
UID:
имя пользователя для связи с сервером (опционально).
PWD:
соответствующий пароль (опционально).
Обратите внимание, что, если Вы уже определили имя пользователя и пароль в параметрах DSN или непосредственно в файле ODBC.INI, Вы можете только определить имеющий силу DSN, а драйвер внутренне получает другую требуемую информацию из записей в DSN сам.
Когда из прикладной программы вызван SQLConnect, Driver Manager использует имя источника данных, чтобы прочитать имя драйвера DLL из соответствующего раздела файла ODBC.INI или из системного реестра. Это затем загружает драйвер DLL и передает ему параметры SQLConnect. Если драйвер нуждается в дополнительной информации, чтобы соединиться с источником данных, он читает эту информацию из того же самого раздела файла ODBC.INI.
Если прикладная программа определяет имя источника данных, которое не значится в файле ODBC.INI или в системном реестре, или если прикладная программа не определяет имя источника данных, Driver Manager ищет заданную по умолчанию спецификацию источника данных. Если он находит заданный по умолчанию источник данных, то загружает заданный по умолчанию драйвер и передает ему определенное прикладная программой имя источника данных. Если не имеется никакого заданного по умолчанию источника данных, Driver Manager возвращает соответствующую ошибку.
Пример: следующий пример распределяет необходимую среду, дескриптор подключения и соединяется с сервером MySQL, используя DSN myodbc3.
SQLHENV henv; SQLHDBC hdbc; SQLHSTMT hstmt; SQLRETURN retcode; /* Allocate environment handle */ retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv); if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) { /* Set the ODBC version environment attribute to version 3 */ retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0); if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) { /* Allocate connection handle */ retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc); if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) { /* Connect to data source myodbc3 */ retcode = SQLConnect(hdbc, (SQLCHAR*) "myodbc3", SQL_NTS, (SQLCHAR*) "myuser", SQL_NTS, (SQLCHAR*) "mypassword", SQL_NTS); if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) { /* Set auto commit to ON */ retcode = SQLSetConnectAttr(hdbc, SQL_ATTR_AUTO_COMMIT, SQL_AUTOCOMMIT_ON,0); printf("\n autocommit returned :%d", redcode); /* Allocate statement handle */ retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt); if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) { /* Process data */ ; ; ; /* Free stattemt handle */ SQLFreeHandle(SQL_HANDLE_STMT, hstmt); } /* Disconnect from the server */ SQLDisconnect(hdbc); } /* Close the connection handle */ SQLFreeHandle(SQL_HANDLE_DBC, hdbc); } } /* Close the environment handle */ SQLFreeHandle(SQL_HANDLE_ENV, henv);
SQLDriverConnect используется, чтобы соединиться с сервером, используя строку подключения. Можно использовать SQLDriverConnect вместо SQLConnect по следующим причинам:
Строка подключения может состоять из одного или большего количества параметров MyODBC подключения, отделяемых точкой с запятой (;). Если драйвер должен запрашивать пользователя относительно информации подключения, то он отображает диалог подключения.
Используя myodbc3 как MySQL ODBC 3.51 DSN:
ConnectionString = "DSN=myodbc3"
DSN Less Connection:
ConnectionString = "DRIVER={MySQL ODBC 3.51 Driver}; SERVER=localhost;\ DATABASE=test; USER=monty; PASSWORD=monty;\ OPTION=4;"
Как только подключение установлено, прикладная программа должна получить большее количество информации относительно драйвера и источника данных, с которым он связан. Использование следующего API поможет это устроить:
SQLGetInfo
: возвращает общую информацию относительно
драйвера и источника данных, связанного с подключением. Например, какие
инструкции SQL прикладная программа выполнит? Прикладная программа использует
скроллируемые курсоры? Транзакции? Процедуры? Длинные данные?
SQLGetTypeInfo:
возвращает информацию относительно типов
данных, поддерживаемых сервером. Драйвер возвращает информацию в форме набора
результатов SQL. Типы данных предназначены для использования в инструкциях
Data Definition Language (DDL).
SQLGetFunctions:
возвращает информацию относительно того,
поддерживает ли драйвер специфическую функцию ODBC. Прикладная программа
может всегда использовать эту функцию, чтобы проверить, поддерживает ли
драйвер некий API или нет.
Пример: получает имя драйвера и версию, имя и версию сервера и соглашения SQL, поддерживаемые драйвером.
SQLHDBC hdbc; SQLRETURN retcode; SQLCHAR strValue[50]; SQLINTEGER nValue; SQLSMALLINT pcbValue; /* Connect to the server */ retcode = SQLConnect (..) if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) { /* get the driver name */ retcode = SQLGetInfo(hdbc, SQL_DRIVER_NAME, strValue, 50, &pcbValue); if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) { printf("driver name:%s",strValue); } /* get the driver version */ retcode = SQLGetInfo(hdbc, SQL_DRIVER_VER, strValue, 50, &pcbValue); if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) { printf("driver version:%s",strValue); } /* get the server name */ retcode = SQLGetInfo(hdbc, SQL_DBMS_NAME, strValue, 50, &pcbValue); if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) { printf("server name:%s",strValue); } /* get the SQL conformance*/ retcode = SQLGetInfo(hdbc, SQL_SQL_CONFORMANCE, &nValue, 0, &pcbValue); if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) { printf("SQL Conformance:%d",nValue); } }
Когда прикладная программа закончила использовать сервер MySQL, она должна в обязательном порядке закрыть подключение и освободить все предварительно распределенные дескрипторы. Чтобы завершать подключение из MyODBC нужно:
SQLDisconnect
, чтобы закрыть
подключение. Если имеются любые открытые операторные дескрипторы на этом
подключении, то драйвер внутренне освобождает все открытые инструкции для
этого подключения. Прикладная программа может затем использовать дескриптор
подключения, чтобы повторно соединиться с тем же самым источником данных или
присоединиться к другому источнику данных, если дескриптор подключения
не был освобожден.
SQLFreeHandle
с опцией SQL_HANDLE_DBC, чтобы
освободить подключение и все ресурсы, связанные с дескриптором.
SQLFreeHandle
с опцией SQL_HANDLE_ENV, чтобы
освободить среду и все ресурсы, связанные с дескриптором.Обратите внимание, если Вы используете драйвер MyODBC 2.50, Вы должны использовать SQLFreeConnect и SQLFreeEnv, чтобы освободить дескрипторы подключения и среды соответственно.
Ну ладно, подключение установлено, а дальше-то что? Надо работать с сервером, для этого все и затевалось. Работа эта происходит на базе обмена командами SQL и их результатами. Вот это самое сложное. Прикладная программа может представлять на рассмотрение любую инструкцию SQL, поддерживаемую сервером MySQL. ODBC-программы выполняют почти весь доступ к базе данных, выполняя инструкции SQL. Общая последовательность событий:
Операторный дескриптор обеспечивает доступ к операторной информации, типа сообщений об ошибках, имени курсора и информации состояния для обработки инструкции SQL. Прежде, чем прикладная программа сможет представлять на рассмотрение серверу инструкцию SQL, она должна распределить операторный дескриптор, используя SQLAllocHandle (или SQLAllocStmt в MyODBC 2.50):
SQLHSTMT hstmt; SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt) или SQLAllocStmt(hdbc, &hstmt)
Драйвер идентифицирует, которую инструкцию надо использовать при вызове функций ODBC через дескриптор инструкции.
Операторные атрибуты представляют собой характеристики инструкции. Например, они используются, чтобы установить имя курсора для специфической инструкции или задать максимальное количество строк, которые будут выбраны в одной инструкции выборки.
Операторные атрибуты могут быть установлены с помощью SQLSetStmtAttr, а их актуальные параметры настройки можно узнать через вызов SQLGetStmtAttr (SQLSetStmtOption и SQLGetConnectOption соответственно для MyODBC 2.50). Поскольку решительно все операторные атрибуты имеют значения по умолчанию, прикладная программа не обязана их менять, можно оставить все как есть.
MyODBC позволяет прикладной программе представлять на рассмотрение инструкции SQL двумя различными способами:
Подготовленное выполнение представляет собой эффективный способ выполнить инструкцию больше одного раза. Инструкция сначала компилируется в план доступа. План доступа затем будет выполнен столько раз, сколько понадобится.
Подготовленное выполнение более предпочтительно, если прикладная программа:
Подготовленное выполнение главным образом достигнуто через MyODBC API SQLPrepare и SQLExecute. Подготовленная инструкция выполняется быстрее, чем неприготовленная инструкция или прямое выполнение потому, что драйвер компилирует инструкцию, строит для нее план доступа и возвращает идентификатор плана доступа обратно прикладной программе. Драйвер минимизирует затраты времени на обработку инструкции, поскольку он не должен каждый раз строить план доступа. Уменьшается и трафик.
Чтобы подготовить и выполнить инструкцию, прикладная программа:
Пример: этот пример объясняет, как прикладная программа может использовать подготовленное выполнение. Выборка готовит инструкцию INSERT и вставляет 100 строк данных, заменяя буферные значения.
SQLHSTMT hstmt; SQLRETURN retcode; retcode = SQLPrepare(hstmt, "INSERT INTO EMP(ID,NAME) VALUES(?,?)", SQL_NTS); if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) { SQLINTEGER id; SQLCHAR name[30]; /* do the binding for parameter 1, id */ retcode = SQLBindParameter(hstmt,1,SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0,0, &id, 0, NULL); if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) { /* Now do the bindings for parameter 2, name */ retcode = SQLBindParameter(hstmt,1,SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 0,0, name, sizeof(name),NULL); if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) { /* Now insert data by changing id and name buffer values */ for (id=1; id <= 100; id++) { /* Set name as Сmysql1Т, Сmysql2ТЕ */ sprintf(name,Фmysql%dФ,id); retcode = SQLExecute(hstmt); } } } /* Free param buffer resources */ retcode = SQLFreeStmt(hstmt, SQL_REST_PARAMS); }
Прямое выполнение представляет собой самый простой способ выполнить инструкцию. Прямое выполнение обычно используется универсальными прикладными программами, которые формируют и выполняют инструкции во время выполнения. Например, следующий код формирует инструкцию SQL и выполняет ее один раз:
SQLCHAR *statement; // Build an SQL statement. printf("enter the SQL statement:"); scanf("%s",&statement); // Execute the statement. SQLExecDirect (hstmt, statement, SQL_NTS);
Прикладная программа должна выполнить инструкции, используя именно прямое выполнение, если:
Основной недостаток использования прямого выполнения: инструкция SQL анализируется каждый раз, когда выполняется.
Чтобы выполнить инструкцию непосредственно, прикладная программа выполняет следующий набор действий:
Пример:
этот пример объясняет, как прикладная
программа может использовать прямое выполнение. Он создает таблицу,
вставляет, модифицирует и удаляет некоторые строки данных, а в заключение
удаляет всю таблицу.
SQLHSTMT hstmt; SQLRETURN retcode; /* create table as "my_test" with integer and text field */ retcode = SQLExecDirect(hstmt, "CREATE TABLE my_test(id int, name text", SQL_NTS); if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) { printf("table created successfully.."); /* insert 2 rows of data to the table Сmy_testТ */ retcode = SQLExecDirect(hstmt, "INSERT INTO my_test VALUES(10,'mysql')", SQL_NTS); if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) { printf("row 1 inserted successfully.."); } retcode = SQLExecDirect(hstmt,"INSERT INTO my_test VALUES(20,'monty')", SQL_NTS); if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) { printf("row 2 inserted successfully.."); } /* Now update the second row by changing id from 20 to 100 */ retcode = SQLExecDirect(hstmt, "UPDATE my_test SET id=100 WHERE name='monty', SQL_NTS); if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) { SQLINTEGER rowcount; printf("row updated successfully.."); /* Get total number of rows affected by the update statement */ retcode=SQLRowCount(hstmt, &rowcount); printf("total rows affected by the updated statement:%d",rowcount); } /* Now delete the newly updated row */ retcode = SQLExecDirect(hstmt, "DELETE FROM my_test WHERE id=100", SQL_NTS); if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) { SQLINTEGER rowcount; printf("row deleted successfully.."); /* Get total number of rows affected by the delete statement */ retcode=SQLRowCount(hstmt, &rowcount); printf("total rows affected by the delete statement:%d",rowcount); } } /* now drop the table Сmy_testТ */ retcode = SQLExecDirect(hstmt,"DROP TABLE my_test", SQL_NTS); if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) { printf(Уtable dropped successfully); }
Параметром является переменная в инструкции SQL. Инструкция SQL может содержать маркеры параметров ("?"), которые указывают значения, которые драйвер получает из прикладной программы во время выполнения.
Например, прикладная программа могла бы использовать следующую инструкцию, чтобы вставить строку данных в таблицу EMPLOYEE:
INSERT INTO EMPLOYEE (NAME.AGE) VALUES (?,?)
Прикладная программа может использовать маркеры параметров вместо литеральных или постоянных значений в инструкции SQL по следующим причинам:
Чтобы устанавливать значение параметра, прикладная программа просто устанавливает значение переменной, привязанной к этому параметру, используя SQLBindParameter. Неважно, когда это значение установлено, пока это сделано прежде, чем инструкция выполнена. Прикладная программа может устанавливать значение в любое время и менять его столько раз, сколько потребуется.
Когда инструкция выполнена, драйвер просто получает актуальное значение переменной. Это особенно полезно, когда подготовленная инструкция выполнена больше, чем однажды: прикладная программа устанавливает новые значения для некоторых или всех переменных, каждый раз, когда инструкция выполнена.
Если буфер длин использован в вызове SQLBindParameter, он должен быть установлен в одно из следующих значений прежде, чем инструкция выполнена:
Расположения параметров, заданные через SQLBindParameter, останутся привязанными к маркерам параметра до вызова SQLFreeStmt из прикладной программы с опцией SQL_RESET_PARAMS или SQL_DROP. Прикладная программа может связать новое место в памяти с маркером параметра в любое время, вызывая SQLBindParameter. Пример:
SQLUINTEGER id; SQLINTEGER idInd; // Prepare a statement to insert id SQLPrepare(hstmt, "INSERT INTO my_table VALUES(?)", SQL_NTS); // Bind id to the parameter for the id column SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_ULONG, SQL_LONG, 0, 0, &id, 0, &idInd); // Repeatedly execute the statement, to insert 100 rows of data for (id=1; id <= 100; id++) { SQLExecute(hstmt); }
MySQL определяет данные long как любые символьные или двоичные данные, превышающие некий размер, обычно 254 символа. Не всегда реально сохранить в памяти целиком элемент длинных данных. Пример: здоровенный текстовый документ (например, эта книга в типографском формате PostScript) или растровая картинка. А поскольку такие данные не могут быть сохранены в одиночном буфере, прикладная программа посылает их драйверу по частям через SQLPutData, когда инструкция выполнена.
Обратите внимание, что прикладная программа может фактически посылать любой тип данных во времени выполнения с помощью SQLPutData, хотя только символьные и двоичные данные могут быть представлены частями. Однако, если данные достаточно маленькие, чтобы разместиться в одиночном буфере, не имеется вообще никакой причины использовать SQLPutData. Намного проще позволять драйверу получать данные из буфера напрямую.
Когда Вы должны ввести большие количества данных в столбец long varchar или в long varbinary, Вы можете использовать ODBC-функции SQLPutData и SQLParamData, чтобы ввести данные в меньших сегментах. Данные обеспечены в сегментах через SQLPutData, а SQLParamData используется, чтобы проверить требуют ли параметры данных.
Чтобы посылать длинные данные во время выполнения в сегментах, прикладная программа выполняет следующие действия:
Готовит SQL-инструкцию
с маркерами параметра там, где
будут данные long или blob. Используется SQLPrepare.
Устанавливает параметр pcbValue
в функции SQLBindParameter в
значение SQL_DATA_AT_EXEC или SQL_LEN_DATA_AT_EXEC. Это позволяет драйверу
узнать, что Вы будете обеспечивать значения для этого параметра во время
выполнения, используя SQLPutData.
Выполняет команду SQL
. Если инструкция уже подготовлена,
выполняется подготовленная инструкция, используя SQLExecute или
SQLExecDirect. Если имеются любые параметры, которые должны получить данные
во времени выполнения, то драйвер возвращает SQL_NEED_DATA.
Вызывает SQLParamData
в ответ на возврат значения
SQL_NEED_DATA. Если длинные данные должны быть посланы, SQLParamData вернет
SQL_NEED_DATA. В буфере, указанном параметром ValuePtrPtr, драйвер возвращает
значение, которое идентифицирует параметр ожидания данных при выполнении.
Если имеется больше, чем один такой параметр, прикладная программа должна
использовать это значение, чтобы определить, который параметр ожидается.
Заметьте, что данные могут быть запрошены драйвером в любом порядке.
Вызывает SQLPutData:
, чтобы послать данные параметра
драйверу. Если данные параметра не вписываются в одиночный буфер, что часто
имеет место с длинными данными, вызовы SQLPutData из прикладной программы
будут повторяться для передачи последующих порций данных.
Вызывает SQLParamData:
если код возврата равен
SQL_NEED_DATA, следующий параметр, который ожидает данные во время
выполнения, готов их получить, и Вы должны вернуться к шагу 4. Если код
возврата равен SQL_SUCCESS или хотя бы SQL_SUCCESS_WITH_INFO, все данные для
всех параметров, ожидающих данных во время выполнения, посланы, и инструкция
SQL завершила выполнение.Перед выполнением новой инструкции SQL, прикладная программа должна убедиться, что текущие операторные параметры настройки соответствующие. Они включают операторные атрибуты, связанные параметры и наборы результатов. Вообще, параметры и наборы результатов для старой инструкции SQL должны быть освобождены (вызовом SQLFreeStmt с опцией SQL_RESET_PARAMS или SQL_UNBIND).
Когда прикладная программа закончила использовать инструкцию, она вызывает SQLFreeHandle с опцией SQL_HANDLE_STMT или SQLFreeStmt с опцией SQL_DROP, чтобы освободить инструкцию. Вызов SQLDisconnect автоматически освобождает все инструкции для данного подключения.
Функция SQLFreeStmt имеет четыре опции:
Опция | Что она делает |
SQL_CLOSE | Закрывает курсор, если он существует, и отбрасывает ждущие обработки результаты. Прикладная программа может использовать операторный дескриптор позже. |
SQL_DROP | Закрывает курсор, если он существует, отбрасывает ждущие обработки результаты и освобождает все ресурсы, связанные с операторным дескриптором. |
SQL_UNBIND | Освобождает все буфера возвратов, связанные SQLBindCol с операторным дескриптором. |
SQL_RESET_PARAMS | Освобождает все буфера параметров, запрошенные SQLBindParameter для операторного дескриптора. |
Набор результатов представляет собой набор строк, который соответствует некоторым критериям. Когда прикладная программа должна получить данные из базы данных, наиболее общий метод состоит в том, чтобы выполнить запрос, используя инструкции SELECT или SHOW.
В большинстве случаев, когда прикладная программа не уверена, относительно того, вернула ли специфическая инструкция набор результатов, она должна вызвать SQLNumResultCols, чтобы определить число столбцов в наборе результатов. Если это 0, инструкция не создала набор результатов.
Прикладная программа может вызывать SQLNumResultCols в любой момент после того, как инструкция подготовлена или выполнена. Обратите внимание, что если Вы вызываете SQLNumResultCols на подготовленной, но не выполненной инструкции, прикладная программа теряет в эффективности, поскольку драйвер внутренне выполняет подготовленную инструкцию, чтобы вернуть информацию обратно прикладной программе.
ОБРАТИТЕ ВНИМАНИЕ, для инструкций типа INSERT, UPDATE или DELETE вызов SQLRowCount из прикладной программы вернет число строк, на которые воздействует инструкция. Для других инструкций SQL драйвер возвращает любой набор результатов, и код возврата SQLExecute или SQLExecDirect обычно единственный источник информации относительно того, была ли инструкция успешно выполнена.
Прикладные программы требуют метаданных для большинства операций с набором результатов. Например, прикладная программа использует тип данных столбца, чтобы определить, какую переменную связать с этим столбцом. Это использует байт длины символьного столбца, чтобы определить, сколько места нужно, чтобы отобразить данные из этого столбца. Как прикладная программа определяет метаданные для столбца, зависит от типа прикладной программы.
SQLDescribeCol и SQLColAttribute (SQLColAttributes в случае MyODBC 2.50) используются, чтобы получить набор метаданных. Различие между этими двумя функциями в том, что SQLDescribeCol всегда возвращает те же самые пять частей информации (имя столбца, тип данных, точность, масштаб и допустимость null), а вот SQLColAttribute возвращает часть информации, запрошенную прикладной программой. Однако, SQLColAttribute может возвращать намного более богатый набор метаданных, включая чувствительность столбца к регистру, размер отображения, возможность поиска и тому подобное.
Чтобы получить строку данных из набора результатов, прикладная программа:
Данные, выбранные из сервера MySQL, возвращены прикладной программе драйвером в переменных, которые прикладная программа распределила для этой цели. Прежде, чем это может быть выполнено, прикладная программа должна связать эти переменные со столбцами набора результатов, используя SQLBindCol.
Прикладные программы могут связать столько столбцов набора результатов, сколько сочтут нужным. Когда строка данных выбрана, драйвер возвращает данные для связанных столбцов прикладной программе. Данные могут быть выбраны и из несвязанных столбцов, вызывая SQLGetData. Это обычно делается, чтобы получить длинные данные, которые часто превышают длину одиночного буфера, и должны быть получены по частям.
Переменная остается связанной со столбцом до тех пор, пока столбец не будет отвязан явно вызовом SQLBindCol с указателем null в качестве адреса переменной, или пока не вызвана функция SQLFreeStmt с опцией SQL_UNBIND.
Курсор представляет собой инструмент, который позволяет Вам построчно проходить через набор результатов. Прикладные программы могут выполнять много действий на каждой индивидуальной строке в данном наборе результатов. Курсор открыт на наборе результатов выполнением запроса. Курсор в наборе результатов указывает текущую (актуальную) позицию и то, какая строка будет возвращена.
MyODBC поддерживает работу с двумя типами курсоров, а именно с блочным и со скроллируемым.
Прикладная программа может выбирать много строк данных, используя одну инструкцию выборки через блочный курсор. Строки, возвращенные в одиночной выборке с блочным курсором, названы rowset. Важно не путать rowset с набором результатов. Набор результатов поддерживается сервером MySQL, в то время как rowset поддерживается драйвером в буферах прикладных программ. В то время как набор результатов фиксирован, rowset меняет позицию и удовлетворяет каждый раз новому набору строк. Прикладная программа устанавливает размер rowset, используя SQLSetStmtAttr с опцией SQL_ATTR_ROW_ARRAY_SIZE.
MyODBC 3.51 три типа скроллируемых курсоров, используя которые прикладная программа может двигаться в наборе результатов:
Чтобы работать с динамическим курсором, надо проверить опцию "Enable Dynamic Cursor Type" в настройках DSN или передать в строке подключения параметр OPTION=32.
Прикладная программа может устанавливать тип курсора через SQLSetStmtAttr (или SQLSetStmtOption в драйвере MyODBC 2.50) с опцией SQL_ATTR_CURSOR_TYPE. По умолчанию драйвер неявно использует курсор типа "только вперед".
Применяя курсор типа "только вперед", прикладная программа может идти только вперед в наборе результатов и не может вернуться назад. В статическом типе курсора прикладная программа может продвигаться вперед, назад или вообще к любому желательному расположению в наборе результатов.
При использовании скроллируемых курсоров, прикладные программы вызывают SQLFetchScroll (или SQLExtendedFetch для MyODBC 2.50), чтобы установить курсор и строки выборок. SQLFetchScroll поддерживает как относительную (следующая строка, предыдущая строка и переход на n строк), так и абсолютную (первая строка, последняя строка и строка n) прокрутку (скроллинг). Параметры FetchOrientation и FetchOffset в вызове функции SQLFetchScroll определяют, который rowset выбрать.
FetchOrientation | Значение |
SQL_FETCH_NEXT | Вернет следующий rowset. Это эквивалентно вызову SQLFetch. SQLFetchScroll игнорирует значение FetchOffset. |
SQL_FETCH_PRIOR | Вернет предшествующий rowset. SQLFetchScroll игнорирует значение FetchOffset. |
SQL_FETCH_FIRST | Вернет первый rowset в наборе результатов. SQLFetchScroll игнорирует значение FetchOffset. |
SQL_FETCH_LAST | Вернет последний полный rowset в наборе результатов. SQLFetchScroll игнорирует значение FetchOffset. |
SQL_FETCH_ABSOLUTE | Вернет rowset, начинающийся в строке FetchOffset. |
SQL_FETCH_RELATIVE | Вернет FetchOffset строк от начала текущего rowset. |
Обратите внимание, что при использовании типа курсора "только вперед", прикладная программа может только продвигаться на SQL_FETCH_NEXT в то время, как при использовании статических и/или динамических типов можно переходить в любое желательное расположение.
Прикладные программы могут модифицировать или удалять желательные строки в наборе результатов, используя следующий набор обращений ODBC:
SQLSetPos
SQLExecute
или
SQLExecDirect
.Чтобы использовать позиционное удаление или модификацию, прикладная программа должна:
Синтаксис этих инструкций:
UPDATE table-name SET column-identifier = {expression | NULL} [, column-identifier = {expression | NULL}]... WHERE CURRENT OF cursor-name DELETE FROM table-name WHERE CURRENT OF cursor-name
Здесь cursor-name
задает имя курсора, возвращенное
SQLGetCursorName. Пример:
HSTMT hstmtSelect; HSTMT hstmtUpdate; UCHAR szLname[NAME_LEN],szFname[NAME_LEN],cursorName[10]; SWORD cursorLen; SDWORD cbName; /* Allocate the statement handles */ retcode = SQLAllocStmt(hdbc, &hstmtSelect); retcode = SQLAllocStmt(hdbc, &hstmtUpdate); /* SELECT the result set and bind its columns to local storage */ retcode = SQLExecDirect(hstmtSelect, "SELECT lname,fname FROM EMP", SQL_NTS); retcode = SQLBindCol(hstmtSelect, 1, SQL_C_CHAR, szLname, NAME_LEN, &cbLname); retcode = SQLBindCol(hstmtSelect, 2, SQL_C_CHAR, szFname, NAME_LEN, &cbFname); /* get the cursor name */ retcode = SQLGetCursorName(hstmtSelect, cursorName, 10, &cursorLen); /* Position to third row in the result set */ retcode = SQLFetchScroll(hstmtSelect,SQL_FETCH_ABSOLUTE, 3); if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)); /* Perform a positioned update */ sprintf(updsql, "UPDATE EMP SET fname = 'monty' WHERE CURRENT OF %s", cursorName); retcode = SQLExecDirect(hstmtUpdate, updsql, SQL_NTS);
Прикладные программы могут модифицировать или удалять любую строку в текущем (актуальном) rowset, используя SQLSetPos. Это удобный вариант для построения и выполнения инструкции SQL.
SQLSetPos функционирует на текущем (актуальном) rowset и может использоваться только после обращения к SQLFetchScroll или SQLExtendedFetch. Прикладная программа определяет номер строки, которую надо модифицировать, удалить или вставить, и драйвер получает новые данные для этой строки из буферов rowset. SQLSetPos может также использоваться, чтобы обозначить определенную строку как текущую или обновить специфическую строку в rowset из источника данных.
Размер Rowset может быть установлен обращением к SQLSetStmtAttr с опцией SQL_ATTR_ROW_ARRAY_SIZE.
Первая строка в rowset имеет номер 1. Параметр RowNumber в SQLSetPos должен идентифицировать строку в rowset. В смысле, значение должно быть в диапазоне между 1 и числом строк, которые были выбраны в последний раз (что может быть меньше, чем размер rowset). Маленькая хитрость: если RowNumber равен 0, операция будет применяться к каждой строке в rowset.
Модификация строк в rowset:
Операция SQLSetPos с параметром SQL_UPDATE предписыает серверу модифицировать
одну или более выбранных строк таблицы, используя данные в буферах прикладных
программ для каждого связанного столбца.
Чтобы модифицировать строки с SQLSetPos, прикладная программа делает следующее:
После завершения SQLSetPos текущей строкой будет модифицируемая строка. Прикладная программа может проверять общее количество строк, на которые воздействует инструкция update, вызывая SQLRowCount и статус обновления через атрибут SQL_ATTR_ROW_STATUS_PTR.
Удаление строк:
Параметр SQL_DELETE в SQLSetPos предписывает серверу удалить одну или
несколько строк в таблице. Чтобы удалить строки с помощью SQLSetPos,
программа вызывает SQLSetPos с параметром Operation, установленным в
SQL_DELETE и RowNumber равным числу удаляемых строк. Осторожно: если
RowNumber равен 0, будут удалены все строки.
После завершения SQLSetPos, удаленная строка становится текущей, и состояние равно SQL_ROW_DELETED. Строка не может использоваться в любых дальнейших позиционных операциях.
Сервер MySQL поддерживает синтаксис SHOW SQL, чтобы обеспечить информацию относительно баз данных, таблиц, столбцов или состояния сервера. Прикладные программы ODBC могут получать метаинформацию относительно сервера, используя следующие функции каталога:
Функция | Описание |
SQLTables | Возвращает список каталогов (баз данных), таблиц или типы таблиц. |
SQLColumns | Возвращает список столбцов в одной или нескольких таблицах. |
SQLStatistics | Возвращает список статистики относительно одной таблицы. Также возвращает список индексов, связанных с этой таблицей. |
SQLSpecialColumns | Возвращает список столбцов, который уникально идентифицирует строку в одной таблице. Также возвращает список столбцов, которые автоматически модифицируются в этой таблице. |
SQLPrimaryKeys | Возвращает список столбцов, которые составляют первичный ключ в одной таблице. |
SQLForeignKeys | Возвращает список внешних ключей в одной таблице или список внешних ключей в других таблицах, которые обращаются к ней. |
SQLTablePrivileges | Возвращает список привилегий, связанных с таблицей или несколькими таблицами сразу. |
SQLColumnPrivileges | Возвращает список привилегий, связанных с одним или несколькими столбцами только в одной таблице. |
SQLGetTypeInfo | Возвращает список типов данных SQL, поддерживаемых сервером. Эти типы данных используются в командах CREATE TABLE и ALTER TABLE. |
Транзакция представляет собой последовательность инструкций SQL, которые формируют логический модуль. Каждая инструкция SQL в транзакции выполняет часть задачи, и все они необходимы для выполнения некоего задания. Только когда все инструкции SQL в транзакции выполнены успешно, задачу можно обрабатывать как завершенную. Имеется общее управление потоком данных в транзакции:
По умолчанию MyODBC/MySQL работает в режиме autocommit. Это означает, что как только Вы выполняете инструкцию SQL, MySQL сохранит данные на диске: механизм транзакций выключен. Если Вы используете транзакционно-безопасные таблицы (например, BDB или InnoDB), Вы можете перевести MySQL в режим не-autocommit с командой SQL:
SET AUTOCOMMIT=0
Через MyODBC Вы можете устанавливать AUTOCOMMIT в ON или в OFF, используя SQLSetConnectAttr (или SQLSetConnectOption в MyODBC 2.50) с атрибутом SQL_ATTR_AUTOCOMMIT. После этого Вы должны использовать SQLEndTran (или SQLTransact в MyODBC 2.50) для завершения транзакции или ее отмены (если Вы хотите игнорировать изменения, которые Вы сделали, начиная с начала Вашей транзакции), используя опции SQL_COMMIT или SQL_ROLLBACK.
Пример:
прикладная программа делает следующий набор
операций, чтобы показать транзакционное поведение:
Вы можете попробовать сделать то же самое с InnoDB, меняя тип таблицы.
SQLHDBC hdbc; SQLHSTMT hstmt; /* Set AUTOCOMMIT to OFF */ SQLSetConnectOption(hdbc,SQL_AUTOCOMMIT,SQL_AUTOCOMMIT_OFF); /* CREATE TABLE t_tran of TYPE BDB */ SQLExecDirect(hstmt,"drop table if exists t_tran",SQL_NTS); SQLTransact(NULL,hdbc,SQL_COMMIT); SQLExecDirect(hstmt,"create table t_tran(col1 int, col2 varchar(30)) TYPE= BDB",SQL_NTS); SQLTransact(NULL,hdbc,SQL_COMMIT); /* INSERT A ROW OF DATA */ SQLExecDirect(hstmt,"insert into t_tran values(10,'venu')",SQL_NTS); /* Now, commit the insert */ SQLTransact(NULL,hdbc,SQL_COMMIT); /* Again INSERT second row of data */ SQLExecDirect(hstmt,"insert into t_tran values(20,'mysql')",SQL_NTS); /* Rollback the previous INSERT */ SQLTransact(NULL,hdbc,SQL_ROLLBACK); /* Now FETCH bac and check whether it has one row or not. */ SQLFreeStmt(hstmt,SQL_CLOSE); SQLExecDirect(hstmt,"select * from t_tran",SQL_NTS); SQLFetch(hstmt); assert(SQLFetch(hstmt) == SQL_NO_DATA_FOUND); SQLFreeStmt(hstmt,SQL_CLOSE);
Обратите внимание, что если Вы используете драйвер MyODBC 3.51, замените SQLSetConnectOption на SQLSetConnectAttr, а SQLTransact на SQLEndTran.
Все функции в MyODBC возвращают диагностическую информацию двумя способами. Код возврата функции указывает полный успех, сбой или другую релевантную информацию о функции. Если прикладная программа хочет получить детализированную информацию относительно функционального состояния, то диагностические записи это легко обеспечивают. Диагностическая информация используется, чтобы отследить ошибки программирования, типа недопустимых дескрипторов), недопустимой функциональной последовательности и ошибок синтаксиса в инструкциях SQL. Это также используется во время выполнения, чтобы перехватить ошибки во время выполнения программы и предупреждения типа усечения данных, нарушений прав доступа и ошибок синтаксиса в инструкциях SQL, введенных пользователем.
Коды возврата:
каждая функция в ODBC возвращает код,
известный как код возврата. Следующее представляет собой различные коды
возврата, возвращаемые MyODBC.
Код возврата | Описание |
SQL_SUCCESS | Все в порядке. |
SQL_SUCCESS_WITH_INFO | Все в порядке, но некоторая информация возвращается в качетсве предупреждения. Прикладная программа может вызывать SQLGetDiagRec (или SQLError для MyODBC 2.50) или SQLGetDiagField, чтобы получить дополнительную информацию. |
SQL_ERROR | Ошибка: функция провалилась. Прикладная программа может вызывать SQLGetDiagRec (или SQLError для MyODBC 2.50) или SQLGetDiagField, чтобы получить дополнительную информацию. |
SQL_NO_DATA | Данные не могут быть получены (конец набора?). |
SQL_NO_DATA_FOUND | Это синоним для SQL_NO_DATA в случае MyODBC 2.50. |
SQL_INVALID_HANDLE | Недопустимый дескриптор был обнаружен. Это указывает на ошибку программирования. |
SQL_NEED_DATA | Драйвер указывает, что прикладная программа должна послать значения данных в качестве параметра времени выполнения. |
Когда происходит ошибка в прикладной программе, то есть когда функция возвратит SQL_ERROR или SQL_SUCCESS_WITH_INFO, прикладная программа может запрашивать диагностическую информацию, вызывая функции SQLGetDiagRec или SQLGetDiagField из драйвера. В MyODBC 2.50 прикладная программа может использовать SQLError для выполнения этой работы. При использовании драйвера MyODBC 3.51, прикладная программа может запрашивать большее количество диагностических записей, используя SQLGetDiagField.
Применение SQLGetDiagRec и SQLGetDiagField:
Как описано в предыдущем разделе, прикладные программы вызывают SQLGetDiagRec
или SQLGetDiagField, чтобы получить диагностическую информацию в случае
драйвера MyODBC 3.51. Эти функции принимают среду, подключение, инструкцию
или дескриптор и возвращают диагностику из функции, которая последней
использовала этот дескриптор.
Прикладные программы получают индивидуальные диагностические поля, вызывая SQLGetDiagField и определяя поле, которое надо получить. Некоторые поля не имеют никакого значения для определенных типов дескрипторов.
Прикладные программы получают и SQLSTATE, местный код ошибки и диагностическое сообщение в одном обращении, вызывая SQLGetDiagRec.
Пример: рассмотрим для примера ситуацию, где пользователь пробует удалить несуществующую таблицу, драйвер возвращает SQL_ERROR, а прикладная программа может выбирать диагностическую информацию, используя вызов функции SQLGetDiagRec.
SQLCHAR SqlState[6], SQLCHAR ErrorMsg[SQL_MAX_MESSAGE_LENGTH]; SQLINTEGER NativeError; SQLSMALLINT MsgLen; SQLRETURN sql_return, diag_return; SQLHSTMT hstmt; // Drop a non-existing table sql_return=SQLExecDirect(hstmt, "DROP TABLE NON_EXISTANT_TABLES^&*", SQL_NTS); if (sql_return == SQL_SUCCESS_WITH_INFO || sql_return == SQL_ERROR) { // Get the diag information. Diag_return = SQLGetDiagRec(SQL_HANDLE_STMT, hstmt, 1, SqlState, &NativeError, ErrorMsg, sizeof(ErrorMsg), &MsgLen); if (diag_return != SQL_NO_DATA) { DisplayError(SqlState,NativeError,Msg,MsgLen); } }
Эта глава руководства описывает каждую функцию (синтаксис, параметры и использование). Каждая функция определена как функция языка программирования C. Описания включают следующее:
ОБРАТИТЕ ВНИМАНИЕ:
вообще все функции API возвращают
следующие коды возврата:
Функции работы с набором результатов, например, SQLFetch, SQLFetchScroll,
SQLGetData также умеют возвращать значения SQL_NO_DATA
или
SQL_NO_DATA_FOUND
. А функции SQLExecute, SQLExecDirect и
SQLParamData моугт возвращать SQL_NEED_DATA
как код возврата
при поставке длинных данных порциями.
Прикладная программа может вызывать функцию SQLGetInfo, чтобы получить информацию соответствия относительно MyODBC. Чтобы получать информацию относительно поддержки специфической функции в драйвере, прикладная программа может вызывать SQLGetFunctions. Обратите внимание, что драйвер MyODBC 3.51 для обратной совместимости поддерживает все устаревшие функции. Имеется список MyODBC API, сгруппированый исходя из задач:
Задача | Имя функции | MyODBC | MyODBC 3.51 | Соответствие | Назначение |
Соединение с источником данных | SQLAllocHandle | Нет | Да | ISO 92 | Получает среду, подключение, инструкцию, или дескриптор. |
SQLConnect | Да | Да | ISO 92 | Подключается к указанному драйверу, используя имя источника данных, user ID и password. | |
SQLDriverConnect | Да | Да | ODBC | Подключается к указанному драферу, используя строку подключения или запрос, чтобы Driver Manager отобразил диалоговое окно подключения. | |
SQLAllocEnv | Да | Да | Устарела | Получает дескриптор среды, распределенный из драйвера. | |
SQLAllocConnect | Да | Да | Устарела | Получает дескриптор подключения. | |
Получение информации относительно драйвера и источника данных | SQLDataSources | Нет | Нет | ISO 92 | Возвращает список доступных источников данных, обработанных Driver Manager. |
SQLDrivers | Нет | Нет | ODBC | Возвращает список установленных драйверов и их атрибутов, обработанных Driver Manager | |
SQLGetInfo | Да | Да | ISO 92 | Возвращает информацию относительно специфического драйвера и источника данных. | |
SQLGetFunctions | Да | Да | ISO 92 | Возвращает перечень функций, поддерживаемых драйвером. | |
SQLGetTypeInfo | Да | Да | ISO 92 | Возвращает информацию относительно поддерживаемых типов данных. | |
Установка и получение атрибутов драйвера. | SQLSetConnectAttr | Нет | Да | ISO 92 | Устанавливает атрибуты связи. |
SQLGetConnectAttr | Нет | Да | ISO 92 | Возвращает значение атрибута подключения. | |
SQLSetConnectOption | Да | Да | Устарела | Устанавливает опции подключения. | |
SQLGetConnectOption | Да | Да | Устарела | Возвращает значение опции подключения. | |
SQLSetEnvAttr | Нет | Да | ISO 92 | Устанавливает атрибут среды. | |
SQLGetEnvAttr | Нет | Да | ISO 92 | Возвращает значение атрибута среды. | |
SQLSetStmtAttr | Нет | Да | ISO 92 | Устанавливает операторный атрибут. | |
SQLGetStmtAttr | Нет | Да | ISO 92 | Возвращает значение операторного атрибута. | |
SQLSetStmtOption | Да | Да | Устарела | Устанавливает операторную опцию. | |
SQLGetStmtOption | Да | Да | Устарела | Возвращает значение операторной опции. | |
Подготовка SQL-запросов. | SQLAllocStmt | Да | Да | Устарела | Распределяет операторный дескриптор. |
SQLPrepare | Да | Да | ISO 92 | Готовит инструкцию SQL для более позднего выполнения. | |
SQLBindParameter | Да | Да | ODBC | Назначает память параметру в инструкции SQL. | |
SQLGetCursorName | Да | Да | ISO 92 | Возвращает имя курсора, связанное с операторным дескриптором. | |
SQLSetCursorName | Да | Да | ISO 92 | Определяет имя курсора. | |
SQLSetScrollOptions | Да | Да | ODBC | Устанавливает параметры, управляющие поведением курсора. | |
Передача запросов на рассмотрение | SQLExecute | Да | Да | ISO 92 | Выполняет подготовленную инструкцию. |
SQLExecDirect | Да | Да | ISO 92 | Выполняет инструкцию SQL. | |
SQLNativeSql | Да | Да | ODBC | Возвращает текст инструкции SQL для трансляции драйверу. | |
SQLDescribeParam | Да | Да | ODBC | Возвращает описание для специфического параметра в инструкции. | |
SQLNumParams | Да | Да | ISO 92 | Возвращает число параметров в инструкции. | |
SQLParamData | Да | Да | ISO 92 | Использован вместе с SQLPutData, чтобы обеспечить передачу данных для параметров во время выполнения (полезно для длинных значений данных). | |
SQLPutData | Да | Да | ISO 92 | Посылает часть или все данные для параметра (полезно для длинных значений данных). | |
Получение результатов и информации относительно результатов. | SQLRowCount | Да | Да | ISO 92 | Возвращает число строк, на которые воздействует запрос типа insert, update или delete. |
SQLNumResultCols | Да | Да | ISO 92 | Возвращает число столбцов в наборе результатов. | |
SQLDescribeCol | Да | Да | ISO 92 | Описывает столбец в наборе результатов. | |
SQLColAttribute | Нет | Да | ISO 92 | Описывает атрибуты столбца в наборе результатов. | |
SQLColAttributes | Да | Да | Устарела | Описывает атрибуты столбца в наборе результатов. | |
SQLFetch | Да | Да | ISO 92 | Возвращает много строк результата. | |
SQLFetchScroll | Нет | Да | ISO 92 | Возвращает скроллируемые строки результата. | |
SQLExtendedFetch | Да | Да | Устарела | Возвращает скроллируемые строки результата. | |
SQLSetPos | Да | Да | ODBC | Устанавливает курсор внутри выбранного блока данных и позволяет прикладной программе обновить данные в rowset, модифицировать или удалять данные в наборе результатов. | |
SQLBulkOperations | Нет | Да | ODBC | Выполняет оптовые вставки и закладки, включая update, delete и выборку по закладке. | |
Получение ошибок или диагностической информации | SQLError | Да | Да | Устарела | Возвращает дополнительную информацию состояния или ошибки. |
SQLGetDiagField | Да | Да | ISO 92 | Возвращает дополнительную информацию диагностики (одиночное поле диагностической структуры данных). | |
SQLGetDiagRec | Да | Да | ISO 92 | Возвращает дополнительную информацию диагностики (много полей диагностической структуры данных). | |
Получение информации относительно системных таблиц источника данных. | SQLColumnPrivileges | Да | Да | ODBC | Возвращает список столбцов и связанных привилегий для одной или нескольких таблиц. |
SQLColumns | Да | Да | X/Open | Возвращает список имен столбцов в определенных таблицах. | |
SQLForeignKeys | Да | Да | ODBC | Возвращает список имен столбцов, которые составляют внешние ключи, если они существуют для определенной таблицы. | |
SQLPrimaryKeys | Да | Да | ODBC | Возвращает список имен столбцов, которые составляют первичный ключ для таблицы. | |
SQLSpecialColumns | Да | Да | X/Open | Возвращает информацию относительно оптимального набора столбцов, который уникально идентифицирует строку в определенной таблице, или столбцов, которые автоматически модифицируются, когда любое значение в строке модифицируется транзакцией. | |
SQLStatistics | Да | Да | ISO 92 | Статистика относительно одной таблицы и списка индексов, связанных с таблицей. | |
SQLTablePrivileges | Да | Да | ODBC | Возвращает список таблиц и привилегий, связанных с каждой таблицей. | |
SQLTables | Да | Да | X/Open | Возвращает список имен таблиц, сохраненных в специфическом источнике данных. | |
Выполнение транзакций. | SQLTransact | Да | Да | Устарела | Завершает или отменяет транзакцию. |
SQLEndTran | Нет | Да | ISO 92 | Завершает или отменяет транзакцию. | |
Прерывание команд. | SQLFreeStmt | Да | Да | ISO 92 | Заканчивает обработку инструкции, отбрасывает ждущие обработки результаты и, факультативно, освобождает все ресурсы, связанные с операторным дескриптором. |
SQLCloseCursor | Да | Да | ISO 92 | Закрывает курсор, который был открыт на операторном дескрипторе. | |
SQLCancel | Да | Да | ISO 92 | Отменяет инструкцию SQL. | |
Прерывание соединения. | SQLDisconnect | Да | Да | ISO 92 | Закрывает подключение. |
SQLFreeHandle | Нет | Да | ISO 92 | Освобождает дескрипторы среды, подключения и инструкции. | |
SQLFreeConnect | Да | Да | Устарела | Освобождает дескриптор подключения. | |
SQLFreeEnv | Да | Да | Устарела | Освобождает дескриптор среды. |
Этот раздел описывает, как устаревшие функции отображены ODBC 3.x Driver Manager, чтобы гарантировать обратную совместимость с MyODBC 2.50. Driver Manager выполняет это отображение независимо от версии прикладной программы. Поскольку каждая функция ODBC 2.x в следующем списке отображена к соответствующей функции ODBC 3.x, драйвер MyODBC 3.51 не должен выполнять функции ODBC 2.x вообще. Но ради прикладных программ, которые работают напрямую с драйвером в обход Driver Manager MyODBC 3.51 поддерживает все функции из версий 2.x.
Следующая таблица вносит в список все дублированные функции, которые представлены в драйвере MyODBC 3.51:
Функция ODBC 2.x | Функция ODBC 3.x |
SQLAllocConnect | SQLAllocHandle с SQL_HANDLE_DBC |
SQLAllocEnv | SQLAllocHandle с SQL_HANDLE_ENV |
SQLAllocStmt | SQLAllocHandle с SQL_HANDLE_STMT |
SQLColAttributes | SQLColAttribute |
SQLError | SQLGetDiagRec |
SQLFreeConnect | SQLFreeHandle с SQL_HANDLE_DBC |
SQLFreeEnv | SQLFreeHandle с SQL_HANDLE_ENV |
SQLFreeStmt with SQL_DROP | SQLFreeHandle с SQL_HANDLE_STMT |
SQLSetConnectOption | SQLSetConnectAttr |
SQLGetConnectOption | SQLGetConnectAttr |
SQLSetStmtAttr | SQLSetStmtAttr |
SQLGetStmtAttr | SQLGetStmtAttr |
SQLParamOptions | SQLSetStmtAttr |
SQLSetScrollOption | SQLSetStmtAttr |
SQLTransact | SQLEndTran |
SQLAllocHandle распределяет среду, подключение, инструкцию и дескриптор.
Обратите внимание, что это универсальная функция для распределения дескрипторов, которая заменяет функции SQLAllocConnect, SQLAllocEnv и SQLAllocStmt из ODBC 2.0. Чтобы позволить работать прикладным программам, вызывающим SQLAllocHandle, вызов SQLAllocHandle отображен в Driver Manager на SQLAllocConnect, SQLAllocEnv или SQLAllocStmt.
SQLRETURN SQLAllocHandle(SQLSMALLINT HandleType, SQLHANDLE InputHandle, SQLHANDLE* OutputHandlePtr);
HandleType[Input]
задает тип дескриптора, который будет
распределен SQLAllocHandle. Должно быть одним из следующих значений:
SQL_HANDLE_ENV, SQL_HANDLE_DBC, SQL_HANDLE_STMT или SQL_HANDLE_DESC
(не поддерживается драйвером).
InputHandle[Input]
задает в каком контексте новый дескриптор
должен быть распределен. Если HandleType равен SQL_HANDLE_ENV, это будет
SQL_NULL_HANDLE. Если HandleType равен SQL_HANDLE_DBC, это должен быть
дескриптор среды, и HandleType равен SQL_HANDLE_STMT или SQL_HANDLE_DESC, это
будет дескриптор подключения.
OutputHandlePtr[Output]
указывает на буфер, чтобы вернуть
дескриптор недавно распределенной структуры данных.
SQLAllocHandle
используется, чтобы распределить дескрипторы
для сред, подключений и инструкций, как описано в следующих разделах.
Обратите внимание
, что MyODBC не поддерживает описатели.
Сколько угодно дескрипторов могут быть распределены прикладной программой одновременно, если драйвер поддерживает многократные распределения. В MyODBC никакое ограничение не определено на число дескрипторов, которые могут быть распределены в любой момент времени.
Если вызов с *OutputHandlePtr определяет дескриптор, который уже определен, он будет просто переопределен.
Обратите внимание
, что это является неправильным ODBC
программированием! Нельзя дважды вызывать SQLAllocHandle
с той
же самой переменной прикладной программы, определенной для *OutputHandlePtr
без того, чтобы вызвать SQLFreeHandle
, чтобы освободить
дескриптор перед его перераспределением. Перезапись ODBC-дескриптора таким
способом может привести к противоречивому поведению или сбою.
SQLAllocHandle
не устанавливает атрибут среды
SQL_ATTR_ODBC_VERSION, когда вызван, чтобы распределить дескриптор среды:
атрибут среды должен быть установлен прикладной программой или будет
возвращена SQLSTATE HY010 (Function sequence error), когда SQLAllocHandle
вызвана, чтобы распределить дескриптор подключения.
Распределение дескриптора среды:
Дескриптор среды обеспечивает доступ к глобальной информации типа имеющих
силу и активных дескрипторов подключения.
Распределение дескриптора подключения:
Дескриптор подключения обеспечивает доступ к информации типа имеющих силу
операторных дескрипторов подключения и открытых в настоящее время транзакций.
Распределение операторного дескриптора:
Операторный дескриптор обеспечивает доступ к операторной информации, типа
сообщений об ошибках, имени курсора и информации состояния для
обработки инструкции SQL.
SQLAllocEnv распределяет память для дескриптора среды.
SQLRETURN SQLAllocEnv(HENV* EnvironmentHandle);
В ODBC 3.x SQLAllocHandle заменила функцию SQLAllocEnv из ODBC 2.x.
SQLAllocConnect распределяет память для дескриптора подключения.
SQLRETURN SQLAllocConnect(HENV EnvironmentHandle, HDBC* ConnectionHandle);
В ODBC 3.x SQLAllocHandle заменила функцию SQLAllocConnect из ODBC 2.x.
SQLConnect устанавливает связи с драйвером и источником данных. Дескриптор подключения ссылается на адрес в памяти всей информации относительно подключению к источнику данных, включая состояние подключения и транзакции, а также информацию об ошибках.
SQLRETURN SQLConnect(SQLHDBC ConnectionHandle, SQLCHAR* ServerName, SQLSMALLINT NameLength1, SQLCHAR* UserName, SQLSMALLINT NameLength2, SQLCHAR* Authentication, SQLSMALLINT NameLength3);
ConnectionHandle[Input]
дескриптор подключения.
ServerName[Input]
имя источника данных.
NameLength1[Input]
длина *ServerName.
UserName[Input]
User id.
NameLength2[Input]
длина *UserName.
Authentication[Input]
строка авторизации (обычно это пароль).
NameLength3[Input]
длина *Authentication.
Подробно использование данной функции описано в разделе "3.4.5 Установление подключения, используя MyODBC".
SQLDriverConnect является альтернативой SQLConnect. Это поддерживает источники данных, которые требуют большего количества информации подключения чем три параметра в SQLConnect, диалоговые окна, чтобы запросить пользователя относительно всей информации о подключении, и источники данных, которые не определены в информации системы.
SQLDriverConnect обеспечивает следующие возможности подключения:
После того, как подключение установлено, SQLDriverConnect вернет завершенную строку подключения. Прикладная программа может использовать ее для выполнения последующих запросов подключения.
SQLRETURN SQLDriverConnect(SQLHDBC ConnectionHandle, SQLHWND WindowHandle, SQLCHAR* InConnectionString, SQLSMALLINT StringLength1, SQLCHAR* OutConnectionString, SQLSMALLINT BufferLength, SQLSMALLINT* StringLength2Ptr, SQLUSMALLINT DriverCompletion);
ConnectionHandle [Input]
дескриптор подключения.
WndowHandle [Input]
дескриптор окна. Прикладная программа
может передавать дескриптор родительского окна, если оно есть, или null,
если дескриптор окна не существует.
InConnectionString [Input]
полное подключение, частичная
строка подключения или пустая строка.
StringLength1 [Input]
длина *InConnectionString в байтах.
OutConnectionString [Output]
указатель на буфер для
завершенной строки подключения. При успешном подключении к целевому источнику
данных этот буфер содержит завершенную строку подключения. Прикладные
программы должны распределить по крайней мере 1024 байта для этого буфера.
BufferLength [Input]
длина буфера *OutConnectionString.
StringLength2Ptr [Output]
указатель на буфер, предназанченный
чтобы возвращать общее количество символов (кроме завершающего нуля) в
*OutConnectionString. Если число символов, доступное для возврата, больше или
равно BufferLength, завершенная строка подключения в *OutConnectionString
будет обрезана до BufferLength.
DriverCompletion [Input]
указывает должен ли Driver Manager
запросить дополнительную информацию для подключения: SQL_DRIVER_PROMPT,
SQL_DRIVER_COMPLETE, SQL_DRIVER_COMPLETE_REQUIRED или SQL_DRIVER_NOPROMPT.
Не поддерживается
.
SQLDataSources возвращает информацию относительно источника данных. Эта функция выполнена исключительно в Driver Manager. Для получения большего количества информации относительно этого API обратитесь к документации на соответствующий Driver Manager.
SQLDrivers вносит в список описания драйверов и ключевые слова атрибутов драйверов. Эта функция выполнена исключительно Driver Manager. Для получения большего количества информации относительно этого API обратитесь к документации на соответствующий Driver Manager.
SQLGetInfo возвращает общую информацию относительно драйвера и сервера, связанных с подключением.
4.4.3.1 Синтаксис
SQLRETURN SQLGetInfo(SQLHDBC ConnectionHandle, SQLUSMALLINT InfoType, SQLPOINTER InfoValuePtr, SQLSMALLINT BufferLength, SQLSMALLINT* StringLengthPtr);
ConnectionHandle [Input]
дескриптор подключения.
InfoType [Input]
тип информации, описанной в разделе
комментариев.
InfoValuePtr [Output]
указатель на буфер, предназначенный
чтобы возвращать информацию. В зависимости от запрошенного InfoType,
возвращенная информация будет одним из следующего: символьная строка с
нулевым символом в конце, значение SQLUSMALLINT, битовая маска SQLUINTEGER,
флажок (параметр) SQLUINTEGER или двоичное значение SQLUINTEGER.
Если параметр InfoType равен SQL_DRIVER_HDESC или SQL_DRIVER_HSTMT, параметр InfoValuePtr является вводом и выводом.
BufferLength [Input]
длина буфера *InfoValuePtr. Если
значение в *InfoValuePtr не является символьной строкой, или InfoValuePtr
представляет собой null, параметр BufferLength игнорируется. Драйвер
принимает, что размер *InfoValuePtr равен SQLUSMALLINT или SQLUINTEGER,
исходя из InfoType. Если *InfoValuePtr является строкой в формате Unicode
(при вызове SQLGetInfoW), параметр BufferLength должен быть четным числом,
если это не так, будет возвращена ошибка SQLSTATE HY090 (Invalid string
or buffer length).
StringLengthPtr [Output]
указатель на буфер предназначенный
для того, чтобы возвращать общее количество байт (за вычетом хвостовых нулей
для символьных данных), доступных в *InfoValuePtr.
Для символьных данных, если число доступных байтов больше или равно BufferLength, информация в *InfoValuePtr обрезается до размера BufferLength.
Для всех других типов данных значение BufferLength игнорируется, и драйвер принимает, что размер *InfoValuePtr равен SQLUSMALLINT или SQLUINTEGER в зависимости от InfoType.
SQLGetFunctions возвращает информацию относительно того, поддерживает ли драйвер специфическую функцию ODBC.
4.4.4.1 Синтаксис
SQLRETURN SQLGetFunctions(SQLHDBC ConnectionHandle, SQLUSMALLINT FunctionId, SQLUSMALLINT* SupportedPtr);
ConnectionHandle [Input]
дескриптор подключения.
FunctionId [Input]
SQL_API_ODBC3_ALL_FUNCTIONS или
SQL_API_ALL_FUNCTIONS.
SQL_API_ODBC3_ALL_FUNCTIONS используется прикладными программами ODBC 3.x, чтобы определить поддержку ODBC 3.x и более ранних функций. SQL_API_ALL_FUNCTIONS используется прикладными программами ODBC 2.x, чтобы определить поддержку ODBC 2.x. Прикладная программа может передавать индивидуальный функциональный идентификатор, чтобы определить поддерживает ли драйвер функцию или нет.
SupportedPtr [Output]
если FunctionId идентифицирует
одиночную функцию ODBC, SupportedPtr указывает на одиночное значение
SQLUSMALLINT, которое является SQL_TRUE, если определенная функция поддержана
драйвером, или SQL_FALSE в противном случае.
Если FunctionId равно SQL_API_ODBC3_ALL_FUNCTIONS, SupportedPtr указывает на массив SQLSMALLINT с рядом элементов, равных SQL_API_ODBC3_ALL_FUNCTIONS_SIZE. Прикладная программа ODBC 3.x может вызывать SQLGetFunctions с SQL_API_ODBC3_ALL_FUNCTIONS.
Если FunctionId равно SQL_API_ALL_FUNCTIONS, SupportedPtr указывает на массив SQLSMALLINT ровно из 100 элементов. Элемент равен SQL_TRUE, если он идентифицирует ODBC 2.x или более раннюю функцию, поддержанную драйвером. Элемент массива будет равен SQL_FALSE, если он идентифицирует функцию ODBC, не поддержанную драйвером, или не идентифицирует функцию ODBC вообще.
Массивы, возвращенные в *SupportedPtr используют индексацию, начиная с 0.
SQLGetTypeInfo возвращает информацию относительно типов данных, поддержанных сервером. Драйвер возвращает информацию в форме набора результатов SQL. Типы данных предназначены для использования в инструкциях Data Definition Language (DDL). Прикладные программы должны использовать имена типов, возвращенные в столбце TYPE_NAME набора результатов SQLGetTypeInfo. Для команд ALTER TABLE и CREATE TABLE возможен возврат больше, чем одной строки с тем же самым значением в DATA_TYPE столбце.
SQLRETURN SQLGetTypeInfo(SQLHSTMT StatementHandle, SQLSMALLINT DataType);
StatementHandle [Input]
операторный дескриптор
для набора результатов.
DataType [Input]
SQL-тип данных. SQL_ALL_TYPES определяет,
что должна быть возвращена информация относительно всех типов данных.
SQLSetConnectAttr устанавливает атрибуты, которые управляют аспектами подключений.
SQLRETURN SQLSetConnectAttr(SQLHDBC ConnectionHandle, SQLINTEGER Attribute, SQLPOINTER ValuePtr, SQLINTEGER StringLength);
ConnectionHandle [Input]
дескриптор подключения.
Attribute [Input]
атрибут для установки.
ValuePtr [Input]
указатель на значение, которое будет связано
с атрибутом. В зависимости от значения атрибута, ValuePtr будет 32-разрядным
целым числом без знака или указателем на строку символов с нулем в конце.
Обратите внимание, что если параметр Attribute представляет собой
специфическое для драйвера значение, то ValuePtr может быть целым
числом со знаком.
StringLength [Input]
если Attribute определен в ODBC и
ValuePtr указывает на строку или на двоичный буфер, этот параметр должен
быть длиной *ValuePtr. Если Attribute определен в ODBC и ValuePtr является
целым числом, StringLength игнорируется.
Имеется список атрибутов подключения, которые поддержаны драйвером MyODBC 3.51:
Атрибут | Содержимое ValuePtr |
SQL_ATTR_ACCESS_MODE | Значение SQLUINTEGER, и драйвер не позволяет пользователю устанавливать этот атрибут во что-либо, кроме SQL_MODE_READ_WRITE. |
SQL_ATTR_ASYNC_ENABLE | Значение SQLUINTEGER, которое определяет асинхронное выполнение. Драйвер не поддерживает асинхронное выполнение, так что это можно устанавливать только в SQL_ASYNC_ENABLE_OFF. |
SQL_ATTR_AUTO_IPD | Значение SQLUINTEGER только для чтения, драйвер возвращает значение по умолчанию как SQL_FALSE. |
SQL_ATTR_AUTOCOMMIT | Значение SQLUINTEGER, которое определяет
использовать ли autocommit или ручной режим: SQL_AUTOCOMMIT_OFF: драйвер работает в ручном режиме, и прикладная программа должна явно заверишть или отменить каждую транзакцию через SQLEndTran. SQL_AUTOCOMMIT_ON: драйвер работает в режиме autocommit. Каждая инструкция выполняется сразу после передачи. Это значение по умолчанию. Любые открытые транзакции на подключении автоматически закрываются при смене SQL_ATTR_AUTOCOMMIT на SQL_AUTOCOMMIT_ON. |
SQL_ATTR_CONNECTION_DEAD | Значение SQLUINTERGER, которое указывает состояние подключения. Если это SQL_CD_TRUE, связь прервана. Если это SQL_CD_FALSE, подключение все еще активно. |
SQL_ATTR_CONNECTION_TIMEOUT | Значение SQLUINTEGER, соответствующее числу секунд, которое надо ждать любой запрос на подключении перед возвратом прикладной программе. Драйвер должен возвратить SQLSTATE HYT00 (Timeout expired) по окончании тайм-аута. Если ValuePtr равно 0 (значение по умолчанию), не имеется никакого времени ожидания. |
SQL_ATTR_CURRENT_CATALOG | Символьная строка, содержащая имя каталога, который нужно использовать как источник данных. Например, в SQL Server каталог является базой данных, так что драйвер посылает инструкцию USE источнику данных, где база данных определена в *ValuePtr. |
SQL_ATTR_LOGIN_TIMEOUT | Значение SQLUINTEGER, соответствующее числу секунд, которое надлежит ждать при входе в систему перед возвратом прикладной программе. Значение по умолчанию зависит от драйвера. Если ValuePtr равно 0, время ожидания заблокировано, и попытка подключения будет ждать неопределенное время. Если определенное время ожидания превышает максимальное время ожидания входа в систему в источнике данных, значение из драйвера имеет приоритет, при этом драйвер вернет SQLSTATE 01S02 (Option value changed). |
SQL_ATTR_METADATA_ID | Значение SQLUINTEGER, которое определяет как обрабатываются строковые параметры каталожных функций. Драйвер пока поддерживает только SQL_FALSE. |
SQL_ATTR_ODBC_CURSORS | Значение SQLUINTEGER, определяющее, как Driver Manager использует библиотеку курсоров ODBC. |
SQL_ATTR_PACKET_SIZE | Значение SQLUINTEGER, определяющее сетевой размер пакета в байтах. |
SQL_ATTR_QUIET_MODE | 32-битный дескриптор окна (hwnd). Если он представляет собой null, драйвер не отображает никакие диалоговые окна. Если дескриптор окна не null, это должно быть родительским дескриптором окна прикладной программы. Это значение по умолчанию. Драйвер использует этот дескриптор, чтобы отобразить диалоговые окна. |
SQL_ATTR_TRACE | Значение SQLUINTEGER, сообщающее Driver
Manager, выполнять ли трассировку: SQL_OPT_TRACE_OFF: трассировка выключена (по умолчанию), SQL_OPT_TRACE_ON: трассировка включена. |
SQL_ATTR_TRACEFILE | Символьная строка с нулевым символом в конце, содержащая имя файла трассировки. |
SQL_ATTR_TRANSLATE_LIB | Символьная строка с нулевым символом в конце, содержащая имя библиотеки, содержащей функции SQLDriverToDataSource и SQLDataSourceToDriver, к которым драйвер обращается, чтобы выполнить задачи трансляции набора символов. |
SQL_ATTR_TRANSLATE_OPTION | 32-битный параметр, который передано к трансляции DLL. |
SQL_ATTR_TXN_ISOLATION | 32-битная маска, которая устанавливает уровень изоляции транзакции для текущего подключения. Прикладная программа должна вызвать SQLEndTran для завершения или отмены всех открытых транзакций на подключении перед вызовом SQLSetConnectAttr с этой опцией. Имеющие силу значения для ValuePtr могут быть определены, вызывая SQLGetInfo с InfoType равным SQL_TXN_ISOLATION_OPTIONS. |
SQLGetConnectAttr возвращает текущую установку некоего атрибута подключения.
SQLRETURN SQLGetConnectAttr(SQLHDBC ConnectionHandle, SQLINTEGER Attribute, SQLPOINTER ValuePtr, SQLINTEGER BufferLength, SQLINTEGER* StringLengthPtr);
ConnectionHandle [Input]
дескриптор подключения.
Attribute [Input]
интересующий атрибут.
ValuePtr [Input]
указатель на память предназначенный, чтобы
возвращать текущее значение атрибута.
BufferLength [Input]
Если Attribute представляет собой
ODBC-атрибут и ValuePtr указывает на символьную строку или двоичный буфер,
этот параметр должен быть длиной *ValuePtr. Если же *ValuePtr не указатель, а
целое число, BufferLength игнорируется.
StringLengthPtr [Output]
указатель на буфер предназначенный,
чтобы возвращать общее количество байт, доступных в *ValuePtr (кроме нулевых
символов в конце). Если *ValuePtr равен null, длина не возвращена. Если
значением атрибута является символьная строка, и число байт больше
BufferLength, данные в *ValuePtr обрезаются до BufferLength.
В ODBC 3.x SQLSetConnectAttr заменяет SQLSetConnectOption.
В ODBC 3.x SQLGetConnectAttr заменяет SQLGetConnectOption.
SQLSetEnvAttr устанавливает атрибуты, которые управляют аспектами сред.
SQLRETURN SQLSetEnvAttr(SQLHENV EnvironmentHandle, SQLINTEGER Attribute, SQLPOINTER ValuePtr, SQLINTEGER StringLength);
EnvironmentHandle [Input]
дескриптор среды.
Attribute [Input]
атрибут для установки.
ValuePtr [Input]
указатель на значение, которое будет связано
с Attribute. В зависимости от значения Attribute, ValuePtr будет 32-битным
целочисленным значением или указателем на символьную строку с
нулевым символом в конце.
StringLength [Input]
: если ValuePtr указатель на символьную
строку с нулевым символом в конце или на двоичный буфер, здесь хранится длина
*ValuePtr. Если ValuePtr представляет собой целое число,
StringLength игнорируется.
Прикладная программа может вызывать SQLSetEnvAttr только, если никакой дескриптор подключения не распределен в текущей среде. Все атрибуты среды устанавливаются прикладной программой до обращения SQLFreeHandle. Следующая таблица вносит в список различные атрибуты среды, поддержанные драйвером:
Атрибут | Содержимое ValuePtr |
SQL_ATTR_CONNECTION_POOLING | 32-битное значение SQLUINTEGER, которое включает или отключает объединение подключений. |
SQL_ATTR_CP_MATCH | 32-битное значение SQLUINTEGER, которое определяет как подключение выбрано из объединения подключений. Обратитесь к документации на конкретный Driver Manager за подробностями. |
SQL_ATTR_ODBC_VERSION | 32-битное целое значение, которое
определяет проявляют ли функциональные возможности поведение ODBC 2.x или
ODBC 3.x. Следующие значения используются, чтобы установить значение этого
атрибута: SQL_OV_ODBC3 и SQL_OV_ODBC2 . |
SQL_ATTR_OUTPUT_NTS | 32-битное целое значение, которое определяет как драйвер возвращает строчные данные. Если SQL_TRUE, драйвер возвращает строки с нулевым символом в конце. Если SQL_FALSE, драйвер этого не делает. Сейчас драйвер поддерживает только значение по умолчанию SQL_TRUE. |
SQLGetEnvAttr возвращает текущую установку атрибута среды.
SQLRETURN SQLGetEnvAttr(SQLHENV EnvironmentHandle, SQLINTEGER Attribute, SQLPOINTER ValuePtr, SQLINTEGER BufferLength, SQLINTEGER* StringLengthPtr);
EnvironmentHandle [Input]
дескриптор среды.
Attribute [Input]
атрибут, значение которого нужно получить.
ValuePtr [Output]
указатель на буфер нужный, чтобы возвращать
текущее значение атрибута, определенного Attribute.
BufferLength [Input]
если ValuePtr указывает на символьную
строку, этот параметр должен быть длиной *ValuePtr. Если *ValuePtr целое
число, BufferLength игнорируется. Если значение атрибута не строка,
BufferLength не применяется.
StringLength [Output]
указатель на буфер предназначенный,
чтобы возвращать общее количество байт, доступных в *ValuePtr (кроме нулевых
символов в конце). Если *ValuePtr равен null, длина не возвращена. Если
значением атрибута является символьная строка, и число байт больше
BufferLength, данные в *ValuePtr обрезаются до BufferLength.
SQLSetStmtAttr устанавливает атрибуты, связанные с инструкцией.
SQLRETURN SQLSetStmtAttr(SQLHSTMT StatementHandle, SQLINTEGER Attribute, SQLPOINTER ValuePtr, SQLINTEGER StringLength);
StatementHandle [Input]
дескриптор инструкции.
Attribute [Input]
атрибут для установки.
ValuePtr [Input]
указатель на значение, которое будет связано с
Attribute, ValuePtr может быть 32-битным целым числом числа без знака или
указателем на символьную строку с нулевым символом в конце, двоичный буфер
или определенное драйвером значение. Если параметр Attribute представляет
собой специфическое для драйвера значение, ValuePtr может быть целым
числом со знаком.
StringLength [Input]
если Attribute определен в ODBC и
ValuePtr указывает на строку или двоичный буфер, это длина *ValuePtr. Если
Attribute определен в ODBC и ValuePtr целое число, StringLength игнорируется.
Если Attribute определен драйвером, прикладная программа указывает характер
атрибута Driver Manager: устанавливая аргумент StringLength. StringLength
может иметь следующие значения:
Операторные атрибуты для инструкции остаются в силе, пока они не изменены другим обращением SQLSetStmtAttr.
Атрибут | Значение ValuePtr |
SQL_ATTR_APP_PARAM_DESC | Не поддерживается |
SQL_ATTR_APP_ROW_DESC | Не поддерживается |
SQL_ATTR_ASYNC_ENABLE | Значение SQLUINTEGER, которое
определяет выполнена ли функция асинхронно: SQL_ASYNC_ENABLE_OFF=Off
(значение по умолчанию), |
SQL_ATTR_CONCURRENCY | Значение SQLUINTEGER, которое
определяет параллелизм курсора:SQL_CONCUR_READ_ONLY: курсор только для чтения. Никакие
модификации не позволяются.SQL_CONCUR_LOCK: курсор использует самый низкий уровень
блокировки, достаточный, чтобы гарантировать, что
строка может модифицироваться.SQL_CONCUR_ROWVER: курсор использует
оптимистическое управление параллелизма.SQL_CONCUR_VALUES: курсор использует оптимистическое управление
параллелизма, сравнивая значения.Значение по умолчанию для SQL_ATTR_CONCURRENCY равно
SQL_CONCUR_READ_ONLY . Драйвер в настоящее время поддерживает
только SQL_CONCUR_ROWVER . |
SQL_ATTR_CURSOR_SCROLLABLE | Значение SQLUINTEGER, которое
определяет уровень поддержки, который прикладная программа требует. Установка
этого атрибута воздействует на последующие обращения к SQLExecDirect и
SQLExecute. SQL_NONSCROLLABLE: скроллируемые курсоры не
требуются на операторном дескрипторе. Если из прикладной программы вызван
SQLFetchScroll на этом дескрипторе, единственное имеющее силу значение
FetchOrientation: SQL_FETCH_NEXT . Это значение по умолчанию.
SQL_SCROLLABLE: скроллируемые курсоры требуются на операторном
дескрипторе. При вызове SQLFetchScroll прикладная программа может
определять любое имеющее силу значение FetchOrientation, достигая
позиционирования курсора в любом режиме. |
SQL_ATTR_CURSOR_SENSITIVITY | Значение SQLUINTEGER, которое
определяет делают ли курсоры на операторном дескрипторе видимыми изменения,
сделанные другим курсором. Установка этого атрибута воздействует на
последующие обращения к SQLExecDirect и SQLExecute. Прикладная программа
может читать значение этого атрибута, чтобы получить информацию статуса.
SQL_UNSPECIFIED: не определено, чем является тип курсора, и
делают ли курсоры на операторном дескрипторе видимыми изменения, сделанные
другим курсором. Курсоры на операторном дескрипторе могут делать видимыми
изменения полностью или частично. Это значение по умолчанию.
SQL_INSENSITIVE: все курсоры на операторном дескрипторе
показывают набор результатов без того, чтобы отразить любые изменения,
сделанные любым другим курсором. Нечувствительные курсоры только для чтения.
Это соответствует статическому курсору, который имеет параллелизм и нужен
только для чтения. SQL_SENSITIVE: все курсоры на операторном
дескрипторе делают видимыми все изменения, сделанные другим курсором. Сейчас
драйвер поддерживает только SQL_SENSITIVE и
SQL_INSENSITIVE . |
SQL_ATTR_CURSOR_TYPE | Значение SQLUINTEGER, которое
определяет тип курсора: SQL_CURSOR_FORWARD_ONLY: курсор
прокручивается только вперед. SQL_CURSOR_STATIC: данные в наборе
результатов статические. SQL_CURSOR_KEYSET_DRIVEN: драйвер
сохраняет и использует ключи для числа строк, определенных в инструкции
SQL_ATTR_KEYSET_SIZE . SQL_CURSOR_DYNAMIC: драйвер
сохраняет и использует только ключи для строк в rowset. Значение по
умолчанию: SQL_CURSOR_FORWARD_ONLY . Этот атрибут не может быть
определен после того, как инструкция SQL была подготовлена. Драйвер сейчас
поддерживает только статический и "только вперед" типы курсора. |
SQL_ATTR_KEYSET_SIZE | Значение SQLUINTEGER, который определяет число строк в ключе для управляемого ключом курсора. Поскольку драйвер не поддерживает управляемые ключами курсоры, этот атрибут игнорируется. |
SQL_ATTR_MAX_LENGTH | Значение SQLUINTEGER, которое определяет максимальное количество данных, которое драйвер возвращает из символьного или двоичного столбца. Если ValuePtr меньше, чем длина доступных данных, SQLFetch или SQLGetData усекает данные и возвращает SQL_SUCCESS. Если ValuePtr равно 0 (значение по умолчанию), драйвер пытается возвращать все доступные данные. |
SQL_ATTR_MAX_ROWS | Значение SQLUINTEGER, соответствующее максимальному числу строк, которое вернется прикладной программе для инструкции SELECT. Если *ValuePtr равно 0 (значение по умолчанию), драйвер возвращает все строки. |
SQL_ATTR_METADATA_ID | Значение SQLUINTEGER, которое определяет
как обрабатываются строчные параметры каталожной функции. Если
SQL_TRUE , строчный параметр каталожной функции обрабатывается
как идентификаторы. Регистр не важен. В случае SQL_FALSE
параметр не обрабатывается как идентификатор. Регистр важен. Значение по
умолчанию SQL_FALSE, и драйвер поддерживает только значение по умолчанию.
|
SQL_ATTR_NOSCAN | Значение SQLUINTEGER, которое указывает
должен ли драйвер просмотреть строки SQL на предмет наличия в них
управляющих последовательностей. SQL_NOSCAN_OFF: драйвер
просматривает строки SQL (значение по умолчанию). SQL_NOSCAN_ON:
драйвер не просматривает строки SQL. Вместо этого драйвер посылает инструкцию
непосредственно источнику данных. |
SQL_ATTR_PARAM_BIND_OFFSET_PTR | Значение SQLUINTEGER*, которое указывает на смещение, добавленное к указателям, чтобы изменить связывание динамических параметров. Не поддерживается драйвером. |
SQL_ATTR_PARAM_BIND_TYPE | Значение SQLUINTEGER, которое
указывает ориентацию связывания, которую нужно использовать для динамических
параметров. Это поле установлено в SQL_PARAM_BIND_BY_COLUMN
(значение по умолчанию), чтобы выбрать поколоночное связывание. Чтобы выбрать
строчное связывание, это поле должно быть установлено в длину структуры или в
образец буфера, который будет привязан к набору динамических параметров. Эта
длина должна включать место для всех связанных параметров и любого дополнения
структуры или буфера, чтобы гарантировать, что, когда адрес связанного
параметра будет увеличен на определенную длину, результат укажет на начало
того же самого параметра в следующем наборе параметров. |
SQL_ATTR_PARAM_OPERATION_PTR | Значение SQLUSMALLINT*, которое
указывает на массив значений SQLUSMALLINT используемых, чтобы игнорировать
параметр в течение выполнения инструкции SQL. Каждое значение установлено в
SQL_PARAM_PROCEED (для параметра, который будет выполнен) или в
SQL_PARAM_IGNORE (для параметра, который нужно игнорировать).
Набор параметров может игнорироваться в течение обработки, устанавливая
значение состояния в массиве, на который указывает
SQL_DESC_ARRAY_STATUS_PTR в SQL_PARAM_IGNORE .
Набор параметров обработан, если значение состояния установлено в
SQL_PARAM_PROCEED или если никакие элементы в массиве не
установлены. Этот операторный атрибут может быть установлен в null, тогда
драйвер не возвращает значения состояния параметра. Этот атрибут может быть
установлен в любое время, но новое значение не используется до следующего
взоыва SQLExecDirect или SQLExecute. |
SQL_ATTR_PARAM_STATUS_PTR | Значение SQLUSMALLINT*, которое
указывает на массив значений SQLUSMALLINT содержащих информацию состояния для
каждой строки значений параметра после обращения к SQLExecute или к
SQLExecDirect. Это поле требуется только если PARAMSET_SIZE
больше 1. Значения состояния могут содержать следующие значения:
SQL_PARAM_SUCCESS: инструкция SQL была успешно выполнена для
этого набора параметров. SQL_PARAM_SUCCESS_WITH_INFO: инструкция
SQL была успешно выполнена для этого набора параметров, однако, в структуре
данных диагностики доступно предупреждение. SQL_PARAM_ERROR:
имелась ошибка в обработке этого набора параметров. Дополнительная информация
об ошибке доступна в структуре данных диагностики. SQL_PARAM_UNUSED:
набор параметров не пригодился, возможно, вследствие того, что
некоторый предыдущий набор параметров вызвал ошибку, которая прервала
обработку, или потому, что SQL_PARAM_IGNORE был установлен для
этого набор параметров в массиве, определенном
SQL_ATTR_PARAM_OPERATION_PTR . SQL_PARAM_DIAG_UNAVAILABLE:
драйвер обрабатывает массивы параметров как монолитный модуль и не генерирует
этот уровень информации ошибки. Этот операторный атрибут может быть
установлен в null, тогда драйвер не возвращает значения состояния параметра.
Этот атрибут может быть установлен в любое время, но новое значение не
используется до очередного вызова SQLExecute или SQLExecDirect. Обратите
внимание, что этот атрибут может воздействовать на поведение выходного
параметра, выполненное драйвером. |
SQL_ATTR_PARAMS_PROCESSED_PTR | Значение SQLUINTEGER*, которое указывает на буфер нужный, чтобы возвратить число наборов параметров, которые были обработаны, включая наборы ошибок. Ничего не будет возвращено, если здесь задан null. |
SQL_ATTR_PARAMSET_SIZE | Значение SQLUINTEGER, которое определяет число значений для каждого параметра. |
SQL_ATTR_QUERY_TIMEOUT | Значение SQLUINTEGER, соответствующее числу секунд, которое надо ждать инструкцию SQL перед возвратом прикладной программе. Если ValuePtr равен 0 (значению по умолчанию), не имеется никакого времени ожидания. |
SQL_ATTR_RETRIEVE_DATA | Значение SQLUINTEGER:
SQL_RD_ON: SQLFetchScroll и, в ODBC 3.x, SQLFetch получают
данные после того, как устанавливают курсор в определенное расположение. Это
значение по умолчанию. SQL_RD_OFF: SQLFetchScroll и, в ODBC 3.x,
SQLFetch не получают данные после того, как устанавливают курсор. Драйвер
поддерживает только значение по умолчанию. |
SQL_ATTR_ROW_ARRAY_SIZE | Значение SQLUINTEGER, которое определяет число строк, возвращенных каждым обращением к SQLFetch или к SQLFetchScroll. Это также задает число строк в массиве закладок, используемом в оптовой операции закладки в SQLBulkOperations. Значение по умолчанию 1. |
SQL_ATTR_ROW_BIND_OFFSET_PTR | Значение SQLUINTEGER*, которое указывает на смещение, добавленное к указателям, чтобы изменить связывание данных столбца. |
SQL_ATTR_ROW_BIND_TYPE | Значение SQLUINTEGER, которое
устанавливает ориентацию связывания, которую нужно использовать, когда
SQLFetch или SQLFetchScroll обращаются к связанной инструкции. Поколоночное
связывание выбрано, устанавливая значение в SQL_BIND_BY_COLUMN .
Построчное связывание будет выбрано, устанавливая значение в длину структуры
или в образец буфера, с которым столбцы результата будут связаны. |
SQL_ATTR_ROW_NUMBER | Значение SQLUINTEGER, которое является номером текущей строки во всем наборе результатов. Если номер текущей строки не может быть определен или не имеется никакой текущей строки, драйвер возвращает 0. Этот атрибут может быть проверен обращением к SQLGetStmtAttr, но не может быть установлен через вызов SQLSetStmtAttr. |
SQL_ATTR_ROW_OPERATION_PTR | Значение SQLUSMALLINT*, которое
указывает на массив значений SQLUSMALLINT используемых, чтобы игнорировать
строку в течение оптовой операции, использующей SQLSetPos. Каждое значение
установлено в SQL_ROW_PROCEED (для строки, которая будет
включена в оптовую операцию) или в SQL_ROW_IGNORE (для строки,
которая будет исключена из оптовой операции). Строки не могут игнорироваться,
используя этот массив в течение обращений к SQLBulkOperations. Этот
операторный атрибут может быть установлен в null, когда драйвер не возвращает
значения состояния строки. Этот атрибут может быть установлен в любое время,
но новое значение не используется до очередного вызова SQLSetPos. |
SQL_ATTR_ROW_STATUS_PTR | Значение SQLUSMALLINT*, которое указывает на массив значений SQLUSMALLINT, содержащих значения состояния строки после обращения к SQLFetch или SQLFetchScroll. Массив имеет так много элементов, сколько есть строк в rowset. Этот операторный атрибут может быть установлен в null, когда драйвер не возвращает значения состояния строки. Этот атрибут может быть установлен в любое время, но новое значение не используется до очередного вызова SQLBulkOperations, SQLFetch, SQLFetchScroll или SQLSetPos. |
SQL_ATTR_ROWS_FETCHED_PTR | Значение SQLUINTEGER*, которое
указывает на буфер нужный, чтобы возвратить число строк, выбранных после
обращения к SQLFetch или SQLFetchScroll, число строк, на которые воздействует
оптовая операция, выполняемая обращением к SQLSetPos с параметром Operation
выставленным в SQL_REFRESH , или число строк, на которые
воздействует оптовая операция, выполняемая SQLBulkOperations. |
SQL_ATTR_SIMULATE_CURSOR | Значение SQLUINTEGER, которое
определяет драйверы, которые моделируют позиционные модификации и удаления и
гарантируют, что такие инструкции воздействуют только на одну строку.
SQL_SC_NON_UNIQUE: драйвер не гарантирует, что моделируемая
инструкция будет воздействовать только на одну строку.
SQL_SC_TRY_UNIQUE: драйвер пытается гарантировать, что
моделируемая инструкция будет воздействовать только на одну строку.
SQL_SC_UNIQUE: драйвер гарантирует, что моделируемая инструкция
будет воздействовать только на одну строку. |
SQL_ATTR_USE_BOOKMARKS | Закладки не поддерживаются. |
SQLGetStmtAttr возвращает текущую установку операторного атрибута.
SQLRETURN SQLGetStmtAttr(SQLHSTMT StatementHandle, SQLINTEGER Attribute, SQLPOINTER ValuePtr, SQLINTEGER BufferLength, SQLINTEGER* StringLengthPtr);
StatementHandle [Input]
операторный дескриптор.
Attribute [Input]
интересующий атрибут.
ValuePtr [Output]
указатель на буфер, в который будет
возвращено значение атрибута, определенного в Attribute.
BufferLength [Input]
если Attribute определен в ODBC и
ValuePtr указывает на символьную строку или двоичный буфер, этот параметр
должен быть длиной *ValuePtr. Если Attribute определен в ODBC и *ValuePtr
целое число, BufferLength игнорируется. BufferLength может иметь значения:
StringLength [Output]
указатель на буфер, куда будет записано
общее количество байт (кроме хвостового нуля), доступное в *ValuePtr. Если
ValuePtr равно null, никакая длина не возвращена. Если значение атрибута
символьная строка, и число доступных байт больше BufferLength, данные в
*ValuePtr автоматически урезаются до размеров BufferLength.
В ODBC 3.x SQLSetStmtAttr заменяет SQLStmtOption.
В ODBC 3.x SQLGetStmtAttr заменяет SQLCetStmtOption.
SQLAllocStmt распределяет память для операторного дескриптора.
SQLRETURN SQLAllocStmt(HDBC ConnectionHandle, HSTMT* StatementHandle);
В ODBC 3.x SQLAllocHandle заменяет функцию ODBC 2.x SQLAllocStmt.
SQLPrepare готовит команду SQL к выполнению.
SQLRETURN SQLPrepare(SQLHSTMT StatementHandle, SQLCHAR* StatementText, SQLINTEGER TextLength);
StatementHandle [Input]
операторный дескриптор.
StatementText [Input]
строка SQL-команды.
TextLength [Input]
длина *StatementText.
SQLBindParameter привязывает буфер к маркеру параметра в инструкции SQL. SQLBindParameter поддерживает связывание к Unicode-C типу данных, даже если основной драйвер не поддерживает Unicode-данные.
SQLRETURN SQLBindParameter(SQLHSTMT StatementHandle, SQLUSMALLINT ParameterNumber, SQLSMALLINT InputOutputType, SQLSMALLINT ValueType, SQLSMALLINT ParameterType, SQLUINTEGER ColumnSize, SQLSMALLINT DecimalDigits, SQLPOINTER ParameterValuePtr, SQLINTEGER BufferLength, SQLINTEGER* StrLen_or_IndPtr);
StatementHandle [Input]
операторный дескриптор.
ParameterNumber [Input]
номер параметра, упорядоченный
последовательно в увеличивающемся порядке, начинающемся с 1.
InputOutputType [Input]
тип параметра.
ValueType [Input]
тип данных C для параметра.
ParameterType [Input]
SQL-тип параметра.
ColumnSize [Input]
размер столбца или выражения,
соответствующего маркеру параметра.
DecimalDigits [Input]
десятичные цифры столбца или выражения
соответствующего маркеру параметра.
ParameterValuePtr [Deferred Input]
указатель на буфер
для данных параметра.
BufferLength [Input/Output]
длина буфера ParameterValuePtr в
байтах.
StrLen_or_IndPtr [Deferred Input]
указатель на буфер
для длины параметра.
SQLGetCursorName возвращает имя курсора, связанного с определенной инструкцией.
SQLRETURN SQLGetCursorName(SQLHSTMT StatementHandle, SQLCHAR* CursorName, SQLSMALLINT BufferLength, SQLSMALLINT* NameLengthPtr);
StatementHandle [Input]
дескриптор подключения.
CursorName [Output]
указатель на буфер для имени курсора.
BufferLength [Input]
длина *CursorName в байтах.
NameLengthPtr [Output]
указатель на память, куда будет
записано возвращаемое значение. Если значение больше, чем BufferLength,
*CursorName урезается до BufferLength за вычетом хвостового нуля.
SQLSetCursorName сопоставляет имя курсора с активной инструкцией. Если прикладная программа не вызывает SQLSetCursorName, драйвер генерирует имена курсора так, как необходимо для обработки инструкции SQL.
4.6.5.1 Синтаксис
SQLRETURN SQLSetCursorName(SQLHSTMT StatementHandle, SQLCHAR* CursorName, SQLSMALLINT NameLength);
StatementHandle [Input]
операторный дескриптор.
CursorName [Input]
имя курсора. Для эффективной обработки имя
курсора не должно включить никаких пробелов, а если имя курсора включает
разграниченный идентификатор, разделитель должен быть установлен как первый
символ в имени курсора.
NameLength [Input]
длина *CursorName.
В ODBC 3.x SQLSetSetScrollOptions заменен обращением к 4.5.7 SQLSetStmtAttr и 4.4.3 SQLGetInfo.
SQLExecute выполняет подготовленную инструкцию, используя текущие (актуальные) значения переменных маркера параметра, если маркеры параметров существуют в инструкции.
4.7.1.1 Синтаксис
SQLRETURN SQLExecute(SQLHSTMT StatementHandle);
StatementHandle [Input]
операторный дескриптор.
SQLExecute выполняет инструкцию, подготовленную SQLPrepare.
SQLExecDirect выполняет инструкцию, используя текущие (актуальные) значения переменных маркера параметра, если параметры существуют в инструкции. SQLExecDirect представляет собой самый быстрый способ представить серверу на рассмотрение инструкцию SQL для одного выполнения.
4.7.2.1 Синтаксис
SQLRETURN SQLExecDirect(SQLHSTMT StatementHandle, SQLCHAR* StatementText, SQLINTEGER TextLength);
StatementHandle [Input]
операторный дескриптор.
StatementText [Input]
SQL-инструкция, которая будет выполнена.
TextLength [Input]
длина *StatementText.
Прикладные программы вызывают SQLExecDirect, чтобы послать инструкцию SQL на сервер MySQL.
SQLNativeSql возвращает строку SQL, обработанную драйвером. SQLNativeSql не выполняет инструкцию SQL.
4.7.3.1 Синтаксис
SQLRETURN SQLNativeSql(SQLHDBC ConnectionHandle, SQLCHAR* InStatementText, SQLINTEGER TextLength1, SQLCHAR* OutStatementText, SQLINTEGER BufferLength, SQLINTEGER* TextLength2Ptr);
ConnectionHandle [Input]
дескриптор подключения.
InStatementText [Input]
текст инструкции SQL.
TextLength1 [Input]
длина строки *InStatementText.
OutStatementText [Output]
указатель на буфер распределенный,
чтобы возвращать строку SQL.
BufferLength [Input]
длина буфера *OutStatementText.
TextLength2Ptr [Output]
указатель на буфер выделенный, чтобы
возвращать общее количество байт, доступное в *OutStatementText. Если число
доступных байт больше BufferLength, *OutStatementText урезается.
SQLDescribeParam возвращает описание маркера параметра, связанного с подготовленной инструкцией SQL.
SQLRETURN SQLDescribeParam(SQLHSTMT StatementHandle, SQLUSMALLINT ParameterNumber, SQLSMALLINT* DataTypePtr, SQLUINTEGER* ParameterSizePtr, SQLSMALLINT* DecimalDigitsPtr, SQLSMALLINT* NullablePtr);
StatementHandle [Input]
операторный дескриптор.
ParameterNumber [Input]
номер маркера, начиная с 1.
DataTypePtr [Output]
указатель на буфер выделенный, чтобы
возвращать SQL-тип данных параметра. В ODBC 3.x SQL_TYPE_DATE, SQL_TYPE_TIME,
или SQL_TYPE_TIMESTAMP будут возвращен в *DataTypePtr для типов date, time
или timestamp соответственно. В ODBC 2.x возвращаются SQL_DATE, SQL_TIME или
SQL_TIMESTAMP.
ParameterSizePtr [Output]
указатель на буфер для возврата
размера столбца или выражения соответствующего маркера параметра.
DecimalDigitsPtr [Output]
указатель на буфер для возврата
количества десятичных цифр столбца или выражения соответствующего параметра
как определено сервером.
NullablePtr [Output]
указатель на буфер, куда будет
возвращено значение, которое указывает позволяет ли параметр значения NULL.
Это значение читается из поля SQL_DESC_NULLABLE в IPD. Один из следующего:
SQL_NO_NULLS:
параметр не позволяет значения NULL (это
значение по умолчанию).
SQL_NULLABLE:
параметр позволяет значения NULL.
SQL_NULLABLE_UNKNOWN:
драйвер не может определить, позволяет
ли параметр значения NULL.SQLNumParams возвращает число параметров в инструкции SQL.
SQLRETURN SQLNumParams(SQLHSTMT StatementHandle, SQLSMALLINT* ParameterCountPtr);
StatementHandle [Input]
операторный дескриптор.
ParameterCountPtr [Output]
указатель на буфер распределенный,
чтобы возвращать число параметров в инструкции.
SQLParamData используется вместе с SQLPutData, чтобы обеспечить данные для параметров во время выполнения.
4.7.6.1 Синтаксис
SQLRETURN SQLParamData(SQLHSTMT StatementHandle, SQLPOINTER* ValuePtrPtr);
StatementHandle [Input]
операторный дескриптор.
ValuePtrPtr [Output]
указатель на буфер выделенный, чтобы
возвращать адрес буфера ParameterValuePtr, определенного в SQLBindParameter
(для данных параметра) или адрес буфера TargetValuePtr, определенного в
SQLBindCol (для данных столбца), как указано в поле SQL_DESC_DATA_PTR
записи операторного дескриптора.
SQLPutData позволяет прикладной программе посылать данные для параметра или столбца драйверу во время выполнения. Эта функция может использоваться, чтобы послать символьные или двоичные значения данных частями к столбцу со специфическим типом данных (например, параметры типов SQL_LONGVARBINARY или SQL_LONGVARCHAR). SQLPutData поддерживает связывание с Unicode C-типом данных, даже если основной драйвер не поддерживает Unicode.
4.7.7.1 Синтаксис
SQLRETURN SQLPutData(SQLHSTMT StatementHandle, SQLPOINTER DataPtr, SQLINTEGER StrLen_or_Ind);
StatementHandle [Input]
операторный дескриптор.
DataPtr [Input]
указатель на буфер с актуальными данными для
для параметра или столбца. Данные должны быть в C-типе данных, определенном в
параметре ValueType функции SQLBindParameter (для данных параметра) или в
параметре TargetType функции SQLBindCol (для данных столбца).
StrLen_or_Ind [Input]
длина *DataPtr. Определяет количество
данных, переданное в вызове SQLPutData. Количество данных может измениться
для каждого вызова. StrLen_or_Ind игнорируется, если не выполняется одно
из следующих условий:
SQLRowCount возвращает число строк, на которые воздействует инструкция UPDATE, INSERT или DELETE.
SQLRETURN SQLRowCount(SQLHSTMT StatementHandle, SQLINTEGER* RowCountPtr);
StatementHandle [Input]
дескриптор подключения.
RowCountPtr [Output]
указывает на буфер для возврата числа
строк. Для UPDATE, INSERT и DELETE, операций SQL_ADD в SQLBulkOperations и
SQL_UPDATE или SQL_DELETE в SQLSetPos значение, возвращенное в *RowCountPtr,
является числом строк, на которые воздействует запрос, или -1, если число
строк не доступно.
При вызове SQLExecute, SQLExecDirect, SQLBulkOperations, SQLSetPos или SQLMoreResults поле SQL_DIAG_ROW_COUNT диагностической структуры данных установлено в число строк, которое кэшируется зависимым от реализации способом. SQLRowCount возвращает кэшируемое значение числа строк. Оно имеет силу, пока операторный дескриптор не перераспределен, не выполнена снова инструкция или не вызван SQLCloseCursor. Обратите внимание, что, если функция была вызвана, поле SQL_DIAG_ROW_COUNT было установлено, и значение, возвращенное SQLRowCount, может отличаться от значения в SQL_DIAG_ROW_COUNT, поскольку поле SQL_DIAG_ROW_COUNT сброшено в 0 любым обращением к функции.
Для других инструкций и функций, драйвер может определять значение, возвращенное в *RowCountPtr. Например, некоторые источники данных могут возвратить число строк, возвращенных инструкцией SELECT или функцией каталога перед выборкой строк.
Обратите внимание
, что много источников данных не могут
возвращать число строк в наборе результатов перед их выборкой.
SQLNumResultCols возвращает число столбцов в наборе результатов.
SQLRETURN SQLNumResultCols(SQLHSTMT StatementHandle, SQLSMALLINT* ColumnCountPtr);
StatementHandle [Input]
операторный дескриптор.
ColumnCountPtr [Output]
указатель на буфер, в который будет
записано число столбцов в наборе результатов.
SQLDescribeCol возвращает имя дескрипторного столбца результата, тип, размер столбца, десятичные цифры и возможность принимать значение null для одного столбца в наборе результатов. Эта информация также доступна в полях IRD.
SQLRETURN SQLDescribeCol(SQLHSTMT StatementHandle, SQLSMALLINT ColumnNumber, SQLCHAR* ColumnName, SQLSMALLINT BufferLength, SQLSMALLINT* NameLengthPtr, SQLSMALLINT* DataTypePtr, SQLUINTEGER* ColumnSizePtr, SQLSMALLINT* DecimalDigitsPtr, SQLSMALLINT* NullablePtr);
StatementHandle [Input]
операторный дескриптор.
ColumnNumber [Input]
номер столбца данных результата,
упорядоченных последовательно в увеличивающемся порядке, начиная с 1.
Параметр ColumnNumber может быть также установлен в 0, чтобы
описать столбец закладки.
ColumnName [Output]
указатель на буфер, в который надо
вернуть имя столбца. Это значение читается из поля SQL_DESC_NAME в IRD. Если
столбец не назван, или имя столбца не может быть определено, драйвер
возвращает пустую строку.
BufferLength [Input]
длина буфера *ColumnName в символах.
NameLengthPtr [Output]
указатель на буфер, куда надо записать
общее количество байт, доступных для возврата в *ColumnName. Хвостовые нули
не учитываются. Если значение в *ColumnName больше BufferLength, оно
усекается до BufferLength.
DataTypePtr [Output]
указатель на буфер, в который надо
вернуть SQL-тип данных столбца. Это значение читается из поля
SQL_DESC_CONCISE_TYPE в IRD. Если тип данных не может быть определен, драйвер
возвращает SQL_UNKNOWN_TYPE.
ColumnSizePtr [Output]
указатель на буфер предназначенный,
чтобы возвращать размер столбца в источнике данных. Если размер столбца не
может быть определен, драйвер возвращает 0.
DecimalDigitsPtr [Output]
указатель на буфер предназначенный,
чтобы возвращать число десятичных цифр столбца в источнике данных. Если число
десятичных цифр не может быть определено или не применимо, драйвер вернет 0.
NullablePtr [Output]
указатель на буфер предназначенный,
чтобы возвращать значение, которое указывает, позволяет ли этот столбец
применять в нем значения NULL. Это значение читается из поля
SQL_DESC_NULLABLE в IRD. Значение одно из следующего:
SQL_NO_NULLS:
столбец не позволяет значения NULL.
SQL_NULLABLE:
столбец позволяет значения NULL.
SQL_NULLABLE_UNKNOWN:
драйвер не может определить, позволяет
ли столбец значения NULL.SQLColAttribute возвращает дескрипторную информацию для столбца в наборе результатов. Дескрипторная информация будет возвращена как символьная строка, 32-разрядное дескрипторно-зависимое значение или целочисленное значение.
SQLRETURN SQLColAttribute(SQLHSTMT StatementHandle, SQLUSMALLINT ColumnNumber, SQLUSMALLINT FieldIdentifier, SQLPOINTER CharacterAttributePtr, SQLSMALLINT BufferLength, SQLSMALLINT* StringLengthPtr, SQLPOINTER NumericAttributePtr);
StatementHandle [Input]
операторный дескриптор.
ColumnNumber [Input]
номер записи в IRD, из которой должно
быть получено значение поля. Этот параметр соответствует номеру столбца
данных результата, упорядоченных последовательно в увеличивающемся порядке,
начиная с 1. Столбцы могут быть описаны в любом порядке. Столбец 0 может быть
определен в этом параметре, но все параметры, за исключением SQL_DESC_TYPE и
SQL_DESC_OCTET_LENGTH, возвратят неопределенные значения.
FieldIdentifier [Input]
поле в строке ColumnNumber в IRD,
которое должно быть возвращено.
CharacterAttributePtr [Output]
указатель на буфер выделенный,
чтобы возвращать значение в поле FieldIdentifier из строки ColumnNumber в
IRD, если поле представляет собой символьную строку.
Иначе поле не используется.
BufferLength [Input]
если FieldIdentifier определен в ODBC и
CharacterAttributePtr указывает на символьную строку или двоичный буфер, этот
параметр должен быть длиной *CharacterAttributePtr. Если FieldIdentifier
определен в ODBC и *CharacterAttributePtr целое число, это поле игнорируется.
Если *CharacterAttributePtr является строкой в Unicode (при вызове
SQLColAttributeW), параметр BufferLength должен быть четным числом.
Если FieldIdentifier определен в драйвере, прикладная программа указывает характер поля для Driver Manager, устанавливая параметр BufferLength. Он может иметь следующие значения:
StringLengthPtr [Output]
указатель на буфер нужный, чтобы
возвращать общее количество байт, доступное в *CharacterAttributePtr,
кроме хвостовых нулей.
Для символьных данных если число доступных байт больше BufferLength, информация дескриптора в *CharacterAttributePtr урезается до BufferLength.
Для всех других типов данных значение BufferLength игнорируется, и драйвер принимает, что размер *CharacterAttributePtr равен 32 битам.
NumericAttributePtr [Output]
указатель на целочисленный
буфер нужный, чтобы возвращать значение в поле FieldIdentifier строки
ColumnNumber из IRD, если поле числовой дескрипторный тип, например,
SQL_DESC_COLUMN_LENGTH. Иначе поле не используется.
В ODBC 3.x SQLColAttributes заменена SQLColAttribute.
SQLBindCol привязывает буферы данных прикладных программ к столбцам в наборе результатов.
SQLRETURN SQLBindCol(SQLHSTMT StatementHandle, SQLUSMALLINT ColumnNumber, SQLSMALLINT TargetType, SQLPOINTER TargetValuePtr, SQLINTEGER BufferLength, SQLLEN* StrLen_or_Ind);
StatementHandle [Input]
операторный дескриптор.
ColumnNumber [Input]
номер столбца в наборе результатов, с
которым надо связать буфер. Столбцы пронумерованы в увеличивающемся порядке,
начиная с 0, где столбец с номером 0 является закладкой. Если закладки не
используются, то есть атрибут инструкции SQL_ATTR_USE_BOOKMARKS установлен в
SQL_UB_OFF, столбцы нумеруются, начиная с 1.
TargetType [Input]
идентификатор C-типа данных буфера
*TargetValuePtr. При получении данных из источника данных с помощью SQLFetch,
SQLFetchScroll, SQLBulkOperations или SQLSetPos, драйвер преобразовывает
данные к этому типу, а при посылке данных источнику данных с помощью
SQLBulkOperations или SQLSetPos, драйвер преобразовывает данные из этого типа.
TargetValuePtr [Deferred Input/Output]
указатель на буфер для
связи со столбцом. SQLFetch и SQLFetchScroll возвращают данные в этом буфере.
SQLBulkOperations получает данные из этого буфера, когда Operation равен
SQL_ADD. SQLSetPos возвращает данные в этом буфере, когда Operation равен
SQL_REFRESH и получает данные из этого буфера, когда Operation
равен SQL_UPDATE.
Если TargetValuePtr равен null, драйвер отвязывает буфер данных от столбца. Прикладная программа может отвязать все столбцы, вызывая SQLFreeStmt с опцией SQL_UNBIND. Прикладная программа может отвязать буфер данных от столбца, но все еще иметь буфер длин связанный со столбцом, если параметр TargetValuePtr в вызове SQLBindCol равен null, но аргумент StrLen_or_IndPtr представляет собой имеющее силу значение.
BufferLength [Input]
длина в бвйтах *TargetValuePtr. Драйвер
использует BufferLength, чтобы не перезаписать хвост буфера *TargetValuePtr
при возврате данных переменной длины, типа символьных или двоичных данных.
Обратите внимание, что драйвер учитывает хвостовой нулевой символ при
возврате символьных данных в *TargetValuePtr. *TargetValuePtr, следовательно,
должен содержать место для этого символа, или драйвер усечет данные.
Когда данные фиксированной длины, типа целого числа или структуры даты, драйвер игнорирует BufferLength и принимают, что буфер достаточно большой, чтобы сохранить данные. Следовательно, для прикладной программы важно распределить достаточно большой буфер для данных фиксированной длины во избежание проблем с переполнением.
SQLBindCol возвращает ошибку SQLSTATE HY090 (Invalid string or buffer length), когда BufferLength меньше 0, но не когда BufferLength равен 0. Однако, если TargetType определяет символьный тип, прикладная программа не должна устанавливать BufferLength в 0, поскольку драйверы ISO CLI в этом случае возвращают SQLSTATE HY090 (Invalid string or buffer length).
StrLen_or_IndPtr [Deferred Input/Output]
указатель на буфер
длин для свяхи со столбцом. SQLFetch и SQLFetchScroll возвращают значение в
этом буфере. SQLBulkOperations получает значение из этого буфера, когда
параметр Operation равен SQL_ADD. SQLSetPos возвращает значение в этом
буфере, когда Operation равен SQL_REFRESH и получает значение из этого
буфера, когда Operation равен SQL_UPDATE. SQLFetch, SQLFetchScroll,
SQLBulkOperations и SQLSetPos могут возвращать следующие
значения в буфере длин:
Прикладная программа может помещать следующие значения в буфер длин для использования с SQLBulkOperations или с SQLSetPos:
Если буфер индикаторов и буфер длин разделены, буфер индикаторов может возвращать только SQL_NULL_DATA, в то время как буфер длин может возвращать все остальные значения. Если StrLen_or_IndPtr равно null, значения длины или индикаторов не применяются.
SQLFetch выбирает следующий rowset данных из набора результатов и возвращает данные для всех связанных столбцов.
SQLRETURN SQLFetch(SQLHSTMT StatementHandle);
StatementHandle [Input]
операторный дескриптор.
SQLFetch возвращает следующий rowset в наборе результатов. Это может быть вызвано только в то время, когда набор результатов существует, то есть после обращения, которое создает набор результатов и прежде, чем курсор будет закрыт. Если любые столбцы связаны с данными, этот вызов возвращает данные в этих столбцах. Если прикладная программа определила указатель на массив состояния или на буфер нужный, чтобы возвращать число выбранных строк, SQLFetch возвращает также и эту информацию. Обращение к SQLFetch может быть смешано с обращениями к SQLFetchScroll, но не может быть смешано с обращениями к SQLExtendedFetch.
SQLFetchScroll выбирает определенный rowset данных из набора результатов и возвращает данные для всех связанных столбцов. Rowset может быть определен в абсолютной или относительной позиции или закладкой. При работе с драйвером ODBC 2.x Driver Manager отображает эту функцию на SQLExtendedFetch.
SQLRETURN SQLFetchScroll(SQLHSTMT StatementHandle, SQLSMALLINT FetchOrientation, SQLINTEGER FetchOffset);
StatementHandle [Input]
операторный дескриптор.
FetchOrientation [Input]
тип выборки:
FetchOffset [Input]
номер строки для выборки. Интерпретация
этого параметра зависит от значения параметра FetchOrientation.
Когда набор результатов создан, курсор установлен перед началом набора результатов. SQLFetchScroll устанавливает блочный курсор, исходя из значений параметров FetchOrientation и FetchOffset как показано в следующей таблице.
FetchOritentation | Смысл |
SQL_FETCH_NEXT | Вернет следующий rowset. Это эквивалентно вызову SQLFetch. SQLFetchScroll игнорирует значение FetchOffset. |
SQL_FETCH_PRIOR | Вернет предшествующий rowset. SQLFetchScroll игнорирует значение FetchOffset. |
SQL_FETCH_RELATIVE | Вернет FetchOffset от начала текущего (актуального) rowset. |
SQL_FETCH_ABSOLUTE | Вернет rowset, начинающийся в строке FetchOffset. |
SQL_FETCH_FIRST | Вернет первый rowset в наборе результатов. SQLFetchScroll игнорирует значение FetchOffset. |
SQL_FETCH_LAST | Вернет последний полный rowset в наборе результатов. SQLFetchScroll игнорирует значение FetchOffset. |
SQLExtendedFetch выбирает определенный rowset данных из набора результатов и возвращает данные для всех связанных столбцов. Rowset может быть определен в абсолютной или относительной позиции.
Обратите внимание
в ODBC 3.x SQLExtendedFetch заменен на
SQLFetchScroll. Прикладные программы ODBC 3.x не должны вызвать
SQLExtendedFetch: взамен они должны вызвать SQLFetchScroll.
SQLRETURN SQLExtendedFetch(SQLHSTMT StatementHandle, SQLUSMALLINT FetchOrientation, SQLINTEGER FetchOffset, SQLUINTEGER* RowCountPtr, SQLUSMALLINT* RowStatusArray);
StatementHandle [Input]
операторный дескриптор.
FetchOrientation [Input]
тип выборки. Это аналогично
FetchOrientation в SQLFetchScroll.
FetchOffset [Input]
номер столбца для выборки. Аналогично
FetchOffset в SQLFetchScroll.
RowCountPtr [Output]
указатель на буфер, куда надо записать
число фактически выбранных строк. Этот буфер используется тем же самым
способом, что и буфер, определенный атрибутом инструкции
SQL_ATTR_ROWS_FETCHED_PTR. Этот буфер используется только SQLExtendedFetch.
Это не используется SQLFetch или SQLFetchScroll.
RowStatusArray [Output]
указатель на буфер, куда надо
записать состояние каждой строки. Этот массив используется тем же самым
способом, что и массив, определенный атрибутом инструкции
SQL_ATTR_ROW_STATUS_PTR.
Однако, адрес этого массива не сохранен в поле SQL_DESC_STATUS_ARRAY_PTR в IRD. Кроме того, этот массив используется только SQLExtendedFetch, SQLBulkOperations при параметре Operation равном SQL_ADD или SQLSetPos, когда это вызвано после SQLExtendedFetch. SQLFetch или SQLFetchScroll не используют это вообще, а SQLBulkOperations или SQLSetPos не используют, когда они вызваны после SQLFetch или SQLFetchScroll. Это также не используется, когда SQLBulkOperations с параметром Operation равным SQL_ADD вызван прежде, чем выполнена любая функция выборки. Прикладные программы должны обеспечить имеющий силу указатель в параметре RowStatusArray. Если это не так, последствия будут непредсказуемыми.
Логика работы SQLExtendedFetch идентична SQLFetchScroll, но:
SQLGetData получает данные для одиночного столбца в наборе результатов. Это может быть вызвано неоднократно, чтобы получить данные переменной длины по частям.
SQLRETURN SQLGetData(SQLHSTMT StatementHandle, SQLUSMALLINT ColumnNumber, SQLSMALLINT TargetType, SQLPOINTER TargetValuePtr, SQLINTEGER BufferLength, SQLINTEGER* StrLen_or_IndPtr);
StatementHandle [Input]
операторный дескриптор.
ColumnNumber [Input]
номер столбца для возврата данных. Все
столбцы в наборе результатов пронумерованы в увеличивающемся порядке, начиная
с 1. Столбец закладки имеет номер столбца, равный 0, это может быть
определено только, если закладки допускаются.
TargetType [Input]
идентификатор C-типа данных буфера
*TargetValuePtr. Если это равно SQL_C_DEFAULT, драйвер выбирает заданный по
умолчанию C-тип данных, основываясь на SQL-типе данных источника.
TargetValuePtr [Input]
указатель на буфер для приема данных.
BufferLength [Input]
длина буфера *TargetValuePtr в байтах.
Драйвер использует BufferLength, чтобы избежать столкновения с
*TargetValuePtr при возврате данных переменной длины, типа символьных или
двоичных данных. Обратите внимание, что драйвер считает хвостовой нуль.
Когда данные имеют фиксированную длину, типа целого числа или структуры даты, драйвер игнорирует BufferLength и принимает, что буфер достаточно большой, чтобы сохранить в нем данные.
SQLGetData вернет SQLSTATE HY090 (Invalid string or buffer length), когда BufferLength меньше 0, но не когда BufferLength равен 0. Если TargetValuePtr равен null, BufferLength игнорируется драйвером.
StrLen_or_IndPtr [Deferred Input/Output]
указатель на буфер
нужный, чтобы возвращать длину или значение индикатора. Если это null, не
будет возвращено ничего. Это возвращает ошибку, когда выбираемые данные NULL.
SQLGetData может возвращать следующие значения в буфере длин/индикатора:
SQLSetPos устанавливает позицию курсора в rowset и позволяет прикладной программе обновить данные в rowset, модифицировать или удалять данные в наборе результатов.
SQLRETURN SQLSetPos(SQLHSTMT StatementHandle, SQLUSMALLINT RowNumber, SQLUSMALLINT Operation, SQLUSMALLINT LockType);
StatementHandle [Input]]
операторный дескриптор.
RowNumber [Input]
позиция строки в rowset над которой надо
выполнить операцию, определенную параметром Operation. Если RowNumber равен
0, операция применяется к каждой строке в rowset.
Operation [Input]
операция для выполнения:
LockType [Input]
определяет, как блокировать строку после
выполнения операции, определенной в параметре Operation:
Row Number: параметр RowNumber определяет номер строки в rowset, с которой надо работать. Если RowNumber равен 0, операция применяется к каждой строке в rowset. RowNumber должен быть значением от 0 до максимального количества строк в rowset. Обратите внимание, что в языке C массивы отсчитываются от 0, RowNumber реально отсчитывается от 1. Например, чтобы модифицировать пятую строку rowset, прикладная программа изменяет буфер rowset в массиве с индексом 4, но определяет RowNumber=5! Все операции устанавливают курсор в строку, определенную RowNumber. Следующие операции требуют позиционирования курсора:
Например, если RowNumber=2, при обращении к SQLSetPos с Operation равным SQL_DELETE, курсор установлен во вторую строку rowset, и эта строка будет удалена. Запись в массиве состояний строк (указан атрибутом инструкции SQL_ATTR_ROW_STATUS_PTR) для второй строки изменена на SQL_ROW_DELETED.
Прикладная программа может определять позицию курсора, когда вызывает SQLSetPos. Вообще, это вызывает SQLSetPos с параметром SQL_POSITION или SQL_REFRESH, чтобы установить курсор перед выполнением позиционной инструкции или вызовом SQLGetData. Параметр Operation поддерживает следующие операции. Чтобы понять, какие именно параметры поддержаны источником данных, вызовите из прикладной программы SQLGetInfo с информационными типами SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES1 и SQL_STATIC_CURSOR_ATTRIBUTES1.
Аргумент | Действие |
SQL_POSITION | Драйвер устанавливает курсор в строку, определенную RowNumber. Содержание массива состояний строк, указанного атрибутом инструкции SQL_ATTR_ROW_OPERATION_PTR игнорируется в SQL_POSITION. |
SQL_REFRESH | Драйвер устанавливает курсор в строку, определенную RowNumber и регенерирует данные в буферах rowset для этой строки. SQLSetPos с Operation равным SQL_REFRESH модифицирует состояние и содержание строк внутри текущего (актуального) выбранного rowset. Поскольку данные в буферах регенерируются, но не выбираются заново, членство в rowset фиксировано. Это отличается от регенерации, выполняемой обращением к SQLFetchScroll с FetchOrientation равным SQL_FETCH_RELATIVE и RowNumber равным 0, что заново выбирает rowset из набора результатов так, чтобы он мог показывать добавленные данные и удалить удаленные данные, если эти операции поддержаны драйвером и курсором. |
SQL_UPDATE | Драйвер устанавливает курсор в строку, определенную RowNumber и модифицирует основную строку данных значениями в буферах rowset (параметр TargetValuePtr в SQLBindCol). |
SQL_DELETE | Драйвер устанавливает курсор в строку, определенную RowNumber и удаляет основную строку данных. Это изменяет соответствующий элемент массива состояний строк на SQL_ROW_DELETED. После того, как строка была удалена, следующее не имеет силу для строки: вызов SQLGetData, позиционная модификация и удаление и обращение к SQLSetPos с любым значением параметра Operation, кроме SQL_POSITION. |
SQLBulkOperations выполняет оптовые вставки и операции закладки, включая update, delete и выборку по закладке.
SQLRETURN SQLBulkOperations(SQLHSTMT StatementHandle, SQLUSMALLINT Operation);
StatementHandle [Input]
операторный дескриптор.
Operation [Input]
операция для выполнения:
SQL_ADD
. Обратите внимание: сейчас никакие операции с закладками
драйвером не поддерживаются.
Выполнение оптовых вставок:
Чтобы вставлять данные с помощью SQLBulkOperations, прикладная программа выполняет следующую последовательность шагов:
SQLBindCol
, чтобы привязать данные, которые
требуется вставлять. Данные будут привязаны к массиву с размером, равным
значению SQL_ATTR_ROW_ARRAY_SIZE. Обратите внимание, что размер массива,
указанного атрибутом инструкции SQL_ATTR_ROW_STATUS_PTR должен быть равен
SQL_ATTR_ROW_ARRAY_SIZE, или SQL_ATTR_ROW_STATUS_PTR должен быть null.
SQLBulkOperations
(StatementHandle,
SQL_ADD
), чтобы выполнить вставку.
SQLError возвращает информацию состояния или ошибку. Прикладная программа обычно вызывает SQLError, когда предыдущая функция ODBC возвращает SQL_ERROR или SQL_SUCCESS_WITH_INFO. В ODBC 3.x SQLGetDiagRec заменила функцию ODBC 2.0 SQLError.
SQLGetDiagField возвращает текущее (актуальное) значение поля записи диагностической структуры данных (связанной с определенным дескриптором), которое содержит ошибку, предупреждение и информацию состояния.
SQLRETURN SQLGetDiagField(SQLSMALLINT HandleType, SQLHANDLE Handle, SQLSMALLINT RecNumber, SQLSMALLINT DiagIdentifier, SQLPOINTER DiagInfoPtr, SQLSMALLINT BufferLength, SQLSMALLINT* StringLengthPtr);
HandleType [Input]
идентификатор типа дескриптора, который
описывает тип дескриптора для которого требуется диагностика. Должен быть
одним из следующего: SQL_HANDLE_ENV, SQL_HANDLE_DBC, SQL_HANDLE_STMT или
SQL_HANDLE_DESC (не поддерживается).
Handle [Input]
дескриптор для диагностической структуры
данных. Тип обозначен в HandleType.
RecNumber [Input]
указывает запись состояния, из которой
прикладная программа ищет информацию. Записи состояния пронумерованы, начиная
с 1. Если параметр DiagIdentifier указывает, любое поле диагностического
заголовка, RecNumber игнорируется. В противном случае это
должно быть больше 0.
DiagIdentifier [Input]
указывает поле диагностики, чье
значение должно быть возвращено.
DiagInfoPtr [Output]
указатель на буфер выделенный, чтобы
возвращать диагностическую информацию. Тип данных зависит
от значения DiagIdentifier.
BufferLength [Input]
если DiagIdentifier определен в ODBC и
DiagInfoPtr указывает на строку или двоичный буфер, этот параметр должен быть
длиной *DiagInfoPtr. Если DiagIdentifier определен в ODBC и *DiagInfoPtr
является целым числом, BufferLength игнорируется. BufferLength может
иметь следующие значения:
StringLengthPtr [Output]
указатель на буфер распределенный,
чтобы возвращать общее количество байт, доступных в *DiagInfoPtr (только для
символьных данных, хвостовые нули не считаются).
SQLGetDiagField не регистрирует диагностические записи для себя. Это использует следующие значения возврата, чтобы сообщить результат собственного выполнения:
Прикладная программа обычно вызывает SQLGetDiagField, чтобы выполнить одну из трех целей:
DiagIdentifier: ниже приведен полный список диагностических идентификаторов, поддержанных драйвером.
DiagIdentifier | Тип возврата | Возвращаемое значение |
SQL_DIAG_CURSOR_ROW_COUNT | SQLINTEGER | Это поле содержит число строк в курсоре. |
SQL_DIAG_NUMBER | SQLINTEGER | Число записей состояния, которые являются доступными для определенного дескриптора. В настоящее время драйвер всегда возвращает 1. |
SQL_DIAG_RETURNCODE | SQLRETURN | Код возврата, возвращенный функцией. |
SQL_DIAG_ROW_COUNT | SQLINTEGER | Число строк, на которые воздействует операция insert, delete или update, вызванная через SQLExecute, SQLExecDirect, SQLBulkOperations или SQLSetPos. |
SQL_DIAG_CLASS_ORIGIN | SQLCHAR* | Строка, которая указывает документ который определяет часть класса значения SQLSTATE в этой записи. Значение "ISO 9075" для всех SQLSTATE определено X/Open и интерфейсом уровня обращения ISO. Для ODBC-специфических SQLSTATE (все те, чей класс SQLSTATE равен "IM"), это значение равно "ODBC 3.0". |
SQL_DIAG_COLUMN_NUMBER | SQLINTEGER | Если поле SQL_DIAG_ROW_NUMBER представляет собой имеющий силу номер строки в наборе строк или наборе параметров, это поле содержит значение, которое представляет номер столбца в наборе результатов или номер параметра в наборе параметров. Номера столбцов всегда начинаются с 1. Если эта запись состояния относится к столбцу закладки, поле может быть нулевым. Номера параметров начинаются с 1. Это имеет значение SQL_NO_COLUMN_NUMBER, если запись состояния не связана с номером столбца или номером параметра. Если драйвер не может определять номер столбца или номер параметра, с которым эта запись связана, это поле имеет значение SQL_COLUMN_NUMBER_UNKNOWN. Содержимое этого поля определено только для операторных дескрипторов. |
SQL_DIAG_CONNECTION_ NAME | SQLCHAR* | Строка, которая указывает имя подключения, к которому относится эта диагностическая запись. Драйвер возвращает DSN как имя подключения, а для DSN-LESS-подключения это поле является строкой нулевой длины. |
SQL_DIAG_MESSAGE_TEXT | SQLCHAR* | Информационное сообщение об ошибке или текста предупреждения. Подробности ниже. |
SQL_DIAG_NATIVE | SQLINTEGER | Исходно-специфический местный код ошибки драйвера или данных. Если не имеется никакого местного кода ошибки, драйвер возвращает 0. |
SQL_DIAG_ROW_NUMBER | SQLINTEGER | Это поле содержит номер строки в наборе строк, или номер параметра в наборе параметров, с которыми запись состояния связана. Номера начинаются с 1. Это поле имеет значение SQL_NO_ROW_NUMBER, если эта запись состояния не связана с номером строки или параметра. Если драйвер не может определять номер строки или параметра, с которым эта запись связана, это поле имеет значение SQL_ROW_NUMBER_UNKNOWN. Содержимое этого поля определено только для операторных дескрипторов. |
SQL_DIAG_SERVER_NAME | SQLCHAR* | Строка, которая указывает имя сервера для этой диагностической записи. Это равно значению, возвращенному для обращения к SQLGetInfo с опцией SQL_DATA_SOURCE_NAME. |
SQL_DIAG_SQLSTATE | SQLCHAR* | Код диагностики пятисимвольного SQLSTATE. |
SQL_DIAG_SUBCLASS_ORIGIN | SQLCHAR* | Строка с тем же самым форматом и имеющими силу значениями, что и SQL_DIAG_CLASS_ORIGIN, которая идентифицирует часть определения части подкласса кода SQLSTATE. ODBC-специфические SQLSTATE для ODBC 3.0 возвращаются. |
SQLGetDiagRec возвращает текущие значения нескольких полей диагностической записи, которая содержит ошибку, предупреждение и информацию состояния. В отличие от SQLGetDiagField, которая возвращает одно диагностическое поле на обращение, SQLGetDiagRec возвращает несколько обычно используемых полей диагностической записи, включая SQLSTATE, местный код ошибки и диагностический текст сообщения.
SQLRETURN SQLGetDiagRec(SQLSMALLINT HandleType, SQLHANDLE Handle, SQLSMALLINT RecNumber, SQLCHAR* Sqlstate, SQLINTEGER* NativeErrorPtr, SQLCHAR* MessageText, SQLSMALLINT BufferLength, SQLSMALLINT* TextLengthPtr);
HandleType [Input]
идентификатор типа дескриптора, который
описывает тип дескриптора, для которого диагностика требуется. Должен быть
одним из следующего: SQL_HANDLE_ENV
,
SQL_HANDLE_DBC
, SQL_HANDLE_STMT
или
SQL_HANDLE_DESC
(не поддерживается).
Handle [Input]
дескриптор для диагностической структуры
данных. Тип задан в HandleType.
RecNumber [Input]
указывает запись состояния, из которой
прикладная программа получает информацию. Записи состояния пронумерованы с 1.
SQLState [Output]
указатель на буфер нужный, чтобы возвращать
код пятисимвольного SQLSTATE, имеющий отношение к диагностической
записи RecNumber.
NativeErrorPtr [Output]
указатель на буфер выделенный, чтобы
возвращать местный код ошибки, специфический для источника данных. Эта
информация содержится в диагностическом поле SQL_DIAG_NATIVE.
MessageText [Output]
указатель на буфер выделенный, чтобы
возвращать диагностический текст сообщения. Эта информация содержится в
диагностическом поле SQL_DIAG_MESSAGE_TEXT.
BufferLength [Input]
длина буфера *MessageText в символах. Не
имеется никакой максимальной длины диагностического текста сообщения.
TextLengthPtr [Output]
указатель на буфер для возврата общего
количество байтов, доступных в *MessageText (кроме хвостовых нулей).
Прикладная программа обычно вызывает SQLGetDiagRec, когда предыдущее обращение к функции ODBC возвратило SQL_SUCCESS или SQL_SUCCESS_WITH_INFO. Однако, поскольку любая функция ODBC может регистрировать ноль или большее количество диагностических записей каждый вызов, прикладная программа может вызывать SQLGetDiagRec после любого обращения к функции ODBC.
SQLColumnPrivileges возвращает список столбцов и связанных привилегий для определенной таблицы. Драйвер возвращает информацию как набор результатов на определенном StatementHandle.
SQLRETURN SQLColumnPrivileges(SQLHSTMT StatementHandle, SQLCHAR* CatalogName, SQLSMALLINT NameLength1, SQLCHAR* SchemaName, SQLSMALLINT NameLength2, SQLCHAR* TableName, SQLSMALLINT NameLength3, SQLCHAR* ColumnName, SQLSMALLINT NameLength4);
StatementHandle [Input]
операторный дескриптор.
CatalogName [Input]
имя каталога. Если драйвер поддерживает
имена для некоторых каталогов, но не для всех (например, при одновременной
работе с разными СУБД), пустая строка обозначает те каталоги, которые не
имеют имен. CatalogName не может содержать образец поиска строки!
NameLength1 [Input]
длина *CatalogName.
SchemaName [Input]
имя схемы. Если драйвер поддерживает схемы
для некоторых каталогов, но не для всех (например, при одновременной работе с
разными СУБД), пустая строка обозначает те схемы, которые не имеют имен.
SchemaName не может содержать образец поиска строки!
NameLength2 [Input]
длина *SchemaName.
TableName [Input]
имя таблицы. Этот параметр не может быть
null. TableName не может содержать образец поиска строки.
NameLength3 [Input]
длина *TableName.
ColumnName [Input]
образец поиска строки с именем столбца.
NameLength4 [Input]
длина *ColumnName.
SQLColumns возвращает список имен столбцов в определенных таблицах. Драйвер возвращает эту информацию в наборе результатов на определенном StatementHandle.
4.10.2.1 Синтаксис
SQLRETURN SQLColumns(SQLHSTMT StatementHandle, SQLCHAR* CatalogName, SQLSMALLINT NameLength1, SQLCHAR* SchemaName, SQLSMALLINT NameLength2, SQLCHAR* TableName, SQLSMALLINT NameLength3, SQLCHAR* ColumnName, SQLSMALLINT NameLength4);
StatementHandle [Input]
операторный дескриптор.
CatalogName [Input]
имя каталога. Если драйвер поддерживает
имена для некоторых каталогов, но не для всех (например, при одновременной
работе с разными СУБД), пустая строка обозначает те каталоги, которые не
имеют имен. CatalogName не может содержать образец поиска строки!
NameLength1 [Input]
длина *CatalogName.
SchemaName [Input]
имя схемы. Если драйвер поддерживает схемы
для некоторых каталогов, но не для всех (например, при одновременной работе с
разными СУБД), пустая строка обозначает те схемы, которые не имеют имен.
SchemaName не может содержать образец поиска строки!
NameLength2 [Input]
длина *SchemaName.
TableName [Input]
имя таблицы. Этот параметр не может быть
null. TableName не может содержать образец поиска строки.
NameLength3 [Input]
длина *TableName.
ColumnName [Input]
образец поиска строки с именем столбца.
NameLength4 [Input]
длина *ColumnName.
SQLForeignKeys может вернуть:
Драйвер возвращает каждый список в наборе результатов на определенной инструкции.
SQLRETURN SQLForeignKeys(SQLHSTMT StatementHandle, SQLCHAR* PKCatalogName, SQLSMALLINT NameLength1, SQLCHAR* PKSchemaName, SQLSMALLINT NameLength2, SQLCHAR* PKTableName, SQLSMALLINT NameLength3, SQLCHAR* FKCatalogName, SQLSMALLINT NameLength4, SQLCHAR* FKSchemaName, SQLSMALLINT NameLength5, SQLCHAR* FKTableName, SQLSMALLINT NameLength6);
StatementHandle [Input]
операторный дескриптор.
PKCatalogName [Input]
имя каталога первичного ключа таблицы.
Если драйвер поддерживает имена для некоторых каталогов, но не для всех
(например, при одновременной работе с разными СУБД), пустая строка обозначает
те каталоги, которые не имеют имен. CatalogName не может содержать
образец поиска строки!
NameLength1 [Input]
длина *PKCatalogName в байтах.
PKSchemaName [Input]
имя схемы первичного ключа таблицы. Если
драйвер поддерживает схемы для некоторых каталогов, но не для всех (например,
при одновременной работе с разными СУБД), пустая строка обозначает те схемы,
которые не имеют имен. SchemaName не может содержать образец поиска строки!
NameLength2 [Input]
длина *PKSchemaName в байтах.
PKTableName [Input]
имя таблицы с первичным ключом. Этот
параметр не может быть null. TableName не может содержать
образец поиска строки.
NameLength3 [Input]
длина *PKTableName в байтах.
PKCatalogName [Input]
имя каталога внешнего ключа таблицы.
Если драйвер поддерживает имена для некоторых каталогов, но не для всех
(например, при одновременной работе с разными СУБД), пустая строка обозначает
те каталоги, которые не имеют имен. CatalogName не может содержать
образец поиска строки!
NameLength4 [Input]
длина *FKCatalogName в байтах.
PKSchemaName [Input]
имя схемы внешнего ключа таблицы. Если
драйвер поддерживает схемы для некоторых каталогов, но не для всех (например,
при одновременной работе с разными СУБД), пустая строка обозначает те схемы,
которые не имеют имен. SchemaName не может содержать образец поиска строки!
NameLength5 [Input]
длина *FKSchemaName в байтах.
FKTableName [Input]
имя таблицы с внешним ключом. Этот
параметр не может быть null. TableName не может содержать
образец поиска строки.
NameLength6 [Input]
длина *FKTableName в байтах.
SQLPrimaryKeys возвращает имена столбцов, которые составляют первичный ключ для таблицы. Драйвер возвращает информацию в наборе результатов. Эта функция не поддерживает первичные ключи из нескольких таблиц сразу в одном обращении.
SQLRETURN SQLPrimaryKeys(SQLHSTMT StatementHandle, SQLCHAR* CatalogName, SQLSMALLINT NameLength1, SQLCHAR* SchemaName, SQLSMALLINT NameLength2, SQLCHAR* TableName, SQLSMALLINT NameLength3);
StatementHandle [Input]
операторный дескриптор.
CatalogName [Input]
имя каталога. Если драйвер поддерживает
имена для некоторых каталогов, но не для всех (например, при одновременной
работе с разными СУБД), пустая строка обозначает те каталоги, которые не
имеют имен. CatalogName не может содержать образец поиска строки!
NameLength1 [Input]
длина *CatalogName.
SchemaName [Input]
имя схемы. Если драйвер поддерживает схемы
для некоторых каталогов, но не для всех (например, при одновременной работе с
разными СУБД), пустая строка обозначает те схемы, которые не имеют имен.
SchemaName не может содержать образец поиска строки!
NameLength2 [Input]
длина *SchemaName.
TableName [Input]
имя таблицы. Этот параметр не может быть
null. TableName не может содержать образец поиска строки.
NameLength3 [Input]
длина *TableName.
SQLSpecialColumns возвращает следующую информацию относительно столбцов внутри определенной таблицы:
SQLRETURN SQLSpecialColumns(SQLHSTMT StatementHandle, SQLSMALLINT IdentifierType, SQLCHAR* CatalogName, SQLSMALLINT NameLength1, SQLCHAR* SchemaName, SQLSMALLINT NameLength2, SQLCHAR* TableName, SQLSMALLINT NameLength3, SQLSMALLINT Scope, SQLSMALLINT Nullable);
StatementHandle [Input]
операторный дескриптор.
IdentifierType [Input]
тип столбца для возврата. Должен быть
одним из следующих значений:
SQL_BEST_ROWID:
возвращает оптимальный столбец или набор
столбцов, который позволяет уникально идентифицировать любую строку в
определенной таблице. Столбец может быть столбцом (или набором столбцов)
любого уникального индекса для таблицы или псевдостолбцом, специально
разработанным для этой цели.
SQL_ROWVER:
возвращает столбец или столбцы в определенной
таблице, которые автоматически модифицируются источником данных, когда любое
значение в строке модифицируется транзакцией (если такие столбцы есть).CatalogName [Input]
имя каталога. Если драйвер поддерживает
имена для некоторых каталогов, но не для всех (например, при одновременной
работе с разными СУБД), пустая строка обозначает те каталоги, которые не
имеют имен. CatalogName не может содержать образец поиска строки!
NameLength1 [Input]
длина *CatalogName.
SchemaName [Input]
имя схемы. Если драйвер поддерживает схемы
для некоторых каталогов, но не для всех (например, при одновременной работе с
разными СУБД), пустая строка обозначает те схемы, которые не имеют имен.
SchemaName не может содержать образец поиска строки!
NameLength2 [Input]
длина *SchemaName.
TableName [Input]
имя таблицы. Этот параметр не может быть
null. TableName не может содержать образец поиска строки.
NameLength3 [Input]
длина *TableName.
Scope [Input]
минимум требуемой области rowid. Возвращенный
rowid может иметь большую область. Должен быть одним из следующего:
SQL_SCOPE_CURROW:
rowid точно будет иметь силу только в
то время, когда выполнено позиционирование в эту строку. Более поздний
перевыбор, использующий rowid, не может возвращать строку, если строка
модифицирована или удалена другой транзакцией.
SQL_SCOPE_TRANSACTION:
rowid будет иметь силу
для текущей транзакции.
SQL_SCOPE_SESSION:
rowid будет иметь силу для текущего
сеанса связи (игнорируя границы транзакции).Nullable [Input]
определяет, возвратить ли специальные
столбцы, которые могут иметь значение NULL. Должен быть одним из следующего:
SQL_NO_NULLS:
исключить специальные столбцы, которые
могут иметь значения NULL. Некоторые драйверы не могут поддерживать
SQL_NO_NULLS, и эти драйверы возвратят пустой набор результатов, если был
определен SQL_NO_NULLS. Прикладные программы должны быть подготовлены к этому
случаю и запрашивать SQL_NO_NULLS только, если это абсолютно необходимо.
SQL_NULLABLE:
вернуть специальные столбцы, даже если они
могут иметь значения NULL.SQLStatistics возвращает статистику относительно одной таблицы и индексов, связанных с этой таблицей. Драйвер возвращает информацию в наборе результатов.
SQLRETURN SQLStatistics(SQLHSTMT StatementHandle, SQLCHAR* CatalogName, SQLSMALLINT NameLength1, SQLCHAR* SchemaName, SQLSMALLINT NameLength2, SQLCHAR* TableName, SQLSMALLINT NameLength3, SQLUSMALLINT Unique, SQLUSMALLINT Reserved);
StatementHandle [Input]
операторный дескриптор.
CatalogName [Input]
имя каталога. Если драйвер поддерживает
имена для некоторых каталогов, но не для всех (например, при одновременной
работе с разными СУБД), пустая строка обозначает те каталоги, которые не
имеют имен. CatalogName не может содержать образец поиска строки!
NameLength1 [Input]
длина *CatalogName.
SchemaName [Input]
имя схемы. Если драйвер поддерживает схемы
для некоторых каталогов, но не для всех (например, при одновременной работе с
разными СУБД), пустая строка обозначает те схемы, которые не имеют имен.
SchemaName не может содержать образец поиска строки!
NameLength2 [Input]
длина *SchemaName.
TableName [Input]
имя таблицы. Этот параметр не может быть
null. TableName не может содержать образец поиска строки.
NameLength3 [Input]
длина *TableName.
Unique [Input]
тип индекса: SQL_INDEX_UNIQUE или
SQL_INDEX_ALL.
Reserved [Input]
указывает важность CARDINALITY в столбце
PAGES набора результатов. Следующие параметры воздействуют на возврат только
столбцов CARDINALITY и PAGES (индексная информация возвращена, даже если
CARDINALITY и PAGES не возвращены):
SQL_ENSURE
требует, чтобы драйвер безоговорочно получил
статистику. Драйверы, которые согласовываются только со стандартом X/Open и
не поддерживают ODBC-расширения, не способны поддерживать SQL_ENSURE.
SQL_QUICK
требует, чтобы драйвер получил CARDINALITY и PAGES
только если они легко доступны с сервера. В этом случае драйвер не
гарантирует, что значения актуальны. Прикладные программы, которые написаны в
стандарте X/Open, будут всегда получать SQL_QUICK из драйверов ODBC 3.x.SQLTablePrivileges возвращает список таблиц и привилегий, связанных с каждой таблицей. Драйвер возвращает информацию в наборе результатов на определенной инструкции.
SQLRETURN SQLTablePrivileges(SQLHSTMT StatementHandle, SQLCHAR* CatalogName, SQLSMALLINT NameLength1, SQLCHAR* SchemaName, SQLSMALLINT NameLength2, SQLCHAR* TableName, SQLSMALLINT NameLength3);
StatementHandle [Input]
операторный дескриптор.
CatalogName [Input]
имя каталога. Если драйвер поддерживает
имена для некоторых каталогов, но не для всех (например, при одновременной
работе с разными СУБД), пустая строка обозначает те каталоги, которые не
имеют имен. CatalogName не может содержать образец поиска строки!
NameLength1 [Input]
длина *CatalogName.
SchemaName [Input]
имя схемы. Если драйвер поддерживает схемы
для некоторых каталогов, но не для всех (например, при одновременной работе с
разными СУБД), пустая строка обозначает те схемы, которые не имеют имен.
SchemaName не может содержать образец поиска строки!
NameLength2 [Input]
длина *SchemaName.
TableName [Input]
имя таблицы. Этот параметр не может быть
null. TableName не может содержать образец поиска строки.
NameLength3 [Input]
длина *TableName.
SQLTables возвращает список имен таблиц, каталогов, схем и типов таблиц, сохраненных в специфическом источнике данных. Драйвер возвращает информацию в наборе результатов.
SQLRETURN SQLTables(SQLHSTMT StatementHandle, SQLCHAR* CatalogName, SQLSMALLINT NameLength1, SQLCHAR* SchemaName, SQLSMALLINT NameLength2, SQLCHAR* TableName, SQLSMALLINT NameLength3, SQLCHAR* TableType, SQLSMALLINT NameLength4);
StatementHandle [Input]
операторный дескриптор.
CatalogName [Input]
имя каталога. Если драйвер поддерживает
имена для некоторых каталогов, но не для всех (например, при одновременной
работе с разными СУБД), пустая строка обозначает те каталоги, которые не
имеют имен. CatalogName не может содержать образец поиска строки!
NameLength1 [Input]
длина *CatalogName.
SchemaName [Input]
имя схемы. Если драйвер поддерживает схемы
для некоторых каталогов, но не для всех (например, при одновременной работе с
разными СУБД), пустая строка обозначает те схемы, которые не имеют имен.
SchemaName не может содержать образец поиска строки!
NameLength2 [Input]
длина *SchemaName.
TableName [Input]
имя таблицы. Этот параметр не может быть
null. TableName не может содержать образец поиска строки.
NameLength3 [Input]
длина *TableName.
Table Type [Input]
список типов таблиц.
NameLength4 [Input]
длина *TableType.
SQLTransact запрашивает завершение или отмену для всех активных операций на всех инструкциях, связанных с подключением. SQLTransact может также запрашивать это для всех подключений, связанных со средой. В ODBC 3.x SQLEndTran заменил функцию ODBC 2.x SQLTransact.
SQLEndTran запрашивает завершение или отмену для всех активных операций на всех инструкциях, связанных с подключением. SQLEndTran может также запрашивать это для всех подключений, связанных со средой.
SQLRETURN SQLEndTran(SQLSMALLINT HandleType, SQLHANDLE Handle, SQLSMALLINT CompletionType);
HandleType [Input]
идентификатор типа дескриптора. Содержит
SQL_HANDLE_ENV (если Handle дескриптор среды) или SQL_HANDLE_DBC (если Handle
представляет собой дескриптор подключения).
Handle [Input]
дескриптор, тип коего задан в HandleType,
указывает контекст транзакции.
CompletionType [Input]
одно из следующтх двух значений:
SQL_COMMIT
или
SQL_ROLLBACK
.SQLFreeStmt останавливает обработку, связанную со специфической инструкцией, закрывает любые открытые курсоры, связанные с этой инструкцией, отбрасывает ждущие обработки результаты и, факультативно, освобождает все ресурсы, связанные с операторным дескриптором.
SQLRETURN SQLFreeStmt(SQLHSTMT StatementHandle, SQLUSMALLINT Option);
StatementHandle [Input]
операторный дескриптор.
Option [Input]
одни из следующих параметров:
Опция | Действие |
SQL_CLOSE | Закрывает курсор, связанный с StatementHandle (если он был определен) и отбрасывает все ждущие обработки результаты. Прикладная программа может вновь открыть этот курсор позже, выполняя инструкцию SELECT с теми же самыми или иными значениями параметра. Если никакой курсор не открыт, эта опция не имеет никакого эффекта для прикладной программы. SQLCloseCursor может также быть вызван, чтобы закрыть курсор. |
SQL_DROP | Освобождает операторный дескриптор:
освобождает все ресурсы, связанных с ним, отбрасывает все ждущие обработки
операции и закрывает курсор. Операторный дескриптор должен быть
перераспределен для повторного использования. Эта опция устарела в MyODBC
3.51. Вызов SQLFreeStmt с параметром Option равным SQL_DROP
отображается на вызов SQLFreeHandle. |
SQL_UNBIND | Освобождает все буферы столбцов, связанные SQLBindCol для данного операторного дескриптора. |
SQL_RESET_PARAMS | Освобождает весь набор буферов параметров SQLBindParameter для данного операторного дескриптора. |
SQLCloseCursor закрывает курсор, который был открыт на инструкции и отбрасывает ждущие обработки результаты.
SQLRETURN SQLCloseCursor(SQLHSTMT StatementHandle);
StatementHandle [Input]
операторный дескриптор.
SQLCancel отменяет обработку инструкции.
SQLRETURN SQLCancel(SQLHSTMT StatementHandle);
StatementHandle [Input]
операторный дескриптор.
SQLCancel может отменять следующие типы обработки инструкции:
В ODBC 2.x, если из прикладной программы вызвана SQLCancel, когда обработка не делается на инструкции, SQLCancel имеют тот же самый эффект, что и SQLFreeStmt с опцией SQL_CLOSE. Это поведение определено только для законченности реализации, и прикладные программы должны вызвать SQLFreeStmt или SQLCloseCursor, чтобы закрыть курсоры.
SQLDisconnect закрывает подключение, связанное со специфическим дескриптором подключения.
SQLRETURN SQLDisconnect(SQLHDBC ConnectionHandle);
ConnectionHandle [Input]
дескриптор подключения.
Если из прикладной программы вызвана SQLDisconnect, в то время как имеется незавершенная транзакция, связанная с дескриптором подключения, драйвер возвращает SQLSTATE 25000 (Invalid transaction state) указывая, что транзакция является неизменяемой, и подключение открыто. Незавершенной транзакцией является такая, которая не была ни завершена, ни отменена с помощью вызова SQLEndTran.
Если из прикладной программы вызвана SQLDisconnect прежде, чем были освобождены все инструкции, связанные с подключением, драйвер после того, как успешно завершит отсоединение от сервера, освобождает те инструкции и все дескрипторы, которые были явно распределены на подключении.
SQLFreeHandle освобождает ресурсы, связанные со специфической средой, подключением, инструкцией или дескриптором.
Обратите внимание
, что это универсальная функция для
освобождения дескрипторов. Это заменяет функции ODBC 2.0 SQLFreeConnect (для
освобождения дескриптора подключения) и SQLFreeEnv (для освобождения
дескриптора среды). SQLFreeConnect и SQLFreeEnv устарели в ODBC 3.x.
SQLFreeHandle также заменяет функцию ODBC 2.0 SQLFreeStmt (с Option равным
SQL_DROP) для освобождения операторного дескриптора.
SQLRETURN SQLFreeHandle(SQLSMALLINT HandleType, SQLHANDLE Handle);
HandleType [Input]
тип дескриптора, который будет освобожден
SQLFreeHandle. Должен быть одним из следующих значений:
SQL_HANDLE_ENV
,
SQL_HANDLE_DBC
,
SQL_HANDLE_STMT
или
SQL_HANDLE_DESC
(не поддерживается)Если HandleType не одно из этих значений, SQLFreeHandle возвращает SQL_INVALID_HANDLE.
Handle [Input]
дескриптор, который будет освобожден.
Освобождение дескриптора среды:
До вызова SQLFreeHandle с HandleType равным SQL_HANDLE_ENV прикладная
программа должна вызвать SQLFreeHandle с HandleType равным SQL_HANDLE_DBC для
всех подключений, распределенных средой. Иначе обращение к SQLFreeHandle
возвращает SQL_ERROR, а среда и любое активное подключение остаются прежними.
Освобождение дескриптора подключения:
До вызова SQLFreeHandle с HandleType равным SQL_HANDLE_DBC прикладная
программа должна вызвать SQLDisconnect для подключения, если имеется
подключение на этом дескрипторе. Иначе обращение к SQLFreeHandle возвращает
SQL_ERROR, а подключение остается прежним.
Освобождение операторного дескриптора:
Обращение к SQLFreeHandle с HandleType равным SQL_HANDLE_STMT освобождает все
ресурсы, которые были распределены обращением SQLAllocHandle с HandleType
равным SQL_HANDLE_STMT. Когда из прикладной программы вызывается
SQLFreeHandle, чтобы освободить инструкцию, которая имеет ждущие обработки
результаты, они будут автоматически удалены. Обратите внимание, что
SQLDisconnect автоматически уничтожает любые инструкции и дескрипторы,
открытые на подключении.
SQLFreeConnect освобождает дескриптор подключения и всю память, связанную с этим дескриптором. В ODBC 3.x SQLFreeHandle заменил собой функцию ODBC 2.0 SQLFreeConnect.
SQLFreeEnv освобождает дескриптор среды и всю память, связанную с дескриптором среды. В ODBC 3.x SQLFreeHandle заменил собой функцию ODBC 2.0 SQLFreeEnv.
Источник данных идентифицирует путь для данных, который может включать
сетевую библиотеку, сервер, базу данных и другие атрибуты, в данном случае
источник данных задает путь к базе данных MySQL
. Чтобы
соединиться с источником данных, Driver Manager проверяет системный реестр
Windows для сбора специфической информации для подключения.
ODBC Driver Manager
и MyODBC Drivers
используют
вход системного реестра, созданный ODBC Data Source
Administrator
. Этот вход содержит информацию относительно каждого
источника данных и связанного с ним драйвера. Прежде, чем Вы сможете
соединяться с источником данных, информация для конкретного подключения
должна быть добавлена к системному реестру.
Машинные источники данных
сохраняют
информацию подключения в системном реестре Windows на специфическом
компьютере с определяемым пользователем именем. Вы можете использовать
машинные источники данных только на компьютере, на котором они определены.
Имеются два типа машинных источников данных: пользовательские
и
системные
.
Пользовательские источники данных
могут
использоваться только текущим пользователем и видны только этому
пользователю. Системные источники данных
могут
использоваться всеми пользователями на компьютере и видны всем пользователям
компьютерных и системных сервисов, типа Microsoft Windows NT services.
Машинный источник данных особенно полезен, когда Вы хотите обеспечивать дополнительную защиту, поскольку только зарегистрировавшиеся пользователи могут рассматривать машинный источник данных, и он не может быть скопирован удаленным пользователем на другой компьютер.
Файловые источники данных
(также известны
как DSN-файлы
) сохраняют информацию подключения в текстовом
файле, и вообще более гибки в использовании, чем машинные источники данных.
Например, Вы можете копировать файловый источник данных на любой компьютер с
правильным ODBC-драйвером так, чтобы Ваша прикладная программа могла
полагаться на непротиворечивую и точную информацию подключения на всех
компьютеры, которые это используют. Или Вы можете помещать источник данных на
сервер, совместно использовать его многими компьютерами в сети и легко
поддерживать информацию подключения в одном месте.
Файловый источник данных
может также быть неразделяемым.
Такой источник данных дислоцируется на одном компьютере и указывает на
машинный источник данных. Вы можете использовать неразделяемые источники
данных, чтобы обратиться к существующим источникам данных машины из
файловых источников данных.
Если Вы хотите соединяться с системы A с системой B с именем пользователя myuser и паролем mypassword, надо:
На системе "B"
:
GRANT ALL ON *.* to "myuser"@"A" IDENTIFIED BY "mypassword"
На системе "A"
:
DSN = remote_test SERVER or HOST = B (или IP-адрес системы B) DATABASE = test (или определите имя нужной базы данных) USER = myuser PASSWORD = mypassword
"DSN=remote_test"
. Если это терпит неудачу,
изучите протокол ошибок MyODBC и действуйте на основании полученной
информации. Если ничего не получается, пишите на
myodbc@lists.mysql.com.Вы можете также использовать довольно простой HOWTO с http://www.phphelp.com/tutorial/using-myodbc-to-connect-to-a-remote-database.html.
"Could Not Load
Translator or Setup Library"
. В чем дело?Подробности на MS KB Article(Q260558) по адресу http://support.microsoft.com/default.aspx?scid=kb;EN-US;q260558. Также убедитесь, что имеете самый современный файл ctl3d32.dll в системном каталоге.
Информацию по объединению подключений смотрите на http://support.microsoft.com/default.aspx?scid=kb;EN-US;q169470".
MDAC
(Microsoft Data
Access Components) с
http://www.microsoft.com/data.
#deleted#
в Access. Обратите внимание, что если Вы используете
MySQL Version 3.22, Вы должны применить заплату MDAC
и
использовать MyODBC 2.50.32, 2.50.34 или выше.
MySQL
с
http://www.mysql.com/downloads/index.html.
MyODBC 3.51
или
MyODBC
с
http://www.mysql.com/downloads/api-myodbc.html.
Return matching
rows
в MyODBC (3.51)
MySQL
через MyODBC
или MyODBC 3.51
.Вы не можете экспортировать таблицу или сделать запрос к базе данных
MySQL, если Вы не установили драйвер MyODBC
или MyODBC
3.51
.
Чтобы экспортировать таблицу из Access в MySQL:
таблицы
или запроса
и затем
из меню File
выберите Export
.
Export Object Type
введите имя объекта, а в окне Save
As Type нажмите на ODBC Databases()
.
Export
введите имя для файла (или используйте
предложенное имя), затем нажмите на OK
.
MyODBC
или MyODBC 3.51
,
в который Вы хотите экспортировать информацию.Microsoft Access свяжется с сервером MySQL
через этот
источник данных и экспортирует новые таблицы и/или данные.
File
укажите Get
External Data
и выберите Import
. Чтобы связывать таблицы,
в меню File укажите на Get External Data
и
выберите Link Tables
.
Import
(или Link
) в блоке Files Of
Type выберите ODBC Databases()
. Диалоговое окно Select Data
Source вносит в список определенные источники данных для любых
ODBC-драйверов, установленных на Вашем компьютере. Нажмите File Data Source
или Machine Data Source и дважды щелкните по источнику данных
MyODBC
или MyODBC 3.51
.
OK
.
MySQL
через ODBC
data source
и отобразит список таблиц, которые Вы можете импортировать
(import
) или привязать (link
).
OK
. Если Вы связываете таблицу, а она не имеет
индекса, который уникально идентифицирует каждую запись, то Microsoft Access
отображает список полей в связанной таблице. Нажмите на поле или на
комбинацию полей, которые уникально идентифицируют каждую запись, а
затем на OK
.Конечно. Используйте следующую процедуру, чтобы рассмотреть или обновить связи, когда структура или расположение связанной таблицы изменились. Linked Table Manager вносит в список пути ко всем в настоящее время связанным таблицам.
Чтобы посмотреть или обновить запись:
Tools
укажите Add-ins
и выберите
Linked Table Manager
.
Microsoft Access подтвердит успешную регенерацию или, если таблица не была
найдена, отобразит диалоговое окно Select New Location of
<имя таблицы>, в котором Вы можете определять новое расположение
таблицы. Если несколько выбранных таблиц передвигались в новое расположение,
которое Вы определяете, Linked Table Manager ищет все выбранные таблицы и
модифицирует все связи.
Чтобы сменить путь для набора связанных таблиц:
Tools
укажите Add-ins
и выберите
Linked Table Manager
.
Always Prompt For A New Location
.
OK
.
Select New Location of
<имя таблицы
> определите новое расположение, нажмите Open
, а затем
OK
.#Deleted#
. Что делать?
Если вставленные или модифицируемые записи показываются как
#DELETED#
в Access:
MDAC
(Microsoft Data
Access Components) с
http://www.microsoft.com/data.
#deleted#
в Access. Обратите внимание, что если Вы используете
MySQL Version 3.22, Вы должны применить заплату MDAC
и
использовать MyODBC 2.50.32, 2.50.34 или выше.
Return matching
rows
в MyODBC (3.51)
. Для Access 2.0 Вы
должны дополнительно включить опцию Simulate ODBC 1.0
.
"Row cannot be located for updating.
Some values may have been changed since it was last read"
Проверьте параметр Return Matching Rows
диалога настройки DSN
или укажите параметр подключения OPTION=2
.
"syntax error"
.Это странная проблема Access 97, ее уже нет в Access 2000 или в 2002. Вы можете решить проблему, обновив драйвер MyODBC до MyODBC 3.51.02 или выше.
"Another
user has modified the record that you have modified"
при редактировании записейВ большинстве случаев это может быть решено, делая одно из следующего:
Если вышеупомянутое не помогает, Вы должны сделать файл трассировки
MyODBC
и попробовать вычислить, что пошло не так.
Обратитесь к интерактивному справочнику на http://support.microsoft.com/support/kb/articles/Q124/9/01.asp?LN=EN-US&SD=gn&FR=0%3CP%3E.
Конечно, есть. Список доступных инструментальных средств есть на странице конверторов: http://www.mysql.com/downloads/contrib.html#SEC643.
Выключите следующие три параметра (или задайте в строке подключения OPTION=2059):
"SELECT count (*) FROM table ..."
в
MyODBC (3.51) возвращается ошибка.Это потому, что выражение COUNT(*)
возвращает BIGINT и ADO
не может работать с такими величинами. Установите опцию, чтобы обработать
BIGINT как INT в MyODBC (option=16384).
Multiple-step
operation generated errors. Check each status value
Методы ADO GetChunk()
и AppendChunk()
не
работают так, как от них ожидается, когда расположение курсора определено как
adUseServer
. Но все работает с применением
adUseClient
.
Простой пример можно найти на http://www.dwam.net/iishelp/ado/docs/adomth02_4.htm.
Вы можете использовать свойство ADO RecordsAffected
. Для
получения большего количества информации относительно использования метода
execute, обратитесь к ресурсу
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ado270/htm/mdmthcnnexecute.asp
.
Простые примеры использования ADO, DAO и RDO с VB есть по адресам:
Если у Вас есть хорошие примеры применения ADO/DAO/RDO или соображения по этим вопросам, напишите на myodbc@lists.mysql.com.
Подробная информация по доступу к MySQL через ASP с использованием MyODBC есть по следующим адресам:
Это проблема Access 97 и происходит она когда Ваша таблица состоит из полей с типами TEXT или VARCHAR. Вы можете обойти эту ошибку, обновив MyODBC до версии 3.51.02 или выше.
Есть статья по настройке на http://dbforums.com/showthread.php?threadid=174934.
Да. MyODBC 3.51 поддерживает динамический
,
"только вперед"
и
статический
типы курсора.
Из-за проблем эффективности, драйвер не поддерживает это свойство по
умолчанию. Можно его включить, определяя параметр опции подключения как
OPTION=32
или проверяя опцию
Enable Dynamic Cursor
из настройки DSN.
Можно. Если Вы находите, что что-то не работает с MyODBC 3.51, но работает с MyODBC 2.50, напишите об этом на myodbc@lists.mysql.com.
Работает. Это было проверено с провайдерами Microsoft .NET, список которых можно найти на: http://www.mysql.com/products/myodbc/manual.html#MyODBC_With_.NET.
Предостережение: при использовании ODBC.NET с MyODBC, при выборке пустой строки (нулевой длины) это начинает давать исключительную ситуацию SQL_NO_DATA. Вы можете получить заплатку для этого с http://support.microsoft.com/default.aspx?scid=kb;EN-US;q319243.
MyODBC был проверен со следующими прикладными программами:
Если Вы знаете о любых других прикладных программах, которые работают с MyODBC, пожалуйста, напишите об этом на myodbc@lists.mysql.com.
Файл mydsn.dll
должен использоваться, чтобы формировать и
удалять DSN-файл системного реестра для драйвера MyODBC в прикладных
программах Coldfusion. Чтобы сформировать DLL, Вам понадобятся VC++ 6.0 и
окружение для компилятора C++, указывающее место дислокации файла CFAPI
header, cfx.h
. Также добавьте путь include
для Вашей среды:
\cfusion\cfx\include
Чтобы использовать mydsn.dll
, Вы должны использовать
администратор CFX Coldfusion, чтобы зарегистрировать заказной тэг
CFX_MYDSN
. Вы имеете две функции: ADD
добавляет
DSN, а REMOVE
удаляет. Чтобы добавить запись, Вы
используете следующий синтаксис:
<CFX_MYDSN ACTION="ADD" DSN="DSN=DSNname" SERVER="SERVER=ServerNameOrIPAddress" DATABASE="DATABASE=DBname" USERNAME="UID=UserName" PASSWORD="PWD=UserPassword" PORT="PORT=3307" OPTION="OPTION=12">
Обратите внимание, что OPTION
здесь задает два параметра:
Trace MyODBC (4)
и Allow Big Results (8)
,
так что в сумме 4+8 = 12.
Чтобы удалить DSN-запись, Вы должны использовать:
<CFX_MYDSN ACTION="REMOVE" DSN="DSN=DSNname">
Цель этого учебника состоит в том, чтобы научить программиста на языке C обращению с ODBC. В качестве примера будет рассматриваться простая программа, которая соединяется с базой данных через ODBC и читает некоторые данные. Программа, показанная в качестве примера, была первоначально написана под WinNT и позже перенесена без каких-либо корректировок в Linux и unixODBC. Вот она, настоящая совместимость!
Я предполагаю, что у Вас есть:
/usr/include/odbc
Если установлен gcc, введите:
gcc odbc.c -o odbc -lodbc
В результате будет создан исполняемый модуль с именем odbc.
Еще потребуется тестовая база данных для проведения над ней опытов. Также нужен источник данных, через который будет осуществляться работа с базой. Наша база данных будет иметь единственную таблицу:
tkeyuser | |
---|---|
iduser | sequence |
dtname | char(40) |
dtmaxSize | Integer |
Наш источник данных будет называться web, а доступ предоставляется пользователю christa без пароля.
Первая вещь, в которой Вы будете заинтересованы, это переменная типа
SQLHENV
. Это дескриптор (указатель) на внутреннюю структуру
ODBC, которая хранит всю информацию относительно ODBC-среды. Без дескриптора
этого вида Вы не сможете почти ничего сделать. Чтобы получить этот
дескриптор, Вы вызываете функцию SQLAllocHandle(SQL_HANDLE_ENV,
SQL_NULL_HANDLE, &V_OD_Env)
. Здесь V_OD_Erg
является
переменной типа SQLHENV
, которая как раз и хранит
распределенный дескриптор среды.
Если Вы распределили дескриптор, Вы должны определить, которую версию ODBC
надлежит использовать. Следовательно, Вы должны вызвать
SQLSetEnvAttr(V_OD_Env, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0)
. Константа SQL_ATTR_ODBC_VERSION
определяет то, какая
версия ODBC будет использована, а SQL_OV_ODBC3
говорит, что
программа будет нуждаться В ODBC 3.0.
Теперь Вы должны создать дескриптор для соединения с базой данных, который
имеет тип SQLHDBC
. Вы еще раз вызываете
SQLAllocHandle
, но на этот раз с SQL_HANDLE_DBC
и
дескриптором среды, возвращенным первым обращением к
SQLAllocHandle
.
Затем Вы можете выбирать, надо ли изменить атрибуты соединения, главным
образом блокировку по времени для любого заданного действия на соединении. Вы
можете сделать это, вызывая функцию SQLSetConnectAttr
с
дескриптором соединения, атрибутом, указателем на переменную и длиной строки,
если она нужна.
После всего этого, Вы способны соединиться с базой данных через вызов
SQLConnect
, который нуждается в имени источника данных, имени
пользователя и пароле в качестве параметров. Для каждого параметра Вы должны
определить, длину строки или только параметр SQL_NTS
, который
говорит, что это строка, длина которой должна быть определена
SQLConnect
.
Пожалуйста, обратите внимание, что все функции, упомянутые в этом разделе,
возвращают SQL_SUCCESS
или SQL_SUCCESS_WITH_INFO
,
если все прошло гладко, SQL_ERROR
или
SQL_INVALID_HANDLE
в случае ошибки. Я расскажу о том, как
получить диагностические сообщения немного позже.
Теперь рассмотрим код примера:
/*
odbc.c
testing unixODBC
*/
#include <stdlib.h>
#include <stdio.h>
#include <odbc/sql.h>
#include <odbc/sqlext.h>
#include <odbc/sqltypes.h>
SQLHENV V_OD_Env; // Handle ODBC environment
long V_OD_erg; // result of functions
SQLHDBC V_OD_hdbc; // Handle connection
char V_OD_stat[10]; // Status SQL
SQLINTEGER V_OD_err,V_OD_rowanz,V_OD_id;
SQLSMALLINT V_OD_mlen;
char V_OD_msg[200],V_OD_buffer[200];
int main(int argc,char *argv[])
{
// 1. allocate Environment handle and register version
V_OD_erg=SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&V_OD_Env);
if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
{
printf("Error AllocHandle\n");
exit(0);
}
V_OD_erg=SQLSetEnvAttr(V_OD_Env, SQL_ATTR_ODBC_VERSION,
(void*)SQL_OV_ODBC3, 0);
if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
{
printf("Error SetEnv\n");
SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);
exit(0);
}
// 2. allocate connection handle, set timeout
V_OD_erg = SQLAllocHandle(SQL_HANDLE_DBC, V_OD_Env, &V_OD_hdbc);
if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
{
printf("Error AllocHDB %d\n",V_OD_erg);
SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);
exit(0);
}
SQLSetConnectAttr(V_OD_hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER *)5, 0);
// 3. Connect to the datasource "web"
V_OD_erg = SQLConnect(V_OD_hdbc, (SQLCHAR*) "web", SQL_NTS,
(SQLCHAR*) "christa", SQL_NTS,
(SQLCHAR*) "", SQL_NTS);
if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
{
printf("Error SQLConnect %d\n",V_OD_erg);
SQLGetDiagRec(SQL_HANDLE_DBC, V_OD_hdbc,1, V_OD_stat, &V_OD_err,
V_OD_msg,100,&V_OD_mlen);
printf("%s (%d)\n",V_OD_msg,V_OD_err);
SQLFreeHandle(SQL_HANDLE_DBC, V_OD_hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);
exit(0);
}
printf("Connected !\n");
/* Продолжение чуть ниже... */
Простой запрос может быть выполнен прямо сейчас. Но что делать, если Ваша программа выполняется на системе, где Вы не можете определить, как настроены имена источников данных?
Тут Вы должны использовать SQLDataSources()
. После
распределения дескриптора среды, Вы можете использовать его, чтобы выяснить
все относительно DSN и описания для источника данных.
Поскольку ODBC знает системные и пользовательские источники данных, Вы должны дать указание, который тип Вы ищете. Вы можете определять любое из следующих значений:
SQL_FETCH_FIRST |
Устанавливает SQLDataSources() в первый из всех доступных
источников данных (системный или пользовательский). |
SQL_FETCH_FIRST_USER |
Устанавливает SQLDataSources() в первый из всех доступных
источников данных (только пользовательский). |
SQL_FETCH_FIRST_SYSTEM |
Устанавливает SQLDataSources() в первый из всех доступных
источников данных (только системный). |
SQL_FETCH_FIRST_NEXT |
Выбирает следующий источник данных. В зависимости от
SQL_FETCH_FIRST_USER , SQL_FETCH_FIRST_SYSTEM или
SQL_FETCH_FIRST , это может быть пользовательский, системный или
любой источник данных. |
Рассмотрим маленькую функцию, которая возвратит все доступные имена
источников данных. Вы можете вставлять этот код в программу, которую Вы
сформировали прежде, и вызывать его где-нибудь после того, как
получили дескриптор среды:
void OD_ListDSN(void)
{
char l_dsn[100],l_desc[100];
short int l_len1,l_len2,l_next;
l_next=SQL_FETCH_FIRST;
while(SQLDataSources(V_OD_Env,l_next,l_dsn, sizeof(l_dsn),
&l_len1, l_desc, sizeof(l_desc), &l_len2) == SQL_SUCCESS)
{
printf("Server=(%s) Beschreibung=(%s)\n",l_dsn,l_desc);
l_next=SQL_FETCH_NEXT;
}
}
Если Вы хотите выполнить запрос, Вы должны будете определить дескриптор
(SQL_HANDLE_STMT
) для SQL-оператора. Чтобы получить его, Вы
должны распределить память с помощью функции SQLAllocHandle
.
Затем Вы должны подготовить запрос для выполнения. Как я писал ранее, я
предполагаю использование таблицы tkeyuser
, которая
содержит следующие данные:
iduser | dtname | dtmaxSize |
---|---|---|
1 | Christa | 10000 |
2 | Nicole | 9000 |
В этом примере мы хотим выполнить запрос, который возвращает все строки
для полей iduser
и dtname
в этой таблице,
упорядоченные соответственно полю iduser
. Так что команда SQL
будет примерно такой:
SELECT iduser,dtname FROM tkeydata ORDER BY iduser
Если Вы выполняете эту команду, Вы получите две строки, каждая с двумя столбцами данных. Эти данные должны быть сохранены где-нибудь так, чтобы Ваша программа могла фактически использовать их, так что Вы должны определить переменную для каждого из столбцов. Так что Вы должны связать столбец с некоторой переменной в Вашей программе. Связывание с переменной автоматически сохраняет данные из столбца в этой переменной, когда Вы получаете строку результатов из соединения. Важно, что Ваши переменные соответствуют типу столбца в таблице внутри базы данных.
Так что надо привязать первый столбец к переменной типа
SQLINTEGER
, а второй к переменной типа char
. Это
делается вызовом функции SQLBindCol
. Следовательно, добавляем в
программу следующие переменные:
SQLHSTMT V_OD_hstmt; // Handle for a statement
SQLINTEGER V_OD_err,V_OD_id;
char V_OD_buffer[200];
Теперь Вы можете связывать переменные:
SQLBindCol(V_OD_hstmt,1,SQL_C_CHAR, &V_OD_buffer,200,&V_OD_err);
SQLBindCol(V_OD_hstmt,2,SQL_C_ULONG,&V_OD_id,sizeof(V_OD_id),&V_OD_err);
Вы должны проверить код возврата из обращения к функции. Теперь Вы можете
выполнять запрос, вызывая функцию SQLExecDirect
:
V_OD_erg=SQLExecDirect(V_OD_hstmt, "SELECT dtname,iduser
FROM tkeyuser order by iduser",SQL_NTS);
if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
{
printf("Error Select %d\n",V_OD_erg);
SQLGetDiagRec(SQL_HANDLE_DBC, V_OD_hdbc,1, V_OD_stat, &V_OD_err,
V_OD_msg,100,&V_OD_mlen);
printf("%s (%d)\n",V_OD_msg,V_OD_err);
SQLFreeHandle(SQL_HANDLE_STMT,V_OD_hstmt);
SQLDisconnect(V_OD_hdbc);
SQLFreeHandle(SQL_HANDLE_DBC,V_OD_hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);
exit(0);
}
Если выполнение инструкции прошло нормально, Вы можете выбрать столбец
данных. Может быть Вы сочтете нужным узнать, сколько столбцов находится в
наборе результатов (если Вы используете SELECT * FROM tkeyuser
в
программе-примере, Вы не знаете этого). Обращение к функции
SQLNumResultCols
решает проблему. Эта функция берет операторный
дескриптор и указатель на целую переменную, которая будет хранить число
столбцов после обращения. Вы можете добавить это к Вашей программе:
// At the beginning add:
SQLSMALLINT V_OD_colanz; // Num of columns
// At the end add:
V_OD_erg=SQLNumResultCols(V_OD_hstmt,&V_OD_colanz);
if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
{
printf("Fehler im ResultCols %d\n",V_OD_erg);
SQLFreeHandle(SQL_HANDLE_STMT,V_OD_hstmt);
SQLFreeHandle(SQL_HANDLE_DBC,V_OD_hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);
exit(0);
}
printf("Number of Columns %d\n",V_OD_colanz);
Следующая вещь, которую Вы должны знать: сколько строк было возвращено
запросом. Обращение к функции SQLRowCount
должно подавить
Вашу жажду знаний.
Последнее действие должно собственно выбрать данные из набора результатов.
Вы должны вызвать SQLFetch
с операторным дескриптором (который
был распределен, и SQLBind
вызван для каждого отдельного
столбца). SQLFetch
возвращает SQL_NO_DATA
, если
не имеется больше данных в наборе результатов.
Имеется полный исходный текст. Это только пример Вашей работы с ODBC,
программа-пример не оптимизирована.
/*
odbc.c
testing unixODBC
*/
#include <stdlib.h>
#include <stdio.h>
#include <odbc/sql.h>
#include <odbc/sqlext.h>
#include <odbc/sqltypes.h>
SQLHENV V_OD_Env; // Handle ODBC environment
long V_OD_erg; // result of functions
SQLHDBC V_OD_hdbc; // Handle connection
char V_OD_stat[10]; // Status SQL
SQLINTEGER V_OD_err,V_OD_rowanz,V_OD_id;
SQLSMALLINT V_OD_mlen,V_OD_colanz;
char V_OD_msg[200],V_OD_buffer[200];
int main(int argc,char *argv[])
{
// 1. allocate Environment handle and register version
V_OD_erg=SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&V_OD_Env);
if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
{
printf("Error AllocHandle\n");
exit(0);
}
V_OD_erg=SQLSetEnvAttr(V_OD_Env, SQL_ATTR_ODBC_VERSION,
(void*)SQL_OV_ODBC3, 0);
if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
{
printf("Error SetEnv\n");
SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);
exit(0);
}
// 2. allocate connection handle, set timeout
V_OD_erg = SQLAllocHandle(SQL_HANDLE_DBC, V_OD_Env, &V_OD_hdbc);
if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
{
printf("Error AllocHDB %d\n",V_OD_erg);
SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);
exit(0);
}
SQLSetConnectAttr(V_OD_hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER *)5, 0);
// 3. Connect to the datasource "web"
V_OD_erg = SQLConnect(V_OD_hdbc, (SQLCHAR*) "web", SQL_NTS,
(SQLCHAR*) "christa", SQL_NTS,
(SQLCHAR*) "", SQL_NTS);
if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
{
printf("Error SQLConnect %d\n",V_OD_erg);
SQLGetDiagRec(SQL_HANDLE_DBC, V_OD_hdbc,1, V_OD_stat, &V_OD_err,
V_OD_msg,100,&V_OD_mlen);
printf("%s (%d)\n",V_OD_msg,V_OD_err);
SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);
exit(0);
}
printf("Connected !\n");
V_OD_erg=SQLAllocHandle(SQL_HANDLE_STMT, V_OD_hdbc, &V_OD_hstmt);
if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
{
printf("Fehler im AllocStatement %d\n",V_OD_erg);
SQLGetDiagRec(SQL_HANDLE_DBC, V_OD_hdbc,1, V_OD_stat,
&V_OD_err,V_OD_msg,100,&V_OD_mlen);
printf("%s (%d)\n",V_OD_msg,V_OD_err);
SQLDisconnect(V_OD_hdbc);
SQLFreeHandle(SQL_HANDLE_DBC,V_OD_hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);
exit(0);
}
SQLBindCol(V_OD_hstmt,1,SQL_C_CHAR, &V_OD_buffer,150,&V_OD_err);
SQLBindCol(V_OD_hstmt,2,SQL_C_ULONG,&V_OD_id,150,&V_OD_err);
V_OD_erg=SQLExecDirect(V_OD_hstmt,"SELECT dtname,iduser
FROM tkeyuser order by iduser",SQL_NTS);
if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
{
printf("Error in Select %d\n",V_OD_erg);
SQLGetDiagRec(SQL_HANDLE_DBC, V_OD_hdbc,1, V_OD_stat,&V_OD_err,
V_OD_msg,100,&V_OD_mlen);
printf("%s (%d)\n",V_OD_msg,V_OD_err);
SQLFreeHandle(SQL_HANDLE_STMT,V_OD_hstmt);
SQLDisconnect(V_OD_hdbc);
SQLFreeHandle(SQL_HANDLE_DBC,V_OD_hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);
exit(0);
}
V_OD_erg=SQLNumResultCols(V_OD_hstmt,&V_OD_colanz);
if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
{
SQLFreeHandle(SQL_HANDLE_STMT,V_OD_hstmt);
SQLDisconnect(V_OD_hdbc);
SQLFreeHandle(SQL_HANDLE_DBC,V_OD_hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);
exit(0);
}
printf("Number of Columns %d\n",V_OD_colanz);
V_OD_erg=SQLRowCount(V_OD_hstmt,&V_OD_rowanz);
if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
{
printf("Number ofRowCount %d\n",V_OD_erg);
SQLFreeHandle(SQL_HANDLE_STMT,V_OD_hstmt);
SQLDisconnect(V_OD_hdbc);
SQLFreeHandle(SQL_HANDLE_DBC,V_OD_hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);
exit(0);
}
printf("Number of Rows %d\n",V_OD_rowanz);
V_OD_erg=SQLFetch(V_OD_hstmt);
while(V_OD_erg != SQL_NO_DATA)
{
printf("Result: %d %s\n",V_OD_id,V_OD_buffer);
V_OD_erg=SQLFetch(V_OD_hstmt);
};
SQLFreeHandle(SQL_HANDLE_STMT,V_OD_hstmt);
SQLDisconnect(V_OD_hdbc);
SQLFreeHandle(SQL_HANDLE_DBC,V_OD_hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);
return(0);
}
Прежде, чем Ваша программа завершит работу, Вы должны освободить все
ресурсы, которые распределили. Функция SQLFreeHandle
должна
использоваться, чтобы освободить каждый распределенный дескриптор. Она
ожидает параметр, который заявляет тип дескриптора, который будет освобожден,
и непосредственно дескриптор. Так, если Вы хотите освободить дескриптор
среды, Вы должны вызвать (в нашем примере программы):
SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);
Прежде, чем Вы освобождаете любой дескриптор, удостоверьтесь, что он впредь не понадобится. Наиболее распространенная ошибка: освобождение дескриптора соединения ДО того, как соединение закрыто.
Если Вы хотите закрыть соединение, Вы нуждаетесь в функции
SQLDisconnect
. Она закрывает соединение, связанное с
дескриптором соединения, передаваемым как параметр вызова
SQLDisconnect
. В нашей программе мы должны вызвать:
SQLDisconnect(V_OD_hdbc);
Цели проекта unixODBC состоят в том, чтобы разрабатывать и поддержать unixODBC, который призван стать окончательным стандартом для ODBC на не-MS Windows системах. Это должно включить поддержку GUI для KDE и GNOME. Платформы Microsoft включают много расширений в спецификацию ODBC, эти расширения также обеспечиваются unixODBC.
Группа разработчиков unixODBC достигла лучших на сегодняшний день результатов под Linux. Весь проект unixODBC распространяется согласно лицензиям GPL или LGPL. Наличие LGPL для библиотек позволяет применять их в коммерческом программном обеспечении с закрытыми исходными текстами.
Это приложение GUI, подобное MS ODBC Administrator. Это позволяет любому пользователю легко конфигурировать свои (пользовательские) источники данных. Пользователь root может также добавлять, удалять и настраивать общесистемные источники данных. Опции Driver меняются в зависимости от СУБД. ODBCConfig вызывает код Driver Config, чтобы позволить драйверу запрашивать пользователя относительно специфических опций.
Пользователь root может добавлять или удалять драйверы, используя ODBCConfig. Это скорее регистрация и отмена регистрации драйвера потому, что никакие файлы фактически не будут скопированы или перемещены, зато модифицируется информация системы ODBC.
Все зарегистрированные драйверы будут представлены пользователю на выбор при создании нового источника данных.
DataManager мог бы называться Data Explorer. Это приложение GUI, которое позволяет пользователю просматривать и управлять источниками данных. Более точно: оно позволяет пользователю просматривать источники данных, начиная с имени источника и заканчивая таблицами, столбцами и индексами. Это также включает SQL-редактор, который позволяет пользователю представлять на рассмотрение источнику данных SQL-запросы и просматривать результаты.
ODBC-приложения делают ODBC-вызовы через DriverManager. DriverManager выполняет ряд задач для приложения:
Большинство обращений к DriverManager передается на загруженный драйвер, чтобы он их дальше обработал сам.
Некоторые преимущества от использования ODBC DriverManager включают;
Когда Crystal Reports запущен под WINE и использует ODBC, появляется сообщение о том, что строка соединения недопустима (сообщение об ошибке: "Unable to connect: Incorrect log on parameters").
Дело в том, что Crystal Reports обращается к реестру Windows, чтобы найти там настройки драйвера для DSN в секции ODBC.INI реестра. Так как установка драйвера находится в файловой системе Linux, ничего хорошего он там не находит, что и приводит к ошибке.
Чтобы исправить положение надо ввести соответствующую запись в реестр. Новая запись может располагаться в дереве HKEY_CURRENT_USER или в HKEY_LOCAL_MACHINE и выглядит так: Software->ODBC->ODBC.INI-><MYDSN>-> Driver="not blank", где <MYDSN> определяет соответствующий DSN. Установка для драйвера не имеет значения, за исключением того, что это не должно быть пустой строкой. Такая схема применима и для других программ.
Когда Crystal Reports запущен под WINE и использует ODBC, появляется сообщение о том, что строка соединения недопустима (сообщение об ошибке: "Unable to connect: Incorrect log on parameters").
Дело в том, что Crystal Reports обращается к реестру Windows, чтобы найти там настройки драйвера для DSN в секции ODBC.INI реестра. Так как установка драйвера находится в файловой системе Linux, ничего хорошего он там не находит, что и приводит к ошибке.
Чтобы исправить положение надо ввести соответствующую запись в реестр. Новая запись может располагаться в дереве HKEY_CURRENT_USER или в HKEY_LOCAL_MACHINE и выглядит так: Software->ODBC->ODBC.INI-><MYDSN>-> Driver="not blank", где <MYDSN> определяет соответствующий DSN. Установка для драйвера не имеет значения, за исключением того, что это не должно быть пустой строкой. Такая схема применима и для других программ.
./configure --prefix=/wwwПлюс любая другая локальная конфигурация, в которой Вы нуждаетесь.
#include <sql.h> #include <sqlext.h> #include <odbcinst.h>Замените здесь /www на каталог, в который установлен apache.
CFLAGS="-I/usr/local/include" LDFLAGS= CUSTOM_ODBC_LIBS="-L/usr/local/lib -lodbc"Не забудьте экспортировать эти переменные!
export CFLAGS LDFLAGS CUSTOM_ODBC_LIBS
./configure --with-apache=../apache_1.3.12 --with-custom-odbc=/usr/local \ --enable-track-varsПлюс любая другая локальная конфигурация, в которой Вы нуждаетесь, затем:
make make install
./configure --prefix=/www --activate-module=src/modules/php3/libphp3.a make make install
cp php3.ini-dist /usr/local/lib/php3.iniВы можете редактировать файл /usr/local/lib/php3.ini, чтобы установить опции PHP. Отредактируйте Ваш файл httpd.conf или srm.conf и добавьте:
AddType application/x-httpd-php3 .php3
Имеются два способа обхода проблемы. Необходимо определить и экспортировать следующие переменные среды перед формированием apache:
export CFLAGS=-D_REENTRANT export LFLAGS=-lpthread ./configure --prefix=wwwИли пересоберите unixODBC без поддержки потоков, конфигурируя его так:
./configure --enable-threads=no
В обоих случаях не забывайте удалять файл config.cache из корневого каталога Apache или unixODBC
Поскольку ничего из вышеупомянутой информации не сгенерировано кодом внутри unixODBC, каких бы то ни было проблем с 2000 годом в рамках кода unixODBC быть не должно. Могут быть сложности у конкретной СУБД или операционной системы, но они не имеют отношения к пакету unixODBC.
INI-библиотека представляет собой библиотеку функций нужных, чтобы помочь в разработке кода для взаимодействия с INI-файлами. Будущая расширенная версия этой библиотеки скорее всего станет стандартной библиотекой Linux, что позволит рассматривать INI-файлы как стандартный формат новых файлов конфигурации в ОС Linux.
Log-библиотека представляет собой комплект функций нужных, чтобы создать средство регистрации событий. Это используется odbcinst и unixODBC Driver Manager. Планируется поддержка системы регистрации событий в UNIX.
List-библиотека представляет собой набор маленьких и простых функций для создания, управления и удаления связанных списков Эти функции служат, чтобы усилить код для работы связанных списков в unixODBC и обеспечить основу для поддержки курсора.
Библиотека odbcinst обеспечивает приложения и другие компоненты unixODBC способностью к чтению и записи системной информации ODBC. Причем неважно, как или где эта информация сохранена. Это осуществляет основной API из MS и добавляет несколько функций для удобства. Одно из таких расширений: добавление нескольких API для работы с ODBC-программами Config в среде KDE/Qt.
Библиотека Tree была создана, чтобы хранить анализируемый код SQL. Она также должна использоваться в будущих версиях, чтобы сохранить синтаксис SQL в намного более реалистичном виде.
Библиотека SQI реализует сильно облегченный обработчик SQL, который использует текстовые файлы для хранения данных. Это дополнено ODBC-драйвером, чтобы создать очень открытую СУБД для маленьких наборов данных. Строго рекомендуется, чтобы все использование SQI было сделано через ODBC-драйвер: это позволит источнику данных превратиться в нормальную СУБД без того, чтобы перетранслировать исходный код.
Разработка SQI управлялась желанием включить поддержку ODBC в KDE и в соответствии с необходимостью создания полноценной СУБД, чтобы позволить использование. SQI для этого вполне достаточна.
Библиотека SQP представляет собой SQL-анализатор, основанный на lex/yacc. Это было выдрано из SQI так, чтобы общий анализатор SQL можно было бы обеспечивать для всех частей unixODBC, в частности, в драйверах и источниках данныхх, основанных не на SQL. Текущее понимание синтаксиса SQL очень ограничено, но это должно быть расширено в будущем.
odbcinst представляет собой инструмент, который был создан для помощи тем, кто разрабатывает скрипты и RPM-пакеты для драйверов, чтобы иметь возможность легко создавать и удалять записи в файлах odbc.ini и odbcinst.ini. Этот инструмент командной строки связан с разделяемой библиотекой (libodbcinst.so) и является частью компонента odbcinst в unixODBC.
isql представляет собой инструмент, который позволяет пользователю выполнять SQL-команды в пакете или в интерактивном режиме. Это имеет некоторые интересные опции типа опции, чтобы генерировать вывод, в виде таблицы на HTML.
Сначала установите клиентский пакет доступа DB2 от IBM, это установит IBM CLI драйвер, который работает с unixODBC как ODBC-драйвер.
При использовании клиентского пакета доступа, определите клиентский доступ под неким именем, например, db2inst1, а затем создайте запись в файле odbcinst.ini:
[DB2] Description = DB2 Driver Driver = /usr/IBMdb2/V6.1/lib/libdb2.so FileUsage = 1 DontDLClose = 1Параметр DontDLClose требуется, чтобы избежать проблемы в драйвере, когда он динамически загружен.
Теперь настройте файл odbc.ini примерно так:
[sample] Description = Test to DB2 Driver = DB2Затем, когда происходит соединение, Вы ДОЛЖНЫ ИМЕТЬ переменную среды DB2INSTANCE, установленную на корректный образец db2, например:
export DB2INSTANCE=db2inst1 isql -v sample db2inst1 ibmdb2
Единственое различие сводится к имени пакета, используемого для доступа. CLI-драйвер теперь должен быть найден в DB2 Personal Developer's Edition V7.1.
Использование версии 7.1 формирует путь к библиотеке:
Driver = /usr/IBMdb2/V7.1/lib/libdb2.so
Вы также должны добавить "/usr/IBMdb2/V7.1/lib" в /etc/ld.so.conf.
Другая полезная подсказка. При использовании PHP+DB2 под AIX через unixODBC к IBM-серверу (4 процессора, мультиядра и т.д), возникало сильное замедление работы. Имеется ошибка в стеке TCP/IP IBM. После изучения странички http://www-4.ibm.com/cgi-bin/db2www/data/db2/udb/winos2unix/support/document.d2w/report?last_page=list.d2w&fn=1006553 и выполнения команд
$ su - db2inst1 $ db2set DB2TCPCONNMGRS=1был достигнут поистине огромный рост производительности (в десятки раз!).
Этот документ поможет пользователям unixODBC обратиться к MS SQL Server, а также к Sybase SQL Server из клиентов unixODBC.
Будем считать, что Вы имеете недавнюю версию unixODBC на своей системе и где-то выполняется сервер. SQL Server должен позволять удаленный доступ и поддерживать соединения, использующие TCP/IP. Конечно, нужны также идентификатор для входа в систему и пароль.
MS SQL Server был порожден партнерством между Microsoft и Sybase. Впоследствии эти два сервера остались очень похожими. Фактически настолько похожими, что протокол связи, используемый клиентским программным обеспечением, чтобы связаться с этими серверами является фактически идентичным. Этот протокол называется Табличным Потоком Данных (Tabular Data Stream, сокращенно TDS).
Brian Bruns создал проект проект открытых исходных текстов, призванный обеспечить реализацию протокола TDS для всех желающих. Проект называется FreeTDS и может быть найден на сайте http://www.freetds.org.
FreeTDS приходит с несколькими интерфейсами TDS с ODBC. ODBC-драйвер, включенный в FreeTDS, работает хорошо для типичных запросов, типа запроса данных. Однако, этот ODBC-драйвер не поддерживает менее используемые функции каталога ODBC. FreeTDS хорошо работает с unixODBC, но Вы скачайте самую свежую версию, например, с ftp://ibiblio.org/pub/Linux/ALPHA/freetds.
Наиболее вероятно, что Вы скачали исходный текст, и этой точки зрения я буду придерживаться. Обычно установка из исходных текстов представляет собой проблему по причине отсутствия необходимых инструментов, но почти версии Linux их имеют. Распакуйте дистрибутив следующими командами:
# tar zxvf freetds-0.52.tar.gz # cd freetds-0.52Как только Вы распаковали исходный текст, изучите файлы INSTALL и README.
Сначала определите некоторые переменные среды. Например, пользователь оболочки bash может добавлять следующее в свой файл /etc/profile.
# TDS # SYBASE=/usr/local/freetds LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:$SYBASE/lib export SYBASE LD_LIBRARY_PATH
Опции configure могут просматриваться, выполняя ./configure --help. Главное, должна быть указана опция выбора конфигурации --with-tdsver. Теперь соберем пакет и установим его:
# ./configure --with-tdsver=4.2 --with-unixodbc=/usr/local # make # make install
Драйвер FreeTDS ODBC должен быть установлен в /usr/local/freetds/lib. Там должен появиться файл libtdsodbc.so.
Регистрация SQL Server с TDS
FreeTDS должен знать несколько вещей относительно каждого сервера, с которым Вы хотите работать. Традиционно используется интерфейсный файл. FreeTDS может работать с файлом, называемым freetds.conf, но для упрощения примера применим старый метод. Файл интерфейсов может быть найден в каталоге /usr/local/freetds. Имеется пример для доступа к MS SQL Server:
P450 query tcp ether 192.168.1.25 1433 master tcp ether 192.168.1.25 1433Под P450 здесь значится имя машины, на которой выполняется MS SQL Server. Имя может быть каким угодно. По умолчанию MS SQL Server слушает порт 1433.
Регистрация ODBC-драйвера через unixODBC
unixODBC должен знать ряд данных относительно всех ODBC-драйверов, которые Вы предполагаете использовать. Самый лучший способ этого достичь: применить графическую программу ODBCConfig, которая приходит с unixODBC. Альтернативный метод состоит в том, чтобы использовать команду odbcinst, которая также приходит с unixODBC. Мы сосредоточимся на использовании команды odbcinst. Создайте файл с именем tds.driver.template с несколькими строками, описывающими нужный драйвер:
[TDS]
Description = v0.52 with protocol v4.2
Driver = /usr/local/freetds/lib/libtdsodbc.so
Выполните odbcinst, предписывая ему создать запись драйвера, используя файл tds.driver.template. Обратите внимание, что Вы должны оставить пробел между параметром -f и именем файла шаблона:
# odbcinst -i -d -f tds.driver.template
Создание ODBC Data Source Name
Клиенты ODBC обычно будут работать с ODBC Data Source Names (DSN). Самый лучший способ создавать, редактировать и удалять DSN состоит в том, чтобы использовать инструмент ODBCConfig.
Снова мы используем команду odbcinst вместо него. Это делается потому, что программа ODBCConfig достаточно наглядна и понятна, но не все пользователи имеют установленные инструментальные средства unixODBC GUI. Снова начнем с создания файла-шаблона под именем tds.datasource.template, который содержит некоторые опции типа заданной по умолчанию базы данных и UID. Примечание: Вы будете использовать Ваш собственный Servername и UID:
[P450] Driver = TDS Description = Northwind sample database Trace  = No Servername = 192.168.1.25 Database = Northwind UID = sa
Примечание: Servername не означает DNS-имя или IP-адрес сервера. Это должно соответствовать серверу из интерфейсного файла (в случае freetds.conf это значение между [], заголовок желательного раздела сервера).
Примечание: предыдущие команды выполнялись как root (обозначенный символом #), но теперь команда выполняется от имени обычного пользователя. Это значительно. Все пользователи системы совместно используют FreeTDS и ODBC-драйверы, но каждый пользователь имеет собственный список DSN (имеются исключения, но здесь они не актуальны). Так что создайте DSN как тот пользователь, который собирается использовать это:
$ odbcinst -i -s -f tds.datasource.template
Тестирование
unixODBC приходит с рядом инструментальных средств, которые позволяют Вам проверять работоспособность пакета. Используем инструмент командной строки isql. Он позволяет представлять на рассмотрение DSN команды (обычно это инструкции SQL) и принимать результаты:
$ isql -v P450 sa MyPassword SQL> select contactname from customers
Вы должны видеть сообщение о соединении и подсказку SQL. Если этого не наблюдается, либо проблема с конфигурацией, либо задана неправильная пара значений ID и PWD.
Теперь попробуйте простую команду SQL:
SQL> SELECT contactname FROM customers
Создан шаблон драйвера, чтобы позволить программистам легко разрабатывать новые драйверы. Это содержит некоторые файлы типа make и все функциональные заголовки, требуемые для совместимости с ODBC 3.5.1. Некоторые функции имеют код, но большая часть оставлена для конкретной реализации.
Двоичная переносимость драйверов для Linux ODBC когда-нибудь будет достигнута, но ODBC пока довольно плохо реализован под Linux в это время, и некоторые драйверы могут иметь проблемы. Это явление постепенно должно уменьшится, поскольку ODBC становится более используемым на Linux.
Сертифицированные драйверы
СУБД | Уровень ODBC | Устанавливается в odbcdrivers.ini | DriverConfig | Замечания | Поддержка | |
DB2 UDB для iSeries | http://www-1.ibm.com/servers/eserver/iseries/access/linux | 3.5 | Да | Да | Имеется драйвер, доступный для систем Intel и для разделов iSeries, выполняющих Linux. Драйвер соответствует ODBC 3.5 ANSI со способностью сохранять и обрабатывать Unicode-данные. Поддерживает тип SQL_WCHAR | Поддержка и закачка пакета: http://www-1.ibm.com/servers/eserver/iseries/access/linux |
Microsoft SQL Server и Microsoft Access | Вы можете использовать Bridge для работы с источником данных ODBC на Windows-машине | http://www.easysoft.com/products/oob/main.phtml | ||||
DB2 | http://www.ibm.com/db2 | 3.5 | No | No | Библиотека libdb2.so, которая является частью набора DB Connect, работает как ODBC-драйвер | Загрузить пакет можно с http://www-1.ibm.com/support/docview.wss?uid=swg21079056 |
Oracle | http://www.oracle.com | 3.5 | Да | Да | Загрузка свободноой тестовой версии: http://www.easysoft.com | support@easysoft.com news://news.easysoft.com/easysoft.public.oracle |
Easysoft ODBC-ODBC Bridge | от 2.0 до 3.5 | Да | Да | http://www.easysoft.com/products/oob/main.phtml. Easysoft's ODBC-ODBC Bridge (пробная бесплатная версия) обеспечивает удаленный доступ к любому ODBC-драйверу | support@easysoft.com news://news.easysoft.com/easysoft.public.da2k.odbc-odbc-bridge http://www.easysoft.com | |
DB2 | http://www.starquest.com | 3.5 | Нет данных | Нет данных | http://www.starquest.com : StarSQL для UNIX 3.10 и выше, Solaris, AIX и Linux | www.starquest.com/support |
Sybase | http://www.sybase.com | 3.5 | Да | Нет | Бесплатная пробная версия доступна на http://www.easysoft.com | support@easysoft.com news://news.easysoft.com/easysoft.public.sybase |
Informix | http://www.informix.com | 3.51 | Нет | Нет | Драйвер от informix работает прекрасно, но Вы должны ознакомиться с сайтом разработчиков в плане свежей документации | |
AdabasD | www.softwareag.com/adabasd | 3.5 | Нет | Нет | ODBC-драйвер для AdabasD доступен для Solaris, HP-UX, AIX, Linux и нескольких других типов unix. | Подробности на сайте разработчика http://www.softwareag.com и в конференции comp.databases.adabas |
Empress | http://www.empress.com | . | . | . | . | . |
Postgres | http://www.postgresql.org | 2.5 | . | Да | Была взята Win32-версия (не из дистрибутива сервера), и она нормально работала с unixODBC с небольшими изменениями. Изменения отправлены координаторам проекта PostgreSQL | |
MySQL | http://www.mysql.com | . | . | . | Драйвер MyODBC (http://www.mysql.com/download.html) работает с unixODBC | http://www.mysql.com |
MiniSQL (он же mSQL) | http://www.Hughes.com.au | Смесь из различных уровней. Борется за достижение 3.51. Безуспешно | Да | Да | Alpha-версия | pharvey@codebydesign.com |
SQI | Очень ограниченные версии INSERT, SELECT, UPDATE и DELETE | . | Да (используются значения по умолчанию для файла) | Text File Driver (alpha) | pharvey@codebydesign.com | |
News Server | Реализована минимальная функциональность ODBC. Сильно ограниченное, но очень полезное подмножество SQL | . | Да | Расширенная версия Ke Jin's Internet News Server ODBC-драйвера. News-серверы представляют собой источники данных, а группы новостей таблицы. | pharvey@codebydesign.com | |
YARD SQL | 3.5 | Сайт проекта YARD (http://www.yard.de). | ||||
Interbase | 3.5 | Да | Да | Доступен для Windows, Linux Intel, Solaris, HPUX, AIX и OS X | ftp://ftp.easysoft.com/pub/interbase | |
RDBMS Linter SQL | 3.5 | Да | Да | Оригинальный драйвер ODBC портирован на UNIX | www.relex.ru, www.relexus.com | |
Ovrimos Webbase | http://www.ovrimos.gr/download.php | 3.5 | Да | Да | http://www.ovrimos.gr/download.php | support@ovrimos.com |
Mimer SQL | http://www.mimer.com | 3.51 | Нет данных | Нет данных | Посетите сайт www.mimer.com/developers для сбора дополнительной информации и загрузки пробной версии высокопроизводительной СУБД | www.mimer.com/developers |
Ingres | http://www.cai.com | 3.51 | http://support.cai.com/techbases/ingres/4327.html | |||
Sap DB | http://www.sapdb.org | 3.51 |
Что было использовано:
Как и что делалось:
mv /opt/coldfusion/lib/odbc/libodbc.so /opt/coldfusion/lib/odbc/libodbc.so.bak ln -s /usr/lib/libodbc.so /opt/coldfusion/lib/odbc/libodbc.so
configure --enable-gui=no make all make installОстальное подобно описанному выше.
[MyODBCSource] Driver=/usr/local/lib/libib6odbc.so.1.0.0 Description=Interbase Driver Database=192.168.0.1:/Database/MyDB.gdb User=MyUser Password=MyPassword With_Schema=0 Dialect=3
1. Установите переменную окружения INFORMIXDIR к корню Вашей установки Informix. Далее я считаю, что это /usr/local/informix.
2. Определите сервис online в файле /etc/services.
3. Создайте файл sqlhosts в каталоге $INFORMIXDIR/etc, который определяет все Ваши серверы базы данных.
4. Удостоверьтесь, что все библиотеки Informix найдены ld. Они размещены в каталоге $INFORMIXDIR/lib и его подкаталогах (это включает по крайней мере cli и esql). Обычно следует включить каталоги с библиотеками в файл /etc/ld.so.conf и выполнить команду ldconfig от имени root.
5. Определите переменную окружения ODBCINI, чтобы указать на Ваш системный файл odbc.ini, например: export ODBCINI=/etc/odbc.ini. Дело в том, что эта переменная представляет собой единственный способ управлять тем, где драйвер Informix ищет сведения о конфигурации.
6. Добавьте драйвер Informix в odbcinst.ini без пробелов между именами параметров и их значениями, например:
[Informix] Description=Informix IDS 2000 Driver=/usr/local/informix/lib/cli/libifcli.so APILevel=1 ConnectFunctions=YYY DriverODBCVer=03.00 FileUsage=0 SQLLevel=1 smProcessPerConnect=Y
7. Определите Informix DSN в odbc.ini:
[miecr] Driver=Informix Server=BARNET Database=miecr CLIENT_LOCALE=en_us.8859-1 DB_LOCALE=en_us.8859-1 TRANSLATIONDLL=/usr/local/informix/lib/esql/igo4a304.so
8. Теперь попробуйте выполнить тестовую команду isql miecr.
Если Вы получаете ошибку "Server %s is not listed as a dbserver name in sqlhosts", это, вероятно, вызвано пробелами в определении драйвера Informix в файле odbcinst.ini или в записи DSN в файле odbc.ini. Синтаксический анализатор драйвера очень легко ошибается.
Откуда и что можно скачать |
Формат дистрибутива
unixODBC на сегодня доступен в формате tar+gzip. Это означает, что Вы должны: Скопировать файл unixODBC*.tar.gz в нужный Вам каталог. Распаковать его, например, командами: gunzip unixODBC*.tar.gz tar xvf unixODBC*.tar Выполнение этих команд создаст каталог unixODBC со всеми исходными файлами внутри. На момент написания данной работы последней версией была 2.2.6 (архив назывался unixODBC-2.2.6.tar.gz). RPM-пакеты В настоящее время на сайте CodingApes ( http://grapeape.codingapes.com) выложено несколько RPM-пакетов. Их также можно найти на http://edas.visaci.cz/en/unixodbc. RPM-пакеты для использования с версиями 7.0 и 8.0 Connectiva Linux (http://www.conectiva.com можно взять на. http://www.andrefelipemachado.hpg.com.br/linux/index.html.Есть также версия для QNX ( http://www.qnx.com), которую можно взять с http://www.unixodbc.org/pub/beta/unixODBC/unixODBC-2.1.1-x86-public.qpr. Версия для FreeBSD Nick Sayer создал порт unixODBC для FreeBSD. Ее можно найти на сайте http://www.freebsd.org/ports. Solaris 8 PKG Palle Haastrup создал пакет для Solaris 8 http://www.unixodbc.org/pub/beta/unixODBC/binaries/unixodbc-2.1.1-sol8-sparc-local.gz .CVS-доступ Публичный доступ к CVS access также доступен для всех желающих работать с самыми последними исходными текстами. CVS-доступ есть на http://sourceforge.net/cvs/?group_id=1544. Так что Вы можете использовать следующие команды, Когда будет запрошен пароль для anonymous, просто нажмите клавишу Enter: cvs -d:pserver:anonymous@cvs.unixODBC.sourceforge.net:/cvsroot/unixodbc login cvs -z3 -d:pserver:anonymous@cvs.unixODBC.sourceforge.net:/cvsroot/unixodbc co modulename Чтобы сформировать пакет из архива CVS, выполните следующую команду: make -f Makefile.cvs Это будет формировать скрипт configure. Чтобы сформировать пакет из CVS, Вы нуждаетесь в некоторых инструментальных средствах:
Построение библиотек и программ Установка теперь использует стандартный процесс GNU autoconf. Скомандуйте: ./configure >make make install По умолчанию файлы будут установлены в каталог /usr/local. Как и положено с configure, это расположение может быть изменено опцией prefix: ./configure --prefix=/usr/local/unixODBCЭто установит каталоги в /usr/local/unixODBC. Чтобы соответствовать руководящим принципам GNU, файл odbcinst теперь установлен по умолчанию в {prefix}/etc, что может быть изменено, используя опцию --sysconfdir в вызове configure. Чтобы устанавливать файлы в старое место, надо указать: ./configure --sysconfdir=/etc Скрипт будет пытаться находить каталоги, которые необходимы для компонентов GUI, и если они не найдены (то есть, Вы не установили QT), построение пакета продолжится, но без частей GUI. Зависимости Компоненты GUI (ODBCConfig и DataManager) требуют Qt не ниже 2.2 ( http://www.troll.no/dl/qtfree-dl.html). Библиотека SQI требует flex и yacc, чтобы анализировать команды SQL. Дистрибутив в целом зависит от наличия многих из стандартных инструментальных средств разработки, типа компилятора C/C++ (в настоящее время протестирован egcs). |
Data Flow Diagram (DFD) описывает все ключевые компоненты в окружении Linux ODBC. DFD пронумерована так, чтобы показать, что происходит при соединении с системой базы данных.
1. Приложение вызывает функцию (SQLAllocEnv, SQLAllocConnect, SQLConnect) из DriverManager.
2. DriverManager отвечает на SQLConnect драйвером базы данных, который соответствует заданному источнику данных (Data Source Name, DSN).
3. DriverManager загружает драйвер базы данных и просит, чтобы он установил связь с СУБД.
4. Драйвер базы данных может быть должен получить дополнительные опции из DSN, что выполняется им по ходу дела.
5. Драйвер базы данных использует специфическое для конкретной СУБД обращение, чтобы соединиться с базой данных.
ОБРАТИТЕ ВНИМАНИЕ: файлы odbc.ini и odbcinst.ini являются системной информацией ODBC. Весь доступ (чтение или запись) к этой информации должен проходить через DriverManager или разделяемую библиотеку ODBCINST. Не обращайтесь к этим INI-файлам непосредственно!
Файл odbc.ini хранит список источников данных и любых параметров для каждого из них. Имеются два типа файлов odbc.ini: системный (/etc/odbc.ini) и пользовательский (~/.odbc.ini). По умолчанию, DriverManager будет искать источники данных, используя следующую схему;
1. Используя переменную окружения, чтобы указать путь к пользовательскому файлу odbc.ini. Например, ODBCINI+/.odbc.ini.
2. Используя домашний каталог, заданный в файле /etc/passwd, чтобы найти путь для .odbc.ini.
3. Используя системный файл odbc.ini, который расположен в /etc/odbc.ini.
Файлы odbc.ini предоставляют те же самые функциональные возможности за исключением того, что системные сервисы могут принимать более высокий уровень защиты на системном odbc.ini. Во всем остальном пользовательские и системные файлы совершенно равны.
ini-файлы используют те же самые требования к синтаксису. Имена источников данных охвачены квадратными скобками. Параметры следуют в последующих строках и используют формат PropertyName=PropertyValue. Например;
[TEST] driver = /usr/lib/libsybase.so.11 tracefile = /home/pharvey/sql.log trace = off database = dbAccounting
Каждое имя источника данных должно иметь, по крайней мере, определенный параметр driver. Это позволит DriverManager загружать драйвер, когда сделан запрос на соединение. Единственые параметры, с которыми работает сам DriverManager: DRIVER, TRACEFILE и TRACE. Другие параметры будут интерпретироваться уже драйвером. Секция [ODBC Data Sources] поддерживается в каждом файле odbc.ini.
Этот ini-файл просто перечисляет все установленные драйверы. Синтаксис прост: имя, сопровождаемое параметром, который сообщает имя файла драйвера:
[Sybase 11] Comment = Super Sybase Server Driver = /usr/lib/libsybase.so.11 Setup = /usr/lib/libsybaseS.so.11 FileUsage = 1
Имя файла драйвера (в данном случае /usr/lib/libsybase.so.11) должно быть уникально. Дружественное имя (то есть Sybase 11) также должно быть уникально.
Параметр Setup указывает на общедоступную (разделяемую) библиотеку, содержащую функции, которые нужно вызвать ODBC Config. ODBC Config вызовет эту библиотеку, чтобы получить специфические для конкретного драйвера имена параметров в ходе конфигурации источника данных. Если программа ODBC Config не может найти или использовать этот файл, она примет некоторые значения по умолчанию. Этот файл должен изменяться только разделяемой библиотекой ODBCINST или утилитой командной строки odbcinst.
Спецификации ODBC включают два случая, в которых GUI был бы особенно полезен. Проект LinuxODBC находится в процессе реализации GUI для обоих случаев. Случаи это такие:
1. Настройка
ODBC Config должен позволить пользователю настроить параметры, специфичные для конкретного драйвера. В MS это обработано через ODBC Admin, вызывающий драйвер и передающий ему дальнейшую инициативу. LinuxODBC не будет вынуждать драйвер делать такую работу. Вместо этого, ODBC Config вызовет библиотеку Drivers Setup, чтобы получить простой список реквизитов. ODBC Config обработает представление и сохранение этих реквизитов. Этот подход делает создание библиотек Driver Setup ОЧЕНЬ простым потому, что они должны обеспечить только список опций.
2. Ввод логина
DriverManager, вероятно, придется запрашивать пользователя относительно большего количества информации для входа в систему. С поддержкой графики это вполне реально.
Много людей используют unixODBC, но по ряду причин не формируют конфигурацию GUI и соответствующие утилиты (ODBCConfig и DataManager).
ODBC сначала появился внутри Windows 3.0. В это время Windows использовала .ini-файлы, чтобы хранить информацию о конфигурации. Это текстовые файлы, содержащие данные в следующем формате:
[section1] entry1 = value entry2 = value [section2] entry1 = value entry2 = value ...
С появлением Windows NT, эти ini-файлы были заменены реестром, но API, чтобы обратиться к ним из ODBC, остался тем же самый. Windows имеет две функции в odbcinst.dll, которые позволяют приложениям и драйверам сделать запрос и изменять эти файлы: SQLGetPrivateProfileString и SQLPutPrivateProfileString.
Как часть репродуцирования ODBC-среды на платформах не-Windows, unixODBC обеспечивает тот же самый формат ini-файлов и функциональные возможности с помощью библиотеки libodbcinst.
ODBC делает различие между двумя типами ini-файлов. Системные ini-файлы разработаны, чтобы быть доступными, но не изменяемыми любым пользователем, а ini-файлы пользователя относятся только к какому-то специфическому пользователю и могут изменяться им.
Системные ini-файлы: odbcinst.ini и odbc.ini (внимание: точек в начале имени нет!), а пользовательский: ~/.odbc.ini в домашнем каталоге пользователя (вот этот уже с точкой: скрытый).
Системный файл odbcinst.ini хранит информацию относительно ODBC-драйверов, доступных всем пользователям, а файл odbc.ini содержит информацию относительно DSN, доступных всем пользователям. Эти системные DSN полезны для приложения типа web-серверов, которые не могут выполняться как реальный пользователь и соответственно не будут иметь домашнего каталога, чтобы хранить в нем файл .odbc.ini.
Хороший пример этого: Apache и PHP с поддержкой ODBC. Когда http-сервер запущен, он от имени root вызывает SQLAllocEnv. Позже он меняет свою принадлежность на иного пользователя и вызывает SQLConnect. Если DSN не является системным, сервер потерпит неудачу.
ODBC 3 также имеет третий сорт DSN, файловый DSN. Они сохраняют информацию соединения в файле, который может быть доступен любому пользователю. UnixODBC в настоящее время не поддерживает файловый DSN, но такая поддержка планируется в ближайшее время, поскольку такой тип DSN весьма полезен. Он больше распространен в NT, чем в UNIX по причине того, такие файлы позволяют хранить данные на центральном сервере, который является доступным всем рабочим станциям, что избавляет от настройки всех систем сразу.
Все файлы конфигурации, необходимые unixODBC представляют собой простые текстовые файлы, так что не имеется никакой причины, из-за которой Вы не можете использовать Ваш любимый текстовый редактор для правки файлы.
Однако, начиная с версии beta 1.6, расположение системных файлов odbcinst.ini и odbc.ini определено скриптом выбора конфигурации. Заданное по умолчанию расположение: /usr/local/etc, и если префикс определен, расположение будет {prefix}/etc. Расположение системных файлов можно поменять и радикально указанием опции --sysconfdir=DIR, например, для обратной совместимости с версиями до pre 1.6 попробуйте:
./configure --sysconfdir=/etc
[PostgreSQL] Description = PostgreSQL driver for Linux & Win32 Driver = /usr/local/lib/libodbcpsql.so Setup = /usr/local/lib/libodbcpsqlS.so FileUsage = 1
[PostgreSQL] Description = PostgreSQL driver for Linux & Win32 Driver = /usr/local/lib/libodbcpsql.so Setup = /usr/local/lib/libodbcpsqlS.soВы вызвали бы odbcinst со следующими параметрами:
odbcinst -i -d -f файл_шаблонаПараметры odbcinst имеют такой смысл:
-i Установить
-d драйвер
-f имя файла с шаблоном
[PostgreSQL] Description = PostgreSQL driver for Linux & Win32 Driver = /usr/local/lib/libodbcpsql.so Setup = /usr/local/lib/libodbcpsqlS.so Threading = 2Эта запись изменяет заданный по умолчанию уровень преобразования в последовательную форму потока.
[PostgreSQL] Description = Test to Postgres Driver = PostgreSQL Trace = Yes TraceFile = sql.log Database = nick Servername = localhost UserName = Password = Port = 5432 Protocol = 6.4 ReadOnly = No RowVersioning = No ShowSystemTables = No ShowOidColumn = No FakeOidIndex = No ConnSettings =
Это может быть записано в файл шаблона и вставлено в ini-файле для текущего (актуального) пользователя командой:
odbcinst -i -s -f template_file
Строка Driver используется, чтобы соответствовать записи [section] в odbcinst.ini, а строка Driver в файле odbcinst используется, чтобы найти путь для библиотеки драйвера, которая будет загружена, когда будет установлено соединение. Возможно заменить имя драйвера на путь к драйверу непосредственно. Это может использоваться, например, если пользователь не может получить root-доступ для записи чего-либо в /etc. Например:
[PostgreSQL] Description = Test to Postgres Driver = /usr/local/lib/libodbcpsql.so Trace = Yes TraceFile = sql.log Database = nick Servername = localhost UserName = Password = Port = 5432 Protocol = 6.4 ReadOnly = No RowVersioning = No ShowSystemTables = No ShowOidColumn = No FakeOidIndex = No ConnSettings =
[MySQL-test] Description = MySQL test database Trace = Off TraceFile = stderr Driver = MySQL SERVER = 192.168.1.26 USER = pharvey PASSWORD = PORT = 3306 DATABASE = test
[Mini SQL] Description = MiniSQL (mSQL) Driver = MiniSQL Trace = No TraceFile = Host = localhost Database = ConfigFile =
[PostgreSQL] Description = Test to Postgres Driver = PostgreSQL Trace = Yes TraceFile = sql.log Database = nick Servername = localhost UserName = Password = Port = 5432 Protocol = 6.4 ReadOnly = No RowVersioning = No ShowSystemTables = No ShowOidColumn = No FakeOidIndex = No ConnSettings =
[nntp Data Source] Description = nntp Driver Driver = nntp Driver Trace = No TraceFile = Host = localhost Database = Port =
Driver = TDS Description = Northwind sample database Trace = No Servername = 192.168.1.25 Database = Northwind UID = sa
[Sybase SQL Anywhere 5.0] Driver = Sybase SQL Anywhere 5.0 Description = Sybase SQL Anywhere 5.0 ODBC Driver Userid = dba Password = sql DatabaseFile = sademo.db
Этот раздел разработан, чтобы помочь установить и использовать UnixODBC. Установка рассматривается в контексте базы данных MySQL.
ODBC представляет собой интерфейс, через который программы могут связываться с любой базой данных, которая имеет ODBC-драйвер. В то время как большинство баз данных имеет один или большее количество API в различных языках программирования, ODBC позволяет тому же самому коду работать с многочисленными типами баз данных. ODBC не единственый интерфейс, чтобы делать это, но он очень широко используется.
Пакет UnixODBC доступен только в исходных текстах. Это означает, что Вы скачиваете tar-файл с http://www.unixODBC.org, распаковываете его, компилируете исходные тексты и устанавливаете получившийся пакет. Прежде, чем Вы это сможете сделаеть, нужно убедиться в некоторых вещах.
tar zxvf qt-2.0.1.tar.gz
Это создаст подкаталог qt-2.0.1 (у Вас версия пакета и имя каталога, конечно, будут другими). Не забудьте, что только root обычно может записывать данные в /usr/local или в /opt.
./configure make make install
./configure ./make ./make install
UnixODBC нуждается в драйвере для каждого типа базы данных, с которой он будет работать. MySQL имеет драйвер ODBC, названный MyODBC, но он не входит в комплект unixODBC, так что Вы должны получить и откомпилировать его непосредственно. Я рассматриваю версию 2.50.24, для остальных все так же. Установка аналогична другим пакетам, но Вы должны дать скрипту configure некоторые опции. Он запросит Вас относительно пути к исходным текстам MySQL, но Вы также должны обеспечить параметр --with-unixODBC=<Ваш каталог unixODBC>. Чтобы configure искал unixODBC вместо iODBC, используйте --with-unixODBC=DIR, где DIR определяет каталог, в который установлен unixODBC. Если включаемые файлы и библиотеки unixODBC не размещены в каталогах DIR/include и DIR/lib, используйте параметры --with-unixODBC-libs=LIBDIR и --with-unixODBC-includes=INCDIR.
Вы могли бы поределять иной префикс для установки (не /usr/local). Я, например, храню мои ODBC-драйверы в каталоге /usr/local/odbc/lib, так что я добавляю: --prefix=/usr/local/odbc.
Таким образом, строка вызова скрипта настройки для моего случая такая:
./configure --with-unixODBC=/usr/local \ --with-mysql-sources=/usr/local/mysql
Выполните make и make install. Это помещает возникающую в результате библиотеку libmyodbc-2.50.23.so в каталог /usr/local/lib. В исходном тексте библиотеки есть ошибка контроля версии, благодаря которой версия 2.50.24 обозначена как libmyodbc-2.50.23.so. Ничего страшного это не вызывает.
Если Вы опускаете параметр --with-mysql-sources, configure будет терпеть неудачу. Если Вы опускаете параметр --with-unixODBC, configure завершится, и MyODBC откомпилируется. Однако, он не будет работать правильно при использовании с unixODBC. Проблемы, описанные ниже, произошли, когда я опустил этот параметр:
1) Если DSN (Data Source Name), которое Вы создаете, также является именем базы данных, драйвер направляется на эту базу данных независимо от того, что Вы еще определили.
2) Если DSN не задает имя существующей базы данных, Вы просто не сможете войти в систему к базе данных. Трассировка сообщит Вам, что пакет не может найти базу данных с именем DSN. Это сбивает с толку, если Вы определили допустимое имя базы данных в файле .odbc.ini.
При использовании параметра --with-unixODBC, эти проблемы не наблюдались, и все работало.
Примечание: MyODBC не поддерживает ODBC версию 3 в своей версии 2.50.24. При написании программ, которые используют этот драйвер, следует указывать параметр V_OD_ODBC2 при вызове функции SQLSetEnvAttr().
UnixODBC состоит из большого количества библиотек, установленных в каталог /usr/local/lib, и нескольких исполняемых файлов (binaries), установленных в каталог /usr/local/bin. Эти исполняемые файлы: ODBCConfig, DataManager и odbcinst.
Чтобы получить работающий пакет unixODBC, выполните следующее:
Все выполняется от имени root.
В xterm введите ODBCConfig. Это GUI-программа, и она должна выполняться в X-сессии. По крайней мере Вы должны установить драйвер, чтобы его использовать. Драйверы будут специфические для каждого приложения базы данных, так, например, MyODBC специфический для MySQL. В дополнение к этому, Вы должны определить setup-файл, который надлежит использовать для этого драйвера. Файлы setup находятся в /usr/local/lib/libodbc*S.so и представляют собой библиотеки, где * выражает приложение базы данных, так что /usr/local/lib/libodbcmyS.so является setup-файлом для MyODBC. Драйвер (не setup-файл!) в этом случае имеет имя /usr/local/lib/libmyodbc-2.50.23.so.
Чтобы устанавливать драйвер, выполните ODBCConfig как root, перейдите на вкладку "drivers" и нажмите кнопку "New". Вот пример настройки:
Name: myodbc Description: MySQL driver. Driver: /usr/local/lib/libmyodbc-2.50.23.so Setup: /usr/local/lib/libodbcmyS.so FileUsage: 1
Вы должны иметь установленный драйвер перед установкой DSN. Сделав так, Вы можете устанавливать системный DSN. Вы делаете это, выбирая вкладку "System DSN" и нажимая на кнопку 'New'. Затем надо указать драйвер, который надо использовать и ввести требуемую информацию. Используйте имя драйвера, которое определили в поле Driver на первом экране, и нажмите OK.
При выполнении этого как root, Вы можете создавать и редактировать файлы /usr/local/etc/odbcinst.ini (информация о драйверах) и /usr/local/etc/odbc.ini (системные записи DSN). Ранние версии unixODBC поместили бы эти файлы в /etc, и все еще Вы можете использовать опцию --sysconfdir=/etc скрипта configure, чтобы поместить файлы в это расположение.
При выполнении этого как нормальный пользователь, имейте в виду, что:
Процесс установки пользовательской записи DSN идентичен установке системной DSN. Вы просто выбираете вкладку "User DSN" в ODBCConfig и заполняете требуемые поля. Например, так:
Name: mysqltest Description: myodbc Driver: myodbc Trace: Yes TraceFile: mysql.log Host: localhost Port: 3306 Socket: Database: test
Это создаст и позволит редактировать файл, именованный ~/.odbc.ini. Так как база данных test приходит без любых таблиц, Вы можете определить mysql как базу данных вместо нее, так что Вы сможете увидеть таблицы при выполнении DataManager.
Теперь Вы должны иметь возможность выполнить DataManager и просмотреть список драйверов, DSN и таблиц для каждого DSN.
UnixODBC скорее посредник между программой и одной или большим количеством баз данных, а не самостоятельная и самодостаточная программа. Имеется информация относительно настройки StarOffice так, чтобы можно было использовать ODBC-соединение. Есть также пакет управления данными, также использующий unixODBC ( http://www.info2000.net/~cmorrison/databuilder.html), да и вообще в последнее время стало много программ с поддержкой unixODBC.
Начиная с unixODBC версии 2.0.0, драйвер поддерживает объединение соединения. Этот метод позволяет увеличить быстродействие соединений драйверов путем их многократного использования. Этот раздел обсуждает, как выполнить объединение соединения в unixODBC а также, что Вы должны знать перед выполнением этого.
Имеется пара пунктов, которые должны быть рассмотрены перед использованием объединенных соединений. Возможно, что если они используются неправильно, это может нарушить системную безопасность. Если Ваш web-сервер использует PHP (например) и объединенные соединения, и делает на соединении что-либо, из-за чего конечное состояние соединения будет отличаться от начального, Вы не должны использовать объединение.
Приведу конкретный пример. Допустим, что Вы имеете страницу, которая запрашивает пароль от пользователя, а затем используя этот пароль, изменяет заданную по умолчанию базу данных как-то так, как не позволено другим пользователям. Если это соединение многократно используется другими пользователями, они будут иметь доступ к данным, которые им нельзя позволять видеть. Если Ваши скрипты делают что-то подобно этому, всегда изменяют соединение с базой данных или изменяют заданную по умолчанию базу данных, лучше не пользоваться объединением соединений
Объединение эффективно только когда используется внутри процесса, хороший пример: web-сервер, использующий PHP и ODBC. Здесь соединения будут объединены внутри каждого процесса web-сервера и многократно использоваться с хорошим увеличением эффективности. Плохой пример: внешняя программа CGI. Здесь каждый раз будет выполнен различный процесс, и не имеется ничего такого, что можно улучшить с помощью объединения соединений.
Объединение запускается, редактируя файл настройки odbcinst.ini, а также на основании драйвера. Если требуется иметь некоторые соединения с драйвером с использованием объединений, а некоторые без этого, то создают две записи для драйвера и отображают различные DSN. Установка с поддержкой объединения выглядит примерно так:
[ODBC] Trace = No Trace File = /tmp/sql.log Pooling = Yes [INTERBASE-P] Description = Easysoft Driver for Interbase Driver = /usr/local/lib/libib6odbc.so Setup = /usr/local/lib/libib6odbcS.so FileUsage = 1 DontDLClose = 1 CPTimeout = 120 [INTERBASE] Description = Easysoft Driver for Interbase Driver = /usr/local/lib/libib6odbc.so Setup = /usr/local/lib/libib6odbcS.so FileUsage = 1 DontDLClose = 1 CPTimeout = 0
При использовании этого файла любой DSN, который применяет драйвер INTERBASE, не будет объединять соединения, а DSN, который использует драйвер INTERBASE-P, будет объединять соединения.
Параметр "Pooling=Yes" представляет собой глобальный переключатель, включающий возможность объединению в диспетчере драйвера, если он установлен в No, не будут никаких объединенных соединений. Чтобы объединять индивидуальный драйвер, значение "CPTimeout" должно быть установлено в ненулевое числовое значение.
Это значение указывает число секунд, которое объединенное соединение останется открытым, если оно не используется. Обратите внимание, что соединение будет закрыто только, когда другое соединение открыто.
http://users.ids.net/~bjepson/freeODBC: FreeODBC.
web=сайт, специализированный по общим понятиям и принципам FreeODBC. Очень неплохое свободное ODBC-решение для Linux.
http://www.easysoft.com : EasySoft.
Вы можете искать коммерческое решение для Вашего ODBC-проекта. EasySoft был очень полезен при разработке unixODBC, так что я очень рекомендую Вам обратить внимание на их разработки.
http://www.openlinksw.com: OpenLink.
Другой коммерческий поставщик простой технологии доступа к данным.
http://www.inline.net : InLine.
Эта система очень хорошо поддерживает unixODBC.
http://orcane.net/freeodbc++: odbc++.
Это очень хорошо написанный JDBC-подобный класс для ODBC. Это может использоваться вместе с unixODBC.
http://www.dharma.com: dharma.
Коммерческий набор разработчика (SDK).
http://www.geocities.com/skuchin/otl/home.htm: Odbc Template Library (OTL).
OTL предоставляет API подобный обычным потокам C++. OTL сильно интегрирован с STL через-совместимый поток.
http://www.geocities.com/corwinjoy/dtl/index.htm: Database Template Library.
Цель этой библиотеки состоит в том, чтобы сделать просмотр наборов данных ODBC аналогичным STL-контейнерам.
Ссылки на СУБД
Следующая таблица иллюстрирует, как драйвер отображает типы данных сервера к заданным по умолчанию SQL и C-типам данных:
Тип на сервере | SQL-тип | C-тип |
tinyint | SQL_TINYINT | SQL_C_STINYINT |
tinyint unsigned | SQL_TINYINT | SQL_C_UTINYINT |
bigint | SQL_BIGINT | SQL_C_SBIGINT |
bigint unsigned | SQL_BIGINT | SQL_C_UBIGINT |
long varbinary | SQL_LONGVARBINARY | SQL_C_BINARY |
blob | SQL_VARBINARY | SQL_C_BINARY |
longblob | SQL_VARBINARY | SQL_C_BINARY |
tinyblob | SQL_BINARY | SQL_C_BINARY |
mediumblob | SQL_LONGVARBINARY | SQL_C_BINARY |
long varchar | SQL_LONGVARCHAR | SQL_C_CHAR |
text | SQL_LONGVARCHAR | SQL_C_CHAR |
mediumtext | SQL_LONGVARCHAR | SQL_C_CHAR |
char | SQL_CHAR | SQL_C_CHAR |
numeric | SQL_NUMERIC | SQL_C_CHAR |
decimal | SQL_DECIMAL | SQL_C_CHAR |
integer | SQL_INTEGER | SQL_C_SLONG |
integer unsigned | SQL_INTEGER | SQL_C_ULONG |
int | SQL_INTEGER | SQL_C_SLONG |
int unsigned | SQL_INTEGER | SQL_C_ULONG |
mediumint | SQL_INTEGER | SQL_C_SLONG |
mediumint unsigned | SQL_INTEGER | SQL_C_ULONG |
smallint | SQL_SMALLINT | SQL_C_SSHORT |
smallint unsigned | SQL_SMALLINT | SQL_C_USHORT |
real | SQL_FLOAT | SQL_C_DOUBLE |
double | SQL_FLOAT | SQL_C_DOUBLE |
float | SQL_REAL | SQL_C_FLOAT |
double prec | SQL_DOUBLE | SQL_C_DOUBLE |
date | SQL_DATE | SQL_C_DATE |
time | SQL_TIME | SQL_C_TIME |
year | SQL_SMALLINT | SQL_C_SHORT |
datetime | SQL_TIMESTAMP | SQL_C_TIMESTAMP |
timestamp | SQL_TIMESTAMP | SQL_C_TIMESTAMP |
text | SQL_VARCHAR | SQL_C_CHAR |
varchar | SQL_VARCHAR | SQL_C_CHAR |
enum | SQL_VARCHAR | SQL_C_CHAR |
set | SQL_VARCHAR | SQL_C_CHAR |
Следующая таблица вносит в список коды ошибок, возвращаемые драйвером кроме ошибок сервера.
Код ошибки | SQLSTATE 2< /STRONG> | SQLSTATE 3 | Сообщение |
500 | 01000 | 01000 | Общее предупреждение. |
501 | 01004 | 01004 | Данные для строки подрезаны справа. |
502 | 01S02 | 01S02 | Измененное значение Option. |
503 | 01S03 | 01S03 | Никакие строки не изменены. |
504 | 01S04 | 01S04 | Больше, чем одна модифицируемая/удаляемая строка. |
505 | 01S06 | 01S06 | Пытаетесь выбирать данные прежде, чем набор результатов возвратил первый набор строк. |
506 | 07001 | 07002 | SQLBindParameter не используемый для всех параметров. |
507 | 07005 | 07005 | Подготовленная инструкция не специфична для курсора. |
508 | 07009 | 07009 | Недопустимый дескрипторный индекс. |
509 | 08002 | 08002 | Имя подключения занято. |
510 | 08003 | 08003 | Подключение не существует. |
511 | 24000 | 24000 | Недопустимое состояние курсора. |
512 | 25000 | 25000 | Недопустимое состояние транзакции. |
513 | 25S01 | 25S01 | Неизвестное состояние транзакции. |
514 | 34000 | 34000 | Недопустимое имя курсора. |
515 | S1000 | HY000 | Общая ошибка драйвера. |
516 | S1001 | HY001 | Ошибка распределения памяти. |
517 | S1002 | HY002 | Недопустимый номер столбца. |
518 | S1003 | HY003 | Недопустимый тип буфера прикладных программ. |
519 | S1004 | HY004 | Недопустимый SQL-тип данных. |
520 | S1009 | HY009 | Недопустимое использование null. |
521 | S1010 | HY010 | Функциональная ошибка последовательности. |
522 | S1011 | HY011 | Атрибут не может быть установлен в настоящий момент. |
523 | S1012 | HY012 | Недопустимый код операции транзакции. |
524 | S1013 | HY013 | Ошибка управления памятью. |
525 | S1015 | HY015 | Никакое имя курсора недоступно. |
526 | S1024 | HY024 | Недопустимое значение атрибута. |
527 | S1090 | HY090 | Недопустимая длина строки или буфера. |
528 | S1091 | HY091 | Недопустимый дескрипторный идентификатор поля. |
529 | S1092 | HY092 | Недопустимый идентификатор атрибута или опции. |
530 | S1093 | HY093 | Недопустимый номер параметра. |
531 | S1095 | HY095 | Функциональный тип вне диапазона. |
532 | S1106 | HY106 | Тип выборки вне диапазона. |
533 | S1117 | HY117 | Значение строки вне диапазона. |
534 | S1109 | HY109 | Недопустимая позиция курсора. |
535 | S1C00 | HYC00 | Факультативное свойство не выполнено. |
0 | 21S01 | 21S01 | Число столбцов не соответствует значению. |
0 | 23000 | 23000 | Нарушение ограничения целостности. |
0 | 42000 | 42000 | Ошибка синтаксиса или нарушение прав доступа в системе. |
0 | 42S02 | 42S02 | Основная таблица или представление не найдено. |
0 | 42S12 | 42S12 | Индекс не найден. |
0 | 42S21 | 42S21 | Столбец уже существует. |
0 | 42S22 | 42S22 | Столбец не найден. |
0 | 08S01 | 08S01 | Сбой связи. |
Эта глава содержит простые примеры использования MySQL ODBC 3.51 с ADO, DAO и RDO.
Следующий пример для ADO (ActiveX Data Objects)
создает таблицу my_ado и показывает использование rs.addNew,
rs.delete и rs.update.
Private Sub myodbc_ado_Click() Dim conn As ADODB.Connection Dim rs As ADODB.Recordset Dim fld As ADODB.Field Dim sql As String 'connect to MySQL server using MySQL ODBC 3.51 Driver Set conn = New ADODB.Connection conn.ConnectionString = "DRIVER={MySQL ODBC 3.51 Driver};"_ & "SERVER=localhost;"_ & " DATABASE=test;"_ & "UID=venu;PWD=venu; OPTION=35" conn.Open 'create table conn.Execute "DROP TABLE IF EXISTS my_ado" conn.Execute "CREATE TABLE my_ado(id int not null primary key, name varchar(20)," _ & "txt text, dt date, tm time, ts timestamp)" 'direct insert conn.Execute "INSERT INTO my_ado(id,name,txt) values(1,100,'venu')" conn.Execute "INSERT INTO my_ado(id,name,txt) values(2,200,'MySQL')" conn.Execute "INSERT INTO my_ado(id,name,txt) values(3,300,'Delete')" Set rs = New ADODB.Recordset rs.CursorLocation = adUseServer 'fetch the initial table .. rs.Open "SELECT * FROM my_ado", conn Debug.Print rs.RecordCount rs.MoveFirst Debug.Print String(50, "-") & "Initial my_ado Result Set " & String(50, "-") For Each fld In rs.Fields Debug.Print fld.Name, Next Debug.Print Do Until rs.EOF For Each fld In rs.Fields Debug.Print fld.Value, Next rs.MoveNext Debug.Print Loop rs.Close 'rs insert rs.Open "select * from my_ado", conn, adOpenDynamic, adLockOptimistic rs.AddNew rs!Name = "Monty" rs!txt = "Insert row" rs.Update rs.Close 'rs update rs.Open "SELECT * FROM my_ado" rs!Name = "update" rs!txt = "updated-row" rs.Update rs.Close 'rs update second time.. rs.Open "SELECT * FROM my_ado" rs!Name = "update" rs!txt = "updated-second-time" rs.Update rs.Close 'rs delete rs.Open "SELECT * FROM my_ado" rs.MoveNext rs.MoveNext rs.Delete rs.Close 'fetch the updated table .. rs.Open "SELECT * FROM my_ado", conn Debug.Print rs.RecordCount rs.MoveFirst Debug.Print String(50, "-") & "Updated my_ado Result Set " & String(50, "-") For Each fld In rs.Fields Debug.Print fld.Name, Next Debug.Print Do Until rs.EOF For Each fld In rs.Fields Debug.Print fld.Value, Next rs.MoveNext Debug.Print Loop rs.Close conn.Close End Sub
Следующий пример для DAO (Data Access Objects)
создает таблицу my_dao и показывает использование rs.addNew,
rs.update, а также прокрутку (скроллинг) набора результатов.
Private Sub myodbc_dao_Click() Dim ws As Workspace Dim conn As Connection Dim queryDef As queryDef Dim str As String 'connect to MySQL using MySQL ODBC 3.51 Driver Set ws = DBEngine.CreateWorkspace("", "venu", "venu", dbUseODBC) str = "odbc;DRIVER={MySQL ODBC 3.51 Driver};"_ & "SERVER=localhost;"_ & " DATABASE=test;"_ & "UID=venu;PWD=venu; OPTION=35" Set conn = ws.OpenConnection("test", dbDriverNoPrompt, False, str) 'Create table my_dao Set queryDef = conn.CreateQueryDef("", "drop table if exists my_dao") queryDef.Execute Set queryDef = conn.CreateQueryDef("", "create table my_dao(Id INT AUTO_INCREMENT PRIMARY KEY, " _ & "Ts TIMESTAMP(14) NOT NULL,Name varchar(20), Id2 INT)") queryDef.Execute 'Insert new records using rs.addNew Set rs = conn.OpenRecordset("my_dao") Dim i As Integer For i = 10 To 15 rs.AddNew rs!Name = "insert record" & i rs!Id2 = i rs.Update Next i rs.Close 'rs update.. Set rs = conn.OpenRecordset("my_dao") rs.Edit rs!Name = "updated-string" rs.Update rs.Close 'fetch the table back... Set rs = conn.OpenRecordset("my_dao", dbOpenDynamic) str = "Results:" rs.MoveFirst While Not rs.EOF str = " " & rs!Id & " , " & rs!Name & ", " & rs!Ts & ", " & rs!Id2 Debug.Print "DATA:" & str rs.MoveNext Wend 'rs Scrolling rs.MoveFirst str = " FIRST ROW: " & rs!Id & " , " & rs!Name & ", " & rs!Ts & ", " & rs!Id2 Debug.Print str rs.MoveLast str = " LAST ROW: " & rs!Id & " , " & rs!Name & ", " & rs!Ts & ", " & rs!Id2 Debug.Print str rs.MovePrevious str = " LAST-1 ROW: " & rs!Id & " , " & rs!Name & ", " & rs!Ts & ", " & rs!Id2 Debug.Print str 'free all resources rs.Close queryDef.Close conn.Close ws.Close End Sub
Следующий пример для RDO (Remote Data Objects)
создает таблицу my_rdo и показывает использование rs.addNew и
rs.update.
Dim rs As rdoResultset Dim cn As New rdoConnection Dim cl As rdoColumn Dim SQL As String 'cn.Connect = "DSN=test;" cn.Connect = "DRIVER={MySQL ODBC 3.51 Driver};"_ & "SERVER=localhost;"_ & " DATABASE=test;"_ & "UID=venu;PWD=venu; OPTION=35" cn.CursorDriver = rdUseOdbc cn.EstablishConnection rdDriverPrompt 'drop table my_rdo SQL = "drop table if exists my_rdo" cn.Execute SQL, rdExecDirect 'create table my_rdo SQL = "create table my_rdo(id int, name varchar(20))" cn.Execute SQL, rdExecDirect 'insert - direct SQL = "insert into my_rdo values (100,'venu')" cn.Execute SQL, rdExecDirect SQL = "insert into my_rdo values (200,'MySQL')" cn.Execute SQL, rdExecDirect 'rs insert SQL = "select * from my_rdo" Set rs = cn.OpenResultset(SQL, rdOpenStatic, rdConcurRowVer, rdExecDirect) rs.AddNew rs!id = 300 rs!Name = "Insert1" rs.Update rs.Close 'rs insert SQL = "select * from my_rdo" Set rs = cn.OpenResultset(SQL, rdOpenStatic, rdConcurRowVer, rdExecDirect) rs.AddNew rs!id = 400 rs!Name = "Insert 2" rs.Update rs.Close 'rs update SQL = "select * from my_rdo" Set rs = cn.OpenResultset(SQL, rdOpenStatic, rdConcurRowVer, rdExecDirect) rs.Edit rs!id = 999 rs!Name = "updated" rs.Update rs.Close 'fetch back... SQL = "select * from my_rdo" Set rs = cn.OpenResultset(SQL, rdOpenStatic, rdConcurRowVer, rdExecDirect) Do Until rs.EOF For Each cl In rs.rdoColumns Debug.Print cl.Value, Next rs.MoveNext Debug.Print Loop Debug.Print "Row count="; rs.RowCount 'close rs.Close cn.Close End Sub
Эта глава содержит простые примеры, чтобы показать использование драйверов MyODBC с ODBC.NET.
Следующий пример создает таблицу my_odbc_net и показывает использование в C#.
/** * @sample : mycon.cs * @purpose : Demo sample for ODBC.NET using MyODBC or MyODBC 3.51 * @author : Venu, venu@mysql.com * * (C) Copyright MySQL AB, 1995-2002 * **/ /* build command * * csc /t:exe * /out:mycon.exe mycon.cs * /r:Microsoft.Data.Odbc.dll */ using Console = System.Console; using Microsoft.Data.Odbc; namespace myodbc3 { class mycon { static void Main(string[] args) { try { //Connection string for MyODBC 2.50 /*string MyConString = "DRIVER={MySQL};" + "SERVER=localhost;" + "DATABASE=test;" + "UID=venu;" + "PASSWORD=venu;" + "OPTION=3"; */ //Connection string for MyODBC 3.51 string MyConString = "DRIVER={MySQL ODBC 3.51 Driver};" + "SERVER=localhost;" + "DATABASE=test;" + "UID=venu;" + "PASSWORD=venu;" + "OPTION=3"; //Connect to MySQL using MyODBC OdbcConnection MyConnection = new OdbcConnection(MyConString); MyConnection.Open(); Console.WriteLine("\n !!! success, connected successfully !!!\n"); //Display connection information Console.WriteLine("Connection Information:"); Console.WriteLine("\tConnection String:" + MyConnection.ConnectionString); Console.WriteLine("\tConnection Timeout:" + MyConnection.ConnectionTimeout); Console.WriteLine("\tDatabase:" + MyConnection.Database); Console.WriteLine("\tDataSource:" + MyConnection.DataSource); Console.WriteLine("\tDriver:" + MyConnection.Driver); Console.WriteLine("\tServerVersion:" + MyConnection.ServerVersion); //Create a sample table OdbcCommand MyCommand = new OdbcCommand("DROP TABLE IF EXISTS my_odbc_net",MyConnection); MyCommand.ExecuteNonQuery(); MyCommand.CommandText = "CREATE TABLE my_odbc_net(id int, name varchar(20), idb bigint)"; MyCommand.ExecuteNonQuery(); //Insert MyCommand.CommandText = "INSERT INTO my_odbc_net VALUES(10,'venu', 300)"; Console.WriteLine("INSERT, Total rows affected:" + MyCommand.ExecuteNonQuery());; //Insert MyCommand.CommandText = "INSERT INTO my_odbc_net VALUES(20,'mysql',400)"; Console.WriteLine("INSERT, Total rows affected:" + MyCommand.ExecuteNonQuery()); //Insert MyCommand.CommandText = "INSERT INTO my_odbc_net VALUES(20,'mysql',500)"; Console.WriteLine("INSERT, Total rows affected:" + MyCommand.ExecuteNonQuery()); //Update MyCommand.CommandText = "UPDATE my_odbc_net SET id=999 WHERE id=20"; Console.WriteLine("Update, Total rows affected:" + MyCommand.ExecuteNonQuery()); //COUNT(*) MyCommand.CommandText = "SELECT COUNT(*) as TRows FROM my_odbc_net"; Console.WriteLine("Total Rows:" + MyCommand.ExecuteScalar()); //Fetch MyCommand.CommandText = "SELECT * FROM my_odbc_net"; OdbcDataReader MyDataReader; MyDataReader = MyCommand.ExecuteReader(); while (MyDataReader.Read()) { if (string.Compare(MyConnection.Driver,"myodbc3.dll") == 0) { Console.WriteLine("Data:" + MyDataReader.GetInt32(0) + " " + MyDataReader.GetString(1) + " " + MyDataReader.GetInt64(2)); } else { Console.WriteLine("Data:" + MyDataReader.GetInt32(0) + " " + MyDataReader.GetString(1) + " " + MyDataReader.GetInt32(2)); // BIGINTs not supported by MyODBC } } // Close all resources MyDataReader.Close(); MyConnection.Close(); } catch (OdbcException MyOdbcException) // Catch any ODBC exception .. { for (int i=0; i < MyOdbcException.Errors.Count; i++) { Console.Write("ERROR #" + i + "\n" + "Message: " + MyOdbcException.Errors[i].Message + "\n" + "Native: " + MyOdbcException.Errors[i].NativeError.ToString() + "\n" + "Source: " + MyOdbcException.Errors[i].Source + "\n" + "SQL: " + MyOdbcException.Errors[i].SQLState + "\n"); } } } } }
Следующий пример создает таблицу my_vb_net и показывает использование в VB.
' @sample : myvb.vb ' @purpose : Demo sample for ODBC.NET using MyODBC or MyODBC 3.51 ' @author : Venu, venu@mysql.com ' ' (C) Copyright MySQL AB, 1995-2002 ' ' build command ' ' vbc /target:exe ' /out:myvb.exe ' /r:Microsoft.Data.Odbc.dll ' /r:System.dll ' /r:System.Data.dll Imports Microsoft.Data.Odbc Imports System Module myvb Sub Main() Try 'MyODBC 3.51 connection string Dim MyConString As String = "DRIVER={MySQL ODBC 3.51 Driver};" & _ "SERVER=localhost;" & _ "DATABASE=test;" & _ "UID=venu;" & _ "PASSWORD=venu;" & _ "OPTION=3;" 'Connection Dim MyConnection As New OdbcConnection(MyConString) MyConnection.Open() Console.WriteLine("Connection State::" & MyConnection.State.ToString) 'Drop Console.WriteLine ("Dropping table") Dim MyCommand As New OdbcCommand() MyCommand.Connection = MyConnection MyCommand.CommandText = "DROP TABLE IF EXISTS my_vb_net" MyCommand.ExecuteNonQuery() 'Create Console.WriteLine ("Creating....") MyCommand.CommandText = "CREATE TABLE my_vb_net(id int, name varchar(30))" MyCommand.ExecuteNonQuery() 'Insert MyCommand.CommandText = "INSERT INTO my_vb_net VALUES(10,'venu')" Console.WriteLine("INSERT, Total rows affected:" & MyCommand.ExecuteNonQuery()) 'Insert MyCommand.CommandText = "INSERT INTO my_vb_net VALUES(20,'mysql')" Console.WriteLine("INSERT, Total rows affected:" & MyCommand.ExecuteNonQuery()) 'Insert MyCommand.CommandText = "INSERT INTO my_vb_net VALUES(20,'mysql')" Console.WriteLine("INSERT, Total rows affected:" & MyCommand.ExecuteNonQuery()) 'Insert MyCommand.CommandText = "INSERT INTO my_vb_net(id) VALUES(30)" Console.WriteLine("INSERT, Total rows affected:" & MyCommand.ExecuteNonQuery()) 'Update MyCommand.CommandText = "UPDATE my_vb_net SET id=999 WHERE id=20" Console.WriteLine("Update, Total rows affected:" & MyCommand.ExecuteNonQuery()) 'COUNT(*) MyCommand.CommandText = "SELECT COUNT(*) as TRows FROM my_vb_net" Console.WriteLine("Total Rows:" & MyCommand.ExecuteScalar()) 'Select Console.WriteLine ("Select * FROM my_vb_net") MyCommand.CommandText = "SELECT * FROM my_vb_net" Dim MyDataReader As OdbcDataReader MyDataReader = MyCommand.ExecuteReader While MyDataReader.Read If MyDataReader("name") Is DBNull.Value Then Console.WriteLine("id = " & CStr(MyDataReader("id")) & " name = " & "NULL") Else Console.WriteLine("id = " & CStr(MyDataReader("id")) & " name = " & CStr(MyDataReader("name"))) End If End While 'Catch ODBC Exception Catch MyOdbcException As OdbcException Dim i As Integer Console.WriteLine (MyOdbcException.ToString) 'Catch program exception Catch MyException As Exception Console.WriteLine (MyException.ToString) End Try End Sub End Module
Это разработчики, которые работают в MySQL AB полный рабочий день над драйверами MyODBC и MyODBC 3.51.
Появление OpenOffice.org 1.0 в 2002 году устранило одну из главных проблем распространения Linux на конторских машинах. Наконец-то пользователи Linux получили нормальное конторское программное обеспечение: текстовый процессор, электронную таблицу, графику, которое не только работает по крайней мере также как эквиваленты из Microsoft Office, но может также работать с форматами данных из Microsoft Office и имеет открытые исходные тексты. Однако, это не предотвратило возражения пользователей пакетов Microsoft, что они все еще не могут перейти на Linux, поскольку "Linux не имеет аналога Microsoft Access". Ну да, не имеет! Еще как имеет. Один из скрытых нюансов OpenOffice.org 1.0 то, что он также имеет интерфейс для баз данных. Все, что Вы должны сделать, это подключиться к любой базе данных под Linux, а их уже написано немало. Этот документ объясняет, как сделать это соединение, а затем обеспечивает краткий просмотр инструментальных средств баз данных внутри OpenOffice.org 1.0. Многие пользователи не придают значения скрытым возможностям, порой даже не знают о них, и бывают поражены ими.
OpenOffice.org 1.0 использует ODBC 1 для связи с базами данных. Здесь рассказано о том, как подключить OpenOffice.org 1.0 к MySQL через unixODBC, но нет ограничений на то, какую именно СУБД использовать, лишь бы она имела драйвер для ODBC. Поскольку задачей было все настроить под RedHat Linux 9, все примеры показывают установку из пакетов RPM. Если Вы используете другой формат или дистрибутив, общие принципы остаются теми же.
Следующий раздел этого документа применяется только к OpenOffice.org 1.0 под Linux. Можно (и довольно просто) установить OpenOffice.org 1.0, MySQL и MyODBC под MS Windows. Если Вы используете MS Windows, переходите к разделу "Использование инструментов Data Source Tools в OpenOffice.org 1.0".
Установка MySQL
Проверьте сначала, установлен ли MySQL на Вашей системе. Из меню RedHat:
System Settings
Add/Remove Applications
Выберите "Select SQL Database Server", щелкните на Details и удостоверьтесь, что MySQL выбран.
Вы должны гарантировать, что сервер базы данных MySQL пребывает в готовности и выполняется. Из меню RedHat выберите:
System Settings
Server Settings
Services
Удостоверьтесь, что сервис mysqld service запущен.
По умолчанию, процесс установки создает пустую базу данных называемую test, доступную пользователю test без пароля (обратите внимание: имя пользователя MySQL представляет собой идентификатор, который Вы передаете MySQL, когда создаете соединение, это не то имя пользователя, которое Вы используете, чтобы входить в систему).
Теперь, когда сервер выполняется, и Вы имеете установленное клиентское программное обеспечение, Вы должны проверить как все это работает. Вы можете обратиться к серверу из оболочки пользователя. Здесь я войду в систему как pautov, но с сервером соединюсь как MySQL-пользователь test. Я дам команду select version(); для проверки работоспособности:
[pautovv@joker pautovv]$ mysql -u test Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1 to server version: 3.23.54 Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> select version(); +-----------+ | version() | +-----------+ | 3.23.54 | +-----------+ 1 row in set (0.27 sec) mysql> exit Bye [pautovv@joker pautovv]$
Вы должны также убедиться, что программное обеспечение unixODBC было установлено. К сожалению, RedHat не ставит драйверы MyODBC, которые соединяют unixODBC с MySQL, и единственый способ установить их: командная строка. Однако, драйверы MyODBC включены в Disk 2, так что их установка проста:
# rpm -ivh /mnt/cdrom/RedHat/RPMS/MyODBC-2.50.39-11.i386.rpm warning: /mnt/cdrom/RedHat/RPMS/MyODBC-2.50.39-11.i386.rpm: V3 DSA signature: NOKEY, key ID db42a60e Preparing... ########################################### [100%] 1:MyODBC ########################################### [100%] [root@joker root]#
Теперь Вы должны установить .ini-файлы, используемые ODBC. Они представляют собой простые текстовые файлы, которые Вы можете редактировать используя Ваш любимый текстовый редактор. RedHat помещает шаблоны в /etc.
odbcinst.ini перечисляет ODBC-драйверы, установленные в системе. Вы должны определить только MySQL-драйвер в /etc/odbcinst.ini:
[MySQL] Description = ODBC for MySQL Driver = /usr/lib/libmyodbc.so FileUsage = 1
odbc.ini определяет связи, которые пользователи используют, чтобы работать с фактической базой данных через драйвер. Связи в /etc/odbc.ini доступны всем пользователям Вашей Linux-системы:
[MySQL-test] Description = MySQL database test Driver = MySQL Server = localhost Database = test Port = 3306
Теперь проверим как работает соединение, на сей раз через ODBC. В пакет unixODBC входит простое средство isql:
[[pautovv@joker pautovv]$ isql MySQL-test test +---------------------------------------+ | Connected! | | sql-statement | | help [tablename] | | quit | +---------------------------------------+ SQL> select version() +----------+ | version()| +----------+ | 3.23.54 | +----------+ 1 rows affected 1 rows returned SQL> quit [pautovv@joker pautovv]$
Если это не работает, попробуйте isql MySQL-test -v, чтобы получить более полные сообщения об ошибках.
Заметьте, что параметр, который Вы передаете isql (MySQL-test) передается программному обеспечению ODBC. Оно ищет этот параметр в odbc.ini и находит драйвер MySQL и информацию для связи. Оно затем ищет MySQL в odbcinst.ini и находит библиотеки.
Если все это работает, Вы теперь можете спокойно работать с базой данных MySQL, доступной из ODBC.
Вы теперь должны сообщить OpenOffice.org 1.0 все относительно Вашего ODBC-соединения. Внутри OpenOffice.org 1.0 выберите Tools/Data Sources... из главного меню. Затем нажмите кнопку New Data Source, чтобы открыть окно Data Source Administration. Введите в Name MySQL-test, выберите в качестве Database type ODBC и нажмите кнопку [...]. Затем выберите источник данных, который Вы только что создали в диалоге Data Source. Нажмите OK. Теперь в окне Data Source Administration на вкладке ODBC введите имя пользователя test и нажмите кнопку OK.
Если Вы делаете новую рабочую станцию RedHat 9, действуйте как показано здесь, все будет работать. Кроме драйверов MyODBC, RedHat наконец дозрела до совместимых версий программных пакетов в одной версии дистрибутива. Более ранние версии RedHat не работали и требовали, чтобы различные обновления программного обеспечения были установлены. Например, следующее работает:
RedHat 9 | RedHat 8.0 | RedHat 7.3 |
mysql-server-3.23.54a-11 | mysql-server-3.23.54a-4 | MySQL-server-3.23.49-1 |
mysql-3.23.54a-11 | mysql-3.23.54a-4 | MySQL-3.23.49-1 |
unixODBC-2.2.3-6 | unixODBC-2.2.2-3 | unixODBC-2.2.1-2 |
MyODBC-2.50.39-11 | MyODBC-2.50.39-4 | MyODBC-2.50.39-4 |
MySQL-shared-3.23.49-1 | MySQL-shared-3.23.49-1 |
Имеется ошибка в версиях .49a и .50 клиентских библиотек MySQL, которая мешает работать по ODBC: Вы будете видеть сообщения об ошибках подобные relocation error: /usr/lib/libmyodbc.so: undefined symbol: init_dynamic_array. Так что Вы должны получить версию .49 в случае необходимости, ищите через http://www.rpmfind.net.
Если Вы устанавливаете MySQL из исходных текстов Вы (в большинстве случаев) должны будете создать базу данных test и пользователя test сами.
Некоторые установщики используют /usr/local/etc для .ini-файлов и /usr/local/lib для библиотек.
Иногда ODBC не работает, пока не будут созданы файлы ~/.odbc.ini для каждого пользователя.
Если Вы установили библиотеки в /usr/local/lib, Вы должны перед запуском OpenOffice.org 1.0 скомандовать:
$ export LD_LIBRARY_PATH=/usr/local/lib
Поиск инструментов Data Source
Чтобы использовать функции базы данных в любое время, выберите View/Data Sources из главного меню или нажмите F4. На экране Data Sources слева Data Source Explorer показывает все источники данных в настоящее время известные OpenOffice.org. Применяется стандартная навигация: щелчок на знаке + покажет дополнительные сведения, щелчок правой кнопкой мышкой покажет доступные инструментальные средства. Правая сторона экрана занята Data Source Browser, который показывает содержание любого в настоящее время выбранного источника данных.
Работа с определениями таблиц
Создание таблицы
Разверните ссыдку MySQL-test в Data Source Explorer, затем правой кнопкой мышки кликните на
Tables. Из появившегося меню выберите New Table Design для отображения окна Table Design Screen.
Я создам таблицу, чтобы сохранить список торговцев книгами. OpenOffice.org действует как окно в MySQL, так что правила относительно того, как Вы можете вызывать поля, какие типы данных являются доступными и т.д., работают согласно MySQL. Панель в правой нижней части окна содержит контекстно-чувствительную справку, но для получения полной помощи, Вы должны обратиться к документации на MySQL.
Обратите внимание, что если Вы хотите модифицировать данные в этой таблице в OpenOffice.org 1.0, Вы должны определить одно поле как первичный ключ. Вы можете сделать это, щелкая правой кнопкой мыши на индикаторе на левой стороне экрана и указывая параметр Primary Key. Это показывает символ ключа. В моем примере первичным ключом будет ISBN книги. Когда Вы закончили, нажмите кнопку Save, назовите таблицу stocklist и закройте окно. Ваша новая таблица будет теперь видна в Data Source Explorer.
Построение индексов
Имеется также индексный проектировщик, доступный из окна Table Design, через меню Tools/Index/Design... или через кнопку Index Design на инструментальной панели.
Изменение определений таблиц
Если Вы должны сделать изменения для полей в вашей таблице, щелкните правой кнопкой мышки на имени таблицы в the Data Source Explorer и выберите Edit Table. Это переместит Вас обратно в окно Table Design.
Таблицы могут быть отредактированы непосредственно из экрана Data Sources: просто нажмите на имя таблицы в Data Source Explorer, и содержание таблицы будет отображаться в Data Source Browser справа на экране.
Обратите внимание на навигационную панель (Navigation Bar) внизу Data Source Browser. Она нужна, чтобы помочь Вам быстро двигаться по таблице.
Обычные соглашения для электронной таблицы также применяются:
Дважды щелкните на заголовке столбца, чтобы изменить ширину столбца.
Щелкните правой кнопкой на заголовке столбца, чтобы изменить ширину столбца вручную, установить новый формат столбца или скрыть столбец вообще.
Щелкните правой кнопкой на любом из маркеров строки, чтобы установить высоту строки или переформатировать целую таблицу.
Обратите внимание: любые комментарии, которые Вы ввели в поле Description, когда Вы настраиваете таблицу, появятся как подсказки, когда Вы перемещаете курсор мыши поверх заголовка столбца в Data Source Browser.
Использование Database Toolbar для работы с Вашими данными
Многое из возможностей OpenOffice.org 1.0 обеспечивается Database Toolbar, которая появляется наверху Data Source Browser. Она содержит следующие кнопки (перечислены слева направо).
Полезно, если Вы хотите максимизировать количество данных, которое Вы можете видеть на экране. Эта кнопка переключает отображение Data Source Explorer (виден или нет).
Эта кнопка отображает диалог Record Search. Обратите внимание, что это будет искать запись в таблице, просматривая таблицу по записям. Это может быть медленно на больших таблицах!
Нажмите на заголовок столбца, чтобы выбрать поле, а затем при нажиме любой из этих кнопок данные в Data Source Browser будут отсортированы в порядке возрастания или убывания значений в выбранном Вами поле.
Обратите внимание: кнопки Sort только изменяют способ, которым отображаются данные. На основную базу данных они никак не воздействуют.
Auto Filtering представляет собой очень мощный инструмент для отображения только тех записей, которые отвечают некоторым критериям. Например, один из издателей в моей таблице называется "Аверс". При нажатии на ячейку, содержащую слово "Аверс" и последующем нажатии на кнопку AutoFilter отобразятся только записи, где издателем является "Аверс". Обратите внимание, что, если Вы теперь делаете другой autofilter, он добавится к тому, который уже в силе: например, повторите процесс для Cover равного H. Это покажет только твердые книги издательства "Аверс". Кнопка Remove Filter/Sort сбросит просмотр таблицы. Обратите внимание: фильтры воздействуют только на способ, которым таблица отображается, они не изменяют данные в базе данных.
При использовании этой кнопки, Вы можете видеть или изменять любой фильтр, работающий в настоящее время. Например, если Вы использовали функцию Autofilter как описано выше, и затем нажали на кнопку Default Filter Вы сможете теперь совершенствовать фильтр, чтобы отобразить твердые книги издательства "Аверс" по цене больше, чем 200 рублей, устанавливая дополнительный фильтр.
Кнопки Sort Ascending и Sort Descending уже описаны выше. Они дают возможность определить простой порядок сортировки на одиночном поле. Кнопка Sort дает возможность установить более сложные критерии сортировки, например, в алфавитном порядке заголовков.
Эта кнопка возвращает просмотр таблицы к значению по умолчанию.
Если Вы определили фильтр, используя кнопки AutoFilter или Filter, эта кнопка включает и выключает фильтр.
Можно открыть множественные окна редактирования той же самой таблицы от одного пользователя или от многих пользователей, если Вы находитесь в многопользовательской системе. Нажим кнопки Refresh вынуждает OpenOffice.org 1.0 перезагружать информацию из базы данных, чтобы отразить любые изменения, сделанные в другом месте.
Если Ваша таблица имеет первичный определенный ключ, нажатие этой кнопки позволит Вам редактировать данные непосредственно в Data Source Browser. Любые изменения, которые Вы делаете на экране, будут зарегистрированы в базе данных, когда Вы переходите к другой записи, или Вы можете применить непосредственную модификацию, используя кнопку Save Current Record.
Если Вы редактируете запись, нажатие на эту кнопку, вынуждает сервер немедленно вписать изменения в базу данных.
Database Toolbar очень мощный инструмент для анализа и работы над Вашими данными. Однако, иногда полезно вызывать предварительно установленный просмотр таблицы. Например, мне пригодится просмотр, показывающий только книги, изданные Нолидж, которые в настоящее время есть в продаже, отсортированные в алфавитном порядке по заголовкам. В окне Data Sources в Data Source Explorer щелкните правой кнопкой мыши по Queries и выберите New Query Design. В диалоге Add Tables пакет запросит Вас относительно таблиц, используемых в запросе. Добавьте туда stocklist и закройте диалог Add Tables Dialogue. Затем Вы попадете на экран Query Design, где можете разрабатывать Ваш запрос.
Field
Поля, которые будут включены в запрос могут быть дважды нажаты в верхнем подокне, перетащены из верхнего подокна или введены, нажимая в строке Field подокна нижней части и используя раскрывающийся список.
Alias
Строка Alias позволяет Вам изменять заголовок столбца.
Visible
Строка Visible позволяет полям использоваться в критериях выбора, но не отображаться.
Functions
Строка Function позволяет Вам определять резюме или группирующие функции.
Criterion
Строка Criterion фильтрует определения: здесь я определил, что издатель равняется Нолидж, и Status равен not empty (null).
Query Toolbar
Query Toolbar обеспечивает большее количество функциональных возможностей:
Run Query
Немедленно отобразит результаты Вашего запроса в новом Data Source Browser. Обратите внимание, что этот новый Data Source Browser также имеет свою собственную инструментальную панель!
Clear Query
Нажим этой кнопки немедленно очищает запрос.
Switch Design View On/Off
Query Designer транслирует Ваш проект запроса в команды SQL, которые понимает MySQL. Для продвинутых пользователей эта кнопка включит отображение необработанных команд SQL, сгенерированных Query Designer. Вы можете редактировать эти команды непосредственно, и изменения будут отражены в Data Designer.
Можно записать просто написать запрос SQL, который является слишком сложным для Query Designer. Всегда сохраняйте запросы перед переключением обратно на Design View.
Add tables...
Позволяет Вам помещать множественные таблицы в запрос.
Functions/Table Name/Alias
Эти кнопки нужны, чтобы отобразить или скрыть соответствующие строки в Query Designer.
Distinct Values
Этот переключатель позволяет Вам создавать запрос, чтобы ответить на вопросы, подобные: "показать мне всех авторов, кто находится в stocklist". Пример, который я использую, имеет 25000 записей. Если Вы пробуете отвечать на вопрос созданием запроса без нажатия кнопки Distinct, OpenOffice.org 1.0 честно покажет все 25000. Ему все равно, что многих авторов он перечислит по нескольку раз. Запрос с Distinct покажет каждого автора только один раз. Это именно то, что нужно.
Edit
Кнопка Edit переключает режим редактирования в Query Design.
Save
Сохраняет Query Design. Если запрос был сохранен, он доступен внутри Data Source Explorer, а содержание может просматриваться в Data Source Browser.
Data Designer представляет собой мощный инструмент для создания запросов, что означает, что Вы можете выполнять повседневные запросы без надобности знать что-либо про SQL. Это включает таблицы подведения итогов и соединение.
Предположим, что Вы создали таблицу Orders, которая хранит книги, которые заказаны. Здесь Вы записываете ISBN каждой книги и количество ее копий для поставки.
Связывание таблиц
Обратите внимание, как две таблицы связаны через общее поле ISBN. Чтобы создать связь в Query Designer, просто перетащите и положите нужное поле из одного списка в другой.
Запросы сохранены в файле DataAccess.xml глубоко внутри Вашей структуры каталога OpenOffice.org.
Вы можете также выполнять любые команды SQL непосредственно, например, специфические для MySQL команды, которые не понятны Data Designer или ODBC.
Продвинутые пользователи могут определять тип связи, дважды нажимая на строке соединения.
Вычисляемые поля
Поле Value определено как произведение Price и Order_Qty, вводя вычисление в запись Field.
Форматирование данных
Поля No, Price и Value форматируются, щелкая правой кнопкой мыши на релевантных столбцах и выбирая соответствующие опции.
Функции Group и Sum
Часто используемые вместе функции Group и Sum определяют, какие данные требуются (Group) и что с ними делать (Sum).
Использование Data Sources в других программах в OpenOffice.org 1.0
Пока этот документ был сконцентрирован на доступе к данным, используя метод F4 View/Data Sources. Однако, иногда более удобно переместить данные непосредственно в другой инструмент, типа OpenOffice 1.0, например, Calc или Writer. Этот раздел показывает Вам, как это сделать.
Calc: создание связи методом Drag and Drop
Извлечение данных из Data Source в электронную таблицу в OpenOffice.org выполняется простым перетаскиванием. В Calc нажмите F4 или из меню выберите View/Data Sources... и откройте таблицу или запрос, который хотите скопировать в Calc. Самое простое, если Вы меняете режим просмотра с Stick на Floating (используйте пиктограмму штырька в левом нижнем углу Data Source Explorer). Чтобы перенести данные в электронную таблицу, просто нажмите на данные и перетащите их в электронную таблицу. Когда Вы их положите, будет создана связь между электронной таблицой и источником данных.
Меню Options
Если Вы создали связь, имеется ряд команд меню, которые Вы можете счесть полезными, доступные из главного меню, когда Вы выбираете ячейку, содержащую связанные данные. В любое время, когда Вы захотите модифицировать электронную таблицу с последними данными в базе данных, выберите из главного меню Data/Refresh Range. Окно Data/Define Range и его кнопка нажмите More позволяют Вам выбрать, импортируются ли заголовки столбца, сохраняется ли Ваше собственное форматирование и сохраняются ли импортированные данные в таблице.
Data Pilot
Data Pilot может обращаться к данным напрямую из Data Sources, давая удивительно мощный инструмент для многотабличных запросов.
Writer: создание связей с помощью метода Drag and Drop
Хотя должно быть можно перетащить и положить данные в текстовый документ таким же образом, как и в электронную таблицу, это не работает правильно в OpenOffice.org 1.0. Однако, эта проблема решаема.
Выбор данных в Data Source Browser включает две кнопки: Data to Text... и Data to Fields....
Data to Text...
Имеются три опции, доступные из этой инструментальной панели.
Insert Data as Table позволяет Вам выбирать поля из исходных данных, чьи данные будут скопированы в столбцы таблицы в Вашем документе. Обычные опции форматирования таблицы доступны. Данные скопированы как простой текст и не будет изменяться при внесении изменений в базу данных.
Insert Data as Text точно так же ожидает, что данные просто будут скопированы без того, чтобы форматироваться как таблица. Обратите внимание: это один из способов преобразовать источник данных в разграниченный запятыми текстовый файл для экспорта в другое программное обеспечение.
Data to Fields... используется для операций типа составления стандартных писем. Средства составления стандартных писем в OpenOffice.org 1.0 являются всесторонними и находятся вне рамок этого документа.
OpenOffice.org 1.0 содержит полную среду програмирования, используя вариант популярного языка программирования BASIC. При использовании этой среды, разработчики могут писать полные приложения для конечных пользователей, типа сложных форм. Возможно создать полностью функционирующую форму без знания программирования, использованием Form AutoPilot.
Из главного меню выберите File/AutoPilot/Form.... Отметьте базу данных MySQL-test и запрос Orders on Hand. Скопируйте все поля из окна Existing Fields в окно Fields in Form и нажмите кнопку Next.
OpenOffice.org 1.0 начнет формировать вашу форму в новом окне. В диалоге Choose Layout любые выборки, которые Вы делаете, будут отражены немедленно в новой форме. Закончите нажатием Create. AutoPilot встраивает в одну форму все функциональные возможности необходимые, чтобы поддержать эту таблицу, при работе с Data Navigation и Database Toolbar включая обычно используемые инструментальные средства для фильтрации, сортировки и т. д. Это очень простой способ создать простое приложение базы данных. Обратите внимание: если Вы хотите исследовать опции, доступные для разработки этой формы далее, нажмите кнопку Form на инструментальной панели слева на экране. Она включает или выключает режим Design. В режиме Design Вы можете выбирать объекты в форме и правом щелчком мыши на них отображать и редактировать их реквизиты, данные и события (Properties, Data и Events).