Программирование >>  Создание клиентов mysql 

1 ... 118 119 120 [ 121 ] 122 123 124 ... 201



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

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

Инструкция SELECT и ряд других инструкций, в частности SHOW PROCESSLIST, возвращают результаты запроса в виде набора записей. Клиент может поместить весь набор в буфер или извлекать по одной записи за раз.Работа с буфером ведется чуть быстрее, но необходимо иметь достаточный объем памяти, чтобы занести в буфер все записи. Функция mysql store resulM) помещает результаты запроса в буфер, а функция mysql use result {) подготавливает программу к режиму небуферизо-ванного чтения.

В любом случае отдельные записи извлекаются с помощью функции fetch row(). За один вызов возвращается одна запись. Тип записи - MYSQL ROW. Это системно-независимое представление строки таблицы. Если записи находятся в буфере, можно воспользоваться функцией mysql data seek () для перехода к произвольной записи. В режиме небуферизованного чтения менять внутренний указатель записей нельзя.

Функция iuysql num rows () позволяет определить число записей в наборе, но в большинстве случаев просто вызывают функции ql fetch roW) до тех пор, пока она не вернет значение NULL. Если при последующем вызове функции mysql errno () возвращается нуль, значит, достигнут конец набора записей.

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

#include <stdio.h>

#include <mysql/mysql.h>

int main(int argc, char *argv[]) {

MYSQL mysql; MYSQL RES *result; MYSQL ROW row;

uint num fields, i; ulong *lengths;

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

if(!mysql init(Smysql)) {

fprintf(stderr, Unable to initialize MYSQL struct!\n ); exit ();



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

if(!mysql real connect(&mysql, localhost , root , password ,

mysql , Ov null, 0))

fprintf(stderr, %d: %s\n , mysql errno(fimysql), mysql error(Smysql));

exit 0 ;

if (mysql query(smysql,

SELECT User, Host FROM user ORDER BY 1,2 ))

fprintf(stderr, %d: %s\n , mysql errno(Smysql), mySql error(smysql));

else

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

result = mysql store result(Smysql); num fields = mysql num fields(result);

while(row = mysql fetch row(result)) { - -

lengths - mysql fetch lengths(result); for(i - 0,- i < num fields; i++)

printf( [%.*s3 , (int) lengths[i],

row[i] ? row[i] : NULL );

printf( \n );

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

mysql free result(result);

mysql close (Smysql) ;

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

** Запрос завершился неудачей!

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







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

Остановимся на том фрагменте программы, где результаты запроса заносятся в буфер. В принципе, заранее известно, что таблица результатов содержит два столбца, но программа написана таким образом, что могут обрабатываться результаты произвольной инструкции SELECT. Определив с помощью функции mysql nmn fields () число столбцов, мы получаем возможность в цикле пройти по каждому полю каждой записи. Запись представляет собой массив полей, нумерация которых начинается с нуля. Если необходимо определить типы полей, воспользуйтесь функцией mysql fetch fields (), mysql fetch field{} либomysql fetch field direct ().

В цикле while из таблицы результатов последовательно извлекаются записи. Функция mysql fetch lengths {) определяет размерность каждого столбца. Это не та размерность, которая указана в определении столбца, а реальная длина строки, содержащейся в соответствующей ячейке. Функция mysql fetch lengths {) чрезвычайно удобна, поскольку с помощью функции strlen {) нельзя определять длину двоичных строк.

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

Запись, возвращаемая функцией mysql fetch row {), представжет собой массив указателей на строки. В случае пустой строки элемент массива ссылается на строку, которая начинается с символа NLJL, а функция mysql fetch lengths (} сообщает о том, что длина такой строки равна нулю. Если же столбец содержит значение NULL, то в массиве будет находиться пустой указатель. С помощью оператора ? такому указателю ставится в соответствие строка NULL .

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

Запросы на вставку или обновление данных не возвращают наборы записей. Они тоже выполняются с помощью функции mys ql query {), но вызывать функцию mysql store result () нет необходимости. Если требуется узнать число добавленных или измененных записей, воспользуйтесь функцией mysql affected rows (} (листинг 16.3).

#include <stdio.h>

#include <mysql/mysql,h>

int main(int argc, char *argv[]) {

MYSQL mysql; MYSQL RES *result; MYSQL ROW row;

uint i;

char query[4096];




1 ... 118 119 120 [ 121 ] 122 123 124 ... 201

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика