QSqlDatabse:程序意外完成了?

时间:2015-11-30 17:14:36

标签: c++ qt qsqldatabase

每次我在我的DatabaseManager类的头文件中声明QSqlDatabse连接时,我的应用程序崩溃并显示一条消息: 程序意外完成

如果我将声明放在源文件中,我的应用程序可以正常工作。

  1. 为什么会这样?
  2. 如何解决?
  3. 修改

    这是头文件:

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

1 个答案:

答案 0 :(得分:0)

我认为这里有一些问题。

open_db() 方法中,请记住C ++中的内存管理是如何工作的。没有任何定义在那里将生存。所以对于以下几行:

QSqlDatabase db;
db = database;

您实际做的是定义 db ,然后将其设置为 数据库的值,这没什么。然后,您将 db 初始化为您想要的值,但这并不重要,因为当方法返回时,将自动销毁所有值。 数据库 变量永远不会设置为任何内容。 在 open_db() 中,只需初始化您在班级中定义的变量,而不是:

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

然后在 create_db_tables() 中,您必须使用刚创建的数据库初始化QSqlQuery对象,如下所示:

QSqlQuery query(database);

一旦你这样做,其他一切都应该开始正常工作。