Spec-Zone .ru
спецификации, руководства, описания, API
|
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
значение, для которого Вы хотите знать, сколько места должно быть выделено.
Чтобы выполнить это, можно использовать эти стратегии:
Перед вызовом mysql_stmt_fetch()
получать отдельные строки, передачу STMT_ATTR_UPDATE_MAX_LENGTH
к mysql_stmt_attr_set()
,
тогда вызовите mysql_stmt_store_result()
буферизовать весь результат на стороне клиента. Установка STMT_ATTR_UPDATE_MAX_LENGTH
припишите заставляет максимальную длину значений столбцов быть обозначенной max_length
элемент метаданных набора результатов, возвращенных mysql_stmt_result_metadata()
.
Вызвать mysql_stmt_fetch()
с буфером нулевым длиной для рассматриваемого столбца и указателя, в котором может быть сохранена
реальная длина. Затем используйте реальную длину с mysql_stmt_fetch_column()
.
real_length= 0;bind[0].buffer= 0;bind[0].buffer_length= 0;bind[0].length= &real_lengthmysql_stmt_bind_result(stmt, bind);mysql_stmt_fetch(stmt);if (real_length > 0){ data= malloc(real_length); bind[0].buffer= data; bind[0].buffer_length= real_length; mysql_stmt_fetch_column(stmt, bind, 0, 0);}
Возвращаемое значение | Описание |
---|---|
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 ушел.
Соединение с сервером было потеряно во время запроса.
Произошла неизвестная ошибка.
Буферный тип MYSQL_TYPE_DATE
, MYSQL_TYPE_TIME
, MYSQL_TYPE_DATETIME
, или
MYSQL_TYPE_TIMESTAMP
, но тип данных не DATE
, TIME
, DATETIME
, или TIMESTAMP
.
Все другие неподдерживаемые ошибки преобразования возвращаются из mysql_stmt_bind_result()
.
Следующий пример демонстрирует, как выбрать данные от табличного использования 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);}