mysql_num_fields与mysql_field_count的区别

来源:互联网 发布:浏览器地址栏执行js 编辑:程序博客网 时间:2024/05/16 09:27

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

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

[cpp] view plaincopyprint?
  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

原创粉丝点击