在Qt線上文件 SQL Database Drivers 中有提及如何建構Qt的資料庫驅動程式,在這邊簡介一下,如何在Windows下使用Qt OpenSource 4.3.3自行編譯MySQL驅動程式的plugin。





  1. 安裝MySQL時必須有Include Files / Lib Files選項


首先是當您在安裝MySQL的時候,必須選擇自訂安裝,並選擇安裝Include Files / Lib Files,安裝完成時在MySQL安裝目錄下,會有include目錄與lib目錄,如果您先前沒有選擇安裝Include Files / Lib Files,則只要再執行一次MySQL安裝程式,選擇「Modify」項目,即可再增加Include Files / Lib Files的安裝。





  1. 複製MySQL的include與lib目錄


若MySQL預設的安裝目錄名稱中預設有空白(例如MySQL Server 5.0這樣的名稱),在編譯驅動程式時會有問題,您可以建立一個mysql目錄,例如c:\mysql,然後將MySQL的include與lib目錄複製至c:\mysql之中。






  1. 下載 mingw-utils


下載mingw-utils-0.3.tar.gz,將之解壓縮,將其中的reimp複製至MinGW的bin目錄中。





  1. 使用reimp與dlltool


開啟文字模式主控台,執行以下指令:

cd c:\mysql\lib\opt


reimp -d libmysql.lib


dlltool -k -d libmysql.def -l libmysql.a






  1. 編譯驅動程式


在文字模式主控台中執行以下指令,%QTDIR%為您的Qt安裝路徑環境變數

cd %QTDIR%\src\plugins\sqldrivers\mysql


qmake -o Makefile "INCLUDEPATH+=C:\mysql\include" "LIBS+=C:\mysql\lib\opt\libmysql.a" mysql.pro


make




完成以上的步驟並編譯完成之後,可以在Qt安裝目錄中的plugins\sqldrivers目錄中,找到編譯好的MySQL驅動程式plugin。



接下來可以編寫程式測試資料庫連結,Qt的資料庫支援是放置在QtSql模組之中,您可以使用QSqlDatabase的靜態addDatabase() 方法指定"QMYSQL",這會載入驅動程式並傳回QSqlDatabase實作物件,之後可以使用setHostName()、 setDatabaseName()、setUserName()、setPassword()等方法,設定資料庫的URL位址、資料庫名稱、使用者與密碼,然後使用open()方法開啟連線,使用close()方法關閉連線。



下面這個程式是個簡單示範:


#include 

#include

#include



bool createConnection() {

QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");



db.setHostName("localhost");

db.setDatabaseName("demo");

db.setUserName("root");

db.setPassword("123456");



if (!db.open()) {

return false;

}



db.close();



return true;

}



int main(int argc, char *argv[]) {

QApplication app(argc, argv);



QLabel *label = new QLabel;

label->setWindowTitle("Qt Database");



if(createConnection()) {

label->setText("

Connected to database!

");

}

else {

label->setText("

Connection fail!

");

}



label->show();



return app.exec();

}



接著執行qmake -project產生.pro檔案,為了要連結QtSql模組,記得編輯.pro檔案,在當中加上一行:


QT += sql




接著就可以再次執行qmake產生Makefile,執行make進行程式編譯了。下圖為程式執行時的參考畫面:





狼翔月影 發表在 痞客邦 PIXNET 留言(0) 人氣()