QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection', old connect

编译无问题,在执行时终端出现以下字母

QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed.
QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed.

 


执行中的数据库操作如下
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");

    db.setDatabaseName("C:/workspace/GData.s3db");
     if(!db.open())
     {
        cout<<"open database failed!"<<endl;
        return 0;
    }

    QSqlQuery query("select XmlValue from GBond where BondId=3", db);

     if (query.next())
     {
        QString stringXml = query.value(0).toString();

        //do something

    }


    db.close();
    QSqlDatabase::removeDatabase("QSQLITE");

经查,是由于在数据库使用过程中,又再次调用QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); 造成了问题。
因此在其他地方的数据库操作中修改此代码。

可以在执行QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); 不用默认的defaultConnection,自己加入名字,然后在每次的添加时可改为:
    QSqlDatabase db;
     if(QSqlDatabase::contains("GBond"))
        db = QSqlDatabase::database("GBond");
     else
        db = QSqlDatabase::addDatabase("QSQLITE", "GBond");

这样该问题已解决。

但再次执行时出现了
QSqlQuery::exec: database not open
QSqlQuery::exec: database not open

经查,这是由于在执行query.exec时没有指定db。将所有执行query.exec改为
// 原来
QSqlQuery query;
query.exec("select XmlValue from GPlatform");

// 改为

QSqlQuery query("select XmlValue from GPlatform", db);

这样就可以了。


第二种方法:

意思是说,还有某查询引用默认数据库连接"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");//不推荐。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值