mysql_stmt_fetch()--MySql数据库_MySQL, Oracle及数据库讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MySQL, Oracle及数据库讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 2641 | 回复: 0   主题: mysql_stmt_fetch()--MySql数据库        下一篇 
大红薯
注册用户
等级:少校
经验:1440
发帖:159
精华:0
注册:2011-7-21
状态:离线
发送短消息息给大红薯 加好友    发送短消息息给大红薯 发消息
发表于: IP:您无权察看 2014-12-22 16:02:22 | [全部帖] [楼主帖] 楼主

描述

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
MYSQL_TYPE_SHORT
MYSQL_TYPE_LONG
MYSQL_TYPE_LONGLONG
MYSQL_TYPE_FLOAT
MYSQL_TYPE_DOUBLE
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


返回值

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

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];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");param_count= mysql_stmt_param_count(stmt);fprintf(stdout, " total parameters in SELECT: %d\\n", param_count);if (param_count != 0) { fprintf(stderr, " invalid parameter count returned by MySQL\\n"); exit(0);}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);}column_count= mysql_num_fields(prepare_meta_result);fprintf(stdout, " total columns in SELECT statement: %d\\n", column_count);if (column_count != 4) { fprintf(stderr, " invalid column count returned by MySQL\\n"); exit(0);}if (mysql_stmt_execute(stmt)){ fprintf(stderr, " mysql_stmt_execute(), failed\\n"); fprintf(stderr, " %s\\n", mysql_stmt_error(stmt)); exit(0);}memset(bind, 0, sizeof(bind)); 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[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[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[3].buffer_type= MYSQL_TYPE_TIMESTAMP;bind[3].buffer= (char *)&ts;bind[3].is_null= &is_null[3];bind[3].length= &length[3];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);}if (mysql_stmt_store_result(stmt)){ fprintf(stderr, " mysql_stmt_store_result() failed\\n"); fprintf(stderr, " %s\\n", mysql_stmt_error(stmt)); exit(0);}row_count= 0;fprintf(stdout, "Fetching results ...\\n");while (!mysql_stmt_fetch(stmt)){ row_count++; fprintf(stdout, " row %d\\n", row_count); fprintf(stdout, " column1 (integer) : "); if (is_null[0]) fprintf(stdout, " NULL\\n"); else fprintf(stdout, " %d(%ld)\\n", int_data, length[0]); fprintf(stdout, " column2 (string) : "); if (is_null[1]) fprintf(stdout, " NULL\\n"); else fprintf(stdout, " %s(%ld)\\n", str_data, length[1]); fprintf(stdout, " column3 (smallint) : "); if (is_null[2]) fprintf(stdout, " NULL\\n"); else fprintf(stdout, " %d(%ld)\\n", small_data, length[2]); 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");}fprintf(stdout, " total rows fetched: %d\\n", row_count);if (row_count != 2){ fprintf(stderr, " MySQL failed to return all rows\\n"); exit(0);} mysql_free_result(prepare_meta_result); if (mysql_stmt_close(stmt)){ fprintf(stderr, " failed while closing the statement\\n"); fprintf(stderr, " %s\\n", mysql_stmt_error(stmt)); exit(0);}


--转自 北京联动北方科技有限公司




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论