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

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

Жанры

Основы программирования в Linux
Шрифт:
Обработка полученных данных

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

MySQL, как большинство баз данных SQL, возвращает два вида данных:

 данные, извлеченные из таблицы и называемые данными столбцов;

 данные о данных, так называемые метаданные, например, имена столбцов и их типы.

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

Функция

mysql_field_count
предоставляет некоторую базовую информацию о результате запроса. Она принимает ваше подключение как объект и возвращает количество полей (столбцов) в результирующем наборе.

unsigned int mysql_field_count(MYSQL * connection);

Помимо

этого вы можете использовать
mysql_field_count
и в других случаях, таких как определение причины аварийного завершения вызова функции
mysql_store_result
. Если
mysql_store_result
возвращает
NULL
, а функция
mysql_field_count
— положительное число, можно предположить ошибку извлечения. Если же функция
mysql_field_count
возвращает 0, нет извлекаемых столбцов, что объясняет сбой при попытке сохранить результат. Естественно ожидать, что вы знаете, сколько предполагаемых столбцов должно быть получено в конкретном запросе. Таким образом, эта функция особенно полезна в компонентах общей обработки запросов и в любой ситуации, когда запросы формируются на лету.

Примечание

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

mysql_num_fields
. Она может принимать в качестве параметра указатель на структуру дескриптора подключения или структуру результата запроса и возвращает количество столбцов.

Если оставить в стороне заботы о форматировании, вы уже знаете, как немедленно вывести данные. Добавьте простую функцию

display_row
в программу select2.c.

Примечание

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

mysql_fetch_row
, все сделаны глобальными. В рабочей программе мы не рекомендуем делать это.

1. Далее приведена очень простая подпрограмма для вывода данных:

void display_row {

 unsigned int field_count;

 field_count = 0;

 while (field_count < mysql_field_count(&my_commection)) {

printf("%s ", sqlrow[field_count]);

field_count++;

 }

 printf("\n");

}

2. Вставьте ее в конец файла select2.c и добавьте объявление и вызов функции:

void display_row;

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

 int res;

 mysql_init(&my_connection);

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

"bar", "rick", 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_use_result(&my_connection);

if (res_ptr) {

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

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

display_row;

}

}

}

 }

}

3. Теперь

сохраните законченный проект с именем select3.c. В заключение откомпилируйте и выполните select3, как показано далее:

$ gcc -I/usr/include/mysql select3. с -L/usr/lib/mysql -lmysqlclient -о select3

$ ./select3

Connection success

Fetched data...

1 Jenny 21

Fetched data...

2 Andrew 17

$

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

NULL
. Если вы хотите вывести более искусно отформатированные (в виде таблицы, например) данные, следует получить из MySQL данные и метаданные. Одновременно считать как данные, так и метаданные в новую структуру вы можете с помощью функции
mysql_fetch_field
.

MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result);

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

NULL
, которое сигнализирует о том, что данные закончились. Далее вы можете использовать указатель на структуру данных о поле для получения сведений о столбце. Структура типа
MYSQL_FIELD
определена в файле mysql.h, как показано в табл. 8.12.

Таблица 8.12

Поле в структуре типа
MYSQL_FIELD
Описание
char *name;
Имя столбца в виде строки
char *table;
Имя таблицы, из которой получен столбец. Оно особенно полезно в запросе с использованием нескольких таблиц. Имейте в виду, что вычисляемое значение в результате, такое как
MAX
, будет иметь пустую строку для имени таблицы
char *def;
При вызове функции
mysql_list_fields
(которую мы не обсуждаем) это поле содержит значение в столбце по умолчанию
enum enum_field_types type;
Тип столбца. См. пояснения сразу после таблицы
unsigned int length;
Ширина столбца, заданная при определении таблицы
unsigned int max_length;
Если применяется функция
mysql_store_result
, это поле содержит длину в байтах самого длинного извлеченного значения столбца. Если применяется функция
mysql_use_result
, поле не задается
unsigned int flags;
Флаги содержат информацию об определении столбца, а не о найденных данных. у распространенных флагов очевидные значения:
NOT_NULL_FLAG
,
PRI_KEY_FLAG
,
UNSIGNED_FLAG
,
AUTO_INCREMENT_FLAG
и
BINARY_FLAG
. Полный список флагов можно найти в документации MySQL
unsigned int decimals;
Количество знаков после десятичной точки. Справедливо только для числовых полей
Поделиться:
Популярные книги

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

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

Бестужев. Служба Государевой Безопасности. Книга вторая

Измайлов Сергей
2. Граф Бестужев
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Бестужев. Служба Государевой Безопасности. Книга вторая

Я еще граф. Книга #8

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

Беглец

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

Корсар

Русич Антон
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
6.29
рейтинг книги
Корсар

Весь цикл «Десантник на престоле». Шесть книг

Ланцов Михаил Алексеевич
Десантник на престоле
Фантастика:
альтернативная история
8.38
рейтинг книги
Весь цикл «Десантник на престоле». Шесть книг

Газлайтер. Том 18

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

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

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

Первый среди равных. Книга XIII

Бор Жорж
13. Первый среди Равных
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Первый среди равных. Книга XIII

Последний Паладин. Том 10

Саваровский Роман
10. Путь Паладина
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Последний Паладин. Том 10

Гримуар темного лорда VII

Грехов Тимофей
7. Гримуар темного лорда
Фантастика:
боевая фантастика
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Гримуар темного лорда VII

Идеальный мир для Лекаря 4

Сапфир Олег
4. Лекарь
Фантастика:
фэнтези
юмористическая фантастика
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 4

Восхождение Примарха

Дубов Дмитрий
1. Восхождение Примарха
Фантастика:
фэнтези
попаданцы
аниме
6.00
рейтинг книги
Восхождение Примарха

Сердце Дракона. Том 12

Клеванский Кирилл Сергеевич
12. Сердце дракона
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.29
рейтинг книги
Сердце Дракона. Том 12