QSqlQuery构造的时候需要指定数据库名。
如果做成类成员的时候,有没有指定数据库名呢?或者换句话说,你怎么让QSQLQuery对象知道你使用的是哪一个数据库的呢?重复使用QSqlQuery的时候,别忘了调用clear函数清除前次的资源。
确认驱动是否正确。
首先,需要确认使用的驱动程序是否正确,是否与当前的系统和数据库版本匹配,如果驱动不正确,需要下载正确的驱动程序。
在加载驱动程序之前,需要确保数据库的配置信息已正确设置。需要检查数据库的地址、端口号、用户名、密码等信息是否正确。
意思是说,还有某查询引用默认数据库连接"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 = dbconnectionName();//获得默认连接名。
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");//不推荐。
以上就是关于关于Qt中的QSQLQuery类,提示数据库没有打开的错误全部的内容,包括:关于Qt中的QSQLQuery类,提示数据库没有打开的错误、linuxqt连接达梦数据加载驱动出错、QT访问MYSQL数据库为什么一打开子窗口访问数据库就出问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)