2010-10-14 5 views
5

Kiedy zamknąłem serwer MySql, jak mogę zrozumieć, że serwer mysql został usunięty z mojego programu Qt?Jak zwrócić uwagę Zamknij serwera MySql w Qt

Edit:

Oto moja próba:

Kiedy zamykam MySQL, uzyskać te wyniki, i nie mogę złapać, że MySQL jest zamknięta.

My fragment kodu jest

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

i wyjście jest:

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

Nie rozumiem dlaczego db.isOpen() zwraca true.

Odpowiedz

1

Twój program nie ma pojęcia o jego otoczeniu. Jeśli coś się zmieni, być może system operacyjny będzie powiadamiał twój program lub będziesz musiał sam się sprawdzić.

Jeśli połączenie z bazą danych zostanie zamknięte przed programem, status z połączenia powinien zwrócić kod błędu. Czy sprawdzasz status z funkcji połączenia?

Napisz prosty program, który otwiera okno i po kliknięciu przycisku zapisuje do bazy danych. Po zapisaniu do bazy danych program powinien wyświetlić status w oknie. Uruchom swój program. Naciśnij przycisk, aby uzyskać "kontrolowaną" odpowiedź. Zamknij bazę danych, a następnie kliknij przycisk ponownie.

Możesz to zrobić za pomocą debuggera, w zależności od zdolności systemu operacyjnego do debugowania & do kolejkowania wiadomości.

1

QSqlQuery::lastError() powinien spowodować błąd w przypadku niepowodzenia zapytania za pośrednictwem QSqlQuery::exec(). Również QSqlDatabase::isOpen() powinien zgłosić stan połączenia, QSqlDatabase::lastError() jest również dostępny

+0

Ta odpowiedź została udzielona przed edytowaniem pytania. Ale jak wyjaśnia edytor, funkcja isOpen jest błędna: zobacz odpowiedź metdos http://stackoverflow.com/a/4406934/1619432 – handle

1

Możesz użyć isOpenError, aby określić, czy otwarcie początkowego połączenia z bazą danych zakończyło się pomyślnie. Zgadzam się, że isOpen powraca true jest mylące.

Aby monitorować połączenie z bazą danych ja wielokrotnie próbować otwierać i zamykać połączenie lekki MySQL (np co 3 sekundy):

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

W powyższym przykładzie, host, user, pass i dbNameQString przypadki zawierające informacje o połączeniu. Zauważ, że potrzebujesz nagłówków programistycznych MySQL.

Powiązane problemy