gpt4 book ai didi

c++ - QSqlDatabase 超出范围后连接仍然打开

转载 作者:搜寻专家 更新时间:2023-10-30 20:34:23 25 4
gpt4 key购买 nike

为什么下面的代码打印的是 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 时关闭对象超出范围。因此,当 db1openDatabase() 结束时超出范围,应该关闭连接。

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

我错过了什么?

最佳答案

根据QTBUG-17140,你是对的,尽管 bug 中的场景略有不同,但问题是普遍的,因为据报道,实现 isOpen() 以检查数据库连接是否处于事件状态时存在问题直到 Qt 5.3.1,错误报告没有显示它已经解决。

关于c++ - QSqlDatabase 超出范围后连接仍然打开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48479130/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com