После использования функции mysql_query() с запросом SELECT или любым другим запросом, возвращающим данные для обработки результирующего набора, возвращенного запросом, для сохранения результата его работы в какой-либо переменной и дальнейшей обработки, можно воспользоваться функцией mysql_store_result() .
Листинг 19.14.
/* получить результат */
result = mysql_store_result(&mysql);
Вызов функции mysql_store_result() с дескриптором соединения MySQL, дает полный результирующий набор, возвращенный последним запросом, и сохраняет его в структуре MYSQL_RES. Затем эту структуру можно обработать с помощью функций MySQL, предназначенных для выборки и обработки отдельных записей и полей, их составляющих.
Когда размер не играет никакой роли
Функция mysql_store_result() производит выборку всего результирующего набора запроса с сервера и сохраняет результат в памяти компьютера клиента. Если такой вариант неприемлем, т.к. в качестве клиентского компьютера используется компьютер с незначительными объемами оперативной памяти, можно воспользоваться функцией mysql_use_result(), которая делает построчную выборку. Таким образом, вполне реально снизить расход памяти на компьютере клиента, т.к. при этом потребуется память для сохранения только одной строки (плюс буфер соединения), а не память под весь результирующий набор.
Так как функции mysql_store_result() и mysql_use_result() обрабатывают только результирующие наборы, не имеет никакого смысла вызывать эти функции для обработки таких операторов SQL, которые не возвращают никаких данных (операторы UPDATE или INSERT). Хотя в этом случае ничего страшного не случится, т.к. обе функции возвращают значение NULL.
Если при чтении результирующего набора, возвращенного функцией mysql_query(), никаких ошибок не возникает, функция mysql_store_result() возвращает значение NULL. Поэтому при работе с запросами SELECT, перед тем как продолжать обработку результирующего набора, целесообразно проверять возвращаемое этой функцией значение. Об этом свидетельствует следующий фрагмент.
Листинг 19.15.
/* проверка ошибок при чтении результирующего набора */ if (!(result =mysql_store_result(&mysql)))
{
fprintf(stderr, "При чтении результирующего набора произошла ошибка n");
exit();
}
После выполнения оператора SELECT и успешного получения результирующего набора, следующим и основным шагом будет обработка полученных данных, которая состоит в определении количества записей и полей в возвращенном результирующем наборе. Для этого служат функции mysql_num_rows() и mysql_num_fields() .
Листинг 19.16.
#include <stdio.h> #include <mysql.h> int main ()
{
/* объявить структуры данных и переменные */ MYSQL mysql; MYSQL_RES *result;
/* инициализировать структуру MYSQL */
mysql_init(&mysql);
/* подключиться к базе данных */
if (!(mysql_real_connect(&mysql, "localhost", "john", "doe",
"db1", 0, NULL, 0)))
{
fprintf(stderr, " Ошибка соединения: %sn", mysql_error(&mysql)) exit();
}
/* выполнить запрос */
if (mysql_query (&mysql, "SELECT title, author FROM books") != 0)
{
fprintf(stderr, " Ошибка в запросе: %sn", mysql_error(&mysql)); exit();
}
/* проверка правильности результирующего набора */
{
if (!(result = mysql_store_result(&mysql))
{
fprintf (stderr, " Ошибка при чтении результирующего набора: %sn", mysql_error (&mysql): exit();
}
else
{
/* если набор правильный */
/* просмотр строки и распечатка содержимого */ int numRecords = mysql_num_rows(result); int numFields = mysql_num_fields(result);
fprintf(stdout, " Запрос дал результат %d rowsn", numRecords); fprintf(stdout, "Каждая запись содержит %d полей n", num-
Fields);
}
mysql_free_result(result);
}
/* очистка */ mysql_close(&mysql);
При успешном выполнении запроса создается структура MYSQL_RES. Это можно проверить с помощью функций mysql_num_rows() и mysql_num_fields() при определении количества строк и столбцов.
Определив количество строк и полей, для получения содержимого каждой строки в результирующем наборе, можно использовать функцию mysql_fetch_row() . Функция mysql_fetch_row() возвращает специальную структуру MYSQL_ROW, которая является индексированным массивом, представляющим поля в каждой строке. Поэтому становится возможным доступ к содержимому определенного поля как к соответствующему элементу массива.
ТОП-10 популярных
Для работы с вещественными числами в MySQL предусмотрено три типа данных - это типы FLOAT, DOUBLE, DECIMAL. Числовой тип FLOAT...
БОЛЬШЕ БОЛЬШИХ LCD-мониторов
Процесс вытеснения с рынка мониторов с электронно-лучевой трубкой (CRT) продолжается. О смещении акцентов в пользу LCD-мониторов теперь заявляют даже те...
Процесс вытеснения с рынка мониторов с электронно-лучевой трубкой (CRT) продолжается. О смещении акцентов в пользу LCD-мониторов теперь заявляют даже те...
Больше больших LCD-мониторов
Процесс вытеснения с рынка мониторов с электронно-лучевой трубкой (CRT) продолжается. О смещении акцентов в пользу LCD-мониторов теперь заявляют даже те...
Процесс вытеснения с рынка мониторов с электронно-лучевой трубкой (CRT) продолжается. О смещении акцентов в пользу LCD-мониторов теперь заявляют даже те...
НОУТБУК с блестящим экраном
Eсли выпустившая ноутбук фирма предлагает его в качестве «замены настольному ПК», то это должно подразумевать под собой нечто большее, чем...
Eсли выпустившая ноутбук фирма предлагает его в качестве «замены настольному ПК», то это должно подразумевать под собой нечто большее, чем...
Иди и пиши. TravelMate C100
Планшетный компьютер платформы Tablet PC обязан в первую очередь быть легким, способным достаточно долго работать без подзарядки батарей. Эти требования...
Планшетный компьютер платформы Tablet PC обязан в первую очередь быть легким, способным достаточно долго работать без подзарядки батарей. Эти требования...
Магнито-оптический дисковод DynaMO
Cейчас, когда традиционные флоппи-дисководы на долгие годы замерли в своем развитии, поиск альтернативных носителей продолжается, и ситуация, казалось бы, разрешилась...
Cейчас, когда традиционные флоппи-дисководы на долгие годы замерли в своем развитии, поиск альтернативных носителей продолжается, и ситуация, казалось бы, разрешилась...
Компьютер для гурманов.«Эксимер ДМ»
Российская компания «Эксимер ДМ», известная как производитель настольных компьютеров, рабочих станций, серверов и ноутбуков, выступила техническим спонсором проведения торжеств, посвященных...
Российская компания «Эксимер ДМ», известная как производитель настольных компьютеров, рабочих станций, серверов и ноутбуков, выступила техническим спонсором проведения торжеств, посвященных...
Для длинных строк, т.е. строк длиннее 255 символов, в MySQL предусмотрены типы BLOB (Binary Large Object, большой двоичный объект) и...
В дополнение к календарным типам, предназначенным для хранения даты и времени отдельно, MySQL также поддерживает гибридные типы данных DATETIME и...
Вообще, к изменению настроек сервера прибегают очень редко. В MySQL программа заранее настроена так, чтобы соответствовать самым распространенным и основным...
Все о MySQL. Обработка результирующего набора
28-12-2009
<< Предыдущая статья | Следующая статья >> |
Все о MySQL. Выполнение запроса | Все о MySQL. Обработка результирующего набора. Часть Вторая. |