本中所使用的table:

MySQL中的错误处理函数

unsigned int mysql_errno(MYSQL *mysql)

const char *mysql_error(MYSQL *mysql)

说明:一个函数是返回错误号,一个返回错误信息,两者都以MYSQL*为参数,很直观。

第一步:进行查询操作

用到的函数:

int mysql_query(MYSQL *mysql, const char *stmt_str)

int mysql_real_query(MYSQL *mysql, const char *stmt_str, unsigned longlength)

返回值:成功则返回0,失败返回非零,如果失败的话,可以利用错误处理函数来获得错误信息。

这两个函数的区别:当查询语句使用的是二进制数据时,只能用后者。

第二步:保存查询结果(仅select语句具有查询结果,update、delete、insert是没有查询结果的)

用到的函数:

MYSQL_RES *mysql_store_result(MYSQL *mysql)

MYSQL_RES *mysql_use_result(MYSQL *mysql)

返回值:如果执行成功,返回一个非空的MYSQL_RES指针,否则,返回NULL。注意,只要执行select语句成功,就算没有与该select语句匹配的表项,该函数的返回值也不应为NULL。

两个函数的区别:mysql_store_result将整个result set放进client中存储,假若select的查询结果有一百个表项,则调用mysql_store_result会将这一百个表项全都存在了内存中,而mysql_use_result仅仅从result set中取出一个表项存在内存中,使用mysql_fetch_row()函数时才从server中的result set中取出下一个表项。因此mysql_use_result占用的内存更少执行速度也更快。但如果你需要在client端对result set的数据进行一些处理的话,那还是用mysql_store_set吧。

总结:mysql_store_result将select语句在server中的执行结果全都存到了client的内存中,而mysql_use_result仅当需要用到数据时才从server中取出下一条数据存到client的内存中。

注意:结果用完之后,要用mysql_free_result()释放内存。该函数的原型为 void mysql_free_result(MYSQL_RES *result)

第三步:遍历结果

遍历结果可分为两个步骤:首先取出result set中的一行数据,然后再遍历该行数据中的每列数据。

遍历行时用到的函数:

MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)

说明:它以上一步中的查询结果为参数,返回一个MYSQL_ROW结构体,这个结构体的内容为result set中的一行数据,可以理解为一个元素为字符指针的数组(char* row[elems]),当result set中的所有数据遍历完毕,该函数返回NULL。那么怎样使用这个结构体呢?首先得通过下面的函数(mysql_num_fields() / mysql_field_count())得到result set中的列数,然后从index从0开始,以(列数 - 1)结束,依此遍历就可以了。以col代指当前列,若当前列的值为NULL,MYSQL_ROW[col]的值也为NULL。

使用示例:

 MYSQL_ROW row;
unsigned int cols = mysql_field_count(conn_ptr);
while ((row = mysql_fetch_row(res_ptr)) != NULL)
{
for (unsigned int i = ; i < cols; ++i)
{
printf("%s ", row[i]);
}
printf("\n");
}

输出结果如下:

其实正常情况下应该对row[i]是否为NULL进行判断的,这里让我有点疑惑,为何row[i]在为空的情况下,也行正常printf出结果,而不产生段错误。

 MYSQL_ROW row;
unsigned int cols = mysql_field_count(conn_ptr);
while((row = mysql_fetch_row(res_ptr)) != NULL)
{
for(unsigned int i = ;i < cols;++i)
{
if(row[i] == NULL)
printf("i am null");
else
printf("%s ",row[i]);
}
printf("\n");
}

结果:

遍历列时用到的函数:

unsigned int mysql_num_fields(MYSQL_RES *result)

unsigned int mysql_field_count(MYSQL *mysql)

MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result)

对于前面两个函数,它们的参数不同,但是效果却是相同的,都是返回当前查询的result set中的列数。

通过第三个函数可以得到列的属性(包括列的name,列的type等信息),它的用法与mysql_fetch_col()差不多,也需要用while不停地循环。当返回值为空时,就代表没有下一列了。

使用示例:

  MYSQL_RES* res_ptr = mysql_store_result(conn_ptr);
if(res_ptr)
{
printf("use result successful\n"); MYSQL_FIELD* field;
while((field = mysql_fetch_field(res_ptr)))
{
printf("%s ",field->name);
}
printf("\n"); }

结果: 

全部代码

 #include <mysql/mysql.h>

 #include <stdlib.h>
#include <stdio.h> int main()
{
//MYSQL* mysql_init(MYSQL *mysql)
MYSQL* conn_ptr = mysql_init(NULL);
if(conn_ptr == NULL)
{
fprintf(stderr,"mysql_init() failed\n");
return -;
}
//MYSQL* mysql_real_connect(MYSQL *mysql, const char *host,
//const char *user,const char *passwd, const char *db,
//unsigned int port, const char *unix_socket, unsigned long clientflag)
mysql_real_connect(conn_ptr,"localhost",
"rick","secretpassword","rick",
,NULL,);
if(conn_ptr)
{
printf("connect successfully\n");
int query_ret = mysql_query(conn_ptr,"SELECT * FROM children;");
if(query_ret == )
{
printf("query successful\n"); MYSQL_RES* res_ptr = mysql_store_result(conn_ptr);
if(res_ptr)
{
printf("use result successful\n"); MYSQL_FIELD* field;
while((field = mysql_fetch_field(res_ptr)))
{
printf("%s ",field->name);
}
printf("\n"); MYSQL_ROW row;
unsigned int cols = mysql_field_count(conn_ptr);
while((row = mysql_fetch_row(res_ptr)) != NULL)
{
for(unsigned int i = ;i < cols;++i)
{
printf("%s ",row[i]);
}
printf("\n");
}
}
else
{
fprintf(stderr,"use result failed %d : %s\n",mysql_errno(conn_ptr),mysql_error(conn_ptr));
}
mysql_free_result(res_ptr);
}
else
{
fprintf(stderr,"query failed %d : %s\n",mysql_errno(conn_ptr),mysql_error(conn_ptr));
} }
else
{
printf("connect failed\n");
}
//void mysql_close(MYSQL *sock)
mysql_close(conn_ptr);
return ;
}

