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

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

Жанры

Основы программирования в Linux
Шрифт:

#include <stdlib.h>

#include <stdio.h>

#include "mysql.h"

MYSQL my_connection;

MYSQL_RES *res_ptr;

MYSQL_ROW sqlrow;

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

 int res;

 mysql_init(&my_connection);

 if (mysql_real_connect(&my_connection, "localhost", "rick",

"secret", "foo", 0, NULL, 0)) {

printf("Connection success\n");

res = mysql_query(&my_connection,

"SELECT childno, fname, age FROM children WHERE age > 5");

if (res) {

printf("SELECT error: %s\n", mysql_error(&my_connection));

} else {

res_ptr = mysql_store_result(&my_connection);

if (res_ptr) {

printf("Retrieved %lu rows\n",

(unsigned long)mysql_num_rows(res_ptr));

while ((sqlrow = mysql_fetch_row(res_ptr))) {

printf("Fetched data...\n");

}

if (mysql_errno(&my_connection)) {

fprintf(stderr, "Retrieve error: %s\n",

mysql_error(&my_connection));

}

mysql_free_result(res_ptr);

}

}

mysql_close(&my_connection);

 } else {

fprintf(stderr, "Connection failed\n');

if (mysql_errno(&my_connection)) {

fprintf(stderr, "Connection error %d: %s\n",

mysql_errno(&my_connection), mysql_error(&my_connection));

}

 }

 return EXIT_SUCCESS;

}

Построчное извлечение данных

Для извлечения данных строка за строкой, если вы действительно хотите этого, пользуйтесь функцией

mysql_use_result
вместо функции
mysql_store_result
.

MYSQL_RES *mysql_use_result(MYSQL *connection);

Как и

mysql_store_result
, функция
mysql_use_result
в случае ошибки возвращает
NULL
; если она выполняется успешно, то возвращает указатель на объект с результирующим набором. Но эта функция отличается тем, что не считывает никаких данных в результирующий набор, который инициализировала.

Примечание

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

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

В чем же выигрыш от вызова функции

mysql_use_result
по сравнению с вызовом функции
mysql_store_result
? У первой из названных функций есть ряд существенных преимуществ, касающихся управления ресурсами; но ее нельзя применять с функциями
mysql_data_seek
,
mysql_row_seek
или
mysql_row_tell
и польза от применения
mysql_num_rows
ограничена, поскольку она не может нормально функционировать до тех пор, пока не будут извлечены все данные.

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

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

Замена программы select1.c на программу select2.c, использующую метод

mysql_use_result
, проста, поэтому далее мы приводим измененный фрагмент в виде закрашенных серым цветом строк:

if (res) {

 printf("SELECT error: %s\n", mysql_error(&my_connection));

} else {

 res_ptr = mysql_use_result(&my_connection);

 if (res_ptr) {

while ((sqlrow = mysql_fetch_row(res_ptr))) {

printf("Fetched data...\n");

}

if (mysql_errno(&my_connection)) {

printf("Retrieve error: %s\n", mysql_error(&my_connection));

}

mysql_free_result(res_ptr);

 }

}

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

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

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

Князь Целитель 6

Ткачев Андрей Юрьевич
6. Князь Целитель
Фантастика:
боевая фантастика
городское фэнтези
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Князь Целитель 6

Локки 2. Потомок бога

Решетов Евгений Валерьевич
2. Локки
Фантастика:
городское фэнтези
аниме
попаданцы
5.00
рейтинг книги
Локки 2. Потомок бога

Князь Андер Арес 5

Грехов Тимофей
5. Андер Арес
Фантастика:
историческое фэнтези
фэнтези
героическая фантастика
5.00
рейтинг книги
Князь Андер Арес 5

Инженер Петра Великого 2

Гросов Виктор
2. Инженер Петра Великого
Фантастика:
попаданцы
альтернативная история
фэнтези
5.00
рейтинг книги
Инженер Петра Великого 2

Телохранитель Генсека. Том 1

Алмазный Петр
1. Медведев
Фантастика:
попаданцы
альтернативная история
7.00
рейтинг книги
Телохранитель Генсека. Том 1

Проклятый Лекарь. Том 2

Молотов Виктор
2. Анатомия Тьмы
Фантастика:
фэнтези
попаданцы
7.00
рейтинг книги
Проклятый Лекарь. Том 2

Афганский рубеж

Дорин Михаил
1. Рубеж
Фантастика:
попаданцы
альтернативная история
7.50
рейтинг книги
Афганский рубеж

Дважды одаренный. Том VI

Тарс Элиан
6. Дважды одаренный
Фантастика:
аниме
альтернативная история
фэнтези
фантастика: прочее
5.00
рейтинг книги
Дважды одаренный. Том VI

Третий. Том 6

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
фантастика: прочее
попаданцы
5.00
рейтинг книги
Третий. Том 6

Громовая поступь. Трилогия

Мазуров Дмитрий
Громовая поступь
Фантастика:
фэнтези
рпг
4.50
рейтинг книги
Громовая поступь. Трилогия

Адвокат

Константинов Андрей Дмитриевич
1. Бандитский Петербург
Детективы:
боевики
8.00
рейтинг книги
Адвокат

Черный Маг Императора 4

Герда Александр
4. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Черный Маг Императора 4

Дворянин

Злотников Роман Валерьевич
2. Император и трубочист
Фантастика:
боевая фантастика
альтернативная история
5.00
рейтинг книги
Дворянин

Геном хищника. Книга четвертая

Гарцевич Евгений Александрович
4. Я - Легенда!
Фантастика:
боевая фантастика
рпг
попаданцы
5.00
рейтинг книги
Геном хищника. Книга четвертая