Чтение онлайн

на главную - закладки

Жанры

Основы программирования в Linux
Шрифт:
Операторы, возвращающие данные

Основное назначение языка — конечно, извлечение данных, а не их добавление или обновление. Данные извлекаются с помощью оператора

SELECT
.

Примечание

MySQL также поддерживает SQL-операторы

SHOW
,
DESCRIBE
и
EXPLAIN
, предназначенные для возврата результатов, но мы не собираемся рассматривать их в данной книге. Как обычно, в руководстве можно найти описание этих операторов.

Получение данных в вашем приложении на языке С обычно будет включать

четыре шага:

1. Выполнение запроса.

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

3. Обработка этих данных.

4. Наведение порядка при необходимости.

Так же, как в случае операторов

INSERT
и
DELETE
, вы воспользуетесь функцией
mysql_query
для отправки SQL-запроса. Далее вы извлечете данные о помощью функций
mysql_store_result
или
mysql_use_result
в зависимости от того, как хотите получить данные. Затем будет применена последовательность вызовов функции
mysql_fetch_row
для обработки данных. И наконец, вы используете функцию
mysql_free_result
для очистки памяти, которая применялась для выполнения вашего запроса.

Разница между функциями

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

Функции для извлечения всех данных сразу

Вы сможете извлечь в единственном вызове все данные из оператора

SELECT
(или другого оператора, возвращающего данные), применяя функцию
mysql_store_result
:

MYSQL_RES *mysql_store_result(MYSQL* connection);

Ясно, что вам понадобится эта функция после успешного вызова функции

mysql_query
. Она немедленно сохранит все возвращенные данные в клиентской части. Функция вернет указатель на новую структуру, называемую структурой результирующего набора, или
NULL
, если оператор завершился аварийно.

В случае успеха вы далее вызываете функцию

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

my_ulonglong mysql_num_rows(MYSQL_RES* result);

Эта функция принимает в качестве параметра структуру с результатом, возвращенную

mysql_store_result
, и возвращает количество строк в данном результирующем наборе. Если функция
mysql_store_result
завершилась успешно, функция
mysql_num_rows
также завершится успешно.

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

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

mysql_use_result
.

Теперь,

когда у вас есть данные, можно обработать их с помощью функции
mysql_fetch_row
и перемещаться по набору, используя функции
mysql_data_seek
,
mysql_row_seek
и
mysql_row_tell
. Давайте рассмотрим их.

 Функция

mysql_fetch_row
извлекает одну строку из структуры типа
result
, которую вы получили с помощью функции
mysql_store_result
, и помещает ее структуру
row
. Когда данные иссякли или возникла ошибка, возвращается
NULL
. В следующем разделе мы вернемся к обработке данных в структуре типа
row
.

MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);

 Функция

mysql_data_seek
позволяет перемещаться в результирующем наборе, задавая строку, которая будет возвращена при следующем вызове функции
mysql_fetch_row
. Значение
offset
— номер строки в диапазоне от нуля до общего количества строк в результирующем наборе, уменьшенного на единицу. Передача нулевого значения вызовет возврат первой строки при следующем вызове функции
mysql_fetch_row
.

void mysql_data_seek(MYSQL_RES *result, my_ulonglong offset);

 Функция

mysql_row_tell
возвращает величину смещения, обозначая текущую позицию в результирующем наборе. Это не номер строки и его нельзя использовать в функции
mysql_data_seek
.

MSSQL_ROW_OFFSET mysql_row_tell(MYSQL_RES *result);

Но ее можно применять с функцией

MYSQL_ROW_OFFSET mysql_row_seek(MYSQL_RES *result,

 MYSQL_ROW_OFFSET offset);

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

Примечание

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

row_tell
и
row_seek
со значением смещения, применяемым в функции
data_seek
. Иначе ваши результаты будут непредсказуемыми.

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

mysql_free_result
, позволяющую библиотеке MySQL навести после себя порядок.

void mysql_free_result(MYSQL_RES *result);

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

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

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

Поделиться:
Популярные книги

Я снова граф. Книга XI

Дрейк Сириус
11. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Я снова граф. Книга XI

Третий Генерал: Том VI

Зот Бакалавр
5. Третий Генерал
Фантастика:
городское фэнтези
аниме
сказочная фантастика
попаданцы
гаремник
5.00
рейтинг книги
Третий Генерал: Том VI

Ученик. Книга 4

Первухин Андрей Евгеньевич
4. Ученик
Фантастика:
фэнтези
5.67
рейтинг книги
Ученик. Книга 4

Герой

Бубела Олег Николаевич
4. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.26
рейтинг книги
Герой

Вперед в прошлое 7

Ратманов Денис
7. Вперед в прошлое
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Вперед в прошлое 7

Печать Пожирателя 3

Соломенный Илья
3. Пожиратель
Фантастика:
городское фэнтези
аниме
сказочная фантастика
фэнтези
попаданцы
5.00
рейтинг книги
Печать Пожирателя 3

Законы Рода. Том 6

Андрей Мельник
6. Граф Берестьев
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Законы Рода. Том 6

Наследие Маозари 4

Панежин Евгений
4. Наследие Маозари
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Наследие Маозари 4

Я не князь. Книга XIII

Дрейк Сириус
13. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я не князь. Книга XIII

Тринадцатый V

NikL
5. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Тринадцатый V

Я не царь. Книга XXIV

Дрейк Сириус
24. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Я не царь. Книга XXIV

Бастард Императора. Том 4

Орлов Андрей Юрьевич
4. Бастард Императора
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Бастард Императора. Том 4

Третий Генерал: Том VIII

Зот Бакалавр
7. Третий Генерал
Фантастика:
городское фэнтези
аниме
сказочная фантастика
попаданцы
5.00
рейтинг книги
Третий Генерал: Том VIII

Запечатанный во тьме. Том 2

NikL
2. Хроники Арнея
Фантастика:
уся
эпическая фантастика
фэнтези
5.00
рейтинг книги
Запечатанный во тьме. Том 2