Php руководство по рнр 3 0 функции odbc


Содержание

Функции ODBC и DB2 (PDO_ODBC)

Введение

PDO_ODBC — драйвер, реализующий интерфейс PHP Data Objects (PDO) для доступа к базам данных через драйвер ODBC или через библиотеку IBM DB2 Call Level Interface (DB2 CLI). В текущий момент PDO_ODBC поддерживает различные «оттенки» драйверов баз данных: ibm-db2

Поддержка доступа к серверам IBM DB2 Universal Database, Cloudscape и Apache Derby через свободный клиент DB2 express-C.

Поддерживает доступ к базам данных через менеджер драйверов unixODBC и собственные ODBC драйверы баз данных.

Предоставляет опцию компиляции менеджеров драйверов ODBC, которые не поддерживаются PDO_ODBC напрямую.

В Windows php_pdo_odbc.dll должно быть разрешено как расширение в php.ini . Оно собирается с участием Windows ODBC Driver Manager, так что PHP сможет соединяться с любой базой данных определенной как System DSN и является рекомендованным для использования для соединения с базами данных Microsoft SQL Server.

Установка

Начиная с PHP 5.1, расширение PDO_ODBC включено в исходный код PHP. Вы можете скомпилировать это расширение как статическое или разделяемое, используя следующий синтаксис configure. ibm_db2

Если вы не укажете директорию установки библиотек и заголовочных файлов DB2, configure будет искать их в /home/db2inst1/sqllib .

Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini .

Конфигурационные опции PDO_ODBC

Имя По умолчанию Место изменения Список изменений
pdo_odbc.connection_pooling «strict» PHP_INI_ALL Доступно с PHP 5.1.0.
pdo_odbc.db2_instance_name NULL PHP_INI_SYSTEM Доступно с PHP 5.1.1. Эта возможность устарела и будет обязательно удалена в будущем.

Для подробного описания констант PHP_INI_*, обратитесь к разделу Где могут быть установлены параметры конфигурации.

Краткое разъяснение конфигурационных директив.

Нужно ли объединять соединения ODBC. Может быть «strict», «relaxed» или «off» (аналогично «»). Параметр определяет как строго менеджер соединений должен сравнивать параметры соединений для выбора, создавать новое соединение или возвращать уже существующее. По умолчанию рекомендуется использовать strict , что означает, что сохраненное соединение будет возвращаться только, если все параметры точно совпадают. relaxed приведет к тому, что закешированное соединение будет возвращено, если параметры схожи. Это приведет к более активному использованию кеша, но может привести к утечке информации о соединении (к примеру) между виртуальными хостами.

Эту настройку можно изменить только в php.ini и воздействует на все процессы; все модули, загшруженные в процексс и использующие те же библиотеки ODBC будут зависить от этой настройки, включая Унифицированное расширение ODBC.

Значение relaxed не должно использоваться на общем хостинге в целях безопасности.

Если у вас нет очень серьезного повода использовать значение, отличное от strict — не меняйте его.

Если вы скомпилировали PDO_ODBC с использованием db2, эта опция установит значение переменной окружения DB2INSTANCE в системах Linux и UNIX, равным выбранному имени экземпляра DB2. Это позволяет PDO_ODBC опредилить местоположение библиотек DB2 и произвести соединение с каталогом базы данных DB2.

odbc_exec

(PHP 3>= 3.0.6, PHP 4)

odbc_exec — готовит и выполняет SQL-оператор.

Описание

resource odbc_exec (resource connection_id, string query_string)

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

odbc_exec() отправляет SQL-оператор серверу БД, специфицированному параметром connection_id . Этот параметр обязан быть правильным идентификатором, возвращённым функцией odbc_connect() или odbc_pconnect() .

См. также в odbc_prepare() и odbc_execute() множественное выполнение SQL-операторов.

ГЛАВА 11. PHP и базы данных

Средства эффективного хранения и выборки больших объемов информации внесли огромный вклад в успешное развитие Интернета. Обычно для хранения информации используются базы данных. Работа таких известных сайтов, как Yahoo, Amazon и Ebay, в значительной степени зависит от надежности баз данных, хранящих громадные объемы информации. Конечно, поддержка баз данных ориентирована не только на интересы гигантских корпораций — в распоряжении web-программистов имеется несколько мощных реализаций баз данных, распространяемых по относительно низкой цене (а то и бесплатно).

Правильная организация базы данных обеспечивает более быстрые и гибкие возможности выборки данных. Она существенно упрощает реализацию средств поиска и сортировки, а проблемы прав доступа к информации решаются при помощи средств контроля за привилегиями, присутствующими во многих системах управления базами данных (СУБД). Кроме того, упрощаются процессы репликации и архивации данных.

