对Mysql的C API调用的问题及解决方法分析

28 篇文章 0 订阅
 最近总是出现一些让人难以理解的问题,在寻找解决方法未果的情况下,只能考虑一些其它的解决方法。
        Mysql提供了两种api接口,query和prepare statement。这两种在存储过程中也存在。下面列举几种不同的调用方法, sp表示调用存储过程, 并在存储过程中使用相关调用方法。
   C API - SQL
1. query - query
2. query - query(sp)
3. query - stmt(sp)
4. stmt - query
5. stmt - query(sp)
6. stmt - stmt(sp)
        上面共有六种不同的方式, 大家可以猜一下哪些可以正常调用, 而不会发生问题。
        实际上,只有1和4最容易使用而不会发生问题。这是最简单常用的调用方式,不论在ADO,还是在其它任何类型的数据库查询中。即使这样,query和stmt还是有区别的。query可以执行多条语句并返回多个集合,stmt只能执行单条,返回单个集合,但是支持(?)绑定参数。同时,使用query执行多条语句和使用stmt时, 在创建连接的时候要开始CLIENT_MULTI_STATEMENTS选项,以支持多条语句。所以现在query又可以把调用方法分成两部分,执行单条和多条。
        我在使用query的时候,并没有想到它也会出问题。感觉把语句传进去执行,返回值就可以了。在使用2,3方式的时候,出现了个比较郁闷的事。当我第一次调用时,所有值正常返回,可是在第二次调用时,所有的函数返回失败,连stmt也不能用了。这时只能重新建立连接。试了很多方法都不行,全部转成stmt也不行,因为它也有更难解决的问题。就是因为stmt的几个问题解决不了,我才使用了query来弥补,在5,6中将讨论这些问题。
        在查了很多资料后,有人提出在调用存储过程时有除返回的集合外的其它的数据返回。在这里要说明一点,Mysql的接口,有些必须要按它的顺序来调用,否则就会发生上面这种情况,必须重连才能恢复。即然有多余的数据,我就试着用mysql_next_result去取它的下一个集合,然后再存储,再释放。结论是,返回的不只有一个集合,而且多了的集合并没有取到数据。然后再执行两次sp,结果成功。
        下面再讨论5,6。这两种方式比其它的遇到的问题更多。上面说一个问题没有解决才去用,就是在6中遇到的问题。首先遇到的是6中的问题。在返回集合时,取到的数据乱掉了。在调试进去后,发现头部少了一个字节, 所以实际取时先取到的是第二个字段或是第一个字段少一个字节。这个问题可以用selet "a",* from table来解决,但估计没人喜欢用这种方式来,而且也不保证完全可行。5可以正确返回,所以我只把6方式改为query。但是当系统正式跑起来时,问题出现了,和2,3的问题一样。但是stmt不支持多集合,所以相关的函数也不能使用。这个问题现在也没有解决,如果谁知道解决方法可能告诉我,tks!
        另外,stmt的无返回集合的调用可以正常使用。我们可以通上面的分析,综合使用这几种方式。
        对于参数,我们可以用stmt设置变量(etc:set P1=?;),然后在query中引用这个变量执行sql语句。如果传入的都是整型的数据,那就不用那么麻烦了,直接动态构造sql用query执行就好了。对于无返回值的调用,推荐用stmt,因为它支持参数绑定,再就是它的执行速度可能会快一些。不过,具体快多少,还要大家测试过后,再决定是否使用。

        好了,就这么多了,大家如果有更好的建议,别忘记给我留言^^

原文地址:http://blog.csdn.net/winterlc/article/details/2782405

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值