Qt报错篇14:QSqlDatabasePrivate::removeDatabase: connection ‘qt_sql_default_connection‘ is still ... ...

环境:windows10 + MYSQL + Qt5.9.9
几个月前,参与开发的一个项目中需要多次连接同一个数据库进行操作,但是执行的时候发现报了以下错误:
QSqlDatabasePrivate::removeDatabase: connection ‘qt_sql_default_connection’ is still in use, all queries will cease to work.QSqlDatabasePrivate::addDatabase: duplicate connection name ‘qt_sql_default_connection’, old connection removed.
实际上之前接触到的都是操作一个数据库,所以比较简单;但是这次是在不同的地方多次连接同一个数据库进行系列操作,所以按照之前的思路炮制,果然出错了,找了一下午,也算是解决了,现在将相关系列给贴出了,也许可以帮助到你!!!

1. 以下代码是关键代码(忽略了初始化连接等部分)

片段一:

bool Database::init()
{
    static bool isFirst = true;
    m_DBName = QString("Alarm_Center");					//数据库
    m_DBpassword = QString("lxgs123");
    m_db = QSqlDatabase::addDatabase("QMYSQL");			//***1	
    m_db.setHostName("10.24.3.239");
    m_db.setUserName("root");
    m_db.setPassword(m_DBpassword);
    m_db.setDatabaseName(m_DBName);
    if(!m_db.open()){
        return false;
    }
    return true;
}

片段二:

bool Database::initForPie()
{
    static bool isFirstForPie = true;
    m_DBNameForPie = QString("Alarm_Center");				//数据库
    m_DBpasswordForPie = QString("lxgs123");
    m_db_ForPie = QSqlDatabase::addDatabase("QMYSQL");		//***2
    m_db_ForPie.setHostName("10.24.3.239");
    m_db_ForPie.setUserName("root");
    m_db_ForPie.setPassword(m_DBpasswordForPie);
    m_db_ForPie.setDatabaseName(m_DBNameForPie);
    if(!m_db_ForPie.open()){
        return false;
    }
    return true;
}

让我们来看一下片段一代码中的init()函数,我们在init()函数中连接了数据库Alarm_Center;这是没有任何问题的,后续我么也是可以直接操作的;
接下来因为需要,我又在initForPie()函数中连接了数据库Alarm_Center,但是此时就会发生上述报错,
这是什么原因呢???
通过一番查看,[static] QSqlDatabase QSqlDatabase::addDatabase(const QString &type, const QString &connectionName = QLatin1String( defaultConnection ))
addDatabase()函数的第二个参数是连接名,我们如果说仅仅是连接一次数据库,这个名字写不写都无所谓了,但若是还要在别的地方再次连接该数据库,那么就需要在调用addDatabase()函数时指定第二个参数(连接名);

2.解决方案

在片段一和片段二中的//***1 和 //***2标记的位置处(也即是addDatabase()函数调用处)分别为addDatabase()函数指定第二个参数连接名,此时就可以在不同的地方多次操控同一个数据库了!
所以修正后的代码分别为(见if…else if…部分, 为修改后的代码):
片段一:

bool Database::init()
{
    static bool isFirst = true;
    m_DBName = QString("Alarm_Center");					
    m_DBpassword = QString("lxgs123");
    if(isFirst) {
        m_db = QSqlDatabase::addDatabase("QMYSQL""first");	//指定了连接名			
        isFirst = false;
    } else if(QSqlDatabase::contains("first")) {
        m_db = QSqlDatabase::database("first");
    }
    m_db.setHostName("10.24.3.239");
    m_db.setUserName("root");
    m_db.setPassword(m_DBpassword);
    m_db.setDatabaseName(m_DBName);
    if(!m_db.open()){
        return false;
    }
    return true;
}

片段二:

bool Database::initForPie()
{
    static bool isFirstForPie = true;
    m_DBNameForPie = QString("Alarm_Center");				
    m_DBpasswordForPie = QString("lxgs123");
    if(isFirstForPie) {
        m_db_ForPie = QSqlDatabase::addDatabase("QMYSQL", "DBForPieSeries");//指定了连接名
        isFirstForPie = false;
    } else if(QSqlDatabase::contains("DBForPieSeries")) {
        m_db_ForPie = QSqlDatabase::database("DBForPieSeries");
    }
    m_db_ForPie.setHostName("10.24.3.239");
    m_db_ForPie.setUserName("root");
    m_db_ForPie.setPassword(m_DBpasswordForPie);
    m_db_ForPie.setDatabaseName(m_DBNameForPie);
    if(!m_db_ForPie.open()){
        return false;
    }
    return true;
}

此时就一切正常了,可以在不同的地方多次连接使用同一个数据库了!!!


版权声明:本文为TianYanRen111原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。