2017-10-20 8 views
0

クロスケーブルまたはワイヤレスを介してQPSQLデータベースに接続しようとしています。正しい情報を入力しても問題ありませんが、間違った情報を入力すると、qDebugメッセージを表示するのではなく、プログラムがクラッシュします。QPSQLへの接続に失敗するとQtプログラムがクラッシュする

失敗した接続 connect()返すNULLで
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(); 
} 

答えて

2

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; 
    } 
} 

だから、あなたがそれをやっている:

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

EDIT:私の答えにいくつかのポイントを追加するには:

あなたはif(postgres_db->open())を行っていますが、connect()はすでにこれを行っています。

これはあなたのコードで動作するように、あなたは、例えば、これに機能を接続編集でき得るために:

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; 
} 

しかし、もちろん、それは実際の接続を行うことはないのではなく、設定をそれのプロパティー、名前は少し混乱するでしょう。

NULLの場合はpostgres_dbをテストし、プライベートプロパティqSQLDbHelper->dbにアクセスするには、何らかの種類のgetterを作成するかpublicに変更します。

+0

あなたの答えは正しいですが、私は、クラッシュしないように、接続に失敗した場合に何を返すのかと少し混乱しています。 – Tony

+0

できれば 'connect'関数を編集して' db-> open() 'を返し、新しい関数を作成して' QSQLDbHelper-> db'プロパティにアクセスしてください。 'connect'がfalseを返すならば、[lastError()](http://doc.qt.io/qt-5/qsqldatabase.html#lastError)を使うことができます。 –

+0

私は2つのアイデアを使って答えを更新しました。このヘルパーをそのまま使用すると、接続時にエラーをチェックすることはできません。そのクラスを編集する必要があります。 –

関連する問題