Spec-Zone .ru
спецификации, руководства, описания, API

21.8.11.11. mysql_stmt_fetch()

int mysql_stmt_fetch(MYSQL_STMT *stmt)

Описание

mysql_stmt_fetch() возвращает следующую строку в наборе результатов. Это можно вызвать только, в то время как набор результатов существует; то есть, после звонка mysql_stmt_execute() для оператора такой как SELECT это производит набор результатов.

mysql_stmt_fetch() данные строки возвратов, используя буферы, связанные mysql_stmt_bind_result(). Это возвращает данные в тех буферах для всех столбцов в текущем наборе строк, и длины возвращаются к length указатель. Все столбцы должны быть связаны приложением прежде, чем оно вызовет mysql_stmt_fetch().

По умолчанию наборы результатов выбираются небуферизованные строка за один раз от сервера. Чтобы буферизовать весь набор результатов на клиенте, вызвать mysql_stmt_store_result() после привязки буферов данных и перед вызовом mysql_stmt_fetch().

Если выбранное значение данных является a NULL значение, *is_null значение соответствия MYSQL_BIND структура содержит ИСТИНУ (1). Иначе, данные и его длина возвращаются в *buffer и *length элементы, основанные на буферном типе, определяются приложением. У каждого числового и временного типа есть фиксированная длина, как перечислено в следующей таблице. Длина строковых типов зависит от длины фактического значения данных, как обозначено data_length.

Ввести Длина
MYSQL_TYPE_TINY 1
MYSQL_TYPE_SHORT 2
MYSQL_TYPE_LONG 4
MYSQL_TYPE_LONGLONG 8
MYSQL_TYPE_FLOAT 4
MYSQL_TYPE_DOUBLE 8
MYSQL_TYPE_TIME sizeof(MYSQL_TIME)
MYSQL_TYPE_DATE sizeof(MYSQL_TIME)
MYSQL_TYPE_DATETIME sizeof(MYSQL_TIME)
MYSQL_TYPE_STRING data length
MYSQL_TYPE_BLOB data_length

В некоторых случаях Вы могли бы хотеть определить длину значения столбца прежде, чем выбрать это с mysql_stmt_fetch(). Например, значение могло бы быть длинной строкой или BLOB значение, для которого Вы хотите знать, сколько места должно быть выделено. Чтобы выполнить это, можно использовать эти стратегии:

Возвращаемые значения

Возвращаемое значение Описание
0 Успешный, данные были выбраны к буферам данных приложения.
1 Ошибка произошла. Код ошибки и сообщение могут быть получены, вызывая mysql_stmt_errno() иmysql_stmt_error().
MYSQL_NO_DATA Больше строк/данных не существует
MYSQL_DATA_TRUNCATED Усечение данных произошло

MYSQL_DATA_TRUNCATED возвращается, когда создание отчетов усечения включается. Чтобы определить, какие значения столбцов были усеченными, когда это значение возвращается, проверьте error элементы MYSQL_BIND структуры используются для того, чтобы выбрать значения. Создание отчетов усечения включается по умолчанию, но может управляться, вызывая mysql_options() с MYSQL_REPORT_DATA_TRUNCATION опция.

Ошибки

Пример

Следующий пример демонстрирует, как выбрать данные от табличного использования mysql_stmt_result_metadata(), mysql_stmt_bind_result(), и mysql_stmt_fetch(). (Этот пример ожидает получать эти две строки, вставленные примером, показанным в Разделе 21.8.11.10,"mysql_stmt_execute()".) mysql переменная, как предполагается, является допустимым дескриптором соединения.

