QSqlDatabse:程序意外完成
QSqlDatabse : the program has unexpectedly finished?
每次我在DatabaseManager类的头文件中声明QSqlDatabse
连接时,我的应用程序都会崩溃,并显示一条消息:程序已意外完成?!
如果我把声明放在源文件中,我的应用程序就可以正常工作。
- 为什么会发生这种情况,以及
- 如何修复
编辑:
这是头文件:
#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);
一旦你做到了,其他一切都应该开始正常工作。
相关文章:
- 更改.cpp程序的输入文件中数据的位置会意外更改输出
- 多线程程序中出现意外的内存泄漏
- C++ 程序意外退出
- 在gcc中意外调用了Const重载.编译器错误或兼容性修复程序
- 如果我删除指针,我的C++程序会意外删除系统文件吗?
- Qt 应用程序具有意外的 QDir::currentPath
- 排序程序的意外错误代码
- 以下程序的意外输出
- QT应用程序意外的语言事件
- 简单程序中的意外推力错误
- 程序意外终止C
- 设置终止和意外处理程序
- 双精度数字程序意外值
- QWT示例该程序已经意外完成
- 使用双精度的程序的意外行为
- 查找素数的程序意外停止
- 程序意外地完成了-QT创建者
- cpp 程序中的意外输出
- 当我在递归函数中调用 return 时,我的程序意外完成
- Arduino上的意外程序停止