日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Qt中使用QSqlDatabase::removeDatabase()的正确方法

發(fā)布時間:2023/12/9 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt中使用QSqlDatabase::removeDatabase()的正确方法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

如果你用過Qt的QSqlDatabase的話,多半會對下面的警告信息感興趣:

QSqlDatabasePrivate::removeDatabase: connection 'qt_sql_default_connection' is still in use, all

queries will cease to work.

意思是說,還有某查詢引用默認(rèn)數(shù)據(jù)庫連接"qt_sql_default_connection"。

如果忽略該警告,Qt官方文檔里也寫了,可能會出現(xiàn)內(nèi)存泄漏:

Warning: There should be no open queries on the database connection when this function is called,

otherwise a resource leak will occur.

還是不出現(xiàn)這個警告的好。怎么把它弄沒了呢?我把一切外圍的對象都排除了:僅建立一個連接,打開它,然后關(guān)閉連接,調(diào)用removeDatabase()。居然還有警告!問題已經(jīng)鎖定在我關(guān)閉連接的語句上:

QSqlDatabase::removeDatabase(QSqlDatabase::database().connectionName());

默認(rèn)連接的名字也是默認(rèn)的,需要通過connectionName()函數(shù)獲得。這樣寫貌似沒什么問題,后來調(diào)試發(fā)現(xiàn),QSqlDatabase::database()靜態(tài)函數(shù)實(shí)際上使默認(rèn)連接的引用計(jì)數(shù)+1。上述句子相當(dāng)于:

QSqlDatabase db = QSqlDatabase::database();//獲得實(shí)例。 QString name = db.connectionName();//獲得默認(rèn)連接名。 QSqlDatabase::removeDatabase(name);//刪除默認(rèn)連接。

這樣,問題就清晰了,db獲得了一個引用,此時引用計(jì)數(shù)為2。在調(diào)用removeDatabase()時,db對象并沒有被刪除,默認(rèn)連接的引用計(jì)數(shù)仍為2,于是報(bào)告警告信息。

我們只需將其改為:

?

QString name; { name = QSqlDatabase::database().connectionName(); }//超出作用域,隱含對象QSqlDatabase::database()被刪除。 QSqlDatabase::removeDatabase(name);

問題就解決了!

如果直接打默認(rèn)連接名的話,代碼就簡單多了,不過名字不太好打(再說了,萬一Qt把默認(rèn)連接名改了呢!):

QSqlDatabase::removeDatabase("qt_sql_default_connection");//不推薦。

?

================下面是官方文檔摘錄================

?

Warning: There should be no open queries on the database connection when this function is called, otherwise a resource leak will occur.

Example:

// WRONG QSqlDatabase db = QSqlDatabase::database("sales"); QSqlQuery query("SELECT NAME, DOB FROM EMPLOYEES", db); QSqlDatabase::removeDatabase("sales"); // will output a warning // "db" is now a dangling invalid database connection, // "query" contains an invalid result set

The correct way to do it:

{ QSqlDatabase db = QSqlDatabase::database("sales"); QSqlQuery query("SELECT NAME, DOB FROM EMPLOYEES", db); } // Both "db" and "query" are destroyed because they are out of scope QSqlDatabase::removeDatabase("sales"); // correct

轉(zhuǎn)載于:https://www.cnblogs.com/codingmylife/archive/2010/04/27/1722404.html

總結(jié)

以上是生活随笔為你收集整理的Qt中使用QSqlDatabase::removeDatabase()的正确方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。