环境: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;
}
此时就一切正常了,可以在不同的地方多次连接使用同一个数据库了!!!