找回密码
 立即注册
收起左侧

QSqlDatabase::removeDatabase的问题

10
回复
8457
查看
[复制链接]
累计签到:70 天
连续签到:1 天
来源: 2017-12-18 10:32:13 显示全部楼层 |阅读模式
1Qter豆
database = QSqlDatabase::addDatabase("QSQLITE");
database.setDatabaseName("aa.db");
database.setUserName("root");
database.setPassword("root");
...
QString name;
{
   name = QSqlDatabase::database().connectionName();
}
QSqlDatabase::removeDatabase(name);
代码是这样的,然后执行提示connection 'qt_sql_default_connection' is still in use, all queries is crease to work.
网上说是这样用,怎么不起作用呢?改怎么用才行,大神帮下忙。

最佳答案

查看完整内容

原因很简单, database生命周期还没有结束,这时候调用 QSqlDatabase::removeDatabase(name); 就会报错 database是你类的 成员函数,只有在类析构的时候才会自动删除. 所以你在类的任何地方调用都会报这个错的! 有种解决方式就是不要声明为类的成员,在用的地方直接调用静态函数去获取 QSqlDatabase::database(name) 这样,你就可以在类里边合适的地方去调用 QSqlDatabase::removeDatabase(name);删除新建的数据库了 还有另外一种方 ...
回复

使用道具 举报

累计签到:53 天
连续签到:1 天
2017-12-18 10:32:14 显示全部楼层
原因很简单, database生命周期还没有结束,这时候调用
QSqlDatabase::removeDatabase(name);
就会报错

database是你类的 成员函数,只有在类析构的时候才会自动删除.
所以你在类的任何地方调用都会报这个错的!

有种解决方式就是不要声明为类的成员,在用的地方直接调用静态函数去获取
QSqlDatabase::database(name)
这样,你就可以在类里边合适的地方去调用
QSqlDatabase::removeDatabase(name);删除新建的数据库了

还有另外一种方式,就是维持你的原代码,只删除掉QSqlDatabase::removeDatabase(name);这行代码
因为当database析构掉的时候,如果没有其他的dababase引用,qt系统会自动销毁这个数据库连接的
回复

使用道具 举报

累计签到:53 天
连续签到:1 天
2017-12-18 13:39:44 显示全部楼层
本帖最后由 angelus 于 2017-12-18 13:42 编辑

关于数据库这块的疑问,你还可以参考下,当初和一位论坛朋友的讨论帖子!
http://www.qter.org/forum.php?mod=viewthread&tid=11885&extra=&page=1
回复

使用道具 举报

累计签到:70 天
连续签到:1 天
2017-12-18 14:02:46 显示全部楼层
angelus 发表于 2017-12-18 13:36
原因很简单, database生命周期还没有结束,这时候调用
QSqlDatabase::removeDatabase(name);
就会报错

关键是我要引用另一个数据库,把这个数据库的数据写到另一个数据库里。只能用第一种方法吗
回复

使用道具 举报

累计签到:53 天
连续签到:1 天
2017-12-18 14:10:51 显示全部楼层
本帖最后由 angelus 于 2017-12-18 14:14 编辑
你外婆那我lz空 发表于 2017-12-18 14:02
关键是我要引用另一个数据库,把这个数据库的数据写到另一个数据库里。只能用第一种方法吗 ...

开两个数据库连接就可以了!
QSqlDatabase::addDatabase("QSQLITE",name);
创建连接的时候 第二个参数是 自己写的连接名称.
不写第二个参数会有默认的,意思就是你只使用默认的连接.

获取连接的时候用 QSqlDatabase::database(name)就能获取你创建好的连接了
使用名称区分不同的连接对象,就可以同时操作多个数据库连接!
把多个name存储在成员中变量中.就可以在类的任何地方获取不同的连接了!

如果要跨类获取连接,就需要把name存储在一个公共的地方,或者声明为静态成员!
回复

使用道具 举报

累计签到:70 天
连续签到:1 天
2017-12-18 14:37:32 显示全部楼层
angelus 发表于 2017-12-18 14:10
开两个数据库连接就可以了!
QSqlDatabase::addDatabase("QSQLITE",name);
创建连接的时候 第二个参数是 自 ...

还不是很懂,我是写了一个公共连接数据库的方法,先连接第一个数据库,再remove,再连接第二个,行不行。我看是没有报那个错
回复

使用道具 举报

累计签到:53 天
连续签到:1 天
2017-12-18 14:53:43 显示全部楼层
本帖最后由 angelus 于 2017-12-18 14:59 编辑
你外婆那我lz空 发表于 2017-12-18 14:37
还不是很懂,我是写了一个公共连接数据库的方法,先连接第一个数据库,再remove,再连接第二个,行不行。 ...

可以是可以的,比如你要分步骤进行,
1 先读取第一个数据库,然后缓存数据.
2 打开第二个数据库,然后把缓存写到数据库

建议你使用另一种模式.
1: 建立第一个数据的连接,
2:建立第二个数据库的连接.
3: 读取第一个数据库的数据, 写入第二个数据中

当然,第一种方法可能更适合你一些,因为做起来比较简单
还有,如果你的database是写在.h 里边声明的,那你在.cpp里边调用移除,肯定会报警告的.
还有那一行文字只是警告,不是报错,意味着你的代码是可以正常得到你想要的结果,只是你的使用方法不太对!

回复

使用道具 举报

累计签到:70 天
连续签到:1 天
2017-12-18 14:57:23 显示全部楼层
angelus 发表于 2017-12-18 14:53
可以是可以的,比如你要分步骤进行,
1 先读取第一个数据库,然后缓存数据.
2 打开第二个数据库,然后把缓存写 ...

好的,但是现在出现了QSqlQuery::prepare: no driver 没驱动这个错误,百度也没找见是什么,这该怎么解决?
回复

使用道具 举报

累计签到:53 天
连续签到:1 天
2017-12-18 15:01:05 显示全部楼层
你外婆那我lz空 发表于 2017-12-18 14:57
好的,但是现在出现了QSqlQuery::prepare: no driver 没驱动这个错误,百度也没找见是什么,这该怎么解决 ...

你的代码贴的太少了,没有头尾的,不好查,只能大概猜你是初始化QSqlQuery时候有问题!
回复

使用道具 举报

累计签到:70 天
连续签到:1 天
2017-12-18 15:03:56 显示全部楼层
angelus 发表于 2017-12-18 15:01
你的代码贴的太少了,没有头尾的,不好查,只能大概猜你是初始化QSqlQuery时候有问题! ...

方便加微信吗,我拍给你,13191292468,麻烦了
回复

使用道具 举报

累计签到:53 天
连续签到:1 天
2017-12-18 15:12:53 显示全部楼层
你外婆那我lz空 发表于 2017-12-18 15:03
方便加微信吗,我拍给你,13191292468,麻烦了

已经添加了,论坛这么排错,确实挺麻烦的!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了