关于QSqlDatabase的addDatabase函数的使用注意

addDatabase的函数原型如下:

[static] QSqlDatabase QSqlDatabase::addDatabase(
				const QString &type, 
				const QString &connectionName = QLatin1String( defaultConnection ))
//第一个参数为“驱动名称”
//第二个参数为“连接名”,默认是相同的

注意这个函数有第二个参数!!!

今天遇到的问题就是:一个项目需要用到两个数据库,我就想先打开数据库,然后把所有数据库的句柄先保存起来,后面可以直接使用。
但是现在出现一个问题就是:所有保存下来的句柄之后最后一个是valid的,前面的全部都是invalid的,导致能用的只有最新的句柄,但是原先的句柄都失效了。
代码如下:

    void openDBs()
    {
        g_mapDBs.clear();

        for (auto it = g_mapDBTables.constBegin(); it != g_mapDBTables.constEnd(); ++it)
        {
            QSqlDatabase db = QSqlDatabase::addDatabase(QString(it.key().driver));
            db.setDatabaseName(QString(it.key().dbName));
            db.setPassword(QString(it.key().password));
            db.setHostName(QString(it.key().hostName));
            db.setPort(it.key().port);
            db.setUserName(QString(it.key().userName));

            if (!db.open())
            {
                qDebug() << db.lastError();
                continue;
            }
            
            //这一步我原意是想将这个db保存下来,留待后面直接使用,但是结果不尽如人意
            g_mapDBs[it.key()] = db;
        }
    }

这个问题困扰了好久,后面还是问我经理解决的。
问题就在于QSqlDatabase::addDatabase函数有第二个参数,这个参数为“连接名”,这个连接名是唯一的。
但是在默认情况下,这个连接名是一样的,这就导致后面的db会把前面的db覆盖掉,就会导致前面的db失效。

解决方法:在有多个数据库的情况下,为每个db都添加上一个不同的连接名。
代码如下:

    void openDBs()
    {
        ......
        
        for (auto it = g_mapDBTables.constBegin(); it != g_mapDBTables.constEnd(); ++it)
        {
        	//注意我在这里为每个数据库添加了不同的连接名
            QSqlDatabase db = QSqlDatabase::addDatabase(QString(it.key().driver),
            			 								QString(it.key().connectionName));
            ......
        }
    }

这样之后,可以有两种使用方式:
1.每次使用addDatabase重新创建,但是因为连接名是唯一的,这样后面得到的这个db就是我们需要的db;
2.只打开一次,然后将这个db保存下来,后面直接使用。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值