为什么isOpen()函数总是返回true?

时间:2015-05-15 09:14:09

标签: database qt sqlite

在我的构造函数(qt 5.4.1 - windows 7)中:

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName(":memory:");
db.open();

QSqlQuery q;
q.exec("create table authors(num integer, birthdate date)");
q.exec("insert into authors values('123', '2015-01-01')");
qDebug()<<"your info saved in db.";

到目前为止,每件事情都可以,但是之后,我需要更改我的数据库并永久保存一些日期,所以:

int Dialog::SaveInfosPermanent()
{

    QSqlDatabase::database().close();
    if ( QSqlDatabase::database().isOpen ()) {
        qDebug()<<"DB is open.";
        return 1;
    }

    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("newDB.db");
    db.open();

    QSqlQuery q;
    q.exec("create table authors(num integer, birthdate date)");
    q.exec("insert into authors values('123', '2015-01-01')");
    qDebug()<<"your info saved in db.";

    return 0;
}

并输出:

your info saved in db.
QSqlError("", "", "")
DB is open.

那么我做错了什么?或者,如果用户选择某个复选框,还有更好的其他想法可以将db从内存更改为硬盘吗?

1 个答案:

答案 0 :(得分:0)

对我来说,初始化数据库连接的最佳方法是使用连接名称:

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", connectionName);

使用连接名称,您有一些额外的机会。 从数据库连接列表中删除数据库,查找文档here

QSqlDatabase::removeDatabase(connectionName);

按名称访问您的数据库,找到文档here

QSqlDatabase db = QSqlDatabase::database(connectionName);

在您的情况下,使用带有连接名称的removeDatabase(),但不要忘记db的范围。请参阅我附加链接的示例。

在这两种情况下,您也可以使用同名的数据库,docs说:

  

使用驱动程序将数据库添加到数据库连接列表中   类型和连接名称connectionName。如果已经存在了   数据库连接名为connectionName,该连接已被删除。

     

数据库连接由connectionName引用。新的   添加了数据库连接。