Основы программирования в Linux
В чем же выигрыш от вызова функции
по сравнению с вызовом функцииmysql_use_result? У первой из названных функций есть ряд существенных преимуществ, касающихся управления ресурсами; но ее нельзя применять с функциямиmysql_store_result,mysql_data_seekилиmysql_row_seekи польза от примененияmysql_row_tellограничена, поскольку она не может нормально функционировать до тех пор, пока не будут извлечены все данные.mysql_num_rowsВы также увеличьте время ожидания в вашей программе, т.к. запрос каждой строки должен пройти по сети и также должны быть отправлены обратно результаты. Еще одна возможность — разрыв сетевого соединения в середине операции, оставляющий вас с неполным набором данных.
Но ни один из перечисленных недостатков никак не уменьшает достоинств, упомянутых ранее: лучше сбалансированная сетевая загрузка и меньшие непроизводительные потери памяти в случае возможных очень больших наборов данных.
Замена программы select1.c на программу select2.c, использующую метод
, проста, поэтому далее мы приводим измененный фрагмент в виде закрашенных серым цветом строк:mysql_use_resultif (res) {printf("SELECT error: %s\n", mysql_error(&my_connection));} else {res_ptr = mysql_use_result(&my_connection);<i> if (res_ptr) {</i><i> while ((sqlrow = mysql_fetch_row(res_ptr))) {</i><i> printf("Fetched data...\n");</i><i> }</i>if (mysql_errno(&my_connection)) {printf("Retrieve error: %s\n", mysql_error(&my_connection));}mysql_free_result(res_ptr);}}Учтите, что вы не можете получить количество строк до тех пор, пока не будет извлечен последний результат. Но проверяя ошибки как можно раньше и чаще, вы облегчите применение функции
. Разрабатывая программу таким образом, можно уберечься от головной боли при последующих ее модификациях.mysql_use_resultОбработка полученных данныхЗная, как извлекать строки, можно перейти к рассмотрению обработки полученных реальных данных.
MySQL, как большинство баз данных SQL, возвращает два вида данных:
□ данные, извлеченные из таблицы и называемые данными столбцов;
□ данные о данных, так называемые метаданные, например, имена столбцов и их типы.
Сначала сосредоточимся на получении данных, как таковых, в пригодном к использованию виде.
Функция
предоставляет некоторую базовую информацию о результате запроса. Она принимает ваше подключение как объект и возвращает количество полей (столбцов) в результирующем наборе.mysql_field_count<b>unsigned int mysql_field_count(MYSQL * connection);</b>Помимо этого вы можете использовать
и в других случаях, таких как определение причины аварийного завершения вызова функцииmysql_field_count. Еслиmysql_store_resultвозвращаетmysql_store_result, а функцияNULL— положительное число, можно предположить ошибку извлечения. Если же функцияmysql_field_countвозвращает 0, нет извлекаемых столбцов, что объясняет сбой при попытке сохранить результат. Естественно ожидать, что вы знаете, сколько предполагаемых столбцов должно быть получено в конкретном запросе. Таким образом, эта функция особенно полезна в компонентах общей обработки запросов и в любой ситуации, когда запросы формируются на лету.mysql_field_countПримечаниеВ программах, написанных для более ранних версий MySQL, вы можете встретить функцию
. Она может принимать в качестве параметра указатель на структуру дескриптора подключения или структуру результата запроса и возвращает количество столбцов.mysql_num_fieldsЕсли оставить в стороне заботы о форматировании, вы уже знаете, как немедленно вывести данные. Добавьте простую функцию
в программу select2.c.display_rowПримечаниеОбратите внимание на то, что для упрощения примера данные о подключении, результате и строке, полученные из функции
, все сделаны глобальными. В рабочей программе мы не рекомендуем делать это.mysql_fetch_row1. Далее приведена очень простая подпрограмма для вывода данных:
<i>void display_row() {</i><i> unsigned int field_count;</i><i> field_count = 0;</i><i> while (field_count < mysql_field_count(&my_commection)) {</i><i> printf("%s ", sqlrow[field_count]);</i><i> field_count++;</i><i> }</i><i> printf("\n");</i><i>}</i>2. Вставьте ее в конец файла select2.c и добавьте объявление и вызов функции:
<i>void display_row();</i>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))) {