當(dāng)前位置:首頁(yè) > IT技術(shù) > 數(shù)據(jù)庫(kù) > 正文

Qt-QSqlDatabasePrivate::addDatabase: duplicate connection name ‘qt_sql_default_connect...
2021-09-17 16:38:00

?

模仿QT官方例子的數(shù)據(jù)庫(kù)打開(kāi)方式 代碼如下:
QSqlDatabase qdb;
if(QSqlDatabase::contains("TEST"))
qdb = QSqlDatabase::database("QSQLITE");
else
qdb = QSqlDatabase::addDatabase("QSQLITE","TEST");

沒(méi)有出現(xiàn)該問(wèn)題,但由于工程需要操作到多數(shù)據(jù)庫(kù)文件,數(shù)據(jù)操作時(shí)發(fā)現(xiàn)讀不出數(shù)據(jù),報(bào)出QSqlQuery查詢出錯(cuò),并且database is not opened的錯(cuò)誤,就想到應(yīng)該是前面打開(kāi)數(shù)據(jù)庫(kù)時(shí)候用的不是默認(rèn)連接,因此出現(xiàn)這問(wèn)題了;

于是將上面代碼改為
QSqlDatabase qdb;
if(QSqlDatabase::contains("QSQLITE"))
qdb = QSqlDatabase::database("QSQLITE");
else
qdb = QSqlDatabase::addDatabase("QSQLITE");

數(shù)據(jù)庫(kù)正常打開(kāi),操作,但報(bào)出標(biāo)題所示的警告,于是想到,QSQLITE這個(gè)字串是否有經(jīng)過(guò)QT內(nèi)部處理,查詢了一下手冊(cè),沒(méi)發(fā)現(xiàn)該字串的具體描述,分析,應(yīng)該是QSqlDatabase::addDatabase()的關(guān)系,查看手冊(cè),該函數(shù)原型為:
QSqlDatabase QSqlDatabase::addDatabase ( const QString & type, const QString & connectionName = QLatin1String( defaultConnection ) ) [static]

type...是類型,并不是連接名,好,現(xiàn)在知道了,于是在以上代碼段下加了打印語(yǔ)句:
qDebug()<<tr("database connection name:%1").arg(qdb.connectionName());
這回看出問(wèn)題來(lái)了,打印出來(lái)的結(jié)果是:
database connection name:qt_sql_default_connection
這下知道了,雖然我們addDatabase("QSQLITE")時(shí)使用的"QSQLITE"字串,表示的是類型,連接名實(shí)際為:qt_sql_default_connection,也就是說(shuō)如果我們使用conntain("QSQLTE")查看是否存在默認(rèn)連接,是不對(duì)的,應(yīng)該使用contains(qt_sql_default_connection),改為以下連接代碼:
QSqlDatabase qdb;
if(QSqlDatabase::contains("qt_sql_default_connection"))
qdb = QSqlDatabase::database("qt_sql_default_connection");
else
qdb = QSqlDatabase::addDatabase("QSQLITE");

問(wèn)題解決,發(fā)現(xiàn)一個(gè)問(wèn)題,看文檔粗心,看例子粗心,其實(shí)addDatabase 的函數(shù)原型就已經(jīng)很好的說(shuō)明了問(wèn)題了
在Qt上使用SQLite的時(shí)候,如果第二次使用QSqlDatabase::addDatabase()方式時(shí),就會(huì)出現(xiàn)以下錯(cuò)誤提示:
QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed.

解決方法是:先判斷一下這個(gè)默認(rèn)的連接名是否存在,如果不存在才使用addDatabase()方法,如果存在則使用database()方法。
先看一下addDatabase()的原形:
QSqlDatabase QSqlDatabase::addDatabase(const QString & type, const QString &connectionName = QLatin1String( defaultConnection )) [static]

解決方法的代碼:
QSqlDatabase db;
if(QSqlDatabase::contains("qt_sql_default_connection"))
db = QSqlDatabase::database("qt_sql_default_connection");
else
db = QSqlDatabase::addDatabase("QSQLITE");

?

本文摘自 :https://blog.51cto.com/u

開(kāi)通會(huì)員,享受整站包年服務(wù)立即開(kāi)通 >