QSqlDatabase超出范围后,连接仍然打开

时间:2018-01-27 18:30:46

标签: c++ database qt qsqldatabase

为什么以下代码打印为true而不是false?

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    if (!openDatabase()) return 1;

    // false means don't open closed connections.
    QSqlDatabase db2 = QSqlDatabase::database("foo", false);

    qDebug() << db2.isOpen();
    return 0;
}

bool openDatabase()
{
    QSqlDatabase db1 = QSqlDatabase::addDatabase("QPSQL", "foo");
    db1.setHostName("localhost");
    db1.setUserName("user");
    db1.setPassword("password");
    db1.setDatabaseName("bar");

    return db1.open();
}

根据What is the correct way of QSqlDatabase & QSqlQuery?第一个答案中的示例#2,当QSqlDatabase对象超出范围时,数据库连接将关闭。因此,当db1超出openDatabase()末尾的范围时,应该关闭连接。

(实际发生的事情有点微妙。在内部,QSqlDatabase维护它为特定连接返回的QSqlDatabase个对象的引用计数。引用计数递减{{1}并且,当它达到0时,连接被关闭。但是,这不应该改变任何东西。引用计数应该是~QSqlDatabase中第一行之后的1和函数结束后的0并且db1被销毁。)< / p>

我错过了什么?

1 个答案:

答案 0 :(得分:1)

根据QTBUG-17140,您是对的,尽管错误中的情况略有不同,但问题仍然很普遍,因为执行>>> def f(): ... print("inside f") ... >>> print(f()) inside f None 时存在问题如果数据库连接处于活动状态,则报告直到Qt 5.3.1,错误报告未显示它已解决。

相关问题