2015-05-15 65 views
0

在我的构造函数(QT 5.4.1 - Windows 7中):为什么isOpen()函数总是返回true?

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从内存更改为硬盘?

+4

您知道'QSqlDatabase :: database()'在默认情况下也会打开数据库连接吗?如果它不是你想要的,那么你必须指定'open'参数:'QSqlDatabase :: database(“QSQLITE”,false).isOpen()' –

回答

0

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

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

随着连接名称你有一些额外的机会。 从数据库连接列表中删除数据库中,找到文档here

QSqlDatabase::removeDatabase(connectionName); 

获得通过名称来访问你的数据库,发现文档here

QSqlDatabase db = QSqlDatabase::database(connectionName); 

在你的情况使用removeDatabase()与连接的名称,但不要忘记db的范围。请参阅我附上的链接中的示例。

您也可以在这两种情况下使用数据库具有相同的名称,作为docs说:

添加一个数据库来使用的驱动程序 类型和连接名称的connectionName数据库连接列表。如果已经存在名为connectionName的数据库连接,则删除该连接。

数据库连接由connectionName引用。新添加的数据库连接将返回 。

+0

那么你现在是什么意思?你的意思是我现在无法使用默认名称关闭连接? – Musa

+0

我的意思是,如果你不确定你的连接关闭使用安全的方式来做到这一点 –

相关问题