Как заметить закрытие сервера MySql в Qt - PullRequest
5 голосов
/ 14 октября 2010

Когда я закрыл сервер 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();

, и вывод:

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 голосов
/ 10 декабря 2010

В Qt есть ошибка, связанная с QSqlDatabase :: isOpen ().

https://bugreports.qt.io/browse/QTBUG-223

1 голос
/ 14 октября 2010

QSqlQuery::lastError() должен выдать ошибку, если ваш запрос через QSqlQuery::exec() не удался. Также QSqlDatabase::isOpen() должен сообщать о состоянии вашего соединения, QSqlDatabase::lastError() также доступно

1 голос
/ 27 октября 2010

Вы можете использовать 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);

В приведенном выше примере host, user, pass и dbName являются экземплярами QString, содержащими информацию о соединении.Обратите внимание, что вам нужны заголовки разработки MySQL.

1 голос
/ 14 октября 2010

Ваша программа не имеет представления о ее окружении.Если что-то изменится, возможно, ОС сможет уведомить вашу программу или вам придется проверить себя.

Если соединение с базой данных закрывается до вашей программы, состояние соединения должно возвращать некоторый код ошибки.Вы проверяете статус из функций подключения?

Напишите простую программу, которая открывает окно и по нажатию кнопки пишет в базу данных.После записи в базу данных программа должна отобразить статус в окне.Запустите вашу программу.Нажмите кнопку, чтобы получить «контролируемый» ответ.Закройте базу данных, затем снова нажмите кнопку.

Вы можете сделать это с помощью отладчика, в зависимости от способности отладчика и ОС ставить сообщения в очередь.

...