Qt 4 訪問 Mysql 數(shù)據(jù)庫(kù)實(shí)例
Qt 4 訪問 Mysql 數(shù)據(jù)庫(kù)實(shí)例是本文要介紹的內(nèi)容,Qt 4.1.2 windows 開源版, mySql 5.0.21 也是windows 開源版。不過這2個(gè)軟件都是跨平臺(tái)的,方法大同小異。
一、配置windows下開發(fā)環(huán)境。
1. Qt 的安裝 這個(gè)很簡(jiǎn)單, 去 trolltech 網(wǎng)站自己下載一個(gè) windows 開源版的就好了。然后雙擊安裝, 一路next, 如果問是否需要安裝 MinGW, 點(diǎn)是, 然后next下去, 就完成了。
2. MySQL 的安裝 我不喜歡安裝東西, 所以去 www.mysql.com 下了個(gè)非安裝版, 直接放到C盤下了。至此,安裝環(huán)境完成。
二、解決 mysql 的 Qt 驅(qū)動(dòng)問題 這個(gè)問題困擾了我一些時(shí)間,因?yàn)?Qt 安裝完后,沒有帶 mySQL 的驅(qū)動(dòng),寫好的程序運(yùn)行會(huì)提示說(shuō) “Driver not loaded”。不過還好, 在 src 目錄下可以找到 mysql qt 驅(qū)動(dòng)的源代碼。 后來(lái)我用 Qt assistant 上說(shuō)的方法,但始終無(wú)法生成庫(kù)文件,總有鏈接錯(cuò)誤。 后來(lái)google 一下,在 qtcn 上看到他們站長(zhǎng)發(fā)的一篇文章,才知道是 mysql 默認(rèn)帶的庫(kù)文件是 ms 格式的, 所以使用 make 的話,ld 程序鏈接時(shí)會(huì)失敗。
如果大家使用linux系統(tǒng),那么就只需按 assistant 說(shuō)的就夠了,下面 XChinux 也提到了。解決的辦法他也給出了。轉(zhuǎn)錄如下:以下引用引自:
http://www.qtcn.org/bbs/read.php?tid=4210&fpage=&toread=&page=1
作者:XChinux QUOTE: Qt4 OpenSource for mingw中編譯MySQL驅(qū)動(dòng) mingw-utils 包下載:
http://www.qtcn.org/download/mingw-utils-0.3.tar.gz
在 Qt4 的文檔中在Windows下關(guān)于怎樣編譯 mysql 的驅(qū)動(dòng)上面說(shuō)
- You need to get the MySQL installation files. Run SETUP.EXE and choose "Custom Install".
- Install the "Libs & Include Files" Module. Build the plugin as follows (here it is assumed that MySQL is installed in C:\MYSQL):
- cd %QTDIR%\src\plugins\sqldrivers\mysql qmake -o Makefile "INCLUDEPATH+=C:\MYSQL\INCLUDE" "LIBS+=C:\MYSQL\LIB\OPT\LIBMYSQL.LIB"
- mysql.pro nmake If you are not using a Microsoft compiler, replace nmake with make in the line above.
這就是一個(gè)容易搞混的地方,上面是使用的 libmysql.lib和nmake來(lái)編譯的,如果使用的是msvc的編譯器,那上面是沒問題的,但是如果使用的是mingw編譯器,那就會(huì)出錯(cuò),有 undefined reference....等類錯(cuò)誤字樣。這是因?yàn)閙ingw使用的庫(kù)和msvc使用的不同格式的庫(kù)而引起的。而mysql只提供了msvc可使用的庫(kù)。
qt4 for mingw要想編譯出qsqlmysql庫(kù)來(lái),我們先得編譯出mingw需要的libmysql.a這個(gè)文件來(lái),可使用mingw工具來(lái)生成。 mingw -utils包里的reimp命令(如果沒有這個(gè)命令的話,可從本帖開頭處給出的地址中下載這個(gè)文件,并把它解壓開后的bin目錄里的內(nèi)容拷貝到 mingw的bin目錄下面。mysql安裝的時(shí)候默認(rèn)的安裝路徑中有空格,我們得先把它的include和lib目錄拷貝到?jīng)]有空格的路徑下,比如C: \mysql下)
- cd c:\mysql\lib\opt reimp -d libmysql.lib
- dlltool -k -d libmysql.def -l libmysql.a
如此,這樣我們的命令行為(注意qmake和make):
- cd %QTDIR%\src\plugins\sqldrivers\mysql
- qmake -o Makefile "INCLUDEPATH+=C:\MYSQL\INCLUDE" "LIBS+=C:\MYSQL\LIB\OPT\LIBMYSQL.a" mysql.pro
- mingw32-make
這下便會(huì)在%QTDIR%\plugins\sqldrivers目錄下面生成libqsqlmysql.a, qsqlmysql.dll這兩個(gè)文件了。 有一點(diǎn), 就是下載他給出的mingw-utils-0.3.tar.gz 文件, 只需要把里面的 reimp 工具復(fù)制到你的 minGW目錄下的bin 里就可以了,這樣按上面的步驟就可以生成需要的驅(qū)動(dòng)了。
make 結(jié)束后, 庫(kù)文件會(huì)生成到qt的系統(tǒng)目錄中去。
三、簡(jiǎn)單配置 mysql
1. 運(yùn)行 mysql 服務(wù)(假定 mysql 安裝在 C:\mysql 下) 打開一個(gè)控制臺(tái)窗口, 就是“DOS”窗口,
- cd c:\mysql\bin mysqld
正常情況下, 什么提示都沒有, 當(dāng)然你不放心的話, 去C:\mysql\data 找擴(kuò)展名是err 的文件看一下, 所有的日志都在里面。另外,建議把 C:\mysql\bin 加入系統(tǒng)的PATH中, 這樣就可以在任何目錄下運(yùn)行mysql了, 以下默認(rèn)是加到 PATH中的,大家可以通過在我的電腦點(diǎn)擊右鍵, 選擇“屬性”,然后點(diǎn)“高級(jí)”標(biāo)簽頁(yè),點(diǎn)“環(huán)境變量”按鈕, 進(jìn)去找到 PATH的變量,加上";c:\mysql\data\"。
2. 測(cè)試客戶端鏈接 再開一個(gè)“DOS”窗口, 輸入: mysql -u root 來(lái)訪問 mysql 服務(wù), 這個(gè)非安裝版, 默認(rèn)含有 root 用戶, 也就是mysql 里的最高用戶, 什么都可以做。同時(shí)默認(rèn) root 用戶沒有密碼。 當(dāng)然你可以登錄后使用 SET PASSWORD= PASSWORD("密碼") 來(lái)設(shè)置自己的密碼。 登錄后, 就進(jìn)入 mysql 環(huán)境, 提示符也成了 mysql>
3. 為我們的測(cè)試程序新建一些數(shù)據(jù)
3.1 創(chuàng)建一個(gè)數(shù)據(jù)庫(kù) mysql> create database example; Query OK, 1 row affected (0.03 sec) mysql> use example; Database changed 這樣就創(chuàng)建了一個(gè)叫 example 的數(shù)據(jù)庫(kù),我們后面就使用這個(gè)庫(kù)來(lái)做試驗(yàn)。
3.2 創(chuàng)建一個(gè)可以完全控制這個(gè)數(shù)據(jù)庫(kù)的用戶 mysql> GRANT all -> ON example.* -> TO test@localhost; Query OK, 0 rows affected (0.00 sec) 通過上面的語(yǔ)句, 系統(tǒng)會(huì)自動(dòng)更新系統(tǒng)的用戶表,新建一個(gè)叫做 test 的用戶, 這個(gè)用戶只可以通過本機(jī)來(lái)訪問數(shù)據(jù)庫(kù),至于網(wǎng)絡(luò)訪問權(quán)限, 我沒有測(cè)試, 但是應(yīng)該也是大同小異,改@后面就可以了。注意, 這個(gè)新創(chuàng)建的用戶是沒有密碼的, root 可以給他設(shè)置密碼,還是使用 grant 命令操作,不過我是后面用 test 登錄后自己設(shè)置的(用上面說(shuō)過 set password 的方法)。test 這個(gè)用戶被賦予了 example 數(shù)據(jù)庫(kù)的完全權(quán)限。
3.3 用 test帳號(hào)登錄 mysql -u test -p password 或者輸入完-p后直接回車, 程序會(huì)讓你輸入密碼。
#p#
3.4 新建一個(gè)表
- mysql> CREATE TABLE employee (
- id CHAR(3),
- lastname VARCHAR(30),
- firstname VARCHAR(20),
- dob DATETIME,
- phone VARCHAR(10)
- );
- Query OK, 0 rows affected (0.00 sec)
這樣就新建了一個(gè)叫做 employee 的表,含有 4 個(gè)字段, id 號(hào), 姓, 名,生日, 電話。 我們?nèi)缓蟛迦?條記錄:
- mysql> INSERT INTO employee VALUES ("001", "熱", "X", "2000-05-18", "5188");
- Query OK, 1 row affected (0.05 sec)
- mysql> INSERT INTO employee VALUES ("002", "包", "子", "2000-05-18", "5198")
- Query OK, 1 row affected (0.00 sec)
那么, 現(xiàn)在我們就準(zhǔn)備好了所有數(shù)據(jù)了。
四、 Qt 4 的一個(gè)簡(jiǎn)單訪問 mysql 的例子
1 Qt 連接 mysql 實(shí)例講解 下面的例子非常的簡(jiǎn)單, 使用了 QTextEdit 來(lái)顯示查詢到的內(nèi)容,主要是要說(shuō)明Qt 4 中如何連接和訪問數(shù)據(jù)庫(kù)。至于用什么顯示, 不是現(xiàn)在我們關(guān)心的問題。:)
- #include <QApplication>
- #include <QTextEdit>
- #include <QString>
- #include <QSqlDatabase>
- #include <QSqlQuery>
- #include <QSqlError>
- #include <QSqlDriver>
- #include <QDateTime>
- #include <QDebug>
- int main(int argc, char **argv)...{
- QApplication app(argc, argv);
- QTextEdit display; display.resize(400, 160);
- display.show(); // 下面進(jìn)行數(shù)據(jù)庫(kù)的設(shè)置
- QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); // 使用mysql數(shù)據(jù)庫(kù)驅(qū)動(dòng)
- db.setHostName("localhost");
- db.setDatabaseName("example"); // 我們之前建立的數(shù)據(jù)庫(kù)
- db.setUserName("test"); // 我們創(chuàng)建的 yunfan 用戶名
- db.setPassword("test"); // yunfan 用戶的密碼
- bool ok = db.open(); // 嘗試連接數(shù)據(jù)庫(kù)
- if(ok)...{ // 這里用yunfan已經(jīng)成功連上數(shù)據(jù)庫(kù)
- QSqlQuery query; // 新建一個(gè)查詢的實(shí)例
- if(query.exec("select * from employee"))...{ // 嘗試列出 employee 表的所有記錄
- // 本次查詢成功
- int numRows = 0; // 詢問數(shù)據(jù)庫(kù)驅(qū)動(dòng),是否驅(qū)動(dòng)含有某種特性
- if(db.driver()->hasFeature(QSqlDriver::QuerySize))...{
- numRows = query.size(); // 如果支持結(jié)果影響的行數(shù),那么直接記錄下來(lái)
- } else...{
- query.last(); //否則定位到結(jié)果最后,qt 文檔說(shuō),這個(gè)方法非常慢
- numRows = query.at() + 1;
- }
- QString id, lname, fname, phone; QDateTime dob;
- display.append("===========================================");
- display.append(QString::fromLocal8Bit(" id | 姓名 | 生日 | 電話"));
- display.append("--------------------------------------");
- while(query.next())...{ // 定位結(jié)果到下一條記錄
- id = query.value(0).toString();
- lname = QString::fromLocal8Bit(query.value(1).toByteArray());
- fname = QString::fromLocal8Bit(query.value(2).toByteArray());
- dob = query.value(3).toDateTime();
- phone = QString::fromLocal8Bit(query.value(4).toByteArray());
- QString result = id + " " + fname + lname + " " + (dob.toString()) + " "+phone;
- display.append(result); }
- display.append("============================================");
- display.append(QString("totally %1 rows").arg( numRows) );
- } else ...{ // 如果查詢失敗,用下面的方法得到具體數(shù)據(jù)庫(kù)返回的原因
- QSqlError error = query.lastError();
- display.append("From mysql database: " + error.databaseText());
- }
- } else ...{ // 打開數(shù)據(jù)庫(kù)失敗,顯示數(shù)據(jù)庫(kù)返回的失敗描述
- display.append("cannot open database.");
- display.append("Reason: " + db.lastError().databaseText());
- }
- QApplication::connect(&app, SIGNAL(lastWindowClose()), &app, SLOT(quit()));
- return app.exec();
- }
2 編譯程序 存盤后(假定存為 client.cpp ), 我們需要生成qt 工程文件。 打開“DOS”窗口,cd 到 你client.cpp 所在的目錄下, 輸入
- qmake -project QT += sql -o client.pro
這樣就生成了工程文件 client.pro, 但是這對(duì)編譯是不夠的,因?yàn)檫€需要手動(dòng)讓qmake生成makefile的時(shí)候鏈接相關(guān)的sql庫(kù)文件。 然后存盤就搞定了, 就這么簡(jiǎn)單 :)。 接下來(lái)就是固定套路
- qmake
- mingw32-make//可以不用這個(gè),用sql database driver中生成驅(qū)動(dòng)的方法
看看新生成的 Release 目錄下, 我們的 client 程序已經(jīng)編譯好了。運(yùn)行一下試試看 ;)
在整個(gè)上面的過程中,最郁悶的地方是Qt的mysql驅(qū)動(dòng)還需要用戶自己編譯, 相信這個(gè)會(huì)給很多人帶來(lái)麻煩(如果使用linux系統(tǒng), 那么按 Qt 文檔生成驅(qū)動(dòng)應(yīng)該是完全沒有問題的, windows用戶會(huì)遇到庫(kù)格式不兼容的問題)。
小結(jié):Qt 4 訪問 Mysql 數(shù)據(jù)庫(kù)實(shí)例的內(nèi)容介紹完了,希望本文對(duì)你有所幫助!