Chinaunix首页 | 论坛 | 博客
  • 博客访问: 280184
  • 博文数量: 111
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 816
  • 用 户 组: 普通用户
  • 注册时间: 2014-05-04 20:35
文章分类

全部博文(111)

文章存档

2016年(1)

2015年(5)

2014年(105)

我的朋友

分类: C/C++

2014-06-28 21:33:59

一、mysql_store_result与mysql_use_result
第一种,调用mysql_store_result函数将从Mysql服务器查询的所有数据都存储到客户端,然后读取;
第二种,调用mysql_use_result初始化检索,以便于后面一行一行的读取结果集,而它本身并没有从服务器读取任何数据,这种方式较之第一种速度更快且所需内存更少,但它会绑定服务器,阻止其他线程更新任何表,而且必须重复执行mysql_fetch_row读取数据,直至返回NULL,否则未读取的行会在下一次查询时作为结果的一部分返回,故经常我们使用mysql_store_result。

二、比较
同:两者均是连接外部程序处理参数,并返回结果集。
异:从服务器上检索结果集的行,前者只是启动一个逐行的检索,后者从服务器检索结果集的时候就提取了行,并且为之分配内存,存储到客户机中。
操作处理:
mysql_store_result:获取全部数据集保存到本机,因此在随后的mysql_fetch_row()就再也不会返回错误,当返回NULL的时候表示已经到达数据集的末端。
mysql_use_result:本身不检索任何行,而只是启动一个逐行的检索,就是说必须对每一行调用mysql_fetch_row()自己来完成。因此当出现NULL是可能是到达数据集末端,也可能是表示在与服务器通信的时候发生错误,可通过mysql_errno()和
mysql_error()将两者区分开来。
适用:
mysql_store_result:较高的内存和处理需求,因为在客户机上维护整个结果集,所以分配的内存和创建数据结构的耗费是非常巨大的。
mysql_use_result:有着较低的内存需求,每次只需给处理的单行分配足够的内存空间,把较大的内存加载到了服务器上。
注意:
mysql_store_result:获取到结果就与服务器脱离关系,因此可以再查询检索。
mysql_use_result:必须到达末端才能进行再次查询。
因此使用那种检索方式还得根据服务器和客户机来综合考虑。

三、范例

  • #include
  • #include
  • #include
  • int main()
  • {
  • MYSQL mysql;//连接数据库的变量
  • MYSQL_RES *res;//存放查询结果的变量
  • MYSQL_ROW row;
  • char *query;
  • int t,r;
  • char *server= "localhost";
  • char *user = "root";
  • char *password="jinyong";
  • char *database = "test";
  • mysql_init(&mysql); //连接数据库前,必须调用此函数初始化变量
  • /**
  • * MYSQL *mysql_init(MYSQL *mysql)
  • * 传入MYSQL类型的指针
  • * 返回一个被初始化的MYSQL*句柄
  • * 在内存不够的情况下,返回NULL
  • */
  • if(!mysql_real_connect(&mysql,server,user,password,database,0/*TCP IP端口*/,NULL/*Unix socket连接类型*/,0/*运行成ODBC数据库的标记*/))
  • {
  • printf("Error connection to database:%s/n",mysql_error(&mysql));
  • }else
  • printf("Connected.../n");
  • query = "select * from t1";
  • printf("query execute:%s/n",query);
  • t = mysql_real_query(&mysql,query,(unsigned int) strlen(query));
  • /**
  • *
  • * int STDCALL mysql_real_query(MYSQL *mysql,const char *q, unsigned int length);
  • * 执行任何SQL查询语句进行查询。
  • * mysql是我们前面用过的变量,q是SQL查询语句,length是这个查询语句的长度。
  • */
  • if(t)
  • {
  • printf("Error making query:%s/n",mysql_error(&mysql));
  • }else
  • printf("[%s] made.../n",query);
  • res = mysql_store_result(&mysql);
  • /**
  • * mysql_store_result(MYSQL *mysql)
  • * 立刻检索全部结果
  • *
  • * mysql_use_result(MYSQL *mysql)
  • * 初始化一个一行一行地结果集合的检索
  • */
  • while(row = mysql_fetch_row(res))
  • {
  • /**
  • * MYSQL_ROW STDCALL mysql_fetch_row(MYSQL_RES *result);
  • * 检索行
  • */
  • for(t=0;t<=mysql_num_fields(res);t++)
  • {
  • printf("%s",row[t]);
  • }
  • printf("/n");
  • }
  • printf("mysql_free_result.../n");
  • mysql_free_result(res);
  • /**
  • * mysql_free_result()
  • * 释放由它使用的内存。
  • */
  • sleep(1);
  • //execute the insert query
  • query = "insert into t1(id,name) values(3,'kunp')";
  • t = mysql_real_query(&mysql,query,(unsigned int) strlen(query));
  • if(t)
  • {
  • printf("Error making query:%s/n",query);
  • mysql_error(&mysql);
  • }
  • else printf("[%s] made.../n",query);
  • mysql_close(&mysql);
  • /**
  • * void mysql_close(MYSQL *mysql)
  • * 传入MYSQL类型的指针
  • * 功能,关闭一个服务器连接,并释放与连接相关的内存i
  • */
  • return 1;
  • }
  • 阅读(3071) | 评论(0) | 转发(0) |
    给主人留下些什么吧!~~