Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

MySQL. Библиотека профессионала - Аткинсон Л

..pdf
Скачиваний:
166
Добавлен:
24.05.2014
Размер:
10.41 Mб
Скачать

КЛИЕНТОВ MYSQL

части рассматриваются вопросы написания приложений, взаимодействующих с сервером MySQL. Для этих целей в MySQL есть базовая библиотека функций языка С. Модули других языков

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

В главе 16, "Использование библиотеки языка С", рассматривается цедура написания приложений, непосредственно работающих с функциями языка С. В главе 17, рассказывается о программировании

ний на языке с использованием интерфейсаJDBC. В главе 18, "VBScript и ODBC", описывается процесс создания с применением технологии ASP и интерфейса ODBC. В главе 19, речь идет о созда нии на языке РНР. В главе 20, рассматриваются язык Perl и библиотека DBI. В главе "Python", описываются язык Python и его модуль В главе 22, "Библиотека описывается лиотекафункций языкаC++, котораяназывается

ИСПОЛЬЗОВАНИЕ

БИБЛИОТЕКИ ЯЗЫКА С

этой

Подготовка программы Извлечение данных Изменение

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

ния и компиляции таких программ. Программы для MySQLможно компилировать в большинстве версий UNIX и Windows.

Функции библиотеки языка С рассматривались в главе 15, функций языка

Подготовка программы

работе с клиентской библиотекой MySQL необходимо включить в программу файл а затем подключить файл библиотеки на этапе компоновки. Файлы за головков обычно находятся в каталоге а ные в каталоге Для подключения библиотеки ука жите в командной строке компилятора ключ

Если компилятор не находит файлы заголовков, воспользуйтесь опцией а если не найден файл библиотеки — опцией L. Ниже показана команда компиляции тестового клиента в системе, где программа MySQL инсталлированав стандартные каталоги.

дсс о Imysqlclient

Естественно, в более сложных случаях необходимо создавать

 

В Windows файл

lib представляет собой оболочку динамической

 

теки

Статическаяверсия библиотекиназывается

lib.

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

ходимо освободить память с помощью функции

Со структурой

MYSQL работают многие функции библиотеки языкаС.

 

376 Глава Использование библиотеки языка С

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

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

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

#include <stdio.h>

char

MYSQL

Инициализация соединения.

Подключение к Сазе данных со стандартными установками.

NULL, NULL, NULL, NULL, 0, NULL,

Закрытие соединения.

Извлечение данных

После к серверу можно посылать ему запросы с помощью функций mysql_query и mysql_send_query Первая из них определяет длину переданной ей строки запроса с помощью функции поэтому в запрос не могут входить строки, содержащие символы NUL (ASCII код О). Это ограничение легко обойти. Достаточно вызвать функцию string которая защитит все специальные символы от интерпретации.

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

Извлечение данных 377

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

Инструкция SELECT и ряд других инструкций, в частности SHOW PROCESSLIST, возвращают результаты запроса в виде набора записей. Клиент может поместить весь набор в буфер или извлекать по одной записи за раз.Работа с буфером ведется чуть быстрее, но необходимо иметь достаточный объем памяти, чтобы занести в буфер все записи. Функция mysql_store_result помещает результаты запроса в буфер, а функция mysql_use_result подготавливает программу к режиму небуферизо ванного чтения.

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

Функция

позволяет определить число записей в наборе, но в

большинстве случаев просто вызывают функцию

etch_row

до тех пор,

пока она не

вернет значение NULL. Если при

последующем вызове функции

возвращается нуль, значит, достигнут конец набора записей.

В листинге 16.2 показана простая программа, которая извлекает данные из табли цы user. Обратите внимание на то, что программа пытается подключиться к серверу от имени пользователя root с явно неправильным паролем. Если будете эксперимен тировать с этой программой, подставьте корректные значения имени пользователя и пароля.

<stdio.h>

char

MYSQL

MYSQL_RES row;

Инициализация

"Unable to initialize MYSQL

378 Глава Использование библиотеки языка С

Подключение к базе

"root", "password",

NULL,

Передача запроса серверу.

"SELECT User, Host FROM user ORDER BY

Запрос завершился

else

Занесение результатов в буфер, подсчет числа полей.

result =

lengths

0; i++)

row[i] row[i]

Освобождение буфера.

Закрытие соединения.

данных

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

Вцикле while из таблицы результатов последовательно извлекаются записи.

Функция etch_lengths определяет размерность каждого столбца. Это не та размерность, которая указана в определении столбца, а реальная длина строки, со

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

Вцикле for функция отображает значение каждой ячейки. Обратите внимание на спецификацию в строке формата. Она заставляет функцию искать в списке аргументов целое число, задающее размерность строкового аргумента. Благо даря этому пропадаетнеобходимостьзавершатькаждуюстрокусимволом NUL.

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

которая начинается с символа NUL, а функция etch_lengths сообщает о том, что длина такой строки равна нулю. Если же столбец содержит значение NULL, то в массиве будет находиться пустой указатель. С помощью оператора такому указа телю ставится в соответствие строка

Изменение данных

Запросы на вставку или обновление данных не возвращают наборы записей. Они тоже выполняются с помощью функции mys ql_query но вызывать функцию нет необходимости. Если требуется узнать число добавлен ных или измененных записей, воспользуйтесь функцией ected_rows (листинг 16.3).

#include <stdio.h>

char

MYSQL

char

380 Глава Использование библиотеки языка С

Вставляемые

const char

 

 

"Leon",

"Vicky", "Carl", "Ricky",

"Jeff",

"Bob",

"Tina", "Joey"

 

rows

Запросы.

const char *query_create "CREATE TABLE (\

ID NOT NULL AUTO_INCREMENT, \ Name \

PRIMARY

const char *query_insert

"INSERT INTO testapi (Name) VALUES

const char *query_delete

"DELETE FROM testapi WHERE ID

 

const char

 

"UPDATE testapi SET Name

WHERE

const char *query_drop "DROP TABLE testapi";

Инициализация соединения.

"Unable to initialize MYSQL exit

Подключение к базе данных.

NULL, NULL,

"test", 0, NULL,

Создание таблицы.

Запрос завершился

Изменение данных

"Could not create

Вставка записей.

i++)

query_insert,

Запрос завершился

"Could not insert query,

row

Удаление записей.

Запрос завершился

"Could not delete

rows

Обновление

Запрос завершился

"Could not update