2010-10-14 19 views
5

Cuando cerré el servidor MySQL, ¿cómo puedo entender que el servidor mysql se haya ido de mi programa Qt?Cómo observar el cierre del servidor MySql en Qt

Editar:

Aquí mi juicio:

Cuando cierro MySql, consigo estos resultados, y no puedo coger que MySQL está cerrado.

Mi Fragmento de código es

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

y la salida es:

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

No entiendo por qué db.isOpen() devuelve verdadero.

Respuesta

1

Su programa no tiene idea de su entorno. Si algo cambia, es posible que el sistema operativo lo notifique a su programa o tendrá que hacerse la prueba usted mismo.

Si la conexión de la base de datos se cierra antes de su programa, el estado de la conexión debe devolver algún tipo de código de error. ¿Está comprobando el estado desde las funciones de conexión?

Escriba un programa simple que abra una ventana y con un clic de un botón, escriba en la base de datos. Después de escribir en la base de datos, el programa debe mostrar el estado en la ventana. Ejecute su programa. Presione el botón para obtener la respuesta "controlada". Cierre la base de datos luego haga clic en el botón nuevamente.

Puede hacer esto con un depurador, dependiendo de la capacidad del OS de depurador & para poner mensajes en cola.

1

QSqlQuery::lastError() debería darle un error si su consulta a través de QSqlQuery::exec() ha fallado. También QSqlDatabase::isOpen() debe informar el estado de su conexión, QSqlDatabase::lastError() también está disponible

+0

Esta respuesta se dio antes de que se editara la pregunta. Pero a medida que la edición aclara, isOpen tiene fallos: consulte metdos answer http://stackoverflow.com/a/4406934/1619432 – handle

1

Puede usar isOpenError para determinar si la apertura de la conexión inicial de la base de datos fue exitosa. Estoy de acuerdo en que isOpen que devuelve true es confuso.

para supervisar la conexión de base de datos I repetidamente intento abrir y cerrar una conexión MySQL ligero (por ejemplo, cada 3 segundos):

#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); 

En el ejemplo anterior, host, user, pass, y dbName son QString casos que contiene la información de conexión. Tenga en cuenta que necesita los encabezados de desarrollo de MySQL.

Cuestiones relacionadas