2010-10-14 14 views
5

Quando ho chiuso il server MySql, come faccio a capire che il server mysql è andato via dal mio programma Qt?Come notare la chiusura del server MySql in Qt

Edit:

Qui mio processo:

Quando chiudo MySql, ottengo questi risultati, e non posso prendere che MySQL è chiuso.

mio frammento di codice è

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

e l'uscita è:

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

Non capisco il motivo per cui db.isOpen() restituisce true.

risposta

1

Il tuo programma non ha idea dei suoi dintorni. Se qualcosa cambia, potresti essere in grado di far sì che il sistema operativo avvisi il tuo programma, o dovrai metterti alla prova.

Se la connessione al database si chiude prima del programma, lo stato della connessione deve restituire una sorta di codice di errore. stai controllando lo stato dalle funzioni di connessione?

Scrivere un semplice programma che apre una finestra e con il clic di un pulsante, scrive nel database. Dopo aver scritto nel database, il programma dovrebbe visualizzare lo stato nella finestra. Esegui il tuo programma. Premere il pulsante per ottenere la risposta "controllata". Chiudere il database quindi fare nuovamente clic sul pulsante.

Potrebbe essere possibile eseguire questa operazione con un debugger, in base alla capacità del debugger & del sistema operativo di accodare i messaggi.

1

QSqlQuery::lastError() dovrebbe darti un errore se la tua richiesta tramite QSqlQuery::exec() non è riuscita. Anche QSqlDatabase::isOpen() dovrebbe segnalare lo stato della connessione, QSqlDatabase::lastError() è disponibile

+0

Questa risposta è stata data prima che la domanda fosse modificata. Ma come chiarisce la modifica, isOpen è bacato: vedi risposta metdos http://stackoverflow.com/a/4406934/1619432 – handle

1

È possibile utilizzare isOpenError per determinare se l'apertura della connessione al database iniziale era successo anche. Sono d'accordo che isOpen restituendo true è confuso.

Per monitorare la connessione al database ho ripetutamente cerco di aprire e chiudere una connessione MySQL leggero (ad esempio ogni 3 secondi):

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

Nell'esempio di cui sopra, host, user, pass, e dbName sono QString casi contenente le informazioni di connessione. Nota che hai bisogno delle intestazioni di sviluppo di MySQL.

Problemi correlati