mysql_num_fields与mysql_field_count的区别

mysql_num_fields和mysql_field_count都是获取结果中列的个数,但是这两个函数在使用的时候是存在区别的。

先看一段代码(上篇文章提供的数据库):

  1. #include <mysql/mysql.h> 
  2. #include <stdio.h> 
  3. #include <stdlib.h> 
  4. #include <string.h> 
  5.  
  6. int main() 
  7.     char out[100]; 
  8.     MYSQL mysql; 
  9.     MYSQL_RES* res; 
  10.  
  11.     int num_fields; 
  12.     int count_fields; 
  13.     int num_rows; 
  14.  
  15.     mysql_init(&mysql); 
  16.     mysql_real_connect(&mysql,NULL,"root","123","ta",0,NULL,0); 
  17.  
  18.     fprintf(stdout,"--insert------------------------/n"); 
  19.  
  20.     mysql_real_query(&mysql,"INSERT INTO t1 VALUES(6,'n6')",29); 
  21.  
  22.     count_fields = mysql_field_count(&mysql); 
  23.     sprintf(out,"insert----count_fields is %d/n",count_fields); 
  24.     fprintf(stdout,out); 
  25.  
  26.     res = mysql_store_result(&mysql); 
  27.     if(res == NULL) 
  28.     { 
  29.         fprintf(stdout,"insert---store return null/n"); 
  30.     } 
  31.     else 
  32.     { 
  33.         num_fields = mysql_num_fields(res); 
  34.         sprintf(out,"insert---num_fields is %d/n",num_fields); 
  35.         fprintf(stdout,out); 
  36.     } 
  37.  
  38.     fprintf(stdout,"---select-----------/n"); 
  39.  
  40.     mysql_real_query(&mysql,"SELECT * FROM t1",16); 
  41.  
  42.     count_fields = mysql_field_count(&mysql); 
  43.     sprintf(out,"select---count_fields is %d/n",count_fields); 
  44.     fprintf(stdout,out); 
  45.  
  46.     res = mysql_store_result(&mysql); 
  47.     if(res == NULL) 
  48.     { 
  49.         fprintf(stdout,"select---store return null/n"); 
  50.     } 
  51.     else 
  52.     { 
  53.         num_fields = mysql_num_fields(res); 
  54.         sprintf(out,"select---num_fields is %d/n",num_fields); 
  55.         fprintf(stdout,out); 
  56.  
  57.         num_rows = mysql_num_rows(res); 
  58.         sprintf(out,"select---num_rows is %d/n",num_rows); 
  59.         fprintf(stdout,out); 
  60.     } 
  61.  
  62.     fprintf(stdout,"---select 0------/n"); 
  63.  
  64.     mysql_real_query(&mysql,"SELECT * FROM t1 where id = 10",30); 
  65.  
  66.     count_fields = mysql_field_count(&mysql); 
  67.     sprintf(out,"select 0---count_fields is %d/n",count_fields); 
  68.     fprintf(stdout,out); 
  69.  
  70.     res = mysql_store_result(&mysql); 
  71.     if(res == NULL) 
  72.     { 
  73.         fprintf(stdout,"select 0---store return null/n"); 
  74.     } 
  75.     else 
  76.     { 
  77.         num_fields = mysql_num_fields(res); 
  78.         sprintf(out,"select 0---num_fields is %d/n",num_fields); 
  79.         fprintf(stdout,out); 
  80.  
  81.         num_rows = mysql_num_rows(res); 
  82.         sprintf(out,"select 0---num_rows is %d/n",num_rows); 
  83.         fprintf(stdout,out); 
  84.     } 
  85.  
  86.     mysql_free_result(res); 
  87.     mysql_close(&mysql); 
  88.     exit(0); 

执行结果是:
--insert------------------------
insert----count_fields is 0
insert---store return null
---select-----------
select---count_fields is 2
select---num_fields is 2
select---num_rows is 7
---select 0------
select 0---count_fields is 2
select 0---num_fields is 2
select 0---num_rows is 0

