Основы программирования в Linux - Мэтью Нейл
"SELECT childno, fname, age FROM children WHERE age > 5"); if (res) { fprintf(stderr, "SELECT error: %sn", mysql_error(&my_connection)); } else { res_ptr = mysql_use_result(&my_connection); if (res_ptr) { while ((sqlrow = mysql_fetch_row(res_ptr))) { if (first_row) { display_header(); first_row = 0; } display_row(); } if (mysql_errno(&my_connection)) { fprintf(stderr, "Retrieve error: %sn", mysql_error(&my_connection)); } mysql_free_result(res_ptr); } } mysql_close(&my_connection); } else { fprintf(stderr, "Connection failedn"); if (mysql_errno(&my_connection)) { fprintf(stderr, "Connection error %d: %sn", mysql_errno(&my_connection), mysql_error(&my_connection)) } } return EXIT_SUCCESS;}void display_header() { MYSQL_FIELD *field_ptr; printf("Column details:n"); while ((field_ptr = mysql_fetch_field(res_ptr)) != NULL) { printf("t Name: %sn", field_ptr->name); printf("t Type: "); if (IS_NUM(field_ptr->type)) { printf("Numeric fieldn"); } else { switch(field_ptr->type) { case FIELD_TYPE_VAR_STRING: printf("VARCHARn"); break; case FIELD_TYPE_LONG: printf("LONGn"); break; default: printf("Type is %d, check in mysql_com.hn", field_ptr->type); } /* switch */ } /* else */ printf("t Max width %ldn", field_ptr->length); if (field_ptr->flags & AUTO_INCREMENT_FLAG) printf("t Auto incrementsn"); printf("n"); } /* while */}void display_row() { unsigned int field_count; field_count = 0; while (field_count < mysql_field_count(&my_connection)) { if (sqlrow[field_count]) printf("%s ", sqlrow[field_count]); else printf("NULL"); field_count++; } printf("n");}Когда вы откомпилируете и выполните программу, то получите следующий вывод:
$ <b>./select4</b>Connection successColumn details: Name: childno Type: Numeric field Max width 11 Auto increments Name: fname Type: VARCHAR Max width 30 Name: age Type: Numeric field Max width 11Column details:1 Jenny 212 Andrew 17$Вывод все еще не слишком привлекателен, но он демонстрирует, как можно обрабатывать и данные, и метаданные, что позволяет более эффективно работать с вашей информацией.
Есть и другие функции, позволяющие извлекать массивы полей и переходить от столбца к столбцу. Как правило, приведенные здесь подпрограммы — все, что вам потребуется; любознательный читатель сможет найти более подробную информацию в руководстве по MySQL.
Разные функции
Есть несколько приведенных в табл. 8.13 дополнительных функций API, которые мы рекомендуем изучить. В основном того, что обсуждалось до сих пор, достаточно для создания функциональной программы, но этот частичный перечень нам кажется полезным.
Таблица 8.13
| Пример API-вызова | Описание |
|---|---|
char *mysql_get_client_info(void); | Возвращает данные о версии библиотеки, используемой клиентской программой |
char *mysql_get_host_info(MYSQL *connection); | Возвращает информацию о подключении к серверу |
char *mysql_get_server_info(MYSQL *connection); | Возвращает информацию о сервере, к которому вы в данный момент подключены |
char *mysql_info(MYSQL* connection); | Возвращает информацию о самом последнем выполненном запросе, но работает только с запросами нескольких типов — обычно с операторами INSERTUPDATENULL |
int mysql_select_db(MYSQL *connection, const char *dbname); | Заменяет базу данных, применяемую по умолчанию, на заданную в качестве параметра, при условии, что у пользователя есть соответствующие права доступа. В случае успеха возвращает ноль |
int mysql_shutdown(MYSQL* connection, enum mysql_enum_shutdown level); | Если у вас есть соответствующие права, завершает работу сервера базы данных, к которому вы подключены. В этот момент уровень останова следует задать равным SHUTDOWN_DEFAULT |