如何在Qt中检测MySql服务器关闭

5
当我关闭MySql服务器时,如何知道我的Qt程序中的mysql服务器已经离开?
编辑:
这是我的尝试:
当我关闭MySql时,我得到这些结果,但我无法捕获到MySql已关闭。
我的代码片段是:
QSqlQuery query(db);
query.exec("SELECT * From RequestIds");
qDebug()<<query.lastError();
qDebug()<<db.lastError()<<QTime::currentTime();
qDebug()<<db.isOpen();
qDebug()<<db.isValid();

输出结果为:

QSqlError(2006, "QMYSQL: Unable to execute query", "MySQL server has gone away") 
QSqlError(-1, "", "") QTime("14:22:58") 
true 
true

我不明白为什么db.isOpen()会返回true。

4个回答

3

1

你可以使用 isOpenError 来确定打开初始数据库连接是否成功。我同意 isOpen 返回 true 是令人困惑的。

为了监视数据库连接,我会反复尝试打开和关闭轻量级 MySQL 连接(例如每3秒):

    #include <mysql/mysql.h>

    mysql_init(&connection);
    MYSQL *result = mysql_real_connect(&connection,
            host.isNull() ? static_cast<const char *>(0) : host.toLocal8Bit().constData(),
            user.isNull() ? static_cast<const char *>(0) : user.toLocal8Bit().constData(),
            pass.isNull() ? static_cast<const char *>(0) : pass.toLocal8Bit().constData(),
            dbName.isNull() ? static_cast<const char *>(0) : dbName.toLocal8Bit().constData(),
            0,
            0,
            0);

    bool currentlyConnected = (result != 0);

在上面的示例中,hostuserpassdbName 是包含连接信息的QString实例。请注意,您需要安装MySQL开发头文件。

1

你的程序对周围环境一无所知。如果有什么变化,你可以让操作系统通知你的程序,或者你必须自己进行测试。

如果数据库连接在你的程序之前关闭,连接状态应该返回某种错误代码。你正在检查连接函数的状态吗?

编写一个简单的程序,打开一个窗口,点击按钮后写入数据库。写入数据库后,程序应在窗口中显示状态。运行你的程序。按下按钮以获得“受控”响应。然后关闭数据库,再次点击按钮。

根据调试器和操作系统排队消息的能力,你可能能够使用调试器来完成此操作。


1

QSqlQuery::lastError()应该在通过QSqlQuery::exec()执行查询失败时返回错误。此外,QSqlDatabase::isOpen()应报告连接状态,QSqlDatabase::lastError()也可用。


此答案是在问题被编辑之前给出的。但是随着编辑的澄清,isOpen存在缺陷: 请参见metdos的答案https://dev59.com/zlHTa4cB1Zd3GeqPOyPQ#4406934 - handle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接