Литмир - Электронная Библиотека
Содержание  
A
A

     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 success

Fetched data...

1 Jenny 21

Fetched data...

2 Andrew 17

$

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

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

<b>MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result);</b>

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

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;
Количество знаков после десятичной точки. Справедливо только для числовых полей

Типов столбца огромное множество. Полный перечень можно найти в файле mysql_com.h и в документации.

К самым распространенным относятся следующие:

FIELD_TYPE_DECIMAL

FIELD_TYPE_LONG

FIELD_TYPE_STRING

FIELD_TYPE_VAR_STRING

Далее приведен особенно полезный макрос

IS_NUM
, возвращающий значение
true
, если тип поля числовой:

if (IS_NUM(myslq_field_ptr-&gt;type)) printf(&quot;Numeric type field\n&quot;);

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

<b>MYSQL_FIELD_OFFSET mysql_field_seek(MYSQL_RES* result,</b>

<b> MYSQL_FIELD_OFFSET offset);</b>

Ее можно использовать для переопределения текущего номера поля, который автоматически увеличивается при каждом вызове

mysql_fetch_field
. Если передать нулевое смещение, вы вернетесь назад к первому столбцу.

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

Далее приведена программа select4.c, которую мы воспроизводим полностью, чтобы у вас был полный пример для изучения. В программе нет расширенного анализа типов столбцов, в ней только демонстрируются требуемые основные правила.

#include &lt;stdlib.h&gt;

#include &lt;stdio.h&gt;

#include &quot;mysql.h&quot;

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(&amp;my_connection);

 if (mysql_real_connect(&amp;my_connection, &quot;localhost&quot;, &quot;rick&quot;,

  &quot;secret&quot;, &quot;foo&quot;, 0, NULL, 0)) {

  printf(&quot;Connection success\n&quot;);

  res = mysql_query(&amp;my_connection,

154
{"b":"285844","o":1}