當前位置:首頁 > IT技術 > 數(shù)據(jù)庫 > 正文

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

?

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

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

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

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

type...是類型,并不是連接名,好,現(xiàn)在知道了,于是在以上代碼段下加了打印語句:
qDebug()<<tr("database connection name:%1").arg(qdb.connectionName());
這回看出問題來了,打印出來的結果是:
database connection name:qt_sql_default_connection
這下知道了,雖然我們addDatabase("QSQLITE")時使用的"QSQLITE"字串,表示的是類型,連接名實際為:qt_sql_default_connection,也就是說如果我們使用conntain("QSQLTE")查看是否存在默認連接,是不對的,應該使用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");

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

解決方法是:先判斷一下這個默認的連接名是否存在,如果不存在才使用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

開通會員,享受整站包年服務立即開通 >