C++ Qt中如何注意MySql服务器的关闭

C++ Qt中如何注意MySql服务器的关闭,c++,mysql,qt,database-connection,C++,Mysql,Qt,Database Connection,当我关闭MySql服务器时,我怎么能理解MySql服务器已经离开了我的Qt程序 编辑: 这是我的审判: 当我关闭MySql时,我会得到这些结果,但我无法发现MySql已经关闭 我的代码片段是 QSqlQuery query(db); query.exec("SELECT * From RequestIds"); qDebug()<<query.lastError(); qDebug()<<db.lastError()<<QTime::currentTime()

当我关闭MySql服务器时,我怎么能理解MySql服务器已经离开了我的Qt程序

编辑:

这是我的审判:

当我关闭MySql时,我会得到这些结果,但我无法发现MySql已经关闭

我的代码片段是

QSqlQuery query(db);
query.exec("SELECT * From RequestIds");
qDebug()<<query.lastError();
qDebug()<<db.lastError()<<QTime::currentTime();
qDebug()<<db.isOpen();
qDebug()<<db.isValid();

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

您的程序不知道它周围的环境。如果发生变化,您可以让操作系统通知您的程序,或者您必须测试自己

如果数据库连接在程序之前关闭,则连接的状态应返回某种错误代码。您是否正在检查连接功能的状态

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


您可以使用调试器执行此操作,具体取决于调试器和操作系统对消息进行排队的能力。

QSqlQuery::lastError()
如果通过
QSqlQuery::exec()
进行的查询失败,则应显示错误。另外,
QSqlDatabase::isOpen()
应报告连接的状态,
QSqlDatabase::lastError()
也可用

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

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

#包括
mysql_init(&connection);
MYSQL*result=MYSQL\u real\u connect(&connection),
host.isNull()?静态_转换(0):host.toLocal8Bit().constData(),
user.isNull()?静态_转换(0):user.toLocal8Bit().constData(),
pass.isNull()?静态_转换(0):pass.toLocal8Bit().constData(),
dbName.isNull()?静态_转换(0):dbName.toLocal8Bit().constData(),
0,
0,
0);
bool currentlyConnected=(结果!=0);

在上面的示例中,
host
user
pass
dbName
是包含连接信息的
QString
实例。请注意,您需要MySQL开发头。

Qt中有一个与QSqlDatabase::isOpen()相关的错误


此答案是在编辑问题之前给出的。但正如编辑澄清的那样,isOpen是有缺陷的:参见metdos答案
QSqlError(2006, "QMYSQL: Unable to execute query", "MySQL server has gone away") 
QSqlError(-1, "", "") QTime("14:22:58") 
true 
true
    #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);