您的位置:首页 > 产品设计 > UI/UE

MySQL 中mysql_query()来判断数据库是否连接中断(二)

2017-04-23 01:09 435 查看

前言

上一节讲到,使用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返回值
200
311146(表不存在)
512013
900

分析

通过mysql_errno的确可以正确得到错误的代码

修正:

将(一)中的流程修改如下:


#include <errmsg.h>
···
···
flag<-mysql_query()
if flag=1
flag<-mysql_errno()
if(flag=CR_SERVER_LOST)
Reconnect()
mysql_query()
···
···
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: