В чем же выигрыш от вызова функции mysql_use_result
по сравнению с вызовом функции mysql_store_result
? У первой из названных функций есть ряд существенных преимуществ, касающихся управления ресурсами; но ее нельзя применять с функциями mysql_data_seek
, mysql_row_seek
или mysql_row_tell
и польза от применения mysql_num_rows
ограничена, поскольку она не может нормально функционировать до тех пор, пока не будут извлечены все данные.
Вы также увеличьте время ожидания в вашей программе, т.к. запрос каждой строки должен пройти по сети и также должны быть отправлены обратно результаты. Еще одна возможность — разрыв сетевого соединения в середине операции, оставляющий вас с неполным набором данных.
Но ни один из перечисленных недостатков никак не уменьшает достоинств, упомянутых ранее: лучше сбалансированная сетевая загрузка и меньшие непроизводительные потери памяти в случае возможных очень больших наборов данных.
Замена программы select1.c на программу select2.c, использующую метод mysql_use_result
, проста, поэтому далее мы приводим измененный фрагмент в виде закрашенных серым цветом строк:
if (res) {
printf("SELECT error: %s\n", mysql_error(&my_connection));
} else {
res_ptr = mysql_use_result(&my_connection);
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
предоставляет некоторую базовую информацию о результате запроса. Она принимает ваше подключение как объект и возвращает количество полей (столбцов) в результирующем наборе.
unsigned int mysql_field_count(MYSQL * connection);
Помимо этого вы можете использовать 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. Далее приведена очень простая подпрограмма для вывода данных: