在linux下QT連接Mysql數(shù)據(jù)庫(kù)
之前用 C 語(yǔ)言連了mysql數(shù)據(jù)庫(kù),因?yàn)轫?xiàng)目畢竟是用QT包裝的,還需要在qt的界面里顯示,所以這一次就用QT來(lái)連一下mysql。
首先說(shuō)一下我的電腦是ubuntu10.10;之前安裝了QT的linux全部套件(包括QT creator),也安裝了嵌入式qt的那三個(gè)編譯環(huán)境(X11,X86,ARM),但是這一次我只用QT creatot里的qmake編譯(以為之前編譯完那三個(gè)環(huán)境后,我就把編譯文件夾全刪了)。
首先,安裝mysql客戶端(mysql-devel),和C語(yǔ)言連接一樣,執(zhí)行命令:
- sudo apt-get install libmysqlclient-dev
- 或
- sudo apt-get install libmysqlclient15-dev
因?yàn)槲抑鞍惭b過(guò),所以這一步就省略了。
然后,連接linux數(shù)據(jù)庫(kù)肯定要有驅(qū)動(dòng),這個(gè)在qt的源碼里就有:進(jìn)入文件夾:
- cd QTDIR/src/plugins/sqldrivers/mysql //這就是qt存放mysql驅(qū)動(dòng)源碼的目錄
目錄里應(yīng)該有main.cpp 和moc_qsql_mysql.cpp兩個(gè)文件
執(zhí)行命令:
- qmake -project //生成mysql.pro文件,可能這一步會(huì)說(shuō)你沒(méi)有權(quán)限,那么chmod給它權(quán)限就可以了
- qmake "INCLUDEPATH+=/usr/include/mysql" "LIBS+=-L/usr/lib/mysql -lmysqlclient_r" mysql.pro
- /usr/include/mysql // mysql所有頭文件所在的位置,mysql.h就在此處
- /usr/lib/mysql //mysql庫(kù)的位置
然后,執(zhí)行命令:
- make
- sudo make install
此時(shí),在QTDIR/src/plugins/sqldrivers/mysql 這個(gè)目錄下,就生成了一個(gè)文件:libqsqlmysql.so;把它拷貝到QTDIR/plugins/sqldrivers, 目錄下面;
現(xiàn)在開始編程:隨便建工程:加入如下代碼:
- #include <QtSql>
- #include <QMessageBox>
- #include <QTextStream>
- QTextStream out(stdout);
- QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
- db.setHostName("localhost");
- db.setDatabaseName("test");
- db.setUserName("root");
- db.setPassword("xxxxxx");
- if(!db.open())
- {
- QMessageBox::critical(0,QObject::tr("Database Error"),db.lastError().text());
- return a.exec();
- }
- QSqlQuery query;
- query.exec("SELECT * FROM t_homedata");
- while(query.next())
- {
- QString id = query.value(0).toString();
- QString type = query.value(1).toString();
- QString data = query.value(2).toString();
- out << id << ", " << type << ", " << data <<endl;
- }
注意,這段代碼,是我加入到工程中的,恩,我就放在main.cpp里;#include <QtSql>這個(gè)是必須的;#include <QTextStream>這個(gè)是用來(lái)進(jìn)行控制臺(tái)打印輸出的,我的數(shù)據(jù)庫(kù)名為test,中間有一個(gè)表叫t_homedata,表里有三個(gè)varchar型字段:其打印結(jié)果為:
- 100010, 23, 32.45
- 100011, 12, 99
- 100012, 11, 35.10
注意,再進(jìn)行工程的編譯和運(yùn)行之前(恩,因?yàn)槲业碾娔X里實(shí)際有4個(gè)qt編譯環(huán)境,所以還需要再Qt creator的project選項(xiàng)里設(shè)置該項(xiàng)目的編譯器,我的編譯器設(shè)置為qt-opensource,即Qt creator自帶的,因?yàn)槲抑八M(jìn)行的mysql驅(qū)動(dòng)編譯也都是再Qt creator的安裝目錄里進(jìn)行的),一定別忘了在工程的.pro文件里加上下面一行:
- QT += sql
Qt 幫助文檔里就是這么說(shuō)的:
- To include the definitions of the module's classes, use the following directive:
- #include <QtSql>
- To link against the module, add this line to your qmake .pro file:
- QT += sql
- define DRIVER "QMYSQL3" /* see the Qt SQL documentation for a list of available drivers */
- define DATABASE ":dehua:" /* the name of your database */
- define USER "root" /* user name with appropriate rights */
- define PASSWORD "password" /* password for USER */
- define HOST "http://192.168.10.14" /* host on which the database is running */
- bool ServerInfo::connMysql(int csID, QString msg)
- {
- MYSQL mysql;
- char host[32]="localhost";
- char user[32]="root";
- char passwd[32]="password";
- char dbname[32]="dehua";
- QString sql;
- if( mysql_init(&mysql) == NULL ) /*初始化數(shù)據(jù)結(jié)構(gòu)*/
- {
- syslog(LOG_USER|LOG_INFO,"inital mysql handle error\n");
- return FALSE;
- }
- if(mysql_real_connect(&mysql,host,user,passwd,dbname,0,NULL,0) == NULL) /*連接數(shù)據(jù)庫(kù)*/
- {
- syslog(LOG_USER|LOG_INFO, "Failed to connect to database: Error: %s\n",mysql_error(&mysql));
- return FALSE;
- }
- msg.replace("'"," "); //去掉單引號(hào)
- sql=QString("insert into socRec(socketID,message) values(%1,'%2')")
- .arg(csID)
- .arg(msg); /*構(gòu)造SQL語(yǔ)句*/
- qWarning(sql);
- if(mysql_query(&mysql,sql) != 0) /*執(zhí)行SQL語(yǔ)句,進(jìn)行檢索數(shù)據(jù)*/
- { /*執(zhí)行SQL語(yǔ)句出錯(cuò)*/
- syslog(LOG_USER|LOG_INFO, "select ps_info Error: %s\n",mysql_error(&mysql));
- qWarning("false");
- }
- else
- {
- qWarning("true");
- }
- }
【編輯推薦】
Qt數(shù)據(jù)庫(kù)之添加MySQL驅(qū)動(dòng)插件