解决error:2014 Commands out of sync; you can't run this command now

这篇博客介绍了在使用MySQL C API时遇到的'error: 2014 Commands out of sync; you can't run this command now'错误。错误通常由于查询顺序不当或结果集未正确处理引起。解决方案包括确保在执行新查询前释放MYSQL_RES对象,以及正确处理存储过程返回的结果集。通过示例代码展示了如何避免这种错误。

以前的csdn密码忘了,博客搬家,把以前解决的一个mysql 2014的错误也拉过来。

原地址:http://blog.csdn.net/grass_ring/archive/2008/12/11/3499402.aspx

 

 

前两天搞mysql的东西,用mysql提供的C API 访问,遇到些问题,在这里分享一下,希望对其他人有帮助。


用mysql C API 调用存储过程,并返回结果集。需要注意几个问题:

 

在建立链接的时候要加选项CLIENT_MULTI_STATEMENTS 或 CLIENT_MULTI_RESULTS,以便可以让query执行多个语句。

 

mysql_real_connect(mySQL,serverIP,user,password,database,serverPort,NULL,CLIENT_MULTI_STATEMENTS)

 

当query时可能产生错误error:2014 Commands out of sync; you can't run this command now

 

Mysql文档中说明错误:Commands out of sync

If you get Commands out of sync; you can't run this command now in your client code, you are calling client functions in the wrong order.

This can happen, for example, if you are using mysql_use_result() and try to execute a new query before you have called mysql_free_result(). It can also happen if you try to execute two queries that return data without calling mysql_use_result() or mysql_store_result() in between.

 

当执行完query后,mysql将结果集放在一个result集中,产生以上问题的原因有两个:

一是未将MYSQL_RES所指对象释放,即在下次查询时要mysql_free_result();

二是结果result集不为空,这个原因比较隐蔽。解决方法可以用如下写法:

do

{

  /* Process all results */

  printf("total affected rows: %lld", mysql_affected_rows(mysql));

  ...

  if (!(result= mysql_store_result(mysql)))

  {

     printf(stderr, "Got fatal error processing query/n");

     exit(1);

  }

  process_result_set(result); /* client function */

  mysql_free_result(result);

} while (!mysql_next_result(mysql));

 

 

还有个问题感觉比较奇怪,我调用一个存储过程,存储过程中就一句select

 

Create procedure test()
Begin
    Select * from test ;
End ;

 

用以上方法处理结果集循环会执行两次,开始我只调了一次result= mysql_store_result(mysql)),导致以后执行query报2014错误。

 

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值