Qt中使用QSqlDatabase::removeDatabase()的正确方法
来源:互联网 发布:淘宝如何改会员名 编辑:程序博客网 时间:2024/05/22 00:18
如果你用过Qt的QSqlDatabase的话,多半会对下面的警告信息感兴趣:
QSqlDatabasePrivate::removeDatabase: connection 'qt_sql_default_connection' is still in use, all
queries will cease to work.
意思是说,还有某查询引用默认数据库连接"qt_sql_default_connection"。
如果忽略该警告,Qt官方文档里也写了,可能会出现内存泄漏:
Warning: There should be no open queries on the database connection when this function is called,
otherwise a resource leak will occur.
还是不出现这个警告的好。怎么把它弄没了呢?我把一切外围的对象都排除了:仅建立一个连接,打开它,然后关闭连接,调用removeDatabase()。居然还有警告!问题已经锁定在我关闭连接的语句上:
QSqlDatabase::removeDatabase(QSqlDatabase::database().connectionName());
默认连接的名字也是默认的,需要通过connectionName()函数获得。这样写貌似没什么问题,后来调试发现,QSqlDatabase::database()静态函数实际上使默认连接的引用计数+1。上述句子相当于:
QSqlDatabase db = QSqlDatabase::database();//获得实例。
QString name = db.connectionName();//获得默认连接名。
QSqlDatabase::removeDatabase(name);//删除默认连接。
这样,问题就清晰了,db获得了一个引用,此时引用计数为2。在调用removeDatabase()时,db对象并没有被删除,默认连接的引用计数仍为2,于是报告警告信息。
我们只需将其改为:
QString name;{name = QSqlDatabase::database().connectionName();}//超出作用域,隐含对象QSqlDatabase::database()被删除。
QSqlDatabase::removeDatabase(name);
问题就解决了!
如果直接打默认连接名的话,代码就简单多了,不过名字不太好打(再说了,万一Qt把默认连接名改了呢!):
QSqlDatabase::removeDatabase("qt_sql_default_connection");//不推荐。
================下面是官方文档摘录================
Warning: There should be no open queries on the database connection when this function is called, otherwise a resource leak will occur.
Example:
// WRONG
QSqlDatabase db = QSqlDatabase::database("sales");
QSqlQuery query("SELECT NAME, DOB FROM EMPLOYEES", db);
QSqlDatabase::removeDatabase("sales"); // will output a warning// "db" is now a dangling invalid database connection,
// "query" contains an invalid result set
The correct way to do it:
{QSqlDatabase db = QSqlDatabase::database("sales");
QSqlQuery query("SELECT NAME, DOB FROM EMPLOYEES", db);
}// Both "db" and "query" are destroyed because they are out of scope
QSqlDatabase::removeDatabase("sales"); // correct删除数据库时出现"QSqlDatabasePrivate::removeDatabase: connection 'xxxx' is still in use, all queries will cease to work"该如何处理答:出现此种错误是因为使用了连接名字为xxxx的变量作用域没有结束,解决方法是在所有使用了xxxx连接的数据库组件变量的作用域都结束后再使用QSqlDatabase::removeDatabae("xxxx")来删除连接。
- Qt中使用QSqlDatabase::removeDatabase()的正确方法
- Qt中使用QSqlDatabase::removeDatabase()的正确方法
- Qt中使用QSqlDatabase::removeDatabase()的正确方法
- Qt中使用QSqlDatabase::removeDatabase()的正确方法
- Qt中使用QSqlDatabase::removeDatabase()的正确方法
- Qt中使用QSqlDatabase::removeDatabase()的正确方法
- Qt中使用QSqlDatabase::removeDatabase()的正确方法
- Qt中使用QSqlDatabase::removeDatabase()的正确方法
- Qt中使用QSqlDatabase::removeDatabase()的正确方法
- Qt中使用QSqlDatabase::removeDatabase()的正确方法
- Qt removeDatabase正确方法
- QT中使用QSqlDatabase 时出现的问题。
- QT中使用QSqlDatabase 时出现的问题。
- QT 009 QSqlDatabase 数据库类的使用
- 关于QT使用QSqlDatabase的警告信息的解决方法.
- qt数据库多线程问题的解决(QSqlDatabase 同一个连接只能在创建它的线程中使用)
- 使用QSqlDatabase成功访问oracle数据库的方法
- QSqlDatabase 数据库操作没有removeDatabase 导致程序崩溃(此文极有可能是错误的,仅作个人留档参考)
- 【iOS开发-4】UIApplication生命周期以及如何简单测试每个函数何时被调用?
- 文件(一)--编码问题
- java学习笔记18
- GIT和SVN之间的五个基本区别
- ODI和OWB
- Qt中使用QSqlDatabase::removeDatabase()的正确方法
- 第6章 数据库管理之事务
- 学习
- Extjs4.2边学边用之panel
- Linux之latex的初学教程
- POJ2262_Goldbach's Conjecture【素数判断】【水题】
- crm2013快速查看下拉框的选项
- spring mvc 的工作原理的简介
- WIN7 64位 VS2010 “模块计算机类型“x64”与目标计算机类型“X86”冲突解决方案