Для извлечения данных строка за строкой, если вы действительно хотите этого, пользуйтесь функцией
mysql_use_result
вместо функции
mysql_store_result
.
MYSQL_RES *mysql_use_result(MYSQL *connection);
Как и
mysql_store_result
, функция
mysql_use_result
в случае ошибки возвращает
NULL
; если она выполняется успешно, то возвращает указатель на объект
с результирующим набором. Но эта функция отличается тем, что не считывает никаких данных в результирующий набор, который инициализировала.
Примечание
Для того чтобы действительно получить данные, следует многократно применять функцию
mysql_fetch_row
до тех пор, пока все данные не будут извлечены. Если вы не получите все данные от функции
mysql_use_result
, последующие операции в вашей программе, направленные на извлечение данных, могут вернуть поврежденную информацию.
В чем же выигрыш от вызова функции
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
, проста, поэтому далее мы приводим измененный фрагмент в виде закрашенных серым цветом строк:
Учтите, что вы не можете получить количество строк до тех пор, пока не будет извлечен последний результат. Но проверяя ошибки как можно раньше и чаще, вы облегчите применение функции
mysql_use_result
. Разрабатывая программу таким образом, можно уберечься от головной боли при последующих ее модификациях.