前言
上一节讲到,使用mysql_query()的返回值来判断数据库连接是否出错。但是,在实现的过程中发现无论是sql 语句本身有问题,比如 查询一张不存在的表,还是数据库的确shutdown了,mysql_query的返回值都是1.当mysql_query无错执行时,其值都为0.这就有一疑问了,为什么官方文档明明是那么写?可是实际中却?Excuse Me???
再看官方文档:
Return Values
Zero for success. Nonzero if an error occurred.
Errors
CR_COMMANDS_OUT_OF_SYNC
Commands were executed in an improper order.
CR_SERVER_GONE_ERROR
The MySQL server has gone away.
CR_SERVER_LOST
The connection to the server was lost during the query.
CR_UNKNOWN_ERROR
An unknown error occurred.
我们来好好读一下这句话:
Return Values
Zero for success. Nonzero if an error occurred.
其唯一能确定的是:成功返回0,不成功返回非0.但是 其返回值人家也没说就要指定不同的错误呀?!而且实践结果也的确说明,mysql_query在执行出错的情况下,统统返回值1.
那它的错误代码CR_XXX怎么用嘞?
再看文档的reference
在官方的这篇的文档关于Error的几个链接里面,我们发现了两个神奇的函数:
char * mysql_error(MYSQL *mysql);
返回mysql连接最近一次错误字符串.
unsigned int mysql_errno(MYSQL *mysql);
返回mysql连接的最近一次错误码
似乎发现了什么~,好像是在说,我们可以通过mysql_errno来获取错误代码。
实践一波
实践方案:
目的:通过mysql_errno()函数获取否则的错误编码。
步骤:
1. mysql 服务器restart,正常运行.
2. mysql_query()执行正确的sql查询语句,得到mysql_query返回值. 并通过mysql_errno()获取错误代码。
3. mysql_query()执行一条错误的sql语句,得到mysql_query返回值.使用mysql_errno()得到错误代码
4. 断开mysql服务器
5. mysql_query()执行一条正确的sql语句,得到mysql_query返回值以及mysql_errno的返回值
6. 进程sleep(10)
7. 打开mysql 服务器
8. 执行重连逻辑
9. mysql_query()执行一条正确的sql语句,得到mysql_query返回值以及mysql_errno的返回值
实践结果
步骤 | mysql_query返回值 | mysql_errno返回值 |
---|---|---|
2 | 0 | 0 |
3 | 1 | 1146(表不存在) |
5 | 1 | 2013 |
9 | 0 | 0 |
分析
通过mysql_errno的确可以正确得到错误的代码
修正:
将(一)中的流程修改如下:
#include <errmsg.h>
···
···
flag<-mysql_query()
if flag=1
flag<-mysql_errno()
if(flag=CR_SERVER_LOST)
Reconnect()
mysql_query()
···
···