2017-10-20 4 views
0

J'essaie de me connecter à la base de données QPSQL via un câble croisé ou sans fil. Quand j'entre les détails corrects tout va bien mais si j'entre les détails incorrects le programme se bloque au lieu de me donner le message de qDebug pourquoi?Le programme Qt se bloque en cas de connexion infructueuse à QPSQL

const char* driverName = "QPSQL"; 
QSQLDbHelper* qSQLDbHelper = new QSQLDbHelper(driverName); 
postgres_db = qSQLDbHelper->connect(host,database,username,password,port); 

if(postgres_db->open()) 
{ 
    qDebug() <<"Opened Postgres Database"<< postgres_db->open(); 
} 
else 
{ 
    qDebug() << "Something went Wrong:" << postgres_db->lastError().text(); 
} 
qSQLDbHelper->disConnect(); 
delete qSQLDbHelper; 

void QSQLDbHelper::disConnect() 
{ 
    qDebug() << "Disconnected From Postgres Database!"; 
    postgres_db->close(); 
} 

Répondre

2

Lors de la connexion infructueuse connect() retourne NULL:

QSqlDatabase* QSQLDbHelper::connect(const QString& server, 
            const QString& databaseName, 
            const QString& userName, 
            const QString& password) 
{ 
    db->setConnectOptions(); 
    db->setHostName(server); 
    db->setDatabaseName(databaseName); 
    db->setUserName(userName); 
    db->setPassword(password); 

    if(db->open()) { 
     return db; 
    } 
    else { 
     return NULL; 
    } 
} 

Vous font que:

qDebug() << "Something went Wrong:" << NULL->lastError().text(); 

EDIT: Pour ajouter quelques points à ma réponse:

Vous font if(postgres_db->open()) mais connect() l'ont déjà fait.

Pour que cela fonctionne dans votre code, vous pouvez, par exemple, modifier la fonction se connecter à ceci:

QSqlDatabase* QSQLDbHelper::connect(const QString& server, 
            const QString& databaseName, 
            const QString& userName, 
            const QString& password) 
{ 
    db->setConnectOptions(); 
    db->setHostName(server); 
    db->setDatabaseName(databaseName); 
    db->setUserName(userName); 
    db->setPassword(password); 

    return db; 
} 

Mais bien sûr, il ne serait pas en train de faire une connexion réelle, mais plutôt mettre en propriétés de celui-ci, donc le nom serait légèrement déroutant.

L'alternative est de tester postgres_db pour NULL et d'accéder à la propriété privée qSQLDbHelper->db en créant une sorte de getter ou en la modifiant en public.

+0

Votre réponse est correcte, mais je suis légèrement confus ce que je retournerais sur une connexion infructueuse afin qu'il ne tombe pas en panne. – Tony

+0

si vous le pouvez, éditez la fonction 'connect' pour retourner' db-> open() 'et créez une nouvelle fonction pour accéder à la propriété' QSQLDbHelper-> db'. Vous pouvez ensuite utiliser [lastError()] (http://doc.qt.io/qt-5/qsqldatabase.html#lastError) dessus si 'connect' renvoie false. –

+0

J'ai mis à jour ma réponse avec 2 idées sur comment vous pouvez contourner cela. Avec cette aide en l'état - vous ne pouvez pas vérifier les erreurs sur connecter. Vous devrez modifier cette classe. –