Выбрать главу

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