2

为什么下面的代码打印的是 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();
}

根据QSqlDatabase 和 QSqlQuery 的正确方法是什么的第一个答案中的示例 #2?,当QSqlDatabase对象超出范围时,数据库连接将关闭。因此,当db1结束时超出范围时openDatabase(),应该关闭连接。

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

我错过了什么?

4

1 回答 1

1

你是对的,根据QTBUG-17140,尽管错误中的场景略有不同,但问题很普遍,因为实施isOpen()检查数据库连接是否处于活动状态存在问题,直到 Qt 5.3.1 才报告,错误报告未显示已解决。

于 2018-01-27T21:58:49.040 回答