环境说明:
ubuntu 10.04.2
QtSDK (1.5G安装包的那个)
mysql5.1
1.安装MySQL
Linux下完整的MySQL开发需要安装服务器端,如果安装客户端也没什么不好。直接在软件中心搜mysql,把client和server选上。
server在安装时会提示为root用户设置密码,设一个好了。
我使用的是mysql5.1版本,用户名密码存储在一个叫mysql的数据库里,只有管理员级别才能看到。
如果直接在终端中输入 mysql,可能会提示ERROR 1045 (28000),这是因为这时候你是以自己用户名访问数据库,而目前数据库中只有一个root用户。没关系,如果有必要,可以添加一个用户进去:
mysql -uroot -p -->以root用户登录,
grant usage on *.* to dummy@localhost; -->授权名为dummy的用户本地登录,这里换成自己的用户名就可以了。
不过这时候直接mysql只有普通的权限,创建数据库、操作mysql都是不可以的,如果真有将其赋予管理员权限的需要,可以自己查阅有关资料。
2.安装Qt的MySQL驱动
方法一:直接sudo apt-get install libqt4-sql-mysql ,这是Qt4的mysql驱动,就不用自己费劲编译了,不过可能会额外下载一些东西。
将 /usr/lib/qt4/plugins/sqldrivers/libqsqlmysql.so拷贝到你的QtSDK sqldrivers目录下,我当时是直接用普通权限安装,目录为:~/QtSDK/Desktop/Qt/473/gcc/plugins/sqldrivers。
方法二:其实你也可以sudo apt-get download libqt4-sql-mysql,把包解压缩,然后把里面的so文件搜出来直接拷贝到那里。
方法三:乖乖按照官方方法编译,但是貌似可行性不大,因为新版本的QtSDK并没有src目录,默认也没有mysql的驱动。
3.做个demo试一下
记得在pro文件中 QT +=那里加上sql,否则qmake是不会去找sql的相关部分的。
#include
#include
#include
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QSqlDatabase db=QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("localhost");
db.setDatabaseName("study");
db.setUserName("root");
db.setPassword("tyh");
if(!db.open()){
qDebug()<<"Unable to open database";
}else{
qDebug()<<"Database connection established";
}
return a.exec();
}
这里study这个数据库之前我已经创建过了,如果连接成功,就会显示Database connection established。 我是建立的控制台程序哈。
二:
1.安装unix/ODBC驱动程序
2.重新编译qt/src/plugins/sql drivers/mysql,生成一个so文件,放在QT安装目录下的plugins/sql drivers文件夹下
3.QT编写程序,代码如下
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("192.168.1.15"); db.setDatabaseName("test"); db.setUserName("root"); db.setPassword("linqinong"); bool r = db.open();qDebug() << db.isOpen(); if (r) {ui->label->setText("MY SQL Server Connect OK!"); } else {ui->label->setText("no open"); }------------------------------------------------------为了确保QMYSQL驱动是否可用可以在main函数里添加以下代码int main(int argc, char *argv[]){ QApplication a(argc, argv); Widget w; w.setGeometry(0,0,320,240); w.setWindowFlags(Qt::FramelessWindowHint); w.show(); qDebug() << "Available drivers:"; QStringList drivers = QSqlDatabase::drivers(); foreach(QString driver, drivers) qDebug() << "\t" << driver; //QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); //qDebug() << "ODBC driver valid?" << db.isValid(); //db = QSqlDatabase::addDatabase("QODBC"); return a.exec();}三: 1. #include <QtSql> 2. #include <QMessageBox> 3. #include <QTextStream> 22. out << id << ", " << type << ", " << data <<endl; 2. #include <QtSql>之前用 C 语言连了mysql数据库,因为项目毕竟是用QT包装的,还需要在qt的界面里显示,所以这一次就用QT来连一下mysql。 | |
首先说一下我的电脑是ubuntu10.10;之前安装了QT的linux全部套件(包括QT creator),也安装了嵌入式qt的那三个编译环境(X11,X86,ARM),但是这一次我只用QT creatot里的qmake编译(以为之前编译完那三个环境后,我就把编译文件夹全删了)。 | |
首先,安装mysql客户端(mysql-devel),和C语言连接一样,执行命令: | |
1. sudo apt-get install libmysqlclient-dev | |
2. 或 | |
3. sudo apt-get install libmysqlclient15-dev | |
因为我之前安装过,所以这一步就省略了。 | |
然后,连接linux数据库肯定要有驱动,这个在qt的源码里就有:进入文件夹: | |
1. cd QTDIR/src/plugins/sqldrivers/mysql //这就是qt存放mysql驱动源码的目录 | |
目录里应该有main.cpp 和moc_qsql_mysql.cpp两个文件 | |
执行命令: | |
1 |
qmake -project //生成mysql.pro文件,可能这一步会说你没有权限,那么chmod给它权限就可以了 |
2 |
qmake "INCLUDEPATH+=/usr/include/mysql" "LIBS+=-L/usr/lib/mysql -lmysqlclient_r" mysql.pro |
3 |
/usr/include/mysql // mysql所有头文件所在的位置,mysql.h就在此处 |
4 |
/usr/lib/mysql //mysql库的位置 |
然后,执行命令: | |
1. make | |
2. sudo make install | |
此时,在QTDIR/src/plugins/sqldrivers/mysql 这个目录下,就生成了一个文件:libqsqlmysql.so;把它拷贝到QTDIR/plugins/sqldrivers, 目录下面; | |
现在开始编程:随便建工程:加入如下代码: | |
4. QTextStream out(stdout); | |
5. QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); | |
6. db.setHostName("localhost"); | |
7. db.setDatabaseName("test"); | |
8. db.setUserName("root"); | |
9. db.setPassword("****"); | |
10. if(!db.open()) | |
11. { | |
12. QMessageBox::critical(0,QObject::tr("Database Error"),db.lastError().text()); | |
13. return a.exec(); | |
14. } | |
15. QSqlQuery query; | |
16. query.exec("SELECT * FROM t_homedata"); | |
17. while(query.next()) | |
18. { | |
19. QString id = query.value(0).toString(); | |
20. QString type = query.value(1).toString(); | |
21. QString data = query.value(2).toString(); | |
23. } | |
注意,这段代码,是我加入到工程中的,恩,我就放在main.cpp里;#include <QtSql>这个是必须的;#include <QTextStream>这个是用来进行控制台打印输出的,我的数据库名为test,中间有一个表叫t_homedata,表里有三个varchar型字段:其打印结果为: | |
1. 100010, 23, 32.45 | |
2. 100011, 12, 99 | |
3. 100012, 11, 35.10 | |
注意,再进行工程的编译和运行之前(恩,因为我的电脑里实际有4个qt编译环境,所以还需要再Qt creator的project选项里设置该项目的编译器,我的编译器设置为qt-opensource,即Qt creator自带的,因为我之前所进行的mysql驱动编译也都是再Qt creator的安装目录里进行的),一定别忘了在工程的.pro文件里加上下面一行: | |
1. QT += sql | |
Qt 帮助文档里就是这么说的: | |
1. To include the definitions of the module's classes, use the following directive: | |
3. To link against the module, add this line to your qmake .pro file: | |
4. QT += sql | |
5. define DRIVER "QMYSQL3" /* see the Qt SQL documentation for a list of available drivers */ | |
6. define DATABASE ":dehua:" /* the name of your database */ | |
7. define USER "root" /* user name with appropriate rights */ | |
8. define PASSWORD "password" /* password for USER */ | |
9. define HOST "http://192.168.10.14" /* host on which the database is running */ | |
10. bool ServerInfo::connMysql(int csID, QString msg) | |
11. { | |
12. MYSQL mysql; | |
13. char host[32]="localhost"; | |
14. char user[32]="root"; | |
15. char passwd[32]="password"; | |
16. char dbname[32]="dehua"; | |
17. QString sql; | |
18 | |
19. if( mysql_init(&mysql) == NULL ) /*初始化数据结构*/ | |
20. { | |
21. syslog(LOG_USER|LOG_INFO,"inital mysql handle error\n"); | |
22. return FALSE; | |
23. } | |
24. if(mysql_real_connect(&mysql,host,user,passwd,dbname,0,NULL,0) == NULL) /*连接数据库*/ | |
25. { | |
26. syslog(LOG_USER|LOG_INFO, "Failed to connect to database: Error: %s\n",mysql_error(&mysql)); | |
27. return FALSE; | |
28. } | |
29 | |
30. msg.replace("'"," "); //去掉单引号 | |
sql=QString("insert into socRec(socketID,message) values(%1,'%2')") | |
32. .arg(csID) | |
33. .arg(msg); /*构造SQL语句*/ | |
34. qWarning(sql); | |
35. if(mysql_query(&mysql,sql) != 0) /*执行SQL语句,进行检索数据*/ | |
36. { /*执行SQL语句出错*/ | |
37. syslog(LOG_USER|LOG_INFO, "select ps_info Error: %s\n",mysql_error(&mysql)); | |
38. qWarning("false"); | |
39. } | |
40. else | |
41. { | |
42. qWarning("true"); | |
43. } | |
44. } |