Основы программирования в Linux - Мэтью Нейл
printf("Fetched data...n"); display_row(); } } } }}3. Теперь сохраните законченный проект с именем select3.c. В заключение откомпилируйте и выполните select3, как показано далее:
$ <b>gcc -I/usr/include/mysql select3. с -L/usr/lib/mysql -lmysqlclient -о select3</b>$ <b>./select3</b>Connection successFetched data...1 Jenny 21Fetched data...2 Andrew 17$Итак, программа работает, несмотря на не слишком эстетически привлекательный вывод. Но вы не смогли учесть в результате возможные значения
NULLmysql_fetch_field<b>MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result);</b>Вызывать эту функцию следует многократно, до тех пор, пока не будет возвращено значение
NULLMYSQL_FIELDТаблица 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_resultmysql_use_result |
unsigned int flags; | Флаги содержат информацию об определении столбца, а не о найденных данных. у распространенных флагов очевидные значения: NOT_NULL_FLAGPRI_KEY_FLAGUNSIGNED_FLAGAUTO_INCREMENT_FLAGBINARY_FLAG |
unsigned int decimals; | Количество знаков после десятичной точки. Справедливо только для числовых полей |
Типов столбца огромное множество. Полный перечень можно найти в файле mysql_com.h и в документации.
К самым распространенным относятся следующие:
FIELD_TYPE_DECIMALFIELD_TYPE_LONGFIELD_TYPE_STRINGFIELD_TYPE_VAR_STRINGДалее приведен особенно полезный макрос
IS_NUMtrueif (IS_NUM(myslq_field_ptr->type)) printf("Numeric type fieldn");Прежде чем обновлять вашу программу, следует упомянуть еще одну функцию:
<b>MYSQL_FIELD_OFFSET mysql_field_seek(MYSQL_RES* result,</b><b> MYSQL_FIELD_OFFSET offset);</b>Ее можно использовать для переопределения текущего номера поля, который автоматически увеличивается при каждом вызове
mysql_fetch_fieldТеперь, имея всю необходимую информацию для написания программы выборки, покажите все дополнительные данные, относящиеся к заданному столбцу.
Далее приведена программа select4.c, которую мы воспроизводим полностью, чтобы у вас был полный пример для изучения. В программе нет расширенного анализа типов столбцов, в ней только демонстрируются требуемые основные правила.
#include <stdlib.h>#include <stdio.h>#include "mysql.h"MYSQL my_connection;MYSQL_RES *res_ptr;MYSQL_ROW sqlrow;void display_header();void display_row();int main(int argc, char *argv[]) { int res; int first_row = 1; /* Применяется для гарантии того, что мы выводим заголовок строки точно один раз, когда данные успешно извлечены */ mysql_init(&my_connection); if (mysql_real_connect(&my_connection, "localhost", "rick", "secret", "foo", 0, NULL, 0)) { printf("Connection successn"); res = mysql_query(&my_connection,