显然,当执行insert语句的时候,是没有结果返回的,因此列的个数为0,且mysql_store_result返回NULL。因此可以通过mysql_field_count()是否返回0来判断是否有结果返回,而不需要执行mysql_store_result来判断是否返回了NULL。我想,mysql_field_count()的效率肯定要比mysql_store_result()高。

在这种情况下,由于没有返回结果,因此mysql_store_result()返回NULL,也就是得不到res指针,于是mysql_num_fields()函数就无法执行,缺少必要的参数。

当执行第一条select语句的时候,返回了结果,因此mysql_field_count()和mysql_num_fields()都返回了正确的列的个数2,mysql_num_rows()返回了记录的条数7.

当执行第二条select语句,由于表中没有 id = 0 的记录,因此mysql_num_rows返回了0表示记录数为0,但是,我们发现mysql_store_result()并没有返回NULL,mysql_num_fields()和mysql_field_count()还是返回了2.

因此我们可以得出这样的结论:

执行结果有三种情况,第一是执行insert、update和delete这样的语句的时候,是不会有任何内容返回,因此mysql_store_result()会返回一个NULL。第二,执行select或show这样的语句时,一定会有内容返回,可以取得列信息,但是记录可以为0,也可以不为0。这就像一个表,表头一定存在,但是表中可以没有数据。

另外:

mysql_affected_rows()函数的作用是,当执行update  insert  delete 时,返回影响的行数。

mysql中文文档:

http://dev.mysql.com/doc/refman/5.1/zh/apis.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
* 0 译者序 * 1 MySQL的一般的信息 o 1.1 什么是MySQL? o 1.2 关于本手册 + 1.2.1 本手册中使用的约定 o 1.3 MySQL的历史 o 1.4 MySQL的主要特征 o 1.5 MySQL稳定性? o 1.6 顺应2000年 o 1.7 SQL一般信息和教程 o 1.8 有用的MySQL相关链接 * 2 MySQL 邮件列表及如何提问或报告错误 o 2.1 MySQL邮件列表 o 2.2 提问或报告错误 o 2.3 怎样报告错误或问题 o 2.4 在邮件列表上回答问题的指南 * 3 MySQL的许可证和技术支持 o 3.1 MySQL的许可证政策 o 3.2 MySQL 使用的版权 + 3.2.1 可能的未来版权改变 o 3.3 MySQL商业性分发 o 3.4 许可证实例 + 3.4.1 销售使用 MySQL的产品 + 3.4.2 销售MySQL相关的服务 + 3.4.3 ISP MySQL服务 + 3.4.4 运营一个使用MySQL的Web服务器 o 3.5 MySQL的许可证和技术支持费用 + 3.5.1 付款信息 + 3.5.2 联系信息 o 3.6 商业性支持的类型 + 3.6.1 基本的电子邮件支持 + 3.6.2 扩展的电子邮件支持 + 3.6.3 登录支持 + 3.6.4 扩展的登录支持 * 4 安装 MySQL o 4.1 怎样获得MySQL o 4.2 MySQL支持的操作系统 o 4.3 使用MySQL哪个版本 o 4.4 怎样和何时发布更新版本 o 4.5 安装布局 o 4.6 安装MySQL二进制代码分发 + 4.6.1 Linux RPM注意事项 + 4.6.2 构造客户程序 + 4.6.3 系统特定的问题 # 4.6.3.1 Linux 注意事项 # 4.6.3.2 HP-UX 注意事项 o 4.7 安装 MySQL源代码分发 + 4.7.1 快速安装概述 + 4.7.2 运用补丁 + 4.7.3 典型的configure选项 o 4.8 编译问题? o 4.9 MIT-pthreads 注意事项 o 4.10 Perl 安装说明 + 4.10.1 在Unix操作系统上安装 Perl + 4.10.2 在 Win32上安装 ActiveState Perl + 4.10.3 在 Win32 上安装 MySQL Perl 分发 + 4.10.4 使用 Perl DBI/DBD接口遇到的问题 o 4.11 系统特定的问题 + 4.11.1 Solaris注意事项 + 4.11.2 Solaris 2.7 注意事项 + 4.11.3 Solaris x86 注意事项 + 4.11.4 SunOS 4 注意事项 + 4.11.5 Linux (所有的Linux版本)注意事项

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值