• 8331阅读
  • 3回复

QT4 的数据库连接什么时候销毁? [复制链接]

上一主题 下一主题
离线hongwang
 
只看楼主 倒序阅读 楼主  发表于: 2008-08-08
— 本帖被 XChinux 执行加亮操作(2008-08-08) —
关键词: 数据库销毁

假设一个程序里面包含两个Widget,  两个Widget运行时都需要连接数据库

我给其中一个Widget定义了个私有变量:
  1. private:
  2. QSqlDatabase db;

然后在其构造函数里面建立了数据库连接:

  1.       QSettings setting("conf/ultraecg.conf", QSettings::IniFormat, qApp);
  2.       db = QSqlDatabase::addDatabase("QMYSQL");
  3.     db.setHostName(setting.value("hostname").toString());
  4.     db.setPort(setting.value("port").toInt());
  5.     db.setUserName(setting.value("username").toString());
  6.     db.setPassword(setting.value("password").toString());
  7.     db.setDatabaseName(setting.value("database").toString());
  8.     if( !db.open() )
  9.           后面省略


而在第二个 Widget 里面没有建立数据库连接。

现在的问题是,当先运行第一个Widget,  然后用 delete 把第一个Widget 销毁后, 再运行第二个 Widget,  第二个Widget竟然还是能够连接上数据库!  按理说, db 私有变量, 只能在本Widget内有效, 其它Widget应该不能共享这个数据库连接; 退一步说, 就算可以共享, 在delete之后,这个db早就不存在了,  那么为什么第二个 Widget 仍然能够连接上数据库呢?  请高人指点!





离线XChinux

只看该作者 1楼 发表于: 2008-08-08
connection是全局存在的,你用上面的语句创建了一个使用默认connectionName的连接。
想彻底销毁,可以用QSqlDatabase::removeDatabase()方法来删除,条件是没有使用当前链接的数据库组件对象存在。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线gnot
只看该作者 2楼 发表于: 2008-08-08
私有是针对类的,不是针对对象的。
离线lugaideath

只看该作者 3楼 发表于: 2008-08-11
正如XChinux说的,那是全局的,不管你是那db是设置为私有还是设置为局部变量,它只要创建了,就哪里都可以使用,如果你不销毁,而在另外的地方重新创建的话,就会自动把之前的帮销毁,再重新创建的!

你想手动销毁就用QSqlDatabase::removeDatabase()来删除,就你上面的代码来看,你没有设置databaseName,那么就是默认的那个databaseName了,所以你要移除就QSqlDatabase::removeDatabase("qt_sql_default_connection"),"qt_sql_default_connection"是默认的databaseName!
快速回复
限100 字节
 
上一个 下一个