本帖最后由 newmczh 于 2011-08-11 21:09:05 编辑

解决方案 »

  1.   

    看看这个:http://blog.csdn.net/grass_ring/article/details/3499402
      

  2.   

    A.2.13. 命令不同步
    如果遇到“命令不同步”错误,将无法在你的客户端代码中运行该命令,你正在以错误顺序调用客户端函数。
    例如,如果你正使用mysql_use_result(),并打算在调用mysql_free_result()之前执行新查询,就会出现该问题。如果你试图执行两次查询,但并未在两次查询之间调用mysql_use_result()或mysql_store_result(),也会出现该问题。
      

  3.   

    谢谢楼上两位,这个我已经翻查过。好像没什么关系,至于 mysql_use_result()和 mysql_free_result()我明显是成对调用的。另外,这个程序有时候会在 mysql_init 调用的时候崩溃,崩溃原因是内存访问非法。我比较怀疑是 opt\libmysql.dll 这个文件编译出来的问题,因为使用某一个版本,不会出现这种情况
      

  4.   

    iihero 的程序是正确的,不过关键的函数好像是 mysql_next_result从另外一篇文章里找到了线索作者分析的挺复杂了,其实我们一般只用mysql_query、mysql_use_result等几个函数,问题的症结在于当执行一个存储过程的时候,数据库返回的是多个数据集合,即使只有一个数据集合,他也会有一个空集合用于结束一次回话,作者骂他变态,其实不然,可能作者考虑到的只是一般的请求,mysql是给所有用户使用的,说不能真有变态的人把图片文件等等直接保存在mysql字段里面,那么回复就不可能一次完成,需要多此网络交互,那么所有的交互肯定需要一个结束符号,并且存储过程本来就可以返回多个数据集合,如果他在c pai中只做一个结果己处理就允许下一次全新的请求,那么对于同一连接,在mysql服务断其实还有没有发送完成的数据,这个时候他安全的做法就是不接受任何新的请求,直到数据发送完全,或者连接关闭,不然,mysql协议解析就会出现问题,下次发送就会出现黏包或者丢包,所以他的做法是完全正确的,即使只有一个结果集合,也需要当前会话内的通讯(比如mysql_next_result)确认完毕,然后结束本次请求,这个时候服务端其实没有数据了,但是这个过程是不能省略的,然后在不关闭连接的情况下就可以进行全新的请求了。
        所以总结起来就是:使用存储过程的时候一定要循环执行,把所有的结果集合都取到,直到为空,这个时候当前数据库连接才可以安全归还回去,
    目前继续测试看一看
      

  5.   

    问题的关键就是在于mysql_next_result, 存储过程有可能返回多个结果集,必须依次取完。