QtSQL學習筆記(2)- 連接到數據庫


  要使用QSqlQuery或者QSqlQueryModel訪問一個數據庫,首先需要創建並打開一個或多個數據庫連接(database connections)。

  一般地,數據庫連接是根據連接名(connection name)來識別的,而不是依靠數據庫名稱。你可以建立多個連接,但連接到同一個數據庫。QSqlDatabase還支持一個默認連接(default connection)的概念,這是一個未命名的連接。當調用QSqlQuery或者QSqlQueryModel中需要指定一個連接名參數的成員函數時,如果你不傳遞一個連接名,那么就會使用默認連接。當你的應用中僅需要使用一個數據庫連接時,創建一個默認連接會非常方便。

  注意創建一個連接和打開一個連接之間的區別。創建一個連接包括創建一個QSqlDatabase類實例。這打開連接之前,這個連接是不可用的。下面的代碼片段展示了如何創建一個默認連接並打開它:

  QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
  db.setHostName("bigblue");
  db.setDatabaseName("flightdb");
  db.setUserName("acarlson");
  db.setPassword("1uTbSbAs");
  bool ok = db.open();

  第一行代碼創建一個連接對象,而最后一行打開這個連接以備后面使用。而中間的代碼,我們用來初始化一些連接信息,包括主機名、數據庫名、用戶名和密碼。在這種情況下,我們正連接到主機名為bigblue的數據庫名為flightdb的MYSQL數據庫。QSqlDatabase::addDatabase()方法的參數“QMYSQL”用來指定用於連接的數據庫驅動類型。

注意:如果第一次使用MYSQL,你可能會遇到如下所示的錯誤提示:

QSqlDatabase: QMYSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE QMYSQL QMYSQL3 QODBC QODBC3 QPSQL QPSQL7

按理說,我使用的是Qt 5.4.1,這個版本已經提供了MYSQL的驅動了,但是這里卻出現了驅動不能加載的情況。在網上查閱資料,絕大多數人給出的解決方案是將MySQL安裝目錄下的libmysql.dll文件放到C:\Qt\Qt5.4.1\5.4\mingw491_32\bin目錄下即可解決。但是,本人嘗試,並非任意版本的此動態鏈接庫文件都能解決此問題,比如本人在官網下載安裝的最新版MYSQL中的此文件就不能解決問題,可能還跟本人使用的Qt是基於MinGW編譯器,而有些是使用VS編譯的有關。這里我提供一個我的平台上可用的一個文件,連接地址如下:http://pan.baidu.com/s/1sjM9x2t

  以上代碼片段中創建的連接是一個默認連接,因為我們沒有為addDatabase()方法傳遞第二個參數,用以指定一個連接名。例如,下面的代碼我們就建立了兩個MYSQL數據庫連接,並且分別命名為“first”和“second”:

QSqlDatabase firstDB = QSqlDatabase::addDatabase("QMYSQL", "first");
QSqlDatabase secondDB = QSqlDatabase::addDatabase("QMYSQL", "second");

  在這些連接被初始化以后,分別對每一個連接調用open()方法來激活連接。如果open()失敗,該方法將返回false。在這種情況下,可以調用QSqlDatabase::lastError()方法來獲取錯誤信息,該方法將返回一個QSqlError對象,可以使用QSqlError::databaseText()方法來得到該錯誤的QString表示形式的信息。

  一旦一個連接被建立,我們可以在任何地方通過調用帶有一個連接名參數的靜態函數QSqlDatabase::database()來獲取一個指向該連接的指針,如果我們不傳遞一個連接名,它將返回默認連接。例如:

QSqlDatabase defaultDB = QSqlDatabase::database();
QSqlDatabase firstDB = QSqlDatabase::database("first");
QSqlDatabase secondDB = QSqlDatabase::database("second");

要移除一個數據庫連接,首先使用QSqlDatabase::close()關閉數據庫,然后使用靜態方法QSqlDatabase::removeDatabase()移除它。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM