Qt數據庫連接

Qt數據庫連接

Qt是通過數據庫連接來進行數據庫訪問的
 QSqlDatabase類提供了連接訪問數據庫的接口。

QSqlDatabase簡介

 一個QSqlDatabase的實例表示一個數據庫的連接。每個連接通過Qt所支持的數據庫驅動提供對數據庫的訪問(數據庫驅動程序派生自QSqlDriver)。你也可以編寫自己的數據庫驅動。
 通過調用靜態addDatabase()函數中的一個來指定要使用的驅動程序(數據庫驅動類型)或驅動程序類型(取決於數據庫的類型)和連接名(connectionName)。

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

每個連接是通過連接名與數據庫連接的。並且一個數據庫可以有多個數據庫連接。
QSqlDatabase支持默認連接,即未命名連接(只需要指定驅動類型)。創建默認連接,只需要在addDatabase()時不傳遞連接名即可。之後,你調用任何靜態成員函數不指定連接名,則都認爲是使用默認連接。


      QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL");
      db.setHostName("acidalia");
      db.setDatabaseName("customdb");
      db.setUserName("mojito");
      db.setPassword("J0a1m8");
      bool ok = db.open();

 上面代碼展示瞭如何創建和打開PostgreSQL的默認連接。創建QSqlDatabase對象後,使用setDatabaseName()、setUserName()、setPassword()、setHostName()、setPort()和setConnectOptions()設置連接參數。然後調用open()來打開到數據庫的物理連接,在打開之前,連接是不可用的
 上面定義的連接是默認連接,因爲沒有爲addDatabase()提供連接名,之後可以通過調用database()來獲得默認連接,而不需要連接名參數。

	QSqlDatabase db = QSqlDatabase::database();

 QSqlDatabase是一個值類(value class)。通過一個QSqlDatabase實例對數據庫連接所做的操作將影響表示相同連接的其他QSqlDatabase實例。使用cloneDatabase()可以創建一個基於已有的數據庫連接的連接。
警告:強烈建議不要將QSqlDatabase的拷貝作爲類成員,因爲這將阻止關閉時正確清理實例。如果需要訪問現有的QSqlDatabase,應該使用database()訪問。如果你選擇使用作爲成員變量的QSqlDatabase,則需要在刪除QCoreApplication實例之前刪除它,否則可能會導致未定義的行爲。

 如果你創建了多個數據庫連接,在調用addDatabase()時爲每個連接指定一個唯一的連接名。使用帶有連接名的database()來獲得該連接。對連接名使用removeDatabase()來刪除連接,如果試圖刪除由其他QSqlDatabase對象引用的連接,則QSqlDatabase輸出一個警告。使用contains()查看指定的連接名是否在該數據庫的連接列表中。

多線程使用數據庫注意

 Qt使用時,常常將GUI線程與各種數據處理線程分開,這時會涉及到多線程操作數據庫。

Threads and the SQL Module
A connection can only be used from within the thread that created it. Moving connections between threads or creating queries from a different thread is not supported.
In addition, the third party libraries used by the QSqlDrivers can impose further restrictions on using the SQL Module in a multithreaded program. Consult the manual of your database client for more information

 官方文檔有明確的說明,每個連接只能在創建它的線程中使用,不支持跨線程
 如果你試圖跨線程使用同一個數據庫連接,可能會出現以下警告,

QSqlDatabasePrivate::database: requested database does not belong to the calling thread.

 一個連接不能跨線程操作,不代表不能多線程操作一個數據庫。想多線程中操作數據庫也很簡單,創建一個不同的連接或者銷燬原連接再打開。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章