通过调用mysql_stmt类的_MySQL 的 C API预处理语句

25.2.7.11. mysql_stmt_fetch()

int mysql_stmt_fetch(MYSQL_STMT *stmt)

描述

mysql_stmt_fetch()返回结果集中的下一行。仅能当结果集存在时调用它,也就是说,调用了能创建结果集的mysql_stmt_execute()之后,或当mysql_stmt_execute()对整个结果集即行缓冲处理后调用了mysql_stmt_store_result()。

使用mysql_stmt_bind_result()绑定的缓冲,mysql_stmt_fetch()返回行数据。对于当前列集合中的所有列,它将返回缓冲内的数据,并将长度返回到长度指针。

调用mysql_stmt_fetch()之前,应用程序必须绑定所有列。

如果获取的数据值是NULL值,对应MYSQL_BIND结构的*is_null值将包含TRUE (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

返回值

返回值

描述

0

成功,数据被提取到应用程序数据缓冲区。

1

出现错误。通过调用mysql_stmt_errno()和mysql_stmt_error(),可获取错误代码和错误消息。

MYSQL_NO_DATA

不存在行/数据。

MYSQL_DATA_TRUNCATED

出现数据截短。

不返回MYSQL_DATA_TRUNCATED,除非用mysql_options()启用了截短通报功能。返回该值时,为了确定截短的参数是哪个,可检查MYSQL_BIND参数结构的错误成员。

错误

·CR_COMMANDS_OUT_OF_SYNC

以不恰当的顺序执行了命令。

·CR_OUT_OF_MEMORY

内存溢出。

·CR_SERVER_GONE_ERROR

MySQL服务器不可用。

·CR_SERVER_LOST

在查询过程中,与服务器的连接丢失。

·CR_UNKNOWN_ERROR

出现未知错误。

·CR_UNSUPPORTED_PARAM_TYPE

缓冲类型为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()从表中获取数据的方法。(在本示例中,将检索在25.2.7.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];

/* 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];

/* 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];

/* 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];

/* 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 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 */

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);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值