QSqlDatabse:程序意外完成

QSqlDatabse : the program has unexpectedly finished?

本文关键字:意外 程序 QSqlDatabse      更新时间:2023-10-16

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

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

  1. 为什么会发生这种情况,以及
  2. 如何修复

编辑:

这是头文件:

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

我认为这里有几个问题。

open_db()方法中,请记住C++中的内存管理是如何工作的。任何在那里被定义的东西都不会存在。因此,对于以下线路:

QSqlDatabase db;
db = database;

您实际要做的是定义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);

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