2015-11-30 3 views
0

Каждый раз, когда я объявляю QSqlDatabse соединение в файле заголовка моего класса DatabaseManager, мое приложение вылетает с сообщением: программа неожиданно закончила?!QSqlDatabse: программа неожиданно закончила?

Если я помещаю декларацию в исходный файл, мое приложение работает нормально.

  1. Почему это происходит и
  2. , как это исправить?

Edit:

здесь заголовочный файл:

#ifndef DATABASEMANAGER_H 
#define DATABASEMANAGER_H 

#include <QObject> 
#include <QSqlDatabase> 
#include <QSqlError> 
#include <QSqlQuery> 

class DatabaseManager : public QObject 
{ 
    Q_OBJECT 
public: 
    explicit DatabaseManager(QObject *parent = 0); 

public: 
    QString open_db(); 
    QString create_db_tables(); 
    QSqlDatabase get_db(); 

    QSqlDatabase database; 
}; 

#endif // DATABASEMANAGER_H 

здесь исходный файл:

#include "databasemanager.h" 
#include <QDir> 
#include <QCoreApplication> 
#include <QDebug> 


QString DatabaseManager::open_db() 
{ 

    QSqlDatabase db; 
    db = database; 

    QString path = "/Users/abubakr/Documents/workspace/Muasaa/"; 

    db = QSqlDatabase::addDatabase("QSQLITE"); 
    db.setDatabaseName(path+"Database v.1"); 
    if (db.open()){ 
     return "Database is created and open, Application is ready ..."; 
    } else { 
     return db.lastError().text(); 
    } 
} 

QSqlDatabase DatabaseManager::get_db(){ 
} 

QString DatabaseManager::create_db_tables(){ 

    QSqlQuery query; 

    //**************************************** 
    //create personal_info table 
    //**************************************** 
    query.prepare("CREATE TABLE IF NOT EXISTS personal_Info" 
        "(ref_no NTEGER UNIQUE PRIMARY KEY," 
        "name VARCHAR(30), father VARCHAR(30), grandfather VARCHAR(30), mother VARCHAR(30), tel VARCHAR(30)," 
        "email VARCHAR(30), post_code VARCHAR(30), address VARCHAR(30))"); 
    if (!query.exec()) return query.lastError().text(); 

    //**************************************** 
    //create familly_info table 
    //**************************************** 
    query.prepare("CREATE TABLE IF NOT EXISTS familly_Info" 
        "(ref_no NTEGER UNIQUE PRIMARY KEY," 
        "spouse VARCHAR(30), father_in_law VARCHAR(30), mother_in_law VARCHAR(30), childern VARCHAR(30))"); 
    if (!query.exec()) return query.lastError().text(); 


    //**************************************** 
    //create payment_info table 
    //**************************************** 
    query.prepare("CREATE TABLE IF NOT EXISTS payment_Info" 
        "(ref_no NTEGER UNIQUE PRIMARY KEY," 
        "payment VARCHAR(30), payment_method VARCHAR(30))"); 
    if (!query.exec()) return query.lastError().text(); 


    return "Tables created successfully "; 

} 
+0

Маленький код будет лучше здесь! – ramtheconqueror

+0

Отладка не показывает мне ничего .. @ drescherjm –

+0

Это на окнах? Если вы используете Qt, который был создан для вашей версии компилятора. Вы не можете использовать Qt, который был создан для любой другой версии. – drescherjm

ответ

0

Я думаю, что есть несколько вещей, здесь не так.

В open_db() метод иметь в виду, как работает ++ управление памятью в C. Ничто из того, что определяется там, не сохранится. Таким образом, для следующих линий:

QSqlDatabase db; 
db = database; 

, что вы на самом деле делаете определение дБ, а затем установить его в значение базы данных, что нет ничего. Затем вы инициализируете db значениям, которые вы хотите, но это не имеет значения, потому что когда метод вернет, все будет автоматически уничтожено. База данных переменная никогда не получает ничего. В open_db() просто инициализировать переменную вы определили в своем классе, а не так:

database = QSqlDatabase::addDatabase("QSQLITE"); 
database .setDatabaseName(path+"Database v.1"); 
if (database .open()){ 

затем в create_db_tables() вы должны инициализировать объект QSqlQuery с базу данных, которую вы только что создали:

QSqlQuery query(database); 

Как только вы это сделаете, все остальное должно начать работать должным образом.

Смежные вопросы