在大型应用程序中使用Qt数据库

时间:2013-04-30 21:42:56

标签: database sqlite qt

我有一个关于在Qt中使用数据库的问题。

在其他语言中,我会做一些事情,比如在主类中创建一个数据库,并将该数据库的指针传递给其他要使用的类。

我一直在玩Qt,似乎如果我在主类中初始化一个数据库,那么我可以在任何其他类中编写和执行查询,它将使用这个数据库,我有点困惑,因为那里似乎没有参考数据库。

有人可以帮我解释一下:)

这是在MainWindow.cpp

中实例化的Database类
#include "database.h"

Database::Database()
{
    Connect();
}

void Database::Connect()
{
    db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("mydatabase­.dat");

    if(db.open()){
        qDebug() << "Connected";
    }
    else
    {
         qDebug() << "Not Connected";
    }
}

bool Database::SetupTables()
{
    QSqlQuery qry;

    qry.exec("CREATE TABLE patients ( patient_id INT, firstname VARCHAR(100), lastname VARCHAR(100) );  ");

    return true;
}

这是我创建的名为PatientList的窗口(窗口小部件)

#include "patientlist.h"
#include "ui_patientlist.h"
#include "database.h"
#include <QtSql>
#include <QtDebug>

PatientList::PatientList(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::PatientList)
{
    ui->setupUi(this);

    QSqlQuery qry;
    if(qry.exec("SELECT patient_id,firstname,lastname FROM patients")){
        qDebug() << "Success";
    }
    else
    {
        qDebug() << "Error";
    }

}

PatientList::~PatientList()
{
    delete ui;
}

这一切都运行正常,但我觉得我做错了,因为我没有提到在MainWindow.cpp中创建的数据库

2 个答案:

答案 0 :(得分:2)

来自QSqlDatabase的Qt文档:

  

连接以其自己的名称而不是名称来表示   它连接的数据库。您可以与一个建立多个连接   数据库。 QSqlDatabase还支持默认的概念   连接,这是未命名的连接。创建默认值   连接,调用时不要传递连接名称参数   addDatabase()。随后,当您调用任何静态成员函数时   如果你没有通过连接名称参数,则采用连接名称参数   连接名称参数,假定为默认连接。

嗯,我认为这说明了一切。请注意,无法直接实例化QSqlDatabase。直接创建QSqlDatabase实例只会产生无效连接。显然,QSqlDatabase只是指向实际连接对象的链接(可能是静态分配的)。由于许多应用程序可能只使用一个数据库连接,因此默认情况下会挑出一个链接。

我不确定这是基于每个应用程序还是每个线程完成的。

答案 1 :(得分:0)

好吧没有看到你的主要使它变得困难,但看起来QSqlQuery足够聪明,可以拿起你的“默认”数据库。见这里:

http://qt-project.org/doc/qt-4.8/qsqlquery.html#QSqlQuery-2

因此,只要您在数据库中看到值,我就会说这只是Qt的另一个例子,它做的事情不一定直观但最终很容易使用。