#define STRING_SIZE 50#define SELECT_SAMPLE "SELECT col1, col2, col3, col4 \                       FROM test_table"MYSQL_STMT    *stmt;MYSQL_BIND    bind[4];MYSQL_RES     *prepare_meta_result;MYSQL_TIME    ts;unsigned long length[4];int           param_count, column_count, row_count;short         small_data;int           int_data;char          str_data[STRING_SIZE];my_bool       is_null[4];my_bool       error[4];/* Prepare a SELECT query to fetch data from test_table */stmt = mysql_stmt_init(mysql);if (!stmt){  fprintf(stderr, " mysql_stmt_init(), out of memory\n");  exit(0);}if (mysql_stmt_prepare(stmt, SELECT_SAMPLE, strlen(SELECT_SAMPLE))){  fprintf(stderr, " mysql_stmt_prepare(), SELECT failed\n");  fprintf(stderr, " %s\n", mysql_stmt_error(stmt));  exit(0);}fprintf(stdout, " prepare, SELECT successful\n");/* Get the parameter count from the statement */param_count= mysql_stmt_param_count(stmt);fprintf(stdout, " total parameters in SELECT: %d\n", param_count);if (param_count != 0) /* validate parameter count */{  fprintf(stderr, " invalid parameter count returned by MySQL\n");  exit(0);}/* Fetch result set meta information */prepare_meta_result = mysql_stmt_result_metadata(stmt);if (!prepare_meta_result){  fprintf(stderr,         " mysql_stmt_result_metadata(), \           returned no meta information\n");  fprintf(stderr, " %s\n", mysql_stmt_error(stmt));  exit(0);}/* Get total columns in the query */column_count= mysql_num_fields(prepare_meta_result);fprintf(stdout,        " total columns in SELECT statement: %d\n",        column_count);if (column_count != 4) /* validate column count */{  fprintf(stderr, " invalid column count returned by MySQL\n");  exit(0);}/* Execute the SELECT query */if (mysql_stmt_execute(stmt)){  fprintf(stderr, " mysql_stmt_execute(), failed\n");  fprintf(stderr, " %s\n", mysql_stmt_error(stmt));  exit(0);}/* Bind the result buffers for all 4 columns before fetching them */memset(bind, 0, sizeof(bind));/* INTEGER COLUMN */bind[0].buffer_type= MYSQL_TYPE_LONG;bind[0].buffer= (char *)&int_data;bind[0].is_null= &is_null[0];bind[0].length= &length[0];bind[0].error= &error[0];/* STRING COLUMN */bind[1].buffer_type= MYSQL_TYPE_STRING;bind[1].buffer= (char *)str_data;bind[1].buffer_length= STRING_SIZE;bind[1].is_null= &is_null[1];bind[1].length= &length[1];bind[1].error= &error[1];/* SMALLINT COLUMN */bind[2].buffer_type= MYSQL_TYPE_SHORT;bind[2].buffer= (char *)&small_data;bind[2].is_null= &is_null[2];bind[2].length= &length[2];bind[2].error= &error[2];/* TIMESTAMP COLUMN */bind[3].buffer_type= MYSQL_TYPE_TIMESTAMP;bind[3].buffer= (char *)&ts;bind[3].is_null= &is_null[3];bind[3].length= &length[3];bind[3].error= &error[3];/* Bind the result buffers */if (mysql_stmt_bind_result(stmt, bind)){  fprintf(stderr, " mysql_stmt_bind_result() failed\n");  fprintf(stderr, " %s\n", mysql_stmt_error(stmt));  exit(0);}/* Now buffer all results to client (optional step) */if (mysql_stmt_store_result(stmt)){  fprintf(stderr, " mysql_stmt_store_result() failed\n");  fprintf(stderr, " %s\n", mysql_stmt_error(stmt));  exit(0);}/* Fetch all rows */row_count= 0;fprintf(stdout, "Fetching results ...\n");while (!mysql_stmt_fetch(stmt)){  row_count++;  fprintf(stdout, "  row %d\n", row_count);  /* column 1 */  fprintf(stdout, "   column1 (integer)  : ");  if (is_null[0])    fprintf(stdout, " NULL\n");  else    fprintf(stdout, " %d(%ld)\n", int_data, length[0]);  /* column 2 */  fprintf(stdout, "   column2 (string)   : ");  if (is_null[1])    fprintf(stdout, " NULL\n");  else    fprintf(stdout, " %s(%ld)\n", str_data, length[1]);  /* column 3 */  fprintf(stdout, "   column3 (smallint) : ");  if (is_null[2])    fprintf(stdout, " NULL\n");  else    fprintf(stdout, " %d(%ld)\n", small_data, length[2]);  /* column 4 */  fprintf(stdout, "   column4 (timestamp): ");  if (is_null[3])    fprintf(stdout, " NULL\n");  else    fprintf(stdout, " %04d-%02d-%02d %02d:%02d:%02d (%ld)\n",                     ts.year, ts.month, ts.day,                     ts.hour, ts.minute, ts.second,                     length[3]);  fprintf(stdout, "\n");}/* Validate rows fetched */fprintf(stdout, " total rows fetched: %d\n", row_count);if (row_count != 2){  fprintf(stderr, " MySQL failed to return all rows\n");  exit(0);}/* Free the prepared result metadata */mysql_free_result(prepare_meta_result);/* Close the statement */if (mysql_stmt_close(stmt)){  fprintf(stderr, " failed while closing the statement\n");  fprintf(stderr, " %s\n", mysql_stmt_error(stmt));  exit(0);}