1. 程式人生 > >QT開發:QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection'...

QT開發:QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection'...

今天寫qt資料庫操作的時候,發現了這個問題,之前是模仿QT官方例子的資料庫開啟方式,即

QSqlDatabase qdb;
if(QSqlDatabase::contains("TEST"))
	qdb = QSqlDatabase::database("QSQLITE");
else
	qdb = QSqlDatabase::addDatabase("QSQLITE","TEST");

沒有出現該問題,但由於工程需要操作到多資料庫檔案,資料操作時發現讀不出資料,報出QSqlQuery查詢出錯,並且database is not opened的錯誤,就想到應該是前面開啟資料庫時候用的不是預設連線,因此出現這問題了;

於是將上面程式碼改為

QSqlDatabase qdb;
if(QSqlDatabase::contains("QSQLITE"))
	qdb = QSqlDatabase::database("QSQLITE");
else
	qdb = QSqlDatabase::addDatabase("QSQLITE");

資料庫正常開啟,操作,但報出標題所示的警告,於是想到,QSQLITE這個字串是否有經過QT內部處理,查詢了一下手冊,沒發現該字串的具體描述,分析,應該是QSqlDatabase::addDatabase()的關係,檢視手冊,該函式原型為:

QSqlDatabase QSqlDatabase::addDatabase ( const QString & type, const QString & connectionName = QLatin1String( defaultConnection ) ) [static]

type...是型別,並不是連線名,好,現在知道了,於是在以上程式碼段下加了列印語句:

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");

問題解決,發現一個問題,看文件粗心,看例子粗心,其實addDatabase 的函式原型就已經很好的說明了問題了