MySQL中遍历查询结果的常用API(c)的更多相关文章

  1. 【原创】7. MYSQL++中的查询结果获取(各种Result类型)

    在本节中,我将首先介绍MYSQL++中的查询的几个简单例子用法,然后看一下mysqlpp::Query中的几个与查询相关的方法原型(重点关注返回值),最后对几个关键类型进行解释. 1. MYSQL++ ...

  2. mysql中模糊查询的四种用法介绍

    下面介绍mysql中模糊查询的四种用法: 1,%:表示任意0个或多个字符.可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示. 比如 SELECT * FROM [user] ...

  3. mysql 中合并查询结果union用法 or、in与union all 的查询效率

    mysql 中合并查询结果union用法 or.in与union all 的查询效率 (2016-05-09 11:18:23) 转载▼ 标签: mysql union or in 分类: mysql ...

  4. 下面介绍mysql中模糊查询的四种用法:

    下面介绍mysql中模糊查询的四种用法: 1,%:表示任意0个或多个字符.可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示. 比如 SELECT * FROM [user] ...

  5. mysql中如何查询最近24小时、top n查询

    MySQL中如何查询最近24小时. where visittime >= NOW() - interval 1 hour; 昨天. where visittime between CURDATE ...

  6. Mysql中分页查询两个方法比较

    mysql中分页查询有两种方式, 一种是使用COUNT(*)的方式,具体代码如下 1 2 3 SELECT COUNT(*) FROM foo WHERE b = 1;   SELECT a FROM ...

  7. mysql中in查询中排序

    mysql中in查询条件的时候,很多时候排序是不规则的,如何按照in里面的条件进行排序呢? mysql中给出了办法,在in后面加order by field,order by field的首个条件是按 ...

  8. 【面经】面试官:如何以最高的效率从MySQL中随机查询一条记录?

    写在前面 MySQL数据库在互联网行业使用的比较多,有些小伙伴可能会认为MySQL数据库比较小,存储不了很多的数据.其实,这些小伙伴是真的不了解MySQL.MySQL的小不是说使用MySQL存储的数据 ...

  9. MySQL中的查询事务问题

    之前帮同学做个app的后台,使用了MySQL+MyBatis,遇到了一个查询提交的问题,卡了很久,现在有时间了来复盘下 环境情况 假设有学生表: USE test; CREATE TABLE `stu ...

随机推荐

  1. 天梯 L2 链表去重

    L2-002 链表去重 (25 分) 给定一个带整数键值的链表 L,你需要把其中绝对值重复的键值结点删掉.即对每个键值 K,只有第一个绝对值等于 K 的结点被保留.同时,所有被删除的结点须被保存在另一 ...

  2. 人群密度检测MCNN+CSRnet

    MCNN(简单理解): 三列卷积神经网络,分别为大中小三种不同尺度的卷积核,表示为L列(使用大尺度卷积核: 9*9, 7*7, 7*7,7*7), M(使用中等尺度卷积核: 7*7, 5*5, 5*5 ...

  3. 构造分组背包(CF)

    Ivan is a student at Berland State University (BSU). There are n days in Berland week, and each of t ...

  4. 盘一盘Tidyverse| 筛行选列之select,玩转列操作

    原文链接:https://mp.weixin.qq.com/s/ldO0rm3UM_rqlFnU3euYaA 2020年,开封 <R 数据科学>R for data science,系统学 ...

  5. python shutil 文件(夹)的复制、删除、移动、压缩和解压

    高级的 文件.文件夹.压缩包 处理模块 shutil.copyfileobj(fsrc, fdst[, length])将文件内容拷贝到另一个文件中 import shutil shutil.copy ...

  6. 我的开源权限管理项目BeCore (基于.net core开发)

    首先 谢谢大家还记得我.. 新年快乐 祝大家工作顺利 事事顺心 人见人爱 车见车载 冬不寒 下雨有伞 全身哪都不疼 就是有人疼 ~~ Github地址:https://github.com/baby8 ...

  7. 废旧手机改造之给你的手机安装win10系统

    最近又开始琢磨把我这个即将退出的二手手机再利用一下 发现了一个不错的软件 先上图 是不是感觉逼格很高啊 点击下面链接即可下载使用 https://www.lanzous.com/i4gpsib 欢迎交 ...

  8. 软件发布!DOTA2统计学

    更新日志: 1.2 增加DOTABUFF作为数据源,可以与DOTAMAX切换 1.1 增加关于对话框 增加版本信息 修复列表框头的错误   受到 http://tieba.baidu.com/p/38 ...

  9. MySQL5.6绿色版安装

    1.下载 MySQL绿色版安装需下载好三个文件 (1).MySQL5.6版本离线安装包 (2).Microsoft Visual C++ (3).Microsoft .NET Framework 1. ...

  10. Day10-Python3基础-协程、异步IO、redis缓存、rabbitMQ队列

    内容目录: Gevent协程 Select\Poll\Epoll异步IO与事件驱动 Python连接Mysql数据库操作 RabbitMQ队列 Redis\Memcached缓存 Paramiko S ...