Глава начинается с подробного описания выборки и обновления данных в MySQL — вероятно, самой популярной СУБД, используемой в PHP ( http://www.mysql.com ). На примере MySQL будет показано, как в PHP происходят загрузка и обновление данных в базе; мы рассмотрим базовые средства поиска и сортировки, используемые во многих web-приложениях. Затем мы перейдем к реализованной в PHP поддержке ODBC (Open Data Base Connectivity) — обобщенного интерфейса, который может использоваться для одновременного соединения с разными СУБД. Поддержка ODBC в PHP будет продемонстрирована на примере соединения и выборки данных из базы данных Microsoft Access. Глава завершается проектом, в котором PHP и СУБД MySQL используются для создания иерархического каталога с информацией об избранных сайтах. При включении в каталог новых сайтов пользователь относит их к одной из стандартных категорий, определяемых администратором сайта.

Прежде чем переходить к обсуждению MySQL, я хочу сказать несколько слов об SQL — самом распространенном языке для работы с базами данных. Язык SQL заложен в основу практически всех существующих СУБД. Чтобы перейти к рассмотрению примеров работы с базами данных, необходимо хотя бы в общих чертах представлять, как работает SQL.

Что такое SQL?

SQL обычно описывается как стандартный язык, используемый для взаимодействия с реляционными базами данных (см. ниже). Однако SQL не является языком программирования, как С, C++ или PHP. Скорее, это интерфейсное средство для выполнения различных операций с базами данных, предоставляющее в распоряжение пользователя стандартный набор команд. Возможности SQL не ограничиваются выборкой данных из базы. В SQL поддерживаются разнообразные возможности для взаимодействия с базой данных, в том числе:

  • определение структуры данных — определение конструкций, используемых при хранении данных;
  • выборка данных — загрузка данных из базы и их представление в формате, удобном для вывода;
  • обработка данных — вставка, обновление и удаление информации;
  • контроль доступа — возможность разрешения/запрета выборки, вставки, обновления и удаления данных на уровне отдельных пользователей;
  • контроль целостности данных — сохранение структуры данных при возникновении таких проблем, как параллельные обновления или системные сбои.

Обратите внимание: в определении SQL было сказано, что этот язык предназначен для работы с реляционными базами данных. В реляционных СУБД данные организуются в виде набора взаимосвязанных таблиц. Связи между таблицами реализуются в виде ссылок на данные других таблиц. Таблицу можно представить себе как двухмерный массив, в котором расположение каждого элемента характеризуется определенными значениями строки и столбца. Пример реляционной базы данных изображен на рис. 11.1.

Рис. 11.1. Пример реляционной базы данных

Как видно из рис. 11.1, каждая таблица состоит из строк (записей) и столбцов (полей). Каждому полю присваивается уникальное (в рамках данной таблицы) имя. Обратите внимание на связь между таблицами customer и orders, обозначенную стрелкой. В информацию о заказе включается короткий идентификатор клиента, что позволяет избежать избыточного хранения имени и прочих реквизитов клиента. В изображенной базе данных существует еще одна связь — между таблицами orders и products. Эта связь устанавливается по полю prod_id, в котором хранится идентификатор товара, заказанного данным клиентом (определяемого полем custjd). Наличие этих связей позволяет легко ссылаться на полные данные клиента и товара по простым идентификаторам. Правильно организованная база данных превращается в мощное средство организации и эффективного хранения данных с минимальной избыточностью. Запомните эту базу данных, я буду часто ссылаться на нее в дальнейших примерах.

Итак, как же выполняются операции с реляционными базами данных? Для этого в SQL существует специальный набор общих команд — таких, как SELECT, INSERT, UPDATE и DELETE. Например, если вам потребуется получить адрес электронной почты клиента с идентификатором 2001cu (см. рис. 11.1), достаточно выполнить следующую команду SQL:

SELECT cust_email FROM customers WHERE custjd = ‘2001cu’

Все вполне логично, не правда ли? В обобщенном виде команда выглядит так:

SELECT имя_поля FROM имя_таблицы [ WHERE условие ]

Квадратные скобки означают, что завершающая часть команды является необязательной. Например, для получения адресов электронной почты всех клиентов из таблицы customers достаточно выполнить следующий запрос:

SELECT cust_email FROM customers

Предположим, вы хотите включить в таблицу products новую запись. Простейшая команда вставки выглядит так:

INSERT into products VALUES (‘1009pr’, ‘Red Tomatoes’, ‘1.43’);

Если позднее эти данные потребуется удалить, воспользуйтесь следующей командой:

DELETE FROM products WHERE prod_ >

Существует много разновидностей команд SQL, и полное их описание выходит за рамки этой книги. На эту тему вполне можно написать отдельную книгу! Я постарался сделать так, чтобы команды SQL, используемые в примерах, были относительно простыми, но достаточно реальными. В Web существует много учебной информации и ресурсов, посвященных SQL. Некоторые ссылки приведены в конце этого раздела.

Записывать команды SQL символами верхнего регистра необязательно. Впрочем, я предпочитаю именно такую запись, поскольку она помогает различать компоненты запроса.

Раз вы читаете эту книгу, вероятно, вас интересует вопрос, как же организуется работа с базами данных в среде Web? Как правило, сначала при помощи какого-

либо интерфейсного языка (PHP, Java или Perl) создается соединение с базой данных, после чего программа обращается к базе с запросами, используя стандартный набор средств. Интерфейсный язык можно рассматривать как своего рода «клей», связывающий базу данных с Web. Я перехожу к своему любимому интерфейсному языку — PHP.

Ниже перечислены некоторые ресурсы Интернета, посвященные SQL. Они пригодятся как новичкам, так и опытным программистам.

Поддержка баз данных в PHP

Если бы мне предложили назвать самый важный аспект PHP, вероятно, я бы остановился на поддержке баз данных. В PHP реализована обширная поддержка практически всех существующих серверов баз данных, в том числе:

PostgreSQL

Oracle (OCI7 и OC18)

Как показывает этот список, поддержка баз данных в PHP простирается от совместимости с базами данных, известных всем (например, Oracle), до тех, о которых многие даже не слышали. Мораль — если вы собираетесь использовать серьезную СУБД для хранения информации, распространяемой через Web, скорее всего, эта база данных поддерживается в PHP. Поддержка базы данных в PHP представлена набором стандартных функций для соединения с базой, обработки запросов и разрыва связи.

Подробное описание всех поддерживаемых баз данных явно выходит за рамки книги. Впрочем, сервер MySQL дает неплохое представление об общих возможностях поддержки баз данных в PHP. По этой причине в примерах оставшейся части этой и всех остальных глав книги будет использоваться синтаксис MySQL. Независимо от того, с каким сервером баз данных вы будете работать, адаптация примеров не вызовет особых сложностей.

MySQL

MySQL ( http://www.mysql.com ) — надежная СУБД на базе SQL, разработанная и сопровождаемая фирмой Т.с.Х DataKonsultAB (Стокгольм, Швеция). Начиная с 1995 года, MySQL стала одной из самых распространенных СУБД в мире, что отчасти обусловлено ее скоростью, надежностью и гибкой лицензионной политикой (см. ниже).

Благодаря хорошим характеристикам и обширному набору стандартных интерфейсных функций, очень простых в использовании, MySQL стала самым популярным средством для работы с базами данных в PHP.

MySQL распространяется на условиях общей лицензии GNU (GPL, GNU Public License). Полное описание текущей лицензионной политики MySQL приведено на сайте MySQL ( http://www.mysql.com ).

Установка

Одна из причин популярности MySQL среди пользователей PHP заключается в том, что поддержка этого сервера автоматически включается в поставку PHP. Таким образом, вам остается лишь проследить за правильной установкой пакета MySQL СУБД MySQL совместима практически с любой серьезной операционной системой, включая FreeBSD, Solaris, UNIX, Linux и различные верии Windows. Хотя лицензионная политика MySQL отличается большей гибкостью в сравнении с другими серверами баз данных, я настоятельно рекомендую ознакомиться с лицензионной информацией, размещенной на сайте MySQL ( http://www.mysql.com ).

Последнюю версию MySQL можно принять с любого зеркального сайта. Полный список зеркальных сайтов приведен по адресу http://www.mysql.com/downloads/ mirrors.html. На момент написания книги последняя стабильная версия MySQL имела номер 3.22.32, а версия 3.32 находилась на стадии бета-тестирования. Конечно, всегда следует устанавливать последнюю стабильную версию, это в ваших интересах. Посетите ближайший «зеркальный» сайт и загрузите версию, соответствующую вашей операционной системе. В верхней части страницы расположены ссылки на новые версии для различных платформ. Обязательно прочитайте всю страницу, поскольку она завершается ссылками для некоторых специфических ОС.

Группа разработчиков MySQL подготовила подробную документацию с описанием процесса установки. Я советую внимательно изучить все общие аспекты установки, не ограничиваясь информацией, относящейся непосредственно к вашей операционной системе.

Настройка MySQL

После успешной установки сервер MySQL необходимо настроить. Процесс настройки в основном состоит из создания новых баз данных и редактирования таблиц привилегий MySQL. Таблицы привилегий управляют доступом к базам данных MySQL. Правильная настройка таблиц играет чрезвычайно важную роль в безопасности ваших баз данных, поэтому перед запуском сайта в рабочем режиме необходимо полностью освоить систему привилегий.

На первый взгляд, таблицы привилегий MySQL выглядят устрашающе, но если в них как следует разобраться, дальнейшее сопровождение становится очень простой задачей. Полное описание таблиц привилегий выходит за рамки этой книги. Впрочем, в Web существует немало ресурсов, предназначенных для помощи начинающим пользователям MySQL. За дополнительной информацией обращайтесь на сайт MySQL ( http://www.mysql.com ).

После успешной установки и настройки пакета MySQL можно начинать эксперименты с базами данных в среде Web! Именно этой теме и посвящен следующий раздел. Начнем с изучения поддержки MySQL в PHP.

Стандартные функции PHP для работы с MySQL

Итак, вы успешно создали и протестировали все необходимые разрешения; все готово для работы с сервером MySQL. В этом разделе я представлю стандартные функции PHP, при помощи которых вы сможете легко организовать взаимодействие сценариев PHP с сервером MySQL. Общая последовательность действий при взаимодействии с сервером MySQL выглядит так:

  1. Установить соединение с сервером MySQL. Если попытка завершается неудачей, вывести соответствующее сообщение и завершить процесс.
  2. Выбрать базу данных сервера MySQL. Если попытка выбора завершается неудачей, вывести соответствующее сообщение и завершить процесс. Допускается одновременное открытие нескольких баз данных для обработки запросов.
  3. Обработать запросы к выбранной базе (или базам).
  4. После завершения обработки запросов закрыть соединение с сервером баз данных.

В примерах этого раздела используются таблицы products, customers и orders (см. рис. 11.1). Если вы захотите самостоятельно проверить все примеры, создайте эти таблицы или скопируйте страницу с описанием структуры, чтобы вам не приходилось постоянно листать книгу.

Итак, начнем с самого начала — то есть с подключения к серверу MySQL.

Функция mysql_connect( ) устанавливает связь с сервером MySQL После успешного подключения к MySQL можно переходить к выбору баз данных, обслуживаемых этим сервером. Синтаксис функции mysql_connect( ):

int mysql_connect ([string хост [:порт] [:/путь//к/сокету] [, string имя пользователя] [, string пароль])

В параметре хост передается имя хостового компьютера, указанное в таблицах привилегий сервера MySQL. Конечно, оно же используется для перенаправления запросов на web-сервер, на котором работает MySQL, поскольку к серверу MySQL можно подключаться в удаленном режиме. Наряду с именем хоста могут указываться необязательные параметры — номер порта, а также путь к сокету (для локального хоста). Параметры имя_пользователя и пароль должны соответствовать имени пользователя и паролю, заданным в таблицах привилегий MySQL. Обратите внимание: все параметры являются необязательными, поскольку таблицы привилегий можно настроить таким образом, чтобы они допускали соединение без проверки. Если параметр хост не задан, mysql_connect( ) пытается установить связь с локальным хостом.

Пример открытия соединения с MySQL:

@mysql_connect(» local host», «web», «4tf9zzzf») or die(«Could not connect to MySQL server!»);

В данном примере localhost — имя компьютера, web— имя пользователя, а 4tf9zzzf — пароль. Знак @ перед вызовом функции mysql_connect( ) подавляет все сообщения об ошибках, выдаваемые при неудачной попытке подключения, — они заменяются сообщением, указанным при вызове die( ). Обратите внимание: значение, возвращаемое при вызове rnysql_connect( ), в данном примере не используется. Если в программе используется всего одно соединение с сервером MySQL, это вполне нормально. Но если программа устанавливает соединения с несколькими серверами MySQL на разных хостах, следует сохранить идентификатор соединения, возвращаемый при вызове mysql_connect( ), чтобы адресовать последующие команды нужному серверу MySQL. Пример:

Идентификаторы $link1 и $link2 передаются при последующих обращениях к базам данных с запросами. Вскоре вы узнаете, как именно адресовать запрос нужному серверу при помощи идентификатора соединения.

Функция mysql_pconnect( ) обеспечивает поддержку восстанавливаемых (persistent) соединений. В многопользовательских средах рекомендуется использовать mysql_pconnect( ) вместо mysql_connect( ) для экономии системных ресурсов. По типам параметров и возвращаемого значения функция mysql_pconnect( ) в точности совпадает c mysql_connect( ).

После успешного соединения с MySQL необходимо выбрать базу данных, находящуюся на сервере. Для этого используется функция mysql_select_db( ). Синтаксис функции mysql_select_db( ):

int mysql_select_db (string имя_базы_данных [, int идентификатор_соединения])

Параметр имя_базы_данных определяет выбираемую базу данных, идентификатор

которой возвращается функцией mysql_select_db( ). Обратите внимание: параметр

идентификатор_соединения необязателен лишь при одном открытом соединении с

сервером MySQL. При наличии нескольких открытых соединений этот параметр

должен указываться. Пример выбора базы данных функцией mysql_select_db( ):

Если в программе выбирается только одна база данных, сохранять ее идентификатор не обязательно. Однако при выборе нескольких баз данных возвращаемые идентификаторы сохраняются, чтобы вы могли сослаться на нужную базу при обработке запроса. Если идентификатор не указан, используется последняявыбранная база данных.

После завершения работы с сервером MySQL соединение необходимо закрыть. Функция mysql_close( ) закрывает соединение, определяемое необязательным параметром. Если параметр не задан, функция mysql_close( ) закрывает последнее открытое соединение. Синтаксис функции mysql_close( ):

int mysql_close ([int идентификатор_соединения])

Пример использования mysql_close( ):

В этом примере указывать идентификатор соединения не нужно, поскольку на момент вызова mysql_close( ) существует лишь одно открытое соединение с сервером.

Соединения, открытые функцией mysql_pconnect( ), закрывать не обязательно.

Функция mysql_query( ) обеспечивает интерфейс для обращения с запросами к базам

данных. Синтаксис функции mysql_query( ):

int mysql_query (string запрос [, int идентификатор_соединения])

Параметр запрос содержит текст запроса на языке SQL. Запрос передается либо соединению, определяемому необязательным параметром идентификатор_соедине-ния, либо, при отсутствии параметра, последнему открытому соединению.

Неопытные программисты часто ошибочно думают, что функция mysql_query( ) возвращает результаты обработки запроса. Это не так — в зависимости от типа запроса вызов mysql_query( ) может приводить к разным последствиям. При успешном выполнении команды SQL SELECT возвращается идентификатор результата, который впоследствии передается функции mysql_result( ) для последующего форматирования и отображения результатов запроса. Если обработка запроса завершилась неудачей, функция возвращает FALSE. Функция mysql_result( ) описана в одном из следующих разделов. Количество записей, участвующих в запросе, определяется при помощи функции mysql_num_rows( ). Эта функция также описана далее.

Учитывая сказанное, я приведу примеры использования mysql_query( ) лишь после описания функций mysql_result( ) и mysql_affected_rows( ).

Если вас беспокоит то, что при обработке запросов расходуется слишком много памя-ти, вызовите стандартную функцию PHP mysql_free_result. При вызове ей передается идентификатор результата, возвращаемый mysql_query( ). Функция mysql_free_result( ) освобождает всю память, связанную с данным запросом.

Во многих ситуациях требуется узнать количество записей, участвующих в запросе SQL с командами INSERT, UPDATE, REPLACE или DELETE. Задача решается функцией mysql_affected_rows( ). Синтаксис функции:

int mysql_affected_rows ([int идентификатор_соединения])

Обратите внимание: параметр идентификатор_соединения не является обязательным. Если он не указывается, mysql_affected_rqws( ) пытается использовать последнее открытое соединение. Пример:

// Выполнить запрос $result = mysql_query($query);

// Определить количество обновленных записей

print «Total row updated; «.mysql_affected_rows( );

При выполнении этого фрагмента будет выведен следующий результат:

Total row updated: 1

Функция mysql_affected_rows( ) не работает с запросами, основанными на команде SELECT. Для определения количества записей, возвращенных при вызове SELECT, используется функция mysql_num_rows( ), описанная в следующем разделе.

В одной специфической ситуации функция mysql_affected_rows( ) работает с ошибкой. При выполнении команды DELETE без секции WHEREmysql_affected_rows( ) всегда возвращает 0.

Функция mysql_num_rows( ) определяет количество записей, возвращаемых командой SELECT. Синтаксис функции mysql_num_rows( ):

int mysql_num_rows(int результат)

Пример использования mysql_num_rows( ):

Поскольку таблица содержит лишь один товар, название которого начинается с буквы р (pears), возвращается только одна запись. Результат:

Total rows selected: 1

Функция mysql_result() используется в сочетании с mysql_query( ) (при выполнении запроса с командой SELECT) для получения набора данных. Синтаксис функции mysql_resu1t():

int mysql_result (int идентификатор_результата, int запись [. mixed поле»]’)

В параметре идентификатор_результата передается значение, возвращенное функцией mysql_query( ). Параметр запись ссылается на определенную запись набора данных, определяемого параметром идентификатор_результата. Наконец, в необязательном параметре поле могут передаваться:

  • смещение поля в таблице;
  • имя поля;
  • имя поля в формате имя_поля_имя_тдблицы.

В листинге 11.1 используется база данных, изображенная на рис. 11.1.

Листинг 11.1. Выборка и форматирование данных в базе данных MySQL

В результате выполнения этого примера с данными, изображенными на рис. 11.1, будет получен следующий результат:

Листинг 11.2. Результат выполнения листинга 11.1

Product ID Product Name Product Price

1000pr

apples

1001pr

oranges

1002pr

bananas

1003pr

pears

Функция mysql_result( ) удобна для работы с относительно небольшими наборами данных, однако существуют и другие функции, работающие намного эффективнее, — а именно, функции mysql_fetch_row( ) и mysql_fetch_array( ). Эти функции описаны в следующих разделах.

Обычно гораздо удобнее сразу присвоить значения всех полей записи элементам индексируемого массива (начиная с индекса 0), нежели многократно вызывать mysql_result( ) для получения отдельных полей. Задача решается функцией mysql_fetch_row( ), имеющей следующий синтаксис:

array mysql_fetch_row (int результат)

Использование функции list( ) в сочетании с mysql_fetch_row( ) позволяет сэкономить несколько команд, необходимых при использовании mysql_result( ). В листинге 11.3 приведен код листинга 11.1, переписанный с использованием list( ) и mysql_fetch_row( ).

Листинг 11.3. Выборка данных функцией mysql_fetch_row( )

Листинг 11.3 выдает тот же результат, что и листинг 11.1, но использует при этом меньшее количество команд.

my sq l_f etch_array ( )

Функция mysql_fetch_array( ) аналогична mysql_fetch_row( ), однако по умолчанию значения полей записи сохраняются в ассоциативном массиве. Впрочем, вы можете выбрать тип индексации (ассоциативная, числовая или комбинированная). Синтаксис функции mysql_fetch_array( ):

array mysql_fetch_array (int идентификатор результата [, тип_индексации])

В параметре идентификатор_результата передается значение, возвращенное функцией mysql_query( ). Необязательный параметр тип_индексации принимает одно из следующих значений:

  • MYSQL_ASSOC — функция mysql_fetch_array( ) возвращает ассоциативный массив. Если параметр не указан, это значение используется по умолчанию;
  • MYSQL_NUM — функция mysql_fetch_array( ) возвращает массив с числовой индексацией;
  • MYSQL_BOTH — к полям возвращаемой записи можно обращаться как по числовым, так и по ассоциативным индексам.

Листинг 11.4 содержит очередной вариант кода листингов 11.1 и 11.3. На этот раз используется функция mysql_fetch_array( ), возвращающая ассоциативный массив полей.

Листинг 11.4. Выборка данных функцией mysql_fetch_array( )

Листинг 11.4 выдает тот же результат, что и листинги 11.1 и 11.3.

Того, что сейчас вы знаете о функциональных возможностях MySQL в PHP, вполне достаточно, чтобы заняться созданием довольно интересных приложений. Первое приложение, которое мы рассмотрим, представляет собой простейшую поисковую систему. Этот пример демонстрирует применение форм HTML (см. предыдущую главу) для получения данных, которые в дальнейшем используются для выборки информации из базы.

Пример простейшей поисковой системы на PHP

Всем нам неоднократно приходилось пользоваться поисковыми системами в Web, но как устроены такие системы? Простейшая поисковая система принимает по крайней мере одно ключевое слово. Это слово включается в запрос SQL, который затем используется для выборки информации из базы данных. Результат поиска форматируется поисковой системой по тому или иному критерию (скажем, по категории или степени соответствия).

Поисковая система, приведенная в листинге 11.5, предназначена для поиска информации о клиентах. В форме пользователь вводит ключевое слово и выбирает категорию (имя, идентификатор или адрес электронной почты клиента), в которой будет производиться поиск. Если введенное пользователем имя, идентификатор или адрес существует, поисковая система извлекает из базы данных остальные атрибуты. Затем по идентификатору покупателя из таблицы orders выбирается

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

Листинг 11.5. Простейшая поисковая система (searchengine.php)

Customer Information:

print «Identification #: $id
«;

Order History:

// Построить и выполнить запрос к таблице ‘orders’

$query = «SELECT order_id, prod_id, quantity

FROM orders WHERE cust_

ORDER BY quantity DESC»;

print »

0rder ID Product ID Quantity

«;

// Отформатировать и вывести найденные записи.

print »

«;

print »

$order_id $prod_id $quantity

«;

print «

«;

print «

«;

Если ввести ключевое слово Mi 1 апо и выбрать в раскрывающемся списке категорию Customer Name (Имя клиента), программа выводит следующую информацию:

Order Id Product Id Quantity
100003 1000pr 12
100005 1002pr 11

Конечно, мы рассмотрели простейшую реализацию поисковой системы. Существует немало дополнительных возможностей — поиск по нескольким ключевым словам, поиск по неполным ключевым словам или автоматическая выборка записей с похожими ключевыми словами. Попробуйте применить свою творческую фантазию и реализовать их самостоятельно.

Сортировка таблиц

При выводе данных из базы необходимо предусмотреть возможность их сортировки по различным критериям. В качестве примера рассмотрим результаты, выведенные нашей поисковой системой, — обратим особое внимание на следующие после заголовка Order History: (История заказов). Допустим, список получился очень длинным, и вы хотите отсортировать данные по идентификатору товара (или идентификатору заказа). Чтобы вы лучше поняли, о чем идет речь, рекомендую посетить один из моих любимых сайтов, http://download.cnet.com. Если в процессе просмотра программ конкретной категории щелкнуть на заголовке столбца (название, дата размещения, количество загрузок или размер файла), то список автоматически упорядочивается по содержимому указанного столбца. Далее показано, как реализовать подобную возможность.

В листинге 11.6 мы производим выборку данных из таблицы orders. По умолчанию данные сортируются по убыванию объема заказа (поле quantity). Однако щелчок на любом заголовке таблицы приводит к тому, что страница загружается заново с упорядочением таблицы по указанному столбцу.

Листинг 11.6. Сортировка таблиц (tablesorter.php)

// Создать заголовок таблицы

// Отформатировать и вывести каждую строку таблицы

while (list($order_id,$cust_id,$prod_id, $quantity)

print »

«;

print »

$order_id $cust_id $prod_id

$quantity

«;

print «

«;

print «

«;

Для базы данных company, изображенной на рис. 11.1, стандартные выходные данные листинга 11.6 выглядят следующим образом:

Order ID Customer ID Product ID Quantity
2000cu 1000pr 12
2000cu 1002pr 11
2000cu 1000pr 9
2000cu 1001pr 5
2000cu 1002pr 3

Обратите внимание: заголовки таблицы представляют собой гиперссылки. Поскольку по умолчанию сортировка осуществляется по полю quantity, записи отсортированы по убыванию последнего столбца. Если щелкнуть на ссылке Order_ID, страница загружается заново, но на этот раз записи сортируются по убыванию идентификатора заказа. Таблица будет выглядеть так:

Order ID Customer ID Product ID Quantity
2000cu 1002pr 11
2000cu 1000pr 9
2000cu 1000pr 12
2000cu 1001pr 5
2000cu 1002pr 3

Сортировка выходных данных приносит огромную пользу при форматировании баз данных. Простая модификация запроса SELECT позволяет упорядочить данные по любому критерию — по возрастанию, по убыванию или с группировкой записей.

На этом наше знакомство с MySQL подходит к концу. Учтите, что материал этой главы отнюдь не исчерпывает всего, что необходимо знать о MySQL. Полный список команд MySQL в PHP приведен в документации ( http://www.php.net/manuat ).

Специализированные функции хорошо подходят для работы с одним конкретным типом СУБД. Но что делать, если вам приходится подключаться к MySQL, Microsoft SQL Server и IBM DB2, притом в одном приложении? Аналогичная проблема возникает при разработке приложений, которые не должны зависеть от СУБД; такие приложения работают «над» существующей инфраструктурой клиентской базы данных. ODBC (сокращение от «Open Database Connectivity», то есть «открытая архитектура баз данных») представляет собой интерфейс прикладных программ (API), позволяющий использовать общий набор абстрактных функций для работы с разными типами баз данных. Преимущества подобного подхода очевидны — вам не придется многократно переписывать один и тот же фрагмент кода только для того, чтобы выполнять одинаковые операции с разнотипными базами данных.

Работа с сервером баз данных через ODBC возможна лишь в том случае, если этот сервер является ODBC-совместимым. Другими словами, для него должны существовать драйверы ODBC. За дополнительной информацией о драйверах ODBC обращайтесь к документации СУБД. Возможно, вам придется дополнительно загрузить их из Интернета и установить на своем компьютере. Хотя стандарт ODBC, разработанный компанией Microsoft, стал открытым стандартом, он в основном используется для работы с СУБД на платформе Windows; впрочем, драйверы ODBC также существуют и на платформе Linux. Ниже приведены ссылки на драйверы для некоторых популярных СУБД.

Драйверы ODBC различаются по целям, платформе и назначению. За информацией о различных аспектах работы с этими драйверами обращайтесь к документации по конкретным пакетам. Впрочем, невзирая на все различия, использование этих драйверов в PHP обходится без проблем.

Когда вы определите, какой комплект драйверов ODBC лучше подходит для ваших целей, загрузите его и выполните все инструкции по установке и настройке. После этого можно переходить к следующему разделу — «Поддержка ODBC в PHP».

Поддержка ODBC в PHP

Функции ODBC в PHP, обычно называемые общими функциями ODBC, не только обеспечивают типовую поддержку ODBC, но и позволяют работать с некоторыми СУБД, обладающими собственным API, через стандартный ODBC API. К числу последних относятся следующие СУБД:

Обратите внимание: при работе с перечисленными СУБД стандартный механизм ODBC на самом деле не используется. Просто поддерживаемые в PHP общие функции ODBC применяются для взаимодействия с базами данных. Это удобно, поскольку при переходе на другую ODBC-совместимую СУБД (или СУБД из приведенного выше списка) все ваши сценарии будут нормально работать.

Поддержка ODBC встроена в комплект поставки PHP, поэтому вам за редкими исключе-ниями практически не придется заниматься специальной настройкой.

В настоящее время существует около 40 общих функций ODBC. Впрочем, для выборки информации из ODBC-совместимой базы данных вполне достаточно нескольких функций, описанных ниже. Полный список общих функций ODBC в PHP приведен в документации (http://www.php.net/manual).

Перед тем как обращаться к ODBC-совместимой базе данных с запросами, необходимо сначала установить с ней связь. Соединение создается функцией ocbc_connect( ). Синтаксис функции odbc_connect( ):

int odbc_connect (string источник_данных, string имя_пользователя, string пароль [, int тип_курсора])

Параметр источник_данных определяет ODBC-совместимую базу данных, с которой вы пытаетесь установить связь. В параметрах имя_пользователя и пароль, как нетрудно догадаться, передаются имя пользователя и пароль, необходимые для подключения к источнику данных. Необязательный параметр тип_курсора предназначе’н для устранения проблем, возникающих при работе с некоторыми драйверами ODBC. Он может принимать одно из четырех возможных значений:

  • SQL_CUR_USE_IF_NEEDED;
  • SQL_CURSOR_USE_ODBC;
  • SQL_CUR_USE_DRIVER;
  • SQL CUR DEFAULT.

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

Использовать odbc_connect( ) в программе несложно. Пример:

Функция используется для открытия восстанавливаемых (persistent) соединений с базами данных. Она экономит системные ресурсы, поскольку odbc_pconnect( ) проверяет, не было ли данное соединение открыто ранее, и если было, использует предыдущее соединение.

После завершения работы с ODBC-совместимой базой данных соединение необходимо закрыть, чтобы освободить все ресурсы, используемые открытым соединением. Соединение закрывается функцией odbc_close( ):

void odbc_close ([int идентификатор_соединения])

В параметре идентификатор_соединения передается идентификатор открытого соединения. Рассмотрим небольшой пример:

Перед непосредственной обработкой запрос необходимо «подготовить». Задача решается функцией odbc_prepare( ):

int odbc_prepare (int идентификатор_соединения , string запрос)

В параметре идентификатор_соединения передается идентификатор соединения, возвращаемый функцией odbc_connect( ). В параметре запрос передается текст запроса, который должен быть выполнен сервером. Если запрос не может быть выполнен, функция возвращает FALSE; в противном случае возвращается идентификатор результата, в дальнейшем используемый при вызове функции odbc_execute( ) (см. ниже).

Запрос, подготовленный функцией odbc_prepare( ), выполняется функцией odbc_execute( ). Синтаксис функции odbc_execute( ):

int odbc_execute (int идентификатор результата [, array параметры])

В параметре идентификатор_результата передается идентификатор результата, возвращаемый при успешном вызове odbc_prepare( ). Необязательный параметр передается лишь в том случае, если при вызове функции передаются дополнительные данные.

Рассмотрим следующий пример:

В приведенном примере продемонстрирована транзакция ODBC, при которой данные запроса не отображаются в браузере (как это обычно делается при использовании команды SELECT). Транзакция ODBC с использованием запроса QUERY описана ниже, в разделе «odbc_result_all( )».

Функция odbc_exec( ) объединяет odbc_prepare( ) и odbc_execute( ). Синтаксис функции odbc_exec( ):

int odbc_exec (int идентификатор_соединения , string запрос)

В параметре идентификатор_соединения передается идентификатор соединения, возвращаемый функцией odbc_connect( ). В параметре запрос передается текст запроса, который должен быть выполнен сервером. Если запрос не может быть выполнен, функция возвращает FALSE; в противном случае возвращается идентификатор результата, используемый при последующих вызовах функций:

В этом примере функция odbc_exec( ) пытается выполнить запрос, текст которого содержится в переменной $query. При успешном выполнении переменной $result присваивается идентификатор результата; в случае неудачи ей присваивается значение FALSE и выводится сообщение, передаваемое при вызове die( ).

Очень удобная функция odbc_result_all( ) форматирует и отображает все записи для идентификатора результата, полученного при вызове odbc_exec( ) или odbc_execute( ). Синтаксис функции odbc_result_all( ):

int odbc_result_all (int идентификатор_результата [, string формат_таблицы])

В параметре идентификатор_результата передается идентификатор результата, возвращаемый при успешном вызове odbc_exec( ) или odbc_execute( ). В необязательном параметре формат_таблицы передаются характеристики таблицы HTML. Рассмотрим следующий пример:

В результате выполнения этого примера содержимое таблицы customers будет выведено в таблице на светло-сером фоне с рамкой толщиной 1. Внешний вид таблицы для данных, приведенных на рис. 11.1, изображен на рис. 11.2.

Рис. 11.2. Данные ODBC в браузере

Хороший стиль программирования требует освобождения всех ресурсов, связанных с завершенными операциями. При работе с запросами ODBC эта задача решается функцией odbc_free_result( ). Синтаксис функции odbc_free_result( ):

int odbc_free_result (int идентификатор_результата)

В параметре функции передается идентификатор результата, который больше не будет использоваться в программе. Следует помнить, что все ресурсы памяти автоматически освобождаются по завершении сценария; таким образом, вызов функции odbc_free_result( ) необходим лишь для очень больших запросов, расходующих очень большие объемы памяти. Ниже приведен пример, демонстрирующий применение odbc_free_result( ). Помните, что без этой функции обычно можно обойтись, если только вы не собираетесь выполнять несколько запросов в одном сценарии, поскольку с завершением сценария вся память будет автоматически освобождена.

После того как функция odbc_result_all( ) завершила использование идентификатора результата, память возвращается в систему при помощи odbc_free_result( ).

На этом завершается наше знакомство с функциями ODBC в PHP, незаменимыми при создании простых интерфейсов на базе ODBC для доступа через Web. В следующем разделе многие из этих функций будут использованы для демонстрации того, как легко на базе PHP организуется взаимодействие с одной из самых популярных СУБД — Microsoft Access.

Microsoft Access и PHP

Популярность СУБД Microsoft Access ( http://www.microsoft.com/office/access ) отчасти объясняется ее удобным графическим интерфейсом. Помимо использования Access в качестве самостоятельной СУБД, вы можете использовать ее графический интерфейс для организации работы с другими базами данных — например, MySQL или Microsoft SQL Server.

Чтобы продемонстрировать поддержку ODBC в PHP, я опишу процесс подключения к базам данных Microsoft Access на PHP. Делается это на удивление просто, но благодаря популярности Microsoft Access это станет полезным дополнением в вашем творческом арсенале. Я опишу этот процесс шаг за шагом:

  1. Создайте базу данных Access. Предполагается, что вы уже умеете это делать, а если не умеете, но все равно хотите проследить за выполнением этого примера, — воспользуйтесь услугами программы-мастера. Я создал стандартную базу данных для хранения контактных данных при помощи мастера. Обязательно создайте в таблице несколько записей и запомните имя таблицы, оно нам вскоре понадобится!
  2. Сохраните базу данных на своем компьютере.
  3. На следующем шаге мы организуем доступ к базе Access средствами ODBC. Выполните команду Пуск > Настройка > Панельуправления (Start > Settings > Control Panel). Найдите на панели управления значок Источники данных ODBC (32) (ODBC Data Sources (32 bit)). При помощи этого значка запускается Администратор ODBC, предназначенный для настройки различных драйверов и источников данных в вашей системе. Запустите программу, дважды щелкнув на этом значке. Окно Администратора по умолчанию открывается на вкладке Пользовательский DSN (User DSN). На этой вкладке перечисляются источники данных-, которые относятся к конкретному пользователю и могут использоваться только на этом компьютере. В данном примере будет использоваться именно такой источник данных.
  4. Нажмите кнопку Добавить. (Add. ) в правой части окна. Открывается новое окно для выбора драйвера, предназначенного для работы с новым источником. Выберите строку Microsoft Access Driver (*.mdb) и нажмите кнопку Finish (Готово).
  5. На экране появляется новое окно Установка драйвера ODBC для Microsoft Access (ODBC Microsoft Access Setup). Найдите в форме текстовое поле Имя источника данных (Data Source Name) и введите в нем имя созданной вами базы данных Access. При желании можете ввести описание в текстовом поле, расположенном непосредственно под полем Имя источника данных.
  6. Нажмите кнопку Выбрать. (Select. ) — появляется окно в стиле Проводника Windows. В нем вам предлагается найти базу данных, доступ к которой будет осуществляться средствами ODBC.
  7. Найдите в дереве каталогов свою базу данных и дважды щелкните на ней. Вы снова возвращаетесь к окну Установка драйвера ODBC для Microsoft Access. Путь к выбранной базе данных отображается над кнопкой Выбрать. Нажмите кнопку ОК.
  8. Готово! Теперь вы можете работать с базой данных Access средствами ODBC.

Все, что вам остается сделать — создать сценарий, в котором вы будете работать с базой данных через ODBC. В приведенном ниже сценарии общие функции ODBC (см. выше) будут использоваться для вывода всей информации из таблицы контактов, созданной при помощи мастера Access. Однако перед рассмотрением сценария желательно знать, как таблица Contacts выглядит в Access (рис. 11.3).

Рис. 11.3. Таблица Contacts в MS Access

Теперь вы знаете, какая информация будет извлекаться из базы данных, и мы можем перейти к сценарию. Если вы забыли, что делает та или иная функция, обращайтесь к описанию в начале этой главы. Результаты работы листинга 11.7 представлены на рис. 11.4.

Листинг 11.7. Применение функций ODBC для работы с MS Access

Не правда ли, все просто? А самое замечательное — то, что этот сценарий полностью совместим с любой другой СУБД с поддержкой ODBC. Для тренировки попробуйте повторить все описанные действия для другой СУБД, запустите сценарий — и вы получите те же результаты, которые изображены на рис. 11.4.

Рис. 11.4. Содержимое таблицы Contacts в web-браузере

Проект: Каталог ссылок на PHP

Самый простой способ наполнить ваш сайт реальным содержанием — дать пользователю возможность сделать это за вас. Конечно, для ввода данных удобнее всего воспользоваться формой HTML.

Введенную пользователем информацию необходимо обработать и сохранить. В проекте предыдущей главы было показано, как легко эта задача решается при помощи PHP и текстового файла. Бесспорно, текстовые файлы хорошо подходят для хранения относительно маленьких и простых фрагментов данных, но в полноценных web-приложениях информация обычно хранится в базах данных. В настоящем примере база данных MySQL используется для хранения информации о web-сайтах. Для упрощения навигации сайты разделены на несколько категорий. Пользователь может ввести информацию о сайте в форме HTML и отнести его к одной из стандартных категорий, определенных администратором сайта. Кроме того, пользователь может загрузить индексную страницу и просмотреть список всех сайтов той или иной категории, щелкнув на ее названии.

Прежде всего вы должны решить, какие сведения о сайтах будут храниться в базе данных SQL. Для простоты я ограничусь следующим набором атрибутов: название, URL, категория, дата включения и описание. Таким образом, определение таблицы в MySQL выглядит примерно так:

mysql>create table bookmarks ( category INT, site_name char(35), url char(50),

date_added date, description char(254) );

В определении таблицы bookmarks имеется пара моментов, заслуживающих внимания. Во-первых, информация о категории сайта почему-то хранится в виде целого числа но разве не правильнее было бы сделать названия категорий более содержательными и понятными для пользователя? Не беспокойтесь, в ини-циализационном файле будет создан массив, связывающий целочисленные индексы с названиями категорий. В будущем администратор может изменять и даже удалять отдельные категории. Хранение информации о категориях заметно упрощает эту задачу. Кроме того, целочисленное поле обеспечивает экономию места на диске, поскольку название категории многократно сохраняется в таблице. Другое обстоятельство, относящееся к структуре таблицы, — ограничение длины описания 254 символами. В зависимости от этого объема описаний вместо типа char( ) можно воспользоваться типом medium или text. За дополнительной информацией о типах полей обращайтесь к документации MySQL.

Следующим шагом в работе над этим приложением будет создание инициализа-ционного файла. Помимо глобальных переменных, в инициализационном файле определяются две функции: add_bookmark( ) и view_bookmark( ). Функция add_bookmark( ) получает пользовательский ввод из формы и включает его в базу. Функция view_bookmark( ) получает индекс категории, читает из базы данных все записи, относящиеся к указанной категории, и отображает их в браузере. Инициализацион-ный файл приложения init.inc с комментариями приведен в листинге 11.8.

Листинг 11.8. Инициализационный файл каталога ссылок (init.inc)

while ($row = mysql_fetch_array($result)) ;

Поддержка ODBC в PHP

Читайте также:

  1. БАЗОВАЯ ПОДДЕРЖКА ЖИЗНЕДЕЯТЕЛЬНОСТИ
  2. Дистанционная поддержка дисциплины
  3. Дыхательная поддержка с эндотрахеальной интубацией
  4. Кому предоставляется социальная защита / поддержка?
  5. Общественное доверие и поддержка граждан
  6. ОПАСНОСТИ И ПОДДЕРЖКА ВО ВРЕМЯ ПУТЕШЕСТВИЙ ВО ВНУТРЕННИЙ МИР
  7. Поддержка
  8. Поддержка BDE в VCL
  9. Поддержка автоматического восстановления
  10. Поддержка базы данных
  11. Поддержка веб-браузерами

ODBC

Специализированные функции хорошо подходят для работы с одним конкретным типом СУБД. Но что делать, если вам приходится подключаться к MySQL, Microsoft SQL Server и IBM DB2, притом в одном приложении? Аналогичная проблема возникает при разработке приложений, которые не должны зависеть от СУБД; такие приложения работают «над» существующей инфраструктурой клиентской базы данных. ODBC (сокращение от «Open Database Connectivity», то есть «открытая архитектура баз данных») представляет собой интерфейс прикладных программ (API), позволяющий использовать общий набор абстрактных функций для работы с разными типами баз данных. Преимущества подобного подхода очевидны — вам не придется многократно переписывать один и тот же фрагмент кода только для того, чтобы выполнять одинаковые операции с разнотипными базами данных.

Работа с сервером баз данных через ODBC возможна лишь в том случае, если этот сервер является ODBC-совместимым. Другими словами, для него должны существовать драйверы ODBC. За дополнительной информацией о драйверах ODBC обращайтесь к документации СУБД. Возможно, вам придется дополнительно загрузить их из Интернета и установить на своем компьютере. Хотя стандарт ODBC, разработанный компанией Microsoft, стал открытым стандартом, он в основном используется для работы с СУБД на платформе Windows; впрочем, драйверы ODBC также существуют и на платформе Linux. Ниже приведены ссылки на драйверы для некоторых популярных СУБД.

  • Драйверы баз данных для Windows 95/98/NT: http://www.microsoft.com/data/odbc
  • Automation Technologies: http://www.odbcsdk.com
  • Easysoft: http://www.easysoft.com/products/oob/main.phtml
  • Драйверы ODBC для MySQL (MyODBC): http://www.mysql.com
  • OpenLinkSoftware: http://www.openlinksw.com

Драйверы ODBC различаются по целям, платформе и назначению. За информацией о различных аспектах работы с этими драйверами обращайтесь к документации по конкретным пакетам. Впрочем, невзирая на все различия, использование этих драйверов в PHP обходится без проблем.

Когда вы определите, какой комплект драйверов ODBC лучше подходит для ваших целей, загрузите его и выполните все инструкции по установке и настройке. После этого можно переходить к следующему разделу — «Поддержка ODBC в PHP».

Функции ODBC в PHP, обычно называемые общими функциями ODBC, не только обеспечивают типовую поддержку ODBC, но и позволяют работать с некоторыми СУБД, обладающими собственным API, через стандартный ODBC API. К числу последних относятся следующие СУБД:

Обратите внимание: при работе с перечисленными СУБД стандартный механизм ODBC на самом деле не используется. Просто поддерживаемые в PHP общие функции ODBC применяются для взаимодействия с базами данных. Это удобно, поскольку при переходе на другую ODBC-совместимую СУБД (или СУБД из приведенного выше списка) все ваши сценарии будут нормально работать.

Поддержка ODBC встроена в комплект поставки PHP, поэтому вам за редкими исключе-ниями практически не придется заниматься специальной настройкой.

В настоящее время существует около 40 общих функций ODBC. Впрочем, для выборки информации из ODBC-совместимой базы данных вполне достаточно нескольких функций, описанных ниже. Полный список общих функций ODBC в PHP приведен в документации (http://www.php.net/manual).

odbc_connect( )

Перед тем как обращаться к ODBC-совместимой базе данных с запросами, необходимо сначала установить с ней связь. Соединение создается функцией ocbc_connect( ). Синтаксис функции odbc_connect( ):

int odbc_connect (string источник_данных, string имя_пользователя, string пароль [, int тип_курсора])

Параметр источник_данных определяет ODBC-совместимую базу данных, с которой вы пытаетесь установить связь. В параметрах имя_пользователя и пароль, как нетрудно догадаться, передаются имя пользователя и пароль, необходимые для подключения к источнику данных. Необязательный параметр тип_курсора предназначе’н для устранения проблем, возникающих при работе с некоторыми драйверами ODBC. Он может принимать одно из четырех возможных значений:

  • SQL_CUR_USE_IF_NEEDED;
  • SQL_CURSOR_USE_ODBC;
  • SQL_CUR_USE_DRIVER;
  • SQL CUR DEFAULT.

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

Использовать odbc_connect( ) в программе несложно. Пример:

Функция используется для открытия восстанавливаемых (persistent) соединений с базами данных. Она экономит системные ресурсы, поскольку odbc_pconnect( ) проверяет, не было ли данное соединение открыто ранее, и если было, использует предыдущее соединение.

odbc_close( )

После завершения работы с ODBC-совместимой базой данных соединение необходимо закрыть, чтобы освободить все ресурсы, используемые открытым соединением. Соединение закрывается функцией odbc_close( ):

void odbc_close ([int идентификатор_соединения])

В параметре идентификатор_соединения передается идентификатор открытого соединения. Рассмотрим небольшой пример:

odbc_prepare( )

Перед непосредственной обработкой запрос необходимо «подготовить». Задача решается функцией odbc_prepare( ):

int odbc_prepare (int идентификатор_соединения , string запрос)

В параметре идентификатор_соединения передается идентификатор соединения, возвращаемый функцией odbc_connect( ). В параметре запрос передается текст запроса, который должен быть выполнен сервером. Если запрос не может быть выполнен, функция возвращает FALSE; в противном случае возвращается идентификатор результата, в дальнейшем используемый при вызове функции odbc_execute( ) (см. ниже).

odbc_execute( )

Запрос, подготовленный функцией odbc_prepare( ), выполняется функцией odbc_execute( ). Синтаксис функции odbc_execute( ):

int odbc_execute (int идентификатор результата [, array параметры])

В параметре идентификатор_результата передается идентификатор результата, возвращаемый при успешном вызове odbc_prepare( ). Необязательный параметр передается лишь в том случае, если при вызове функции передаются дополнительные данные.

Рассмотрим следующий пример:

В приведенном примере продемонстрирована транзакция ODBC, при которой данные запроса не отображаются в браузере (как это обычно делается при использовании команды SELECT). Транзакция ODBC с использованием запроса QUERY описана ниже, в разделе «odbc_result_all( )».

odbc_exec( )

Функция odbc_exec( ) объединяет odbc_prepare( ) и odbc_execute( ). Синтаксис функции odbc_exec( ):

int odbc_exec (int идентификатор_соединения , string запрос)

В параметре идентификатор_соединения передается идентификатор соединения, возвращаемый функцией odbc_connect( ). В параметре запрос передается текст запроса, который должен быть выполнен сервером. Если запрос не может быть выполнен, функция возвращает FALSE; в противном случае возвращается идентификатор результата, используемый при последующих вызовах функций:

В этом примере функция odbc_exec( ) пытается выполнить запрос, текст которого содержится в переменной $query. При успешном выполнении переменной $result присваивается идентификатор результата; в случае неудачи ей присваивается значение FALSE и выводится сообщение, передаваемое при вызове die( ).

odbc_result_all( )

Очень удобная функция odbc_result_all( ) форматирует и отображает все записи для идентификатора результата, полученного при вызове odbc_exec( ) или odbc_execute( ). Синтаксис функции odbc_result_all( ):

int odbc_result_all (int идентификатор_результата [, string формат_таблицы])

В параметре идентификатор_результата передается идентификатор результата, возвращаемый при успешном вызове odbc_exec( ) или odbc_execute( ). В необязательном параметре формат_таблицы передаются характеристики таблицы HTML. Рассмотрим следующий пример:

В результате выполнения этого примера содержимое таблицы customers будет выведено в таблице на светло-сером фоне с рамкой толщиной 1. Внешний вид таблицы для данных, приведенных на рис. 11.1, изображен на рис. 11.2.

Рис. 11.2. Данные ODBC в браузере

odbc_free_result ( )

Хороший стиль программирования требует освобождения всех ресурсов, связанных с завершенными операциями. При работе с запросами ODBC эта задача решается функцией odbc_free_result( ). Синтаксис функции odbc_free_result( ):

int odbc_free_result (int идентификатор_результата)

В параметре функции передается идентификатор результата, который больше не будет использоваться в программе. Следует помнить, что все ресурсы памяти автоматически освобождаются по завершении сценария; таким образом, вызов функции odbc_free_result( ) необходим лишь для очень больших запросов, расходующих очень большие объемы памяти. Ниже приведен пример, демонстрирующий применение odbc_free_result( ). Помните, что без этой функции обычно можно обойтись, если только вы не собираетесь выполнять несколько запросов в одном сценарии, поскольку с завершением сценария вся память будет автоматически освобождена.

После того как функция odbc_result_all( ) завершила использование идентификатора результата, память возвращается в систему при помощи odbc_free_result( ).

На этом завершается наше знакомство с функциями ODBC в PHP, незаменимыми при создании простых интерфейсов на базе ODBC для доступа через Web. В следующем разделе многие из этих функций будут использованы для демонстрации того, как легко на базе PHP организуется взаимодействие с одной из самых популярных СУБД — Microsoft Access.

Дата добавления: 2015-05-10 ; Просмотров: 442 ; Нарушение авторских прав? ;

Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет

8 ODBC и проект unixODBC

Что такое проект unixODBC?

Цели проекта unixODBC состоят в том, чтобы разрабатывать и поддержать unixODBC, который призван стать окончательным стандартом для ODBC на не-MS Windows системах. Это должно включить поддержку GUI для KDE и GNOME. Платформы Microsoft включают много расширений в спецификацию ODBC, эти расширения также обеспечиваются unixODBC.

Группа разработчиков unixODBC достигла лучших на сегодняшний день результатов под Linux. Весь проект unixODBC распространяется согласно лицензиям GPL или LGPL. Наличие LGPL для библиотек позволяет применять их в коммерческом программном обеспечении с закрытыми исходными текстами.

ODBCConfig

Это приложение GUI, подобное MS ODBC Administrator. Это позволяет любому пользователю легко конфигурировать свои (пользовательские) источники данных. Пользователь root может также добавлять, удалять и настраивать общесистемные источники данных. Опции Driver меняются в зависимости от СУБД. ODBCConfig вызывает код Driver Config, чтобы позволить драйверу запрашивать пользователя относительно специфических опций.

Пользователь root может добавлять или удалять драйверы, используя ODBCConfig. Это скорее регистрация и отмена регистрации драйвера потому, что никакие файлы фактически не будут скопированы или перемещены, зато модифицируется информация системы ODBC.

Все зарегистрированные драйверы будут представлены пользователю на выбор при создании нового источника данных.

DataManager

DataManager мог бы называться Data Explorer. Это приложение GUI, которое позволяет пользователю просматривать и управлять источниками данных. Более точно: оно позволяет пользователю просматривать источники данных, начиная с имени источника и заканчивая таблицами, столбцами и индексами. Это также включает SQL-редактор, который позволяет пользователю представлять на рассмотрение источнику данных SQL-запросы и просматривать результаты.

DriverManager

ODBC-приложения делают ODBC-вызовы через DriverManager. DriverManager выполняет ряд задач для приложения:

  • Обеспечение загрузки и выгрузки соответствующего драйвера
  • Задачи проверки правильности
  • Отображение данных и вызовов 3.5 на 3.0 и на 2.0

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

Некоторые преимущества от использования ODBC DriverManager включают;

  • Переносной (мобильный) код доступа к данным
  • Связывание во время выполнения с источником данных (Data Source)
  • Способность легко изменять источник данных

Использование unixODBC с wine

Когда 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-> -> Driver=»not blank», где определяет соответствующий DSN. Установка для драйвера не имеет значения, за исключением того, что это не должно быть пустой строкой. Такая схема применима и для других программ.

Использование unixODBC с wine

Когда 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-> -> Driver=»not blank», где определяет соответствующий DSN. Установка для драйвера не имеет значения, за исключением того, что это не должно быть пустой строкой. Такая схема применима и для других программ.

Установка PHP с unixODBC

Поддержка Apache DSO

Имеются два способа обхода проблемы. Необходимо определить и экспортировать следующие переменные среды перед формированием apache: Или пересоберите unixODBC без поддержки потоков, конфигурируя его так:

В обоих случаях не забывайте удалять файл config.cache из корневого каталога Apache или unixODBC

UnixODBC и 2000 год

Поскольку ничего из вышеупомянутой информации не сгенерировано кодом внутри unixODBC, каких бы то ни было проблем с 2000 годом в рамках кода unixODBC быть не должно. Могут быть сложности у конкретной СУБД или операционной системы, но они не имеют отношения к пакету 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.

Использование IBM DB2 с unixODBC

Сначала установите клиентский пакет доступа DB2 от IBM, это установит IBM CLI драйвер, который работает с unixODBC как ODBC-драйвер.

При использовании клиентского пакета доступа, определите клиентский доступ под неким именем, например, db2inst1, а затем создайте запись в файле odbcinst.ini: Параметр DontDLClose требуется, чтобы избежать проблемы в драйвере, когда он динамически загружен.

Теперь настройте файл odbc.ini примерно так: Затем, когда происходит соединение, Вы ДОЛЖНЫ ИМЕТЬ переменную среды DB2INSTANCE, установленную на корректный образец db2, например:

Версия 7.1

Единственое различие сводится к имени пакета, используемого для доступа. CLI-драйвер теперь должен быть найден в DB2 Personal Developer’s Edition V7.1.

Использование версии 7.1 формирует путь к библиотеке:

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

unixODBC и Sybase/MS SQL Server

Введение

Этот документ поможет пользователям 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 их имеют. Распакуйте дистрибутив следующими командами: Как только Вы распаковали исходный текст, изучите файлы INSTALL и README.

Сначала определите некоторые переменные среды. Например, пользователь оболочки bash может добавлять следующее в свой файл /etc/profile.

Опции configure могут просматриваться, выполняя ./configure —help. Главное, должна быть указана опция выбора конфигурации —with-tdsver. Теперь соберем пакет и установим его:

Драйвер FreeTDS ODBC должен быть установлен в /usr/local/freetds/lib. Там должен появиться файл libtdsodbc.so.

Настройка

Регистрация SQL Server с TDS

FreeTDS должен знать несколько вещей относительно каждого сервера, с которым Вы хотите работать. Традиционно используется интерфейсный файл. FreeTDS может работать с файлом, называемым freetds.conf, но для упрощения примера применим старый метод. Файл интерфейсов может быть найден в каталоге /usr/local/freetds. Имеется пример для доступа к MS SQL Server: Под P450 здесь значится имя машины, на которой выполняется MS SQL Server. Имя может быть каким угодно. По умолчанию MS SQL Server слушает порт 1433.

Регистрация ODBC-драйвера через unixODBC

unixODBC должен знать ряд данных относительно всех ODBC-драйверов, которые Вы предполагаете использовать. Самый лучший способ этого достичь: применить графическую программу ODBCConfig, которая приходит с unixODBC. Альтернативный метод состоит в том, чтобы использовать команду odbcinst, которая также приходит с unixODBC. Мы сосредоточимся на использовании команды odbcinst. Создайте файл с именем tds.driver.template с несколькими строками, описывающими нужный драйвер:


Выполните odbcinst, предписывая ему создать запись драйвера, используя файл tds.driver.template. Обратите внимание, что Вы должны оставить пробел между параметром -f и именем файла шаблона:

Создание ODBC Data Source Name

Клиенты ODBC обычно будут работать с ODBC Data Source Names (DSN). Самый лучший способ создавать, редактировать и удалять DSN состоит в том, чтобы использовать инструмент ODBCConfig.

Снова мы используем команду odbcinst вместо него. Это делается потому, что программа ODBCConfig достаточно наглядна и понятна, но не все пользователи имеют установленные инструментальные средства unixODBC GUI. Снова начнем с создания файла-шаблона под именем tds.datasource.template, который содержит некоторые опции типа заданной по умолчанию базы данных и UID. Примечание: Вы будете использовать Ваш собственный Servername и UID:

Примечание: Servername не означает DNS-имя или IP-адрес сервера. Это должно соответствовать серверу из интерфейсного файла (в случае freetds.conf это значение между [], заголовок желательного раздела сервера).

Примечание: предыдущие команды выполнялись как root (обозначенный символом #), но теперь команда выполняется от имени обычного пользователя. Это значительно. Все пользователи системы совместно используют FreeTDS и ODBC-драйверы, но каждый пользователь имеет собственный список DSN (имеются исключения, но здесь они не актуальны). Так что создайте DSN как тот пользователь, который собирается использовать это:

unixODBC приходит с рядом инструментальных средств, которые позволяют Вам проверять работоспособность пакета. Используем инструмент командной строки isql. Он позволяет представлять на рассмотрение DSN команды (обычно это инструкции SQL) и принимать результаты:

Вы должны видеть сообщение о соединении и подсказку SQL. Если этого не наблюдается, либо проблема с конфигурацией, либо задана неправильная пара значений ID и PWD.

Теперь попробуйте простую команду SQL:

Шаблон драйвера

Создан шаблон драйвера, чтобы позволить программистам легко разрабатывать новые драйверы. Это содержит некоторые файлы типа 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?u >
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

Установка и настройка Cold Fusion и Interbase под Linux

Как и что делалось:

  • 1. Под RH Linux 6.2 установлен UnixODBC 1.8.12 с применением для этой цели rpm-пакета с сайта Coding Apes ( http://grapeape.codingapes.com/unixODBC.xml). ODBC-диспетчер драйверов, обеспеченный ColdFusion, был заменен на диспетчер из UnixODBC:
  • 2. Под RH Linux 6.1 используйте исходный текст с сайта http://www.unixodbc.org. Если Вы не нуждаетесь в графических инструментальных средствах, а для серверов обычно их не ставят), выполните: Остальное подобно описанному выше.
  • 3. Конфигурируйте Interbase ODBC Driver, загрузите Interbase Driver с сайта Easysoft ( http://www.easysoft.com/products/interbase). Установите его, скопировав файлы в каталог /usr/local/lib. Теперь настройте Ваш файл odbc.ini в /opt/coldfusion/odbc/odbc.ini примерно так:

Получение ODBC-драйвера из Informix Client access или SDK, работающего с unixODBC

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 без пробелов между именами параметров и их значениями, например:

7. Определите Informix DSN в odbc.ini:

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 в нужный Вам каталог.

Распаковать его, например, командами:

Выполнение этих команд создаст каталог unixODBC со всеми исходными файлами внутри.

На момент написания данной работы последней версией была 2.2.6 (архив назывался unixODBC-2.2.6.tar.gz).

В настоящее время на сайте 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.

Версия для FreeBSD

Nick Sayer создал порт unixODBC для FreeBSD. Ее можно найти на сайте http://www.freebsd.org/ports.

Чтобы сформировать пакет из архива CVS, выполните следующую команду:

Это будет формировать скрипт configure.

Чтобы сформировать пакет из CVS, Вы нуждаетесь в некоторых инструментальных средствах:

  • automake 1.5
  • libtool 1.4.2

Они могут быть найдены на web-сайте проекта GNU http://www.gnu.org или на его многоичисленных зеркалах.

Построение библиотек и программ

Установка теперь использует стандартный процесс GNU autoconf. Скомандуйте:

По умолчанию файлы будут установлены в каталог /usr/local. Как и положено с configure, это расположение может быть изменено опцией prefix: Это установит каталоги в /usr/local/unixODBC.

Чтобы соответствовать руководящим принципам GNU, файл odbcinst теперь установлен по умолчанию в /etc, что может быть изменено, используя опцию —sysconfdir в вызове configure. Чтобы устанавливать файлы в старое место, надо указать:

Скрипт будет пытаться находить каталоги, которые необходимы для компонентов GUI, и если они не найдены (то есть, Вы не установили QT), построение пакета продолжится, но без частей GUI.

Компоненты GUI (ODBCConfig и DataManager) требуют Qt не ниже 2.2 ( http://www.troll.no/dl/qtfree-dl.html).

Библиотека SQI требует flex и yacc, чтобы анализировать команды SQL.

Дистрибутив в целом зависит от наличия многих из стандартных инструментальных средств разработки, типа компилятора C/C++ (в настоящее время протестирован egcs).

Начинка unixODBC

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

ОБРАТИТЕ ВНИМАНИЕ: файлы 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. Например;

Каждое имя источника данных должно иметь, по крайней мере, определенный параметр driver. Это позволит DriverManager загружать драйвер, когда сделан запрос на соединение. Единственые параметры, с которыми работает сам DriverManager: DRIVER, TRACEFILE и TRACE. Другие параметры будут интерпретироваться уже драйвером. Секция [ODBC Data Sources] поддерживается в каждом файле odbc.ini.

Файл odbcinst.ini

Этот ini-файл просто перечисляет все установленные драйверы. Синтаксис прост: имя, сопровождаемое параметром, который сообщает имя файла драйвера:

Имя файла драйвера (в данном случае /usr/lib/libsybase.so.11) должно быть уникально. Дружественное имя (то есть Sybase 11) также должно быть уникально.

Параметр Setup указывает на общедоступную (разделяемую) библиотеку, содержащую функции, которые нужно вызвать ODBC Config. ODBC Config вызовет эту библиотеку, чтобы получить специфические для конкретного драйвера имена параметров в ходе конфигурации источника данных. Если программа ODBC Config не может найти или использовать этот файл, она примет некоторые значения по умолчанию. Этот файл должен изменяться только разделяемой библиотекой ODBCINST или утилитой командной строки odbcinst.

Графическое наполнение

Спецификации ODBC включают два случая, в которых GUI был бы особенно полезен. Проект LinuxODBC находится в процессе реализации GUI для обоих случаев. Случаи это такие:

ODBC Config должен позволить пользователю настроить параметры, специфичные для конкретного драйвера. В MS это обработано через ODBC Admin, вызывающий драйвер и передающий ему дальнейшую инициативу. LinuxODBC не будет вынуждать драйвер делать такую работу. Вместо этого, ODBC Config вызовет библиотеку Drivers Setup, чтобы получить простой список реквизитов. ODBC Config обработает представление и сохранение этих реквизитов. Этот подход делает создание библиотек Driver Setup ОЧЕНЬ простым потому, что они должны обеспечить только список опций.

DriverManager, вероятно, придется запрашивать пользователя относительно большего количества информации для входа в систему. С поддержкой графики это вполне реально.

unixODBC без GUI

Много людей используют unixODBC, но по ряду причин не формируют конфигурацию GUI и соответствующие утилиты (ODBCConfig и DataManager).

Что такое ini-файл?

ODBC сначала появился внутри Windows 3.0. В это время Windows использовала .ini-файлы, чтобы хранить информацию о конфигурации. Это текстовые файлы, содержащие данные в следующем формате:

С появлением 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 не является системным, сервер потерпит неудачу.

FILEDSN

ODBC 3 также имеет третий сорт DSN, файловый DSN. Они сохраняют информацию соединения в файле, который может быть доступен любому пользователю. UnixODBC в настоящее время не поддерживает файловый DSN, но такая поддержка планируется в ближайшее время, поскольку такой тип DSN весьма полезен. Он больше распространен в NT, чем в UNIX по причине того, такие файлы позволяют хранить данные на центральном сервере, который является доступным всем рабочим станциям, что избавляет от настройки всех систем сразу.

Почему не vi?

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

Однако, начиная с версии beta 1.6, расположение системных файлов odbcinst.ini и odbc.ini определено скриптом выбора конфигурации. Заданное по умолчанию расположение: /usr/local/etc, и если префикс определен, расположение будет /etc. Расположение системных файлов можно поменять и радикально указанием опции —sysconfdir=DIR, например, для обратной совместимости с версиями до pre 1.6 попробуйте:

Что входит в эти файлы?

odbcinst.ini

Шаблоны

-i Установить
-d драйвер
-f имя файла с шаблоном

Потоки

[.]odbc.ini

Это может быть записано в файл шаблона и вставлено в ini-файле для текущего (актуального) пользователя командой:

Подключение PHP к MSSQL через PDO ODBC

когда я выполняю этот код:

Он говорит, что у меня есть odbc драйвер.

однако, когда я пытаюсь использовать его вот так:

ничего не происходит — никаких ошибок и он не работает вообще. Это даже не будет выполняться за этой линией!

Как подключить PHP к этой базе данных MSSQL через PDO и ODBC?

3 ответов

есть несколько файлов конфигурации, которые необходимо настроить. /etc/odbc.ini , /etc/odbcinst.ini и /etc/freetds/freetds.conf (эти местоположения действительны для Ubuntu 12.04 и, вероятно, правильны для большинства * nixes).

вам нужно установить unixodbc и freetds (не уверен, что имена пакетов на CentOS). В Ubuntu это будет apt-get install unixodbc tdsodbc .

/ etc / odbc.ini (этот файл может быть пустым)

/ etc/freetds / freetds.conf (или вы можете найти его в /etc/freetds.conf)

возможно, Вам придется изменить tds version = 7.1 строка выше в зависимости от вашей версии MSSQL.

вам придется перезапустить apache после внесения этих изменений.

в вашем PHP-коде вы создадите свой PDO такой объект:

обратите внимание, что ваше имя пользователя может быть в формате: domain\username .

кроме того, вы будете знать, что это сработало, если вы выполните phpinfo() на Вашей странице и найдите «freetds», который покажет раздел mssql с freetds, перечисленными как версия библиотеки.

принятый ответ является правильным до фактического вызова PHP. Как кто-то справедливо прокомментировал, он должен вызывать драйвер odbc. Во-вторых, он не использует имя источника данных (DSN), которое было настроено в odbc.ini но на самом деле создает ad-hoc DSN. Вместо этого:

здесь mssql относится к объекту DSN в odbc.ini

вы можете создать специальный DSN следующим образом:

где mssql теперь относится к объекту сервера в freetds.conf и FreeTDS объект драйвера в odbcinst.ini

(это действительно должен быть комментарий, но у меня нет точек повторения).

Если вы хотите напрямую настроить соединение PDO odbc с помощью драйвера FreeTDS на MS SQL server, не указывая его в файле конфигурации freetds.conf.

Если у вас есть сервер MSSQL с именованным экземпляром, вы можете удалить порт no, а затем изменить $serverName в формате server_ip\instance_name, например: «192.168.1.1\sqlexpress», где sqlexpress-это имя экземпляра.

odbc_connect

odbc_connect — Connect to a datasource

Description

Returns an ODBC connection id or 0 (FALSE) on error.

The connection id returned by this functions is needed by other ODBC functions. You can have multiple connections open at once as long as they either use different db or different credentials. The optional fourth parameter sets the type of cursor to be used for this connection. This parameter is not normally needed, but can be useful for working around problems with some ODBC drivers.

With some ODBC drivers, executing a complex stored procedure may fail with an error similar to: «Cannot open a cursor on a stored procedure that has anything other than a single select statement in it». Using SQL_CUR_USE_ODBC may avoid that error. Also, some drivers don’t support the optional row_number parameter in odbc_fetch_row(). SQL_CUR_USE_ODBC might help in that case, too.

The following constants are defined for cursortype:

  • SQL_CUR_USE_IF_NEEDED
  • SQL_CUR_USE_ODBC
  • SQL_CUR_USE_DRIVER
  • SQL_CUR_DEFAULT

For persistent connections see odbc_pconnect().

Коментарии

If using Openlink to connect to a Microsoft Access database, you will most likely fine tha odbd_connect() works fine, but discover that ANY query will produce odd results; with SELECT queries failing with «[OpenLink][ODBC][Driver]Driver not capable, SQL state
S1C00 in SQLExecDirect in xxxx.php on line xx» and INSERT / DELETE queries warning «No tuples available at this result index».

In this case, use the SQL_CUR_USE_ODBC cursor!

This had me stumped for quite some time; because it was the odbc_exec() which was seemingly at fault. :)

If like me you are using openlink from unix to access an MS Access database on an NT/Win2k machine and find out that your INSERT queries don’t do anything and don’t report any errors, use odbc_pconnect().

I couldn’t understand what was going on and after a bit of research I found out that with MySQL they recommended using mysql_pconnect() for INSERT queries. I tried the same thing with odbc and it worked.

If you don’t want to specify your login credentials on your web server, you can leave the login fields blank to use the integrated windows security like here:

Make sure you have switched your system dsn to integrated security, too !

(works on windows machines only, of course)

We’ve tried hard to connect from php to our IBM DB2 RS/6000 Server. It worked after we compiled with —ibm-db2= option, but it was unbelievable
slow.

No, just testing some options, we found out that it went from very slow (getting 100 records lasts 1 till 10 seconds) to fast access (almost same speed as with using JDBC from Servlets) to 0.2 till 0.3 seconds.

We simply added the optional parameter Cursortype to odbc_connect, and with the cursortype SQL_CUR_USE_ODBC it changed in that way!

Hope this helps anybody who must connect to db2 ;)

Due to multiple requests, more for DSN-less connections:

= new COM ( «ADODB.Connection» );

$db_connstr = «DRIVER=; DBQ=» . realpath ( «../databases/database.mdb» ) . » ;DefaultDir=» . realpath ( «../databases» );
$db_connection -> open ( $db_connstr );
$rs = $db_connection -> execute ( «SELECT * FROM Table» );
$rs_fld0 = $rs -> Fields ( 0 );
$rs_fld1 = $rs -> Fields ( 1 );
while (! $rs -> EOF ) <
print «$rs_fld0->value $rs_fld1->value\n» ;
$rs -> MoveNext (); /* updates fields! */
>
$rs -> Close ();
$db_connection -> Close ();
?>

(Prints first 2 columns for each row.)

$cnx = odbc_connect(‘cliente’,’Administrador’,»);
//query
$SQL_Exec_String = «select * from Clientes»;
//ejecucion query
$cur= odbc_exec( $cnx, $SQL_Exec_String );
echo »

«.
»

\n»;
while( odbc_fetch_row( $cur ) ) <
$Dni= odbc_result( $cur, 1 );
$Nombre= odbc_result( $cur, 2 );
$codigo= odbc_result( $cur, 3 );
$ciudad= odbc_result( $cur, 4 );
echo »

«.
»

\n»;
>
echo «

Dni Nombre codigo ciudad
$Dni $Nombre $codigo $ciudad

«;

WINNT 4 Workstation, PHP4

odbc_connect() kept giving me weird errors when trying to connect to a MSaccess DSN(Microsoft Jet engine couldn’t open the database ‘Unknow’. Another user is using it exclusively, or you dont have permission to use it).

After going nuts for a while, I realized that my database name had a space in it (course surveys.mdb), I shortened the name to eliminate the space .. and everything worked fine.

Thought I’d add a note here on this. I’m using Apache 2.0.39 on Windows XP and PHP 4.2.2.

It helps a lot if you don’t use capital letters in your dsn string.

Thought I also comment on the posts about using system dsns over file dsns. There are lots of posts saying use systems not files, but none (that I have seen) which explain why.

Essentially: File DSNs are specific to the current user, therefore the Internet Guest User Account doesn’t have rights to them. Systems are available to everyone.

here’s a quick note about using php and db2 that cost me a couple of hours and several recompiles trying to figure out why it didn’t work.

put the below line in any script

Or, set that in your webserver environment somehow.

As always Microsoft is clueless. I’ve been trying to connect to an Access database on a W2K on the network (not a local file, but mapped on the V: drive), via ODBC.

All I got is this message:
Warning: SQL error: [Microsoft][ODBC Microsoft Access Driver] ‘(unknown)’ is not a valid path. Make sure that the path name is spelled correctly and that you are connected to the server on which the file resides., SQL state S1009 in SQLConnect in d:\apache\cm\creaart.php on line 13

So. I started looking al around and looks like the ODBC driver has some severe problems:

1. It cannot access a Access database via a mapped drive. And this is for ANY application, name it PHP, Coldfusion, whatever
2. You cannot make a system DSN with a UNC (\\Server\resource), so you must map the drive

So. I quit on ODBC and went via ADO, this is the code that works:

// Driver do Microsoft Access (*.mdb)
// must be the name in your odbc drivers, the one you get
// from the Data Sources (ODBC).
// In this case, I’m in Mexico but the driver name is in portuguese, thanks Microsoft.

$sql = ‘SELECT username FROM tblUsuarios’;
$res = $conn->Execute($sql);
while (!$res->EOF)
<
print $res->Fields[‘username’]->Value . «
«;
$res->MoveNext();
>

$res->Close();
$conn->Close();
$res = null;
$conn = null;

Connect to an MS-Access Database on the Network via ODBC

Apache 2.0.47 with PHP 4.3.4 running on Windows XP Pro

If you encounter the error
«[Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified, SQL state IM002 in SQLConnect»

you should make sure to have the following done:

The ODBC-link must be a System-DNS and not a User-DNS. Configure your ODBC-link and then modify your configuration with regedt32. Go to HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC_INI and open your ODBC-link. The field DBQ contains the path to your database. This path must be without Drive-names (e. g. «M:») so change it to «\\Server\folder\database.mdb». This setting is changed each time you modify your ODBC-configuration using the Windows-tool, so make sure you do this afterwards.

Then you go to the Services-Section in your Systemmanagement. Select the properties of your Apache module. In the login-section you have to make sure you login with a valid User-Account for your Network-Server.

Please note that this way you still have no permission to access linked tables within the linked database

Funny enough all this is not necessary on Win98.

To connect to a SQL DB on a unix srv via odbc one can use one of the following solutions.

1. having an odbc.ini (

[PostgreSQL]
Description = PostgreSQL template1
Driver = PostgreSQL
Trace = Yes
TraceFile = /tmp/odbc.log
Database = PerfTest
Servername = localhost
UserName = boss
Password = BigBoss
Port = 5432
Protocol = 6.4
ReadOnly = Yes
ConnSettings =

[Default]
Driver = /local/lib/libodbc.so

2. specifying a DSN

function DBCALL($SQL)
<
$U = «boss»;
$DB = «PerfTest»;
$P = «BigBoss»;
$Srv = «llocalhost»;
$DSN = «Driver=PostgreSQL;Server=$Srv;Database=$DB»;

echo «Trying to connect to $DSN\n»;
if ($C ,SQL_CUR_USE_ODBC))
<
echo «still trying C > if ($RES = odbc_exec($CID, $SQL))
<
echo «RES = $RES\n»;
print_r($RES);
echo «\n»;

Hope this helps.

To make a DSN-less connection using ODBC to MS-SQL:

$user = ‘username’ ;
$pass = ‘password’ ;

$connection = odbc_connect ( $connection_string , $user , $pass );

?>

servername is the name of the database server

databasename is the name of the database

Note, I’ve only tried this from a windows box using the Microsoft ODBC drivers.

Hi Mario, I changed a bit your script to suit my configuration,
I also included a lines to close the connection.
Thanks for the script
I am running apache 2.0.52 and PHP 5.0.2. Windows 2000
SQL 2000

= odbc_pconnect ( «RAMPANT» , «Invent» , «pass» , «» );
$cur = odbc_exec ( $cx , «select tipo,marca,modelo from inv_equipos» );
while( odbc_fetch_row ( $cur ))
<
//collect results
$tipo = odbc_result ( $cur , 1 );
$marca = odbc_result ( $cur , 2 );
$modelo = odbc_result ( $cur , 3 );
//format and display results
print ( »

» );
print ( »

» );
print ( »

» );
print ( »

» );
print ( «

» );
>

//disconnect from database
odbc_close ( $cx );

Php руководство по рнр 3 0 функции odbc

ьФБ ЗМБЧБ УПДЕТЦЙФ ЙОЖПТНБГЙА ПФОПУЙФЕМШОП ТБЪТБВПФЛЙ РТЙЛМБДОЩИ РТПЗТБНН, ЛПФПТЩЕ ЙУРПМШЪХАФ MyODBC ЛБЛ ЙОФЕТЖЕКУ, ЮФПВЩ ПВТБФЙФШУС Л УЕТЧЕТХ MySQL.

ч ПВЭЕН ЧЙДЕ, ЮФПВЩ ТБВПФБФШ У УЕТЧЕТПН MySQL ЙЪ МАВПК РТПЗТБННЩ ЮЕТЕЪ ODBC/MyODBC, ОБДП УДЕМБФШ УМЕДХАЭЕЕ:

  • оБУФТПЙФШ MyODBC DSN
  • рПДЛМАЮЙФШУС Л УЕТЧЕТХ MySQL
  • рТПЧЕУФЙ ЙОЙГЙБМЙЪБГЙА
  • чЩРПМОЙФШ ЛПНБОДЩ SQL
  • рПМХЮЙФШ ТЕЪХМШФБФЩ
  • пВТБВПФБФШ ФТБОЪБЛГЙЙ
  • пФУПЕДЙОЙФШУС ПФ УЕТЧЕТБ

вПМШЫЙОУФЧП РТЙЛМБДОЩИ РТПЗТБНН ЙУРПМШЪХЕФ ОЕЛПФПТПЕ ЙЪНЕОЕОЙЕ ЬФЙИ ЫБЗПЧ.

йУФПЮОЙЛ ДБООЩИ ЙДЕОФЙЖЙГЙТХЕФ РХФШ ДМС ДБООЩИ, ЛПФПТЩК НПЦЕФ ЧЛМАЮБФШ УЕФЕЧХА ВЙВМЙПФЕЛХ, УЕТЧЕТ, ВБЪХ ДБООЩИ Й ДТХЗЙЕ БФТЙВХФЩ. ч ОБЫЕН УМХЮБЕ ЙУФПЮОЙЛ ДБООЩИ РТЕДУФБЧМСЕФ УПВПК РХФШ Л ВБЪЕ ДБООЩИ 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 .
  • оБ УЙУФЕНБИ РПД Microsoft Windows 2000 ДЧБЦДЩ ЭЕМЛОЙФЕ РП Administrative Tools , Б ЪБФЕН ДЧБЦДЩ ЭЕМЛОЙФЕ РП Data Sources (ODBC) . оБ ЛПНРШАФЕТБИ РПД РТЕДЩДХЭЙНЙ ЧЕТУЙСНЙ Microsoft Windows ДЧБЦДЩ ЭЕМЛОЙФЕ РП 32-bit ODBC ЙМЙ РП ODBC .

юФПВЩ ДПВБЧЙФШ ЙУФПЮОЙЛ ДБООЩИ Ч Windows:

  1. пФЛТПКФЕ ODBC Data Source Administrator .
  2. ч ДЙБМПЗПЧПН ПЛОЕ ODBC Data Source Administrator ОБЦНЙФЕ Add . пФЛТПЕФУС ДЙБМПЗПЧПЕ ПЛОП Create New Data Source .
  3. чЩВЕТЙФЕ ФБН MySQL ODBC 3.51 Driver Й ОБЦНЙФЕ ОБ Finish . рПСЧЙФУС ДЙБМПЗПЧПЕ ПЛОП MySQL ODBC 3.51 Driver — DSN Configuration .
  4. ч ПЛОЕ Data Source Name ЧРЕЮБФБКФЕ ЙНС ЙУФПЮОЙЛБ ДБООЩИ, Л ЛПФПТПНХ чЩ ИПФЙФЕ ПВТБЭБФШУС. ьФП НПЦЕФ ВЩФШ МАВПЕ ЙНЕАЭЕЕ УЙМХ ЙНС, ЛПФПТПЕ РПОТБЧЙМПУШ.
  5. ч ПЛОЕ Description ЧЧЕДЙФЕ ПРЙУБОЙЕ ОЕПВИПДЙНПЕ ДМС DSN.
  6. ч ПЛОЕ Host or Server Name (or IP) ОБРЕЮБФБКФЕ ЙНС УЕТЧЕТБ MySQL, Л ЛПФПТПНХ чЩ ИПФЙФЕ ПВТБЭБФШУС. рП ХНПМЮБОЙА ЬФП local host.
  7. ч ПЛОЕ Database Name ХЛБЦЙФЕ ЙНС MySQL ВБЪЩ ДБООЩИ, ЛПФПТБС ВХДЕФ РТЙНЕОСФШУС ЛБЛ ЪБДБООБС РП ХНПМЮБОЙА ВБЪБ ДБООЩИ.
  8. ч ПЛОЕ User ЪБДБКФЕ ЙНС РПМШЪПЧБФЕМС ВБЪЩ ДБООЩИ (user ID).
  9. ч ПЛОЕ Password ОБДП ЪБДБФШ РБТПМШ.
  10. ч ПЛОЕ Port ОБРЕЮБФБКФЕ ОПНЕТ РПТФБ, ЕУМЙ ЬФП ОЕ ЪОБЮЕОЙЕ РП ХНПМЮБОЙА 3306.
  11. ч ПЛОЕ SQL Command чЩ НПЦЕФЕ ЧЧПДЙФШ ЖБЛХМШФБФЙЧОХА ЛПНБОДХ SQL, ЛПФПТХА УЕТЧЕТХ ОБДМЕЦЙФ ЧЩРПМОЙФШ УТБЪХ РПУМЕ ХУФБОПЧМЕОЙС РПДЛМАЮЕОЙС.

фЕРЕТШ ОБЦНЙФЕ OK , ЮФПВЩ ДПВБЧЙФШ ЬФПФ ЙУФПЮОЙЛ ДБООЩИ. пВТБФЙФЕ ЧОЙНБОЙЕ: РТЙ ЭЕМЮЛЕ ОБ OK ДЙБМПЗПЧПЕ ПЛОП Data Sources dialog, Й ODBC Administrator НПДЙЖЙГЙТХЕФ ЙОЖПТНБГЙА УЙУФЕНОПЗП ТЕЕУФТБ. йНС РПМШЪПЧБФЕМС Й УФТПЛБ РПДЛМАЮЕОЙС УФБОХФ ЪБДБООЩНЙ РП ХНПМЮБОЙА ЪОБЮЕОЙСНЙ РПДЛМАЮЕОЙС ДМС ЬФПЗП ЙУФПЮОЙЛБ ДБООЩИ. чЩ НПЦЕФЕ ФБЛЦЕ РТПЧЕТЙФШ, ДПУФБФПЮОЩ МЙ чБЫЙ РБТБНЕФТЩ ОБУФТПКЛЙ, ЮФПВЩ УПЕДЙОЙФШУС У УЕТЧЕТПН, ЙУРПМШЪХС ЛОПРЛХ Test Data Source . ьФБ ЧПЪНПЦОПУФШ РПСЧЙМБУШ ФПМШЛП ОБЮЙОБС У MyODBC 3.51 .

Driver Options : чЩ НПЦЕФЕ ФБЛЦЕ ЧЙДЕФШ ЛОПРЛХ Options , ЛПФПТБС ПФПВТБЪЙФ ДЙБМПЗ ДПРПМОЙФЕМШОЩИ РБТБНЕФТПЧ, ЛПФПТЩЕ ХРТБЧМСАФ РПЧЕДЕОЙЕН ДТБКЧЕТБ.

пВТБФЙФЕ ЧОЙНБОЙЕ , ЮФП РБТБНЕФТЩ Driver Trace Options ВХДХФ ЪБВМПЛЙТПЧБОЩ (ОБТЙУПЧБОЩ УЕТЩН ГЧЕФПН) РТЙ ЙУРПМШЪПЧБОЙЙ ПВЩЮОПК ЧЕТУЙЙ DLL.

юФПВЩ ЙЪНЕОЙФШ ЙУФПЮОЙЛ ДБООЩИ Ч Windows:

  1. пФЛТПКФЕ ПЛОП ODBC Data Source Administrator . чЩВЕТЙФЕ УППФЧЕФУФЧХАЭХА ЧЛМБДЛХ DSN.
  2. чЩВЕТЙФЕ ЙУФПЮОЙЛ ДБООЩИ MySQL, ЛПФПТЩК чЩ ИПФЙФЕ ЙЪНЕОЙФШ, Б ЪБФЕН ОБЦНЙФЕ modify Й ЭЕМЛОЙФЕ РП Configure . пФЛТПЕФУС ДЙБМПЗПЧПЕ ПЛОП MySQL ODBC 3.51 Driver — DSN Configuration .
  3. йЪНЕОЙФЕ УППФЧЕФУФЧХАЭЙЕ РПМС ЙУФПЮОЙЛБ ДБООЩИ, Б ЪБФЕН ОБЦНЙФЕ 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:

  • ODBCConfig GUI tool ( HOWTO : ODBCConfig)
  • odbcinst

нПЦОП ПРТЕДЕМСФШ УМЕДХАЭЙЕ РБТБНЕФТЩ ДМС MyODBC ЙМЙ ДМС MyODBC 3.51 Ч УЕЛГЙЙ [Data Source Name] ЖБКМБ ODBC.INI ЙМЙ ЮЕТЕЪ РБТБНЕФТ InConnectionString Ч ЧЩЪПЧЕ SQLDriverConnect() .

Tipo Marca Modelo
$tipo $marca $modelo
рБТБНЕФТ ъОБЮЕОЙЕ РП ХНПМЮБОЙА лПННЕОФБТЙК
user ODBC (Ч Windows) йНС РПМШЪПЧБФЕМС ДМС УЧСЪЙ У MySQL.
server localhost йНС УЕТЧЕТБ MySQL.
database вБЪБ ДБООЩИ РП ХНПМЮБОЙА
option гЕМПЕ ЮЙУМП, ЛПФПТЩН чЩ НПЦЕФЕ ПРТЕДЕМСФШ ЛБЛ ДПМЦЕО ТБВПФБФШ 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-УЧСЪШ У РПНПЭША ЙОФЕТЖЕКУБ Й УПРПУФБЧЙФШ У ОЕК ДЕУЛТЙРФПТ УТЕДЩ. пО ПВЕУРЕЮЙЧБЕФ ДПУФХР Л ЗМПВБМШОПК ЙОЖПТНБГЙЙ ФЙРБ ЙНЕАЭЙИ УЙМХ ДЕУЛТЙРФПТПЧ РПДЛМАЮЕОЙС Й БЛФЙЧОЩИ ДЕУЛТЙРФПТПЧ РПДЛМАЮЕОЙС.

юФПВЩ ТБУРТЕДЕМЙФШ РТБЧЙМШОЩК ДЕУЛТЙРФПТ УТЕДЩ, РТЙЛМБДОБС РТПЗТБННБ:

  1. пВЯСЧМСЕФ РЕТЕНЕООХА ФЙРБ SQLHENV. оБРТЙНЕТ, РТЙЛМБДОБС РТПЗТБННБ НПЗМБ ВЩ ЙУРПМШЪПЧБФШ ПВЯСЧМЕОЙЕ: SQLHENV henv;
  2. чЩЪЩЧБЕФ SQLAllocHandle (Ч MyODBC 2.50 ОБЪЩЧБЕФУС SQLAllocEnv) Й РЕТЕДБЕФ БДТЕУ ЬФПК РЕТЕНЕООПК Й ПРГЙЙ SQL_HANDLE_ENV ЛБЛ: 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 РТЙ ЙУРПМШЪПЧБОЙЙ УМЕДХАЭЙИ ЬМЕНЕОФПЧ:

  • SQLSTATE: нОПЗП ЪОБЮЕОЙК SQLSTATE ТБЪМЙЮОЩ Ч ODBC 2.x Й ODBC 3.x. дМС РПМХЮЕОЙС УРЙУЛБ ЛПДПЧ SQLSTATE, ЧПЪЧТБЭБЕНЩИ ДТБКЧЕТПН MyODBC 3.51 ПВТБФЙФЕУШ Л ТБЪДЕМХ » лПДЩ ПЫЙВПЛ MyODBC».
  • фЙРЩ Date, Time Й Timestamp: УМЕДХАЭБС ФБВМЙГБ РПЛБЪЩЧБЕФ ЙДЕОФЙЖЙЛБФПТЩ ФЙРПЧ ДМС ДБООЩИ date, time Й timestamp Ч ODBC 2.x Й Ч ODBC 3.x.
    ODBC 2.XODBC 3.X
    йДЕОФЙЖЙЛБФПТЩ ФЙРПЧ Ч SQL
    SQL_DATESQL_TYPE_DATE
    SQL_TIMESQL_TYPE_TIME
    SQL_TIMESTAMPSQL_TYPE_TIMESTAMP
    йДЕОФЙЖЙЛБФПТЩ ФЙРПЧ Ч C
    SQL_C_DATESQL_C_TYPE_DATE
    SQL_C_TIMESQL_C_TYPE_TIME
    SQL_C_TIMESTAMPSQL_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.
  • пОБ ЪБФЕН ЧЩЪЩЧБЕФ SQLAllocHandle (ЙМЙ SQLAllocConnect ДМС ЧЕТУЙЙ MyODBC 2.50) Й РЕТЕДБЕФ БДТЕУ ЬФПК РЕТЕНЕООПК, ДЕУЛТЙРФПТ УТЕДЩ, ЮФПВЩ ТБУРТЕДЕМЙФШ РПДЛМАЮЕОЙЕ, Й ПРГЙА SQL_HANDLE_DBC. оБРТЙНЕТ: 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). йНЕАФУС ДЧЕ ТБЪМЙЮОЩИ ЖХОЛГЙЙ ДМС ЬФПЗП:

3.4.5.1 уПЕДЙОЕОЙЕ ЮЕТЕЪ SQLConnect

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 ЧПЪЧТБЭБЕФ УППФЧЕФУФЧХАЭХА ПЫЙВЛХ.

3.4.5.2 уЧСЪШ ЮЕТЕЪ SQLDriverConnect

SQLDriverConnect ЙУРПМШЪХЕФУС, ЮФПВЩ УПЕДЙОЙФШУС У УЕТЧЕТПН, ЙУРПМШЪХС УФТПЛХ РПДЛМАЮЕОЙС. нПЦОП ЙУРПМШЪПЧБФШ SQLDriverConnect ЧНЕУФП SQLConnect РП УМЕДХАЭЙН РТЙЮЙОБН:

  • рПЪЧПМЙФШ РТЙЛМБДОПК РТПЗТБННЕ ЙУРПМШЪПЧБФШ УРЕГЙЖЙЮЕУЛХА ДМС ДТБКЧЕТБ ЙОЖПТНБГЙА РПДЛМАЮЕОЙС.
  • юФПВЩ ДТБКЧЕТ ЪБРТБЫЙЧБМ РПМШЪПЧБФЕМС ПФОПУЙФЕМШОП ЙОЖПТНБГЙЙ РПДЛМАЮЕОЙС.
  • уПЕДЙОСФШУС ВЕЪ ПРТЕДЕМЕОЙС ЙУФПЮОЙЛБ ДБООЩИ (DSN less connection).

уФТПЛБ РПДЛМАЮЕОЙС НПЦЕФ УПУФПСФШ ЙЪ ПДОПЗП ЙМЙ ВПМШЫЕЗП ЛПМЙЮЕУФЧБ РБТБНЕФТПЧ MyODBC РПДЛМАЮЕОЙС, ПФДЕМСЕНЩИ ФПЮЛПК У ЪБРСФПК (;). еУМЙ ДТБКЧЕТ ДПМЦЕО ЪБРТБЫЙЧБФШ РПМШЪПЧБФЕМС ПФОПУЙФЕМШОП ЙОЖПТНБГЙЙ РПДЛМАЮЕОЙС, ФП ПО ПФПВТБЦБЕФ ДЙБМПЗ РПДЛМАЮЕОЙС.

3.4.5.3 уФТПЛБ РПДЛМАЮЕОЙС ДМС SQLDriverConnect

йУРПМШЪХС myodbc3 ЛБЛ MySQL ODBC 3.51 DSN: ConnectionString = «DSN=myodbc3»

DSN Less Connection: ConnectionString = «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):

  • рТЙЛМБДОБС РТПЗТБННБ ПВЯСЧМСЕФ РЕТЕНЕООХА ФЙРБ HSTMT. ьФП ЪБФЕН ЧЩЪЩЧБЕФ SQLAllocHandle Й РЕТЕДБЕФ БДТЕУ ЬФПК РЕТЕНЕООПК, ДЕУЛТЙРФПТ РПДЛМАЮЕОЙС, ЮФПВЩ ТБУРТЕДЕМЙФШ ЙОУФТХЛГЙА, Й ПРГЙА SQL_HANDLE_STMT: SQLHSTMT hstmt; SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt) ЙМЙ SQLAllocStmt(hdbc, &hstmt)
  • Driver Manager ТБУРТЕДЕМСЕФ УФТХЛФХТХ, ЮФПВЩ УПИТБОЙФШ ЙОЖПТНБГЙА ПФОПУЙФЕМШОП ЙОУФТХЛГЙЙ Й ЧЩЪЩЧБЕФ SQLAllocHandle Ч ДТБКЧЕТЕ У ПРГЙЕК SQL_HANDLE_STMT.
  • дТБКЧЕТ ТБУРТЕДЕМСЕФ УПВУФЧЕООХА УФТХЛФХТХ, ЮФПВЩ УПИТБОЙФШ ЙОЖПТНБГЙА ПФОПУЙФЕМШОП ЙОУФТХЛГЙЙ Й ЧПЪЧТБЭБЕФ ДЕУЛТЙРФПТ ЙОУФТХЛГЙЙ ДТБКЧЕТБ ОБЪБД Ч Driver Manager. у ДТХЗПК УФПТПОЩ, ЕУМЙ чЩ ЛПНРПОХЕФЕ РТПЗТБННХ ОЕРПУТЕДУФЧЕООП У ДТБКЧЕТПН, ФП ЙНЕООП УБН ДТБКЧЕТ ТБУРТЕДЕМСЕФ ПРЕТБФПТОХА УФТХЛФХТХ Й ЧПЪЧТБЭБЕФ ЕЕ БДТЕУ ПВТБФОП РТЙЛМБДОПК РТПЗТБННЕ.
  • Driver Manager ЧПЪЧТБЭБЕФ ДЕУЛТЙРФПТ ЙОУФТХЛГЙЙ РТЙЛМБДОПК РТПЗТБННЕ.

дТБКЧЕТ ЙДЕОФЙЖЙГЙТХЕФ, ЛПФПТХА ЙОУФТХЛГЙА ОБДП ЙУРПМШЪПЧБФШ РТЙ ЧЩЪПЧЕ ЖХОЛГЙК ODBC ЮЕТЕЪ ДЕУЛТЙРФПТ ЙОУФТХЛГЙЙ.

пРЕТБФПТОЩЕ БФТЙВХФЩ РТЕДУФБЧМСАФ УПВПК ИБТБЛФЕТЙУФЙЛЙ ЙОУФТХЛГЙЙ. оБРТЙНЕТ, ПОЙ ЙУРПМШЪХАФУС, ЮФПВЩ ХУФБОПЧЙФШ ЙНС ЛХТУПТБ ДМС УРЕГЙЖЙЮЕУЛПК ЙОУФТХЛГЙЙ ЙМЙ ЪБДБФШ НБЛУЙНБМШОПЕ ЛПМЙЮЕУФЧП УФТПЛ, ЛПФПТЩЕ ВХДХФ ЧЩВТБОЩ Ч ПДОПК ЙОУФТХЛГЙЙ ЧЩВПТЛЙ.

пРЕТБФПТОЩЕ БФТЙВХФЩ НПЗХФ ВЩФШ ХУФБОПЧМЕОЩ У РПНПЭША SQLSetStmtAttr, Б ЙИ БЛФХБМШОЩЕ РБТБНЕФТЩ ОБУФТПКЛЙ НПЦОП ХЪОБФШ ЮЕТЕЪ ЧЩЪПЧ SQLGetStmtAttr (SQLSetStmtOption Й SQLGetConnectOption УППФЧЕФУФЧЕООП ДМС MyODBC 2.50). рПУЛПМШЛХ ТЕЫЙФЕМШОП ЧУЕ ПРЕТБФПТОЩЕ БФТЙВХФЩ ЙНЕАФ ЪОБЮЕОЙС РП ХНПМЮБОЙА, РТЙЛМБДОБС РТПЗТБННБ ОЕ ПВСЪБОБ ЙИ НЕОСФШ, НПЦОП ПУФБЧЙФШ ЧУЕ ЛБЛ ЕУФШ.

MyODBC РПЪЧПМСЕФ РТЙЛМБДОПК РТПЗТБННЕ РТЕДУФБЧМСФШ ОБ ТБУУНПФТЕОЙЕ ЙОУФТХЛГЙЙ SQL ДЧХНС ТБЪМЙЮОЩНЙ УРПУПВБНЙ:

  • рПДЗПФПЧМЕООПЕ ЧЩРПМОЕОЙЕ
  • рТСНПЕ ЧЩРПМОЕОЙЕ

рПДЗПФПЧМЕООПЕ ЧЩРПМОЕОЙЕ РТЕДУФБЧМСЕФ УПВПК ЬЖЖЕЛФЙЧОЩК УРПУПВ ЧЩРПМОЙФШ ЙОУФТХЛГЙА ВПМШЫЕ ПДОПЗП ТБЪБ. йОУФТХЛГЙС УОБЮБМБ ЛПНРЙМЙТХЕФУС Ч РМБО ДПУФХРБ. рМБО ДПУФХРБ ЪБФЕН ВХДЕФ ЧЩРПМОЕО УФПМШЛП ТБЪ, УЛПМШЛП РПОБДПВЙФУС.

рПДЗПФПЧМЕООПЕ ЧЩРПМОЕОЙЕ ВПМЕЕ РТЕДРПЮФЙФЕМШОП, ЕУМЙ РТЙЛМБДОБС РТПЗТБННБ:

  • чЩРПМОСЕФ ЙОУФТХЛГЙА ВПМШЫЕ ПДОПЗП ТБЪБ, НЕОСС ЪОБЮЕОЙС РБТБНЕФТБ.
  • оХЦДБЕФУС Ч ЙОЖПТНБГЙЙ ПФОПУЙФЕМШОП ЙОУФТХЛГЙЙ SQL ЙМЙ ОБВПТБ ТЕЪХМШФБФПЧ ДП ЧЩРПМОЕОЙС.

рПДЗПФПЧМЕООПЕ ЧЩРПМОЕОЙЕ ЗМБЧОЩН ПВТБЪПН ДПУФЙЗОХФП ЮЕТЕЪ MyODBC API SQLPrepare Й SQLExecute. рПДЗПФПЧМЕООБС ЙОУФТХЛГЙС ЧЩРПМОСЕФУС ВЩУФТЕЕ, ЮЕН ОЕРТЙЗПФПЧМЕООБС ЙОУФТХЛГЙС ЙМЙ РТСНПЕ ЧЩРПМОЕОЙЕ РПФПНХ, ЮФП ДТБКЧЕТ ЛПНРЙМЙТХЕФ ЙОУФТХЛГЙА, УФТПЙФ ДМС ОЕЕ РМБО ДПУФХРБ Й ЧПЪЧТБЭБЕФ ЙДЕОФЙЖЙЛБФПТ РМБОБ ДПУФХРБ ПВТБФОП РТЙЛМБДОПК РТПЗТБННЕ. дТБКЧЕТ НЙОЙНЙЪЙТХЕФ ЪБФТБФЩ ЧТЕНЕОЙ ОБ ПВТБВПФЛХ ЙОУФТХЛГЙЙ, РПУЛПМШЛХ ПО ОЕ ДПМЦЕО ЛБЦДЩК ТБЪ УФТПЙФШ РМБО ДПУФХРБ. хНЕОШЫБЕФУС Й ФТБЖЙЛ.

юФПВЩ РПДЗПФПЧЙФШ Й ЧЩРПМОЙФШ ЙОУФТХЛГЙА, РТЙЛМБДОБС РТПЗТБННБ:

  • чЩЪЩЧБЕФ SQLPrepare Й РЕТЕДБЕФ УФТПЛХ, УПДЕТЦБЭХА ЙОУФТХЛГЙА SQL.
  • хУФБОБЧМЙЧБЕФ ЪОБЮЕОЙС МАВЩИ ПРЕТБФПТОЩИ РБТБНЕФТПЧ.
  • чЩЪЩЧБЕФ SQLExecute Й ДЕМБЕФ МАВХА ДПРПМОЙФЕМШОХА ПВТБВПФЛХ, ЛПФПТБС СЧМСЕФУС ОЕПВИПДЙНПК, ФЙРБ ЧЩВПТЛЙ ДБООЩИ.
  • рП НЕТЕ ОБДПВОПУФЙ РПЧФПТСЕФ 2 Й 3 ЫБЗЙ.
  • лПЗДБ ЧЩЪЧБОБ SQLPrepare, ДТБКЧЕТ ЙЪНЕОСЕФ ЙОУФТХЛГЙА SQL, ЮФПВЩ ЙУРПМШЪПЧБФШ УЙОФБЛУЙУ MySQL ВЕЪ ФПЗП, ЮФПВЩ БОБМЙЪЙТПЧБФШ ЙОУФТХЛГЙА. ьФП ЧЛМАЮБЕФ ЪБНЕОХ ХРТБЧМСАЭЙИ РПУМЕДПЧБФЕМШОПУФЕК. оП ДТБКЧЕТ ОЕ ЧПЪЧТБЭБЕФ ОЙЛБЛЙИ УЙОФБЛУЙЮЕУЛЙИ Й УЕНБОФЙЮЕУЛЙИ ПЫЙВПЛ.
  • рТЙ ЧЩЪПЧЕ SQLExecute ДТБКЧЕТ:
    • рПМХЮБЕФ ФЕЛХЭЙК РБТБНЕФТ, ПГЕОЙЧБЕФ Й РТЕПВТБЪХЕФ ЕЗП РП НЕТЕ ОЕПВИПДЙНПУФЙ.
    • рПУЩМБЕФ ЙДЕОФЙЖЙЛБФПТ РМБОБ ДПУФХРБ Й РТЕПВТБЪПЧБООЩЕ ЪОБЮЕОЙС РБТБНЕФТПЧ ОБ УЕТЧЕТ MySQL.
    • чПЪЧТБЭБЕФ МАВЩЕ ПЫЙВЛЙ. ьФП ПЫЙВЛЙ, ЧПЪОЙЛЫЙЕ ЧП ЧТЕНС ЧЩРПМОЕОЙС РТПЗТБННЩ, ФЙРБ SQLSTATE 24000 (Invalid cursor state), Б ФБЛЦЕ УЙОФБЛУЙЮЕУЛЙЕ Й УЕНБОФЙЮЕУЛЙЕ ПЫЙВЛЙ, ЕУМЙ ПОЙ ЕУФШ.

рТЙНЕТ: ЬФПФ РТЙНЕТ ПВЯСУОСЕФ, ЛБЛ РТЙЛМБДОБС РТПЗТБННБ НПЦЕФ ЙУРПМШЪПЧБФШ РПДЗПФПЧМЕООПЕ ЧЩРПМОЕОЙЕ. чЩВПТЛБ ЗПФПЧЙФ ЙОУФТХЛГЙА INSERT Й ЧУФБЧМСЕФ 100 УФТПЛ ДБООЩИ, ЪБНЕОСС ВХЖЕТОЩЕ ЪОБЮЕОЙС. SQLHSTMT hstmt; SQLRETURN retcode; retcode = SQLPrepare(hstmt, «INSERT INTO EMP( >

рТСНПЕ ЧЩРПМОЕОЙЕ РТЕДУФБЧМСЕФ УПВПК УБНЩК РТПУФПК УРПУПВ ЧЩРПМОЙФШ ЙОУФТХЛГЙА. рТСНПЕ ЧЩРПМОЕОЙЕ ПВЩЮОП ЙУРПМШЪХЕФУС ХОЙЧЕТУБМШОЩНЙ РТЙЛМБДОЩНЙ РТПЗТБННБНЙ, ЛПФПТЩЕ ЖПТНЙТХАФ Й ЧЩРПМОСАФ ЙОУФТХЛГЙЙ ЧП ЧТЕНС ЧЩРПМОЕОЙС. оБРТЙНЕТ, УМЕДХАЭЙК ЛПД ЖПТНЙТХЕФ ЙОУФТХЛГЙА SQL Й ЧЩРПМОСЕФ ЕЕ ПДЙО ТБЪ: SQLCHAR *statement; // Build an SQL statement. printf(«enter the SQL statement:»); scanf(«%s»,&statement); // Execute the statement. SQLExecDirect (hstmt, statement, SQL_NTS);

рТЙЛМБДОБС РТПЗТБННБ ДПМЦОБ ЧЩРПМОЙФШ ЙОУФТХЛГЙЙ, ЙУРПМШЪХС ЙНЕООП РТСНПЕ ЧЩРПМОЕОЙЕ, ЕУМЙ:

  • йОУФТХЛГЙС ОХЦОБ ПДОПЛТБФОП.
  • рТЙЛМБДОБС РТПЗТБННБ ОЕ ОХЦДБЕФУС Ч ЙОЖПТНБГЙЙ ПФОПУЙФЕМШОП ОБВПТБ ТЕЪХМШФБФПЧ ДП ЧЩРПМОЕОЙС.

пУОПЧОПК ОЕДПУФБФПЛ ЙУРПМШЪПЧБОЙС РТСНПЗП ЧЩРПМОЕОЙС: ЙОУФТХЛГЙС SQL БОБМЙЪЙТХЕФУС ЛБЦДЩК ТБЪ, ЛПЗДБ ЧЩРПМОСЕФУС.

юФПВЩ ЧЩРПМОЙФШ ЙОУФТХЛГЙА ОЕРПУТЕДУФЧЕООП, РТЙЛМБДОБС РТПЗТБННБ ЧЩРПМОСЕФ УМЕДХАЭЙК ОБВПТ ДЕКУФЧЙК:

  • хУФБОБЧМЙЧБЕФ ЪОБЮЕОЙС МАВЩИ РБТБНЕФТПЧ.
  • чЩЪЩЧБЕФ SQLExecDirect Й РЕТЕДБЕФ УФТПЛХ, УПДЕТЦБЭХА ЙОУФТХЛГЙА SQL.
  • рТЙ ЧЩЪПЧЕ SQLExecDirect ДТБКЧЕТ:
    • йЪНЕОСЕФ ЙОУФТХЛГЙА SQL, ЮФПВЩ ЙУРПМШЪПЧБФШ УЙОФБЛУЙУ MySQL ВЕЪ ФПЗП, ЮФПВЩ БОБМЙЪЙТПЧБФШ ЙОУФТХЛГЙА. ьФП ЧЛМАЮБЕФ ЪБНЕОХ ЧУЕЯ ХРТБЧМСАЭЙИ РПУМЕДПЧБФЕМШОПУФЕК СЪЩЛБ.
    • рПМХЮБЕФ БЛФХБМШОЩК РБТБНЕФТ, ПГЕОЙЧБЕФ ЕЗП Й ЙЪНЕОСЕФ ЙОУФТХЛГЙА SQL, НЕОСС НБТЛЕТЩ РБТБНЕФТБ ОБ ДБООЩЕ У УППФЧЕФУФЧХАЭЙНЙ РТЕПВТБЪПЧБОЙСНЙ.
    • рПУЩМБЕФ ЙЪНЕОЕООХА ЙОУФТХЛГЙА SQL MySQL ДМС ЧЩРПМОЕОЙС.
    • чПЪЧТБЭБЕФ МАВЩЕ ПЫЙВЛЙ. пОЙ ЧЛМАЮБАФ ДЙБЗОПУФЙЛХ ЧЩРПМОЕОЙС, ОБРТЙНЕТ, SQLSTATE 24000 (Invalid cursor state), УЙОФБЛУЙЮЕУЛЙЕ ПЫЙВЛЙ, ФЙРБ SQLSTATE 42000 (Syntax error or access violation) Й УЕНБОФЙЮЕУЛЙЕ ПЫЙВЛЙ, ЧТПДЕ SQLSTATE 42S02 (Base table or view not found).

рТЙНЕТ:
ЬФПФ РТЙНЕТ ПВЯСУОСЕФ, ЛБЛ РТЙЛМБДОБС РТПЗТБННБ НПЦЕФ ЙУРПМШЪПЧБФШ РТСНПЕ ЧЩРПМОЕОЙЕ. пО УПЪДБЕФ ФБВМЙГХ, ЧУФБЧМСЕФ, НПДЙЖЙГЙТХЕФ Й ХДБМСЕФ ОЕЛПФПТЩЕ УФТПЛЙ ДБООЩИ, Б Ч ЪБЛМАЮЕОЙЕ ХДБМСЕФ ЧУА ФБВМЙГХ. SQLHSTMT hstmt; SQLRETURN retcode; /* create table as «my_test» with integer and text field */ retcode = SQLExecDirect(hstmt, «CREATE TABLE my_test( , SQL_NTS); if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)

рБТБНЕФТПН СЧМСЕФУС РЕТЕНЕООБС Ч ЙОУФТХЛГЙЙ SQL. йОУФТХЛГЙС SQL НПЦЕФ УПДЕТЦБФШ НБТЛЕТЩ РБТБНЕФТПЧ (» ? «), ЛПФПТЩЕ ХЛБЪЩЧБАФ ЪОБЮЕОЙС, ЛПФПТЩЕ ДТБКЧЕТ РПМХЮБЕФ ЙЪ РТЙЛМБДОПК РТПЗТБННЩ ЧП ЧТЕНС ЧЩРПМОЕОЙС.

оБРТЙНЕТ, РТЙЛМБДОБС РТПЗТБННБ НПЗМБ ВЩ ЙУРПМШЪПЧБФШ УМЕДХАЭХА ЙОУФТХЛГЙА, ЮФПВЩ ЧУФБЧЙФШ УФТПЛХ ДБООЩИ Ч ФБВМЙГХ EMPLOYEE: INSERT INTO EMPLOYEE (NAME.AGE) VALUES (. )

рТЙЛМБДОБС РТПЗТБННБ НПЦЕФ ЙУРПМШЪПЧБФШ НБТЛЕТЩ РБТБНЕФТПЧ ЧНЕУФП МЙФЕТБМШОЩИ ЙМЙ РПУФПСООЩИ ЪОБЮЕОЙК Ч ЙОУФТХЛГЙЙ SQL РП УМЕДХАЭЙН РТЙЮЙОБН:

  • фТЕВХЕФУС ЧЩРПМОЙФШ ФХ ЦЕ УБНХА РПДЗПФПЧМЕООХА ЙОУФТХЛГЙА ОЕУЛПМШЛП ТБЪ У ТБЪМЙЮОЩНЙ ЪОБЮЕОЙСНЙ РБТБНЕФТБ.
  • ъОБЮЕОЙС РБТБНЕФТБ ОЕЙЪЧЕУФОЩ, ЛПЗДБ ЙОУФТХЛГЙС ЗПФПЧЙФУС.
  • ъОБЮЕОЙС РБТБНЕФТБ ДПМЦОЩ ВЩФШ СЧОП РТЕПВТБЪПЧБОЩ ЙЪ ПДОПЗП ФЙРБ ДБООЩИ Ч ДТХЗПК.

юФПВЩ ХУФБОБЧМЙЧБФШ ЪОБЮЕОЙЕ РБТБНЕФТБ, РТЙЛМБДОБС РТПЗТБННБ РТПУФП ХУФБОБЧМЙЧБЕФ ЪОБЮЕОЙЕ РЕТЕНЕООПК, РТЙЧСЪБООПК Л ЬФПНХ РБТБНЕФТХ, ЙУРПМШЪХС SQLBindParameter. оЕЧБЦОП, ЛПЗДБ ЬФП ЪОБЮЕОЙЕ ХУФБОПЧМЕОП, РПЛБ ЬФП УДЕМБОП РТЕЦДЕ, ЮЕН ЙОУФТХЛГЙС ЧЩРПМОЕОБ. рТЙЛМБДОБС РТПЗТБННБ НПЦЕФ ХУФБОБЧМЙЧБФШ ЪОБЮЕОЙЕ Ч МАВПЕ ЧТЕНС Й НЕОСФШ ЕЗП УФПМШЛП ТБЪ, УЛПМШЛП РПФТЕВХЕФУС.

лПЗДБ ЙОУФТХЛГЙС ЧЩРПМОЕОБ, ДТБКЧЕТ РТПУФП РПМХЮБЕФ БЛФХБМШОПЕ ЪОБЮЕОЙЕ РЕТЕНЕООПК. ьФП ПУПВЕООП РПМЕЪОП, ЛПЗДБ РПДЗПФПЧМЕООБС ЙОУФТХЛГЙС ЧЩРПМОЕОБ ВПМШЫЕ, ЮЕН ПДОБЦДЩ: РТЙЛМБДОБС РТПЗТБННБ ХУФБОБЧМЙЧБЕФ ОПЧЩЕ ЪОБЮЕОЙС ДМС ОЕЛПФПТЩИ ЙМЙ ЧУЕИ РЕТЕНЕООЩИ, ЛБЦДЩК ТБЪ, ЛПЗДБ ЙОУФТХЛГЙС ЧЩРПМОЕОБ.

еУМЙ ВХЖЕТ ДМЙО ЙУРПМШЪПЧБО Ч ЧЩЪПЧЕ SQLBindParameter, ПО ДПМЦЕО ВЩФШ ХУФБОПЧМЕО Ч ПДОП ЙЪ УМЕДХАЭЙИ ЪОБЮЕОЙК РТЕЦДЕ, ЮЕН ЙОУФТХЛГЙС ЧЩРПМОЕОБ:

  • дМЙОБ ДБООЩИ Ч ВБКФБИ Ч УЧСЪБООПК РЕТЕНЕООПК. дТБКЧЕТ РТПЧЕТСЕФ ЬФХ ДМЙОХ ФПМШЛП, ЕУМЙ РЕТЕНЕООБС УЙНЧПМШОБС ЙМЙ ДЧПЙЮОБС (ValueType ТБЧЕО SQL_C_CHAR ЙМЙ SQL_C_BINARY).
  • SQL_NTS. дБООЩЕ СЧМСАФУС УФТПЛПК У ОХМЕЧЩН УЙНЧПМПН Ч ЛПОГЕ.
  • SQL_NULL_DATA. ъОБЮЕОЙЕ ДБООЩИ ТБЧОП NULL, Й ДТБКЧЕТ ЙЗОПТЙТХЕФ ЪОБЮЕОЙЕ УЧСЪБООПК РЕТЕНЕООПК.
  • SQL_DATA_AT_EXEC ЙМЙ ТЕЪХМШФБФ НБЛТПЛПНБОДЩ SQL_LEN_DATA_AT_EXEC. ъОБЮЕОЙЕ РБТБНЕФТБ ДПМЦОП ВЩФШ РПУМБОП У SQLPutData.

тБУРПМПЦЕОЙС РБТБНЕФТПЧ, ЪБДБООЩЕ ЮЕТЕЪ SQLBindParameter, ПУФБОХФУС РТЙЧСЪБООЩНЙ Л НБТЛЕТБН РБТБНЕФТБ ДП ЧЩЪПЧБ SQLFreeStmt ЙЪ РТЙЛМБДОПК РТПЗТБННЩ У ПРГЙЕК SQL_RESET_PARAMS ЙМЙ SQL_DROP. рТЙЛМБДОБС РТПЗТБННБ НПЦЕФ УЧСЪБФШ ОПЧПЕ НЕУФП Ч РБНСФЙ У НБТЛЕТПН РБТБНЕФТБ Ч МАВПЕ ЧТЕНС, ЧЩЪЩЧБС SQLBindParameter. рТЙНЕТ: SQLUINTEGER >

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 НПЦЕФ ЧПЪЧТБЭБФШ ОБНОПЗП ВПМЕЕ ВПЗБФЩК ОБВПТ НЕФБДБООЩИ, ЧЛМАЮБС ЮХЧУФЧЙФЕМШОПУФШ УФПМВГБ Л ТЕЗЙУФТХ, ТБЪНЕТ ПФПВТБЦЕОЙС, ЧПЪНПЦОПУФШ РПЙУЛБ Й ФПНХ РПДПВОПЕ.

юФПВЩ РПМХЮЙФШ УФТПЛХ ДБООЩИ ЙЪ ОБВПТБ ТЕЪХМШФБФПЧ, РТЙЛМБДОБС РТПЗТБННБ:

  • чЩЪЩЧБЕФ SQLBindCol, ЮФПВЩ УЧСЪБФШ УФПМВГЩ ОБВПТБ ТЕЪХМШФБФПЧ У БДТЕУБНЙ Ч РБНСФЙ, ЕУМЙ ЬФП ЕЭЕ ОЕ УДЕМБОП.
  • чЩЪЩЧБЕФ SQLFetch, ЮФПВЩ РЕТЕКФЙ ОБ УМЕДХАЭХА УФТПЛХ Ч ОБВПТЕ ТЕЪХМШФБФПЧ Й РПМХЮЙФШ ДБООЩЕ ДМС ЧУЕИ УФПМВГПЧ.

дБООЩЕ, ЧЩВТБООЩЕ ЙЪ УЕТЧЕТБ MySQL, ЧПЪЧТБЭЕОЩ РТЙЛМБДОПК РТПЗТБННЕ ДТБКЧЕТПН Ч РЕТЕНЕООЩИ, ЛПФПТЩЕ РТЙЛМБДОБС РТПЗТБННБ ТБУРТЕДЕМЙМБ ДМС ЬФПК ГЕМЙ. рТЕЦДЕ, ЮЕН ЬФП НПЦЕФ ВЩФШ ЧЩРПМОЕОП, РТЙЛМБДОБС РТПЗТБННБ ДПМЦОБ УЧСЪБФШ ЬФЙ РЕТЕНЕООЩЕ УП УФПМВГБНЙ ОБВПТБ ТЕЪХМШФБФПЧ, ЙУРПМШЪХС SQLBindCol.

рТЙЛМБДОЩЕ РТПЗТБННЩ НПЗХФ УЧСЪБФШ УФПМШЛП УФПМВГПЧ ОБВПТБ ТЕЪХМШФБФПЧ, УЛПМШЛП УПЮФХФ ОХЦОЩН. лПЗДБ УФТПЛБ ДБООЩИ ЧЩВТБОБ, ДТБКЧЕТ ЧПЪЧТБЭБЕФ ДБООЩЕ ДМС УЧСЪБООЩИ УФПМВГПЧ РТЙЛМБДОПК РТПЗТБННЕ. дБООЩЕ НПЗХФ ВЩФШ ЧЩВТБОЩ Й ЙЪ ОЕУЧСЪБООЩИ УФПМВГПЧ, ЧЩЪЩЧБС SQLGetData. ьФП ПВЩЮОП ДЕМБЕФУС, ЮФПВЩ РПМХЮЙФШ ДМЙООЩЕ ДБООЩЕ, ЛПФПТЩЕ ЮБУФП РТЕЧЩЫБАФ ДМЙОХ ПДЙОПЮОПЗП ВХЖЕТБ, Й ДПМЦОЩ ВЩФШ РПМХЮЕОЩ РП ЮБУФСН.

рЕТЕНЕООБС ПУФБЕФУС УЧСЪБООПК УП УФПМВГПН ДП ФЕИ РПТ, РПЛБ УФПМВЕГ ОЕ ВХДЕФ ПФЧСЪБО СЧОП ЧЩЪПЧПН SQLBindCol У ХЛБЪБФЕМЕН null Ч ЛБЮЕУФЧЕ БДТЕУБ РЕТЕНЕООПК, ЙМЙ РПЛБ ОЕ ЧЩЪЧБОБ ЖХОЛГЙС SQLFreeStmt У ПРГЙЕК SQL_UNBIND.

лХТУПТ РТЕДУФБЧМСЕФ УПВПК ЙОУФТХНЕОФ, ЛПФПТЩК РПЪЧПМСЕФ чБН РПУФТПЮОП РТПИПДЙФШ ЮЕТЕЪ ОБВПТ ТЕЪХМШФБФПЧ. рТЙЛМБДОЩЕ РТПЗТБННЩ НПЗХФ ЧЩРПМОСФШ НОПЗП ДЕКУФЧЙК ОБ ЛБЦДПК ЙОДЙЧЙДХБМШОПК УФТПЛЕ Ч ДБООПН ОБВПТЕ ТЕЪХМШФБФПЧ. лХТУПТ ПФЛТЩФ ОБ ОБВПТЕ ТЕЪХМШФБФПЧ ЧЩРПМОЕОЙЕН ЪБРТПУБ. лХТУПТ Ч ОБВПТЕ ТЕЪХМШФБФПЧ ХЛБЪЩЧБЕФ ФЕЛХЭХА (БЛФХБМШОХА) РПЪЙГЙА Й ФП, ЛБЛБС УФТПЛБ ВХДЕФ ЧПЪЧТБЭЕОБ.

MyODBC РПДДЕТЦЙЧБЕФ ТБВПФХ У ДЧХНС ФЙРБНЙ ЛХТУПТПЧ, Б ЙНЕООП У ВМПЮОЩН Й УП УЛТПММЙТХЕНЩН .

рТЙЛМБДОБС РТПЗТБННБ НПЦЕФ ЧЩВЙТБФШ НОПЗП УФТПЛ ДБООЩИ, ЙУРПМШЪХС ПДОХ ЙОУФТХЛГЙА ЧЩВПТЛЙ ЮЕТЕЪ ВМПЮОЩК ЛХТУПТ. уФТПЛЙ, ЧПЪЧТБЭЕООЩЕ Ч ПДЙОПЮОПК ЧЩВПТЛЕ У ВМПЮОЩН ЛХТУПТПН, ОБЪЧБОЩ rowset. чБЦОП ОЕ РХФБФШ rowset У ОБВПТПН ТЕЪХМШФБФПЧ. оБВПТ ТЕЪХМШФБФПЧ РПДДЕТЦЙЧБЕФУС УЕТЧЕТПН MySQL, Ч ФП ЧТЕНС ЛБЛ rowset РПДДЕТЦЙЧБЕФУС ДТБКЧЕТПН Ч ВХЖЕТБИ РТЙЛМБДОЩИ РТПЗТБНН. ч ФП ЧТЕНС ЛБЛ ОБВПТ ТЕЪХМШФБФПЧ ЖЙЛУЙТПЧБО, rowset НЕОСЕФ РПЪЙГЙА Й ХДПЧМЕФЧПТСЕФ ЛБЦДЩК ТБЪ ОПЧПНХ ОБВПТХ УФТПЛ. рТЙЛМБДОБС РТПЗТБННБ ХУФБОБЧМЙЧБЕФ ТБЪНЕТ rowset, ЙУРПМШЪХС SQLSetStmtAttr У ПРГЙЕК SQL_ATTR_ROW_ARRAY_SIZE.

MyODBC 3.51 ФТЙ ФЙРБ УЛТПММЙТХЕНЩИ ЛХТУПТПЧ, ЙУРПМШЪХС ЛПФПТЩЕ РТЙЛМБДОБС РТПЗТБННБ НПЦЕФ ДЧЙЗБФШУС Ч ОБВПТЕ ТЕЪХМШФБФПЧ:

  • фПМШЛП ЧРЕТЕД
  • уФБФЙЮЕУЛЙК
  • дЙОБНЙЮЕУЛЙК (ФПМШЛП ДМС MyODBC 3.51.01 Й ЧЩЫЕ)

юФПВЩ ТБВПФБФШ У ДЙОБНЙЮЕУЛЙН ЛХТУПТПН, ОБДП РТПЧЕТЙФШ ПРГЙА «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
  • чЩРПМОЕОЙЕН РПЪЙГЙПООЩИ ЛПНБОД SQL, ЙУРПМШЪХС SQLExecute ЙМЙ SQLExecDirect .

юФПВЩ ЙУРПМШЪПЧБФШ РПЪЙГЙПООПЕ ХДБМЕОЙЕ ЙМЙ НПДЙЖЙЛБГЙА, РТЙЛМБДОБС РТПЗТБННБ ДПМЦОБ:

  • хУФБОПЧЙФШ ЙНС ЛХТУПТБ, ЧЩЪЩЧБС SQLSetCursorName. еУМЙ РТЙЛМБДОБС РТПЗТБННБ ОЕ ХУФБОПЧЙМБ ЙНС ЛХТУПТБ СЧОП, ФП ДТБКЧЕТ ЧПЪЧТБЭБЕФ ЪБДБООПЕ РП ХНПМЮБОЙА ЙНС ЛХТУПТБ.
  • пФЛТЩФШ ОБВПТ ТЕЪХМШФБФПЧ ЙОУФТХЛГЙЕК SELECT.
  • хУФБОПЧЙФШ ЛХТУПТ Ч УФТПЛХ, ЛПФПТХА ОХЦОП НПДЙЖЙГЙТПЧБФШ ЙМЙ ХДБМЙФШ. рТЙЛМБДОБС РТПЗТБННБ НПЦЕФ ДЕМБФШ ЬФП, ЧЩЪЩЧБС SQLFetchScroll (ЙМЙ SQLExtendedFetch Ч УМХЮБЕ MyODBC 2.50), ЮФПВЩ РПМХЮЙФШ rowset, УПДЕТЦБЭЙК ФТЕВХЕНХА УФТПЛХ, Й ЧЩЪЩЧБС SQLSetPos У SQL_POSITION, ЮФПВЩ ХУФБОПЧЙФШ ЛХТУПТ Ч ЬФХ УФТПЛХ Ч ТБНЛБИ rowset.
  • рПМХЮЙФШ ЙНС ЛХТУПТБ, ЧЩЪЩЧБС SQLGetCursorName. пВТБФЙФЕ ЧОЙНБОЙЕ, ЮФП, ЕУМЙ РТЙЛМБДОБС РТПЗТБННБ ОЕ ХУФБОБЧМЙЧБЕФ ЙНС ЛХТУПТБ СЧОП РЕТЕД ПФЛТЩФЙЕН ОБВПТБ ТЕЪХМШФБФПЧ Ч ФПН ЦЕ УБНПН ПРЕТБФПТОПН ДЕУЛТЙРФПТЕ ЮЕТЕЪ ЧЩЪПЧ ЖХОЛГЙЙ SQLSetCursorName, ДТБКЧЕТ ЧПЪЧТБЭБЕФ ЪБДБООПЕ РП ХНПМЮБОЙА ЙНС ЛХТУПТБ.
  • рТЙЛМБДОБС РТПЗТБННБ ЧЩРПМОСЕФ РПЪЙГЙПООХА ЙОУФТХЛГЙА ОБ ДТХЗПН ПРЕТБФПТОПН ДЕУЛТЙРФПТЕ, ЮЕН ФПФ, ЛПФПТЩК ЙУРПМШЪХЕФУС ОБВПТПН ТЕЪХМШФБФПЧ.

уЙОФБЛУЙУ ЬФЙИ ЙОУФТХЛГЙК: UPDATE table-name SET column- >

ъДЕУШ 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, РТЙЛМБДОБС РТПЗТБННБ ДЕМБЕФ УМЕДХАЭЕЕ:

  • рПНЕЭБЕФ ОПЧЩЕ ЪОБЮЕОЙС ДБООЩИ Ч ВХЖЕТБ rowset.
  • хУФБОБЧМЙЧБЕФ ЪОБЮЕОЙЕ Ч ВХЖЕТЕ ДМЙО ЛБЦДПЗП УФПМВГБ РП НЕТЕ ОЕПВИПДЙНПУФЙ. ьФП ВБКФ ДМЙОЩ ДБООЩИ ЙМЙ SQL_NTS ДМС УФПМВГПЧ, УЧСЪБООЩИ УП УФТПЛПЧЩНЙ ВХЖЕТБНЙ, ЙМЙ SQL_NULL_DATA ДМС МАВЩИ УФПМВГПЧ, ЛПФПТЩЕ ВХДХФ ХУФБОПЧМЕОЩ Ч NULL.
  • чЩЪЩЧБЕФ SQLSetPos У РБТБНЕФТПН Operation ХУФБОПЧМЕООЩН Ч SQL_UPDATE Й RowNumber ТБЧОЩН ЮЙУМХ УФТПЛ ДМС ПВОПЧМЕОЙС. нБМЕОШЛБС ИЙФТПУФШ: ЕУМЙ RowNumber ТБЧЕО 0, ПРЕТБГЙС ВХДЕФ РТЙНЕОСФШУС Л ЛБЦДПК УФТПЛЕ Ч rowset.

рПУМЕ ЪБЧЕТЫЕОЙС 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.

рТЙНЕТ:
РТЙЛМБДОБС РТПЗТБННБ ДЕМБЕФ УМЕДХАЭЙК ОБВПТ ПРЕТБГЙК, ЮФПВЩ РПЛБЪБФШ ФТБОЪБЛГЙПООПЕ РПЧЕДЕОЙЕ:

  • уПЪДБЕФ ФБВМЙГХ ФЙРБ BDB ЙМЙ ФЙРБ InnoDB.
  • чЩЛМАЮБЕФ ТЕЦЙН AUTOCOMMIT.
  • чУФБЧМСЕФ УФТПЛХ ДБООЩИ Й ЪБЧЕТЫБЕФ ФТБОЪБЛГЙА.
  • чУФБЧМСЕФ ЧФПТХА УФТПЛХ ДБООЩИ Й ПФНЕОСЕФ ЬФХ ФТБОЪБЛГЙА.
  • фЕРЕТШ чЩ ДПМЦОЩ ЧЙДЕФШ ФПМШЛП ПДОХ (РЕТЧХА) УФТПЛХ ДБООЩИ Ч ФБВМЙГЕ.

чЩ НПЦЕФЕ РПРТПВПЧБФШ УДЕМБФШ ФП ЦЕ УБНПЕ У 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); >>

odbc_exec

(PHP 3>= 3.0.6, PHP 4)

odbc_exec — готовит и выполняет SQL-оператор.

Описание

resource odbc_exec (resource connection_id, string query_string)

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

odbc_exec() отправляет SQL-оператор серверу БД, специфицированному параметром connection_id . Этот параметр обязан быть правильным идентификатором, возвращённым функцией odbc_connect() или odbc_pconnect() .

См. также в odbc_prepare() и odbc_execute() множественное выполнение SQL-операторов.

Подключить PHP к MSSQL через PDO ODBC

Когда я выполняю этот код:

В нем говорится, что у меня есть драйвер odbc .

Однако, когда я пытаюсь использовать его так:

Он ничего не делает — никаких ошибок и не работает вообще. Он даже не выполнит эту строку!

Как я могу подключить PHP к этой базе данных MSSQL через PDO и ODBC?

Существует несколько конфигурационных файлов, которые необходимо настроить. /etc/odbc.ini , /etc/odbcinst.ini и /etc/freetds/freetds.conf (эти местоположения действительны для Ubuntu 12.04 и, вероятно, исправлены для большинства * nixes).

Вам нужно установить unixodbc и freetds (не уверен, что имена пакетов находятся в CentOS). В Ubuntu это будет apt-get install unixodbc tdsodbc .

Для помощи в установке этих вопросов, посмотрите на этот вопрос Невозможно установить FreeTDS через диспетчер пакетов Yum

/etc/odbc.ini(этот файл может быть пустым)

/etc/freetds/freetds.conf(или вы можете найти его на /etc/freetds.conf)

Возможно, вам придется изменить строку tds version = 7.1 выше в зависимости от вашей версии MSSQL.

Вам придется перезапустить apache после внесения этих изменений.

В вашем PHP-коде вы создадите свой объект PDO следующим образом:

Обратите внимание, что ваше имя пользователя может быть в формате: domain\username .

Кроме того, вы будете знать, что это сработало, если вы выполняете phpinfo() на своей странице и выполняете поиск «freetds», в котором будет показан раздел mssql с freetds, перечисленными как версия библиотеки.

Илон Маск рекомендует:  linear-gradient() в CSS
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL