一、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);
if(!mysql_real_connect(&mysql,server,user,password,database,0,NULL,0))
{
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));
if(t)
{
printf("Error making query:%s/n",mysql_error(&mysql));
}else
printf("[%s] made.../n",query);
res = mysql_store_result(&mysql);
while(row = mysql_fetch_row(res))
{
for(t=0;t<=mysql_num_fields(res);t++)
{
printf("%s",row[t]);
}
printf("/n");
}
printf("mysql_free_result.../n");
mysql_free_result(res);
sleep(1);
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);
return 1;
}
阅读(3109) | 评论(0) | 转发(0) |