Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1476876
  • 博文数量: 254
  • 博客积分: 8696
  • 博客等级: 中将
  • 技术积分: 2961
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-03 16:46
文章分类

全部博文(254)

文章存档

2015年(4)

2014年(18)

2013年(16)

2012年(8)

2011年(25)

2010年(2)

2009年(74)

2008年(107)

分类: C/C++

2014-04-18 18:37:26

调用mysql_real_query失败,并报:Commands out of sync; you can't run this command now。

通常情况MySQL出于安全考虑不允许一次执行多条语句(但也不报错,很让人郁闷)。MySQL是支持在单个查询字符串中指定多语句执行的,使用方法是给链接指定参数:

  1. //链接时设定  
  2. mysql_real_connect( ..., CLIENT_MULTI_STATEMENTS );  
  3. //或者  
  4. //中途指定  
  5. mysql_set_server_option( mysql, MYSQL_OPTION_MULTI_STATEMENTS_ON ); //mysql是连接的名称  

当使用执行多语句功能后,一定要读完整个resault集,否则会出现错误:Commands out of sync; you can't run this command now

官方推荐的执行语句是这样的:

 

  1. do  
  2. {  
  3.     /* Process all results */  
  4.     ...    
  5.     printf( "total affected rows: %lld", mysql_affected_rows( mysql ) );  
  6.     ...  
  7.   
  8.     if( !( result  mysql_store_result( mysql ) ) )  
  9.     {  
  10.         printf( stderr, "Got fatal error processing query\n" );  
  11.         exit(1);  
  12.     }  
  13.   
  14.     process_result_set(result); /* client function */  
  15.     mysql_free_result(result);  
  16. }while( !mysql_next_result( mysql ) );  

如果仅仅是插入等不需要返回值的SQL语句,也一样得读完整个resault集并释放,最小化的写法:

  1. do  
  2. {  
  3.     result = mysql_store_result( mysql );  
  4.     mysql_free_result(result);  
  5. }while( !mysql_next_result( mysql ) );  
上述是网上所述原因和解决办法。

但我的代码里面并没有涉及多次查询或与存储过程相关的操作,代码流程基本上是mysql_real_connect---->mysql_real_query。找了很久后也没有发现多次查询的情况。

后来发现是mysql api的include文件版本与libmysqlclient.so版本不一样;把对应的include替换工程里面的mysql/include后重新编译,程序正常运行。




阅读(4841) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~