QSqlDataBase 一點心得

2021-10-08 21:53:08 字數 1610 閱讀 6156

先來看下這段**

qsqldatabase db1 = qsqldatabase::

adddatabase

("qsqlite"

,"myconnection1");

qsqldatabase db2 = qsqldatabase::

adddatabase

("qsqlite"

,"myconnection2");

qdebug()

<< qsqldatabase::

connectionnames()

;qdebug()

<< db1.

isvalid()

; qsqldatabase::

removedatabase

("myconnection1");

qdebug()

<< qsqldatabase::

connectionnames()

;qdebug()

;

這段**首先建立了兩個資料庫的連線,然後移除掉了其中乙個

這段**的輸出如下:

(「myconnection1」, 「myconnection2」)

true

qsqldatabaseprivate::removedatabase: connection 『myconnection1』 is still in use, all queries will cease to work.

(「myconnection2」)

false

可以發現,在移除myconnnection1時,qt彈出了警告,這是因為在刪除myconnection1時,當前作用域內,還存在乙個使用myconnection1的物件db1, 這個時候,db1變成了無效的,如果我們還繼續對db1進行操作,是不安全的。所以qt會非常人性化的給出了警告。

正確的刪除方法應該是這樣:

qsqldatabase::

removedatabase

("myconnection1"

);

用括號限定了db1的作用域,當刪除的時候,就已經沒有使用myconnection1的物件了,這時候刪除,qt就不會彈出警告了。

不過這種寫法在實際應用中,沒有什麼可用之處,下面介紹乙個十分好用的寫法:

qsqldatabase  getdatabase

(qstring connectionname)

將獲取qsqldatabase的物件封裝成函式,指定連線名稱,返回qsqldatabase物件,如果已經存在了相應的連線,則直接返回存在的qsqldatabase物件。在程式中,可以直接使用getdatabase().open() 這種方式來運算元據庫,由於getdatabase()返回的是乙個臨時物件的拷貝,脫離它的作用域後,用完就會自動釋放。

這樣寫有兩點好處:

1、可以在程式的任意地方使用qsqldatabase::removedatabase()來刪除乙個連線,而不會彈出警告

2、從某種程度上,這種方法實現了資料庫的單例模式,無論何時,都只會有乙個名稱為connectionname的連線

使用Authentication的一點心得

我寫了乙個例子程式 第一次使用基於froms的驗證 首先假設使用者登陸成功 這個一般從資料庫得到驗證 然後寫入驗證票據authentication.以後的頁面中判斷這個使用者是否通過驗證,如果沒有,重定向到使用者登陸頁面 如果已經登陸,則執行業務邏輯 本文重點在討論authentication在角色...

python def和lambda的一點心得

原文 python def和python lambda這2個有相似點也有不同點,今天給大家分享下自己的心得吧。先說說2個的相似點 這兩個很重要的相似點就是都可以定義一些固定的方法或者是流程,供給程式來呼叫,比如我們要定義乙個變數加2的方法。首先看python def吧。definfo x retur...

python def和lambda的一點心得

原文 python def和python lambda這2個有相似點也有不同點,今天給大家分享下自己的心得吧。先說說2個的相似點 這兩個很重要的相似點就是都可以定義一些固定的方法或者是流程,供給程式來呼叫,比如我們要定義乙個變數加2的方法。首先看python def吧。definfo x retur...