之前用 C 语言连了mysql数据库,因为项目毕竟是用QT包装的,还需要在qt的界面里显示,所以这一次就用QT来连一下mysql。
首先说一下我的电脑是ubuntu10.10;之前安装了QT的linux全部套件(包括QT creator),也安装了嵌入式qt的那三个编译环境(X11,X86,ARM),但是这一次我只用QT creatot里的qmake编译(以为之前编译完那三个环境后,我就把编译文件夹全删了)。
首先,安装mysql客户端(mysql-devel),和C语言连接一样,执行命令:
sudo apt-get install libmysqlclient-dev
或
sudo apt-get install libmysqlclient15-dev
- 1.
- 2.
- 3.
因为我之前安装过,所以这一步就省略了。
然后,连接linux数据库肯定要有驱动,这个在qt的源码里就有:进入文件夹:
cd QTDIR/src/plugins/sqldrivers/mysql //这就是qt存放mysql驱动源码的目录
- 1.
目录里应该有main.cpp 和moc_qsql_mysql.cpp两个文件
执行命令:
qmake -project //生成mysql.pro文件,可能这一步会说你没有权限,那么chmod给它权限就可以了
qmake "INCLUDEPATH+=/usr/include/mysql" "LIBS+=-L/usr/lib/mysql -lmysqlclient_r" mysql.pro
/usr/include/mysql // mysql所有头文件所在的位置,mysql.h就在此处
/usr/lib/mysql //mysql库的位置
- 1.
- 2.
- 3.
- 4.
然后,执行命令:
make
sudo make install
- 1.
- 2.
此时,在QTDIR/src/plugins/sqldrivers/mysql 这个目录下,就生成了一个文件:libqsqlmysql.so;把它拷贝到QTDIR/plugins/sqldrivers, 目录下面;
现在开始编程:随便建工程:加入如下代码:
#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;
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
注意,这段代码,是我加入到工程中的,恩,我就放在main.cpp里;#include <QtSql>这个是必须的;#include <QTextStream>这个是用来进行控制台打印输出的,我的数据库名为test,中间有一个表叫t_homedata,表里有三个varchar型字段:其打印结果为:
100010, 23, 32.45
100011, 12, 99
100012, 11, 35.10
- 1.
- 2.
- 3.
注意,再进行工程的编译和运行之前(恩,因为我的电脑里实际有4个qt编译环境,所以还需要再Qt creator的project选项里设置该项目的编译器,我的编译器设置为qt-opensource,即Qt creator自带的,因为我之前所进行的mysql驱动编译也都是再Qt creator的安装目录里进行的),一定别忘了在工程的.pro文件里加上下面一行:
QT += sql
- 1.
Qt 帮助文档里就是这么说的:
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 ) /*初始化数据结构*/
{
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) /*连接数据库*/
{
syslog(LOG_USER|LOG_INFO, "Failed to connect to database: Error: %s\n",mysql_error(&mysql));
return FALSE;
}
msg.replace("'"," "); //去掉单引号
sql=QString("insert into socRec(socketID,message) values(%1,'%2')")
.arg(csID)
.arg(msg); /*构造SQL语句*/
qWarning(sql);
if(mysql_query(&mysql,sql) != 0) /*执行SQL语句,进行检索数据*/
{ /*执行SQL语句出错*/
syslog(LOG_USER|LOG_INFO, "select ps_info Error: %s\n",mysql_error(&mysql));
qWarning("false");
}
else
{
qWarning("true");
}
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
【编辑推荐】