? У первой из названных функций есть ряд существенных преимуществ, касающихся управления ресурсами; но ее нельзя применять с функциями
mysql_data_seek
,
mysql_row_seek
или
mysql_row_tell
и польза от применения
mysql_num_rows
ограничена, поскольку она не может нормально функционировать до тех пор, пока не будут извлечены все данные.
Вы также увеличьте время ожидания в вашей программе, т.к. запрос каждой строки должен пройти по сети и также должны быть отправлены
обратно результаты. Еще одна возможность — разрыв сетевого соединения в середине операции, оставляющий вас с неполным набором данных.
Но ни один из перечисленных недостатков никак не уменьшает достоинств, упомянутых ранее: лучше сбалансированная сетевая загрузка и меньшие непроизводительные потери памяти в случае возможных очень больших наборов данных.
Замена программы select1.c на программу select2.c, использующую метод
mysql_use_result
, проста, поэтому далее мы приводим измененный фрагмент в виде закрашенных серым цветом строк:
Учтите, что вы не можете получить количество строк до тех пор, пока не будет извлечен последний результат. Но проверяя ошибки как можно раньше и чаще, вы облегчите применение функции
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. Далее приведена очень простая подпрограмма для вывода данных:
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");