Qt 4 访问 Mysql 数据库实例

移动开发
本文介绍的是Qt 4 访问 Mysql 数据库实例,使用 Qt 来连接 mysql 是非常简单的事情, 当然 Qt 还提供了一些数据库相关的 widget 来更好的显示,更新数据。

Qt 4 访问 Mysql 数据库实例是本文要介绍的内容,Qt 4.1.2   windows 开源版, mySql 5.0.21 也是windows 开源版。不过这2个软件都是跨平台的,方法大同小异。

一、配置windows下开发环境。

1. Qt 的安装 这个很简单, 去 trolltech 网站自己下载一个 windows 开源版的就好了。然后双击安装, 一路next, 如果问是否需要安装 MinGW, 点是, 然后next下去, 就完成了。
2. MySQL 的安装 我不喜欢安装东西, 所以去 www.mysql.com 下了个非安装版, 直接放到C盘下了。至此,安装环境完成。

二、解决 mysql 的 Qt 驱动问题 这个问题困扰了我一些时间,因为 Qt 安装完后,没有带 mySQL 的驱动,写好的程序运行会提示说 “Driver not loaded”。不过还好, 在 src 目录下可以找到 mysql qt 驱动的源代码。 后来我用 Qt assistant 上说的方法,但始终无法生成库文件,总有链接错误。 后来google 一下,在 qtcn 上看到他们站长发的一篇文章,才知道是 mysql 默认带的库文件是 ms 格式的, 所以使用 make 的话,ld 程序链接时会失败。

如果大家使用linux系统,那么就只需按 assistant 说的就够了,下面 XChinux 也提到了。解决的办法他也给出了。转录如下:以下引用引自:

http://www.qtcn.org/bbs/read.php?tid=4210&fpage=&toread=&page=1

作者:XChinux QUOTE: Qt4 OpenSource for mingw中编译MySQL驱动 mingw-utils 包下载:

http://www.qtcn.org/download/mingw-utils-0.3.tar.gz

在 Qt4 的文档中在Windows下关于怎样编译 mysql 的驱动上面说

  1. You need to get the MySQL installation files. Run SETUP.EXE and choose "Custom Install".  
  2.  Install the "Libs & Include Files" Module. Build the plugin as follows (here it is assumed that MySQL is installed in C:\MYSQL):  
  3.  cd %QTDIR%\src\plugins\sqldrivers\mysql qmake -o Makefile "INCLUDEPATH+=C:\MYSQL\INCLUDE" "LIBS+=C:\MYSQL\LIB\OPT\LIBMYSQL.LIB"  
  4.  mysql.pro nmake If you are not using a Microsoft compiler, replace nmake with make in the line above.  

这就是一个容易搞混的地方,上面是使用的 libmysql.lib和nmake来编译的,如果使用的是msvc的编译器,那上面是没问题的,但是如果使用的是mingw编译器,那就会出错,有 undefined reference....等类错误字样。这是因为mingw使用的库和msvc使用的不同格式的库而引起的。而mysql只提供了msvc可使用的库。

qt4 for mingw要想编译出qsqlmysql库来,我们先得编译出mingw需要的libmysql.a这个文件来,可使用mingw工具来生成。 mingw -utils包里的reimp命令(如果没有这个命令的话,可从本帖开头处给出的地址中下载这个文件,并把它解压开后的bin目录里的内容拷贝到 mingw的bin目录下面。mysql安装的时候默认的安装路径中有空格,我们得先把它的include和lib目录拷贝到没有空格的路径下,比如C: \mysql下)

  1. cd c:\mysql\lib\opt reimp -d libmysql.lib   
  2. dlltool -k -d libmysql.def -l libmysql.a  

如此,这样我们的命令行为(注意qmake和make):

  1. cd %QTDIR%\src\plugins\sqldrivers\mysql   
  2. qmake -o Makefile "INCLUDEPATH+=C:\MYSQL\INCLUDE" "LIBS+=C:\MYSQL\LIB\OPT\LIBMYSQL.a" mysql.pro   
  3. mingw32-make  

这下便会在%QTDIR%\plugins\sqldrivers目录下面生成libqsqlmysql.a, qsqlmysql.dll这两个文件了。 有一点, 就是下载他给出的mingw-utils-0.3.tar.gz 文件, 只需要把里面的 reimp 工具复制到你的 minGW目录下的bin 里就可以了,这样按上面的步骤就可以生成需要的驱动了。

make 结束后, 库文件会生成到qt的系统目录中去。

三、简单配置 mysql

1. 运行 mysql 服务(假定 mysql 安装在 C:\mysql 下) 打开一个控制台窗口, 就是“DOS”窗口,

  1. cd c:\mysql\bin mysqld  

正常情况下, 什么提示都没有, 当然你不放心的话, 去C:\mysql\data 找扩展名是err 的文件看一下, 所有的日志都在里面。另外,建议把 C:\mysql\bin 加入系统的PATH中, 这样就可以在任何目录下运行mysql了, 以下默认是加到 PATH中的,大家可以通过在我的电脑点击右键, 选择“属性”,然后点“高级”标签页,点“环境变量”按钮, 进去找到 PATH的变量,加上";c:\mysql\data\"。

2. 测试客户端链接 再开一个“DOS”窗口, 输入: mysql -u root 来访问 mysql 服务, 这个非安装版, 默认含有 root 用户, 也就是mysql 里的最高用户, 什么都可以做。同时默认 root 用户没有密码。 当然你可以登录后使用 SET PASSWORD= PASSWORD("密码") 来设置自己的密码。 登录后, 就进入 mysql 环境, 提示符也成了 mysql>

3. 为我们的测试程序新建一些数据

3.1 创建一个数据库 mysql> create database example; Query OK, 1 row affected (0.03 sec) mysql> use example; Database changed 这样就创建了一个叫 example 的数据库,我们后面就使用这个库来做试验。

3.2 创建一个可以完全控制这个数据库的用户 mysql> GRANT all -> ON example.* -> TO test@localhost; Query OK, 0 rows affected (0.00 sec) 通过上面的语句, 系统会自动更新系统的用户表,新建一个叫做 test 的用户, 这个用户只可以通过本机来访问数据库,至于网络访问权限, 我没有测试, 但是应该也是大同小异,改@后面就可以了。注意, 这个新创建的用户是没有密码的, root 可以给他设置密码,还是使用 grant 命令操作,不过我是后面用 test 登录后自己设置的(用上面说过 set password 的方法)。test 这个用户被赋予了 example 数据库的完全权限。

3.3 用 test帐号登录 mysql -u test -p password 或者输入完-p后直接回车, 程序会让你输入密码。

#p#

3.4 新建一个表

  1. mysql> CREATE TABLE employee (  
  2.      id CHAR(3),  
  3.      lastname VARCHAR(30),  
  4.      firstname VARCHAR(20),  
  5.      dob DATETIME,  
  6.      phone VARCHAR(10)  
  7.      );  
  8. Query OK, 0 rows affected (0.00 sec) 

这样就新建了一个叫做 employee 的表,含有 4 个字段, id 号, 姓, 名,生日, 电话。 我们然后插入2条记录:

  1. mysql> INSERT INTO employee VALUES ("001", "热", "X", "2000-05-18", "5188");  
  2. Query OK, 1 row affected (0.05 sec)  
  3. mysql> INSERT INTO employee VALUES ("002", "包", "子", "2000-05-18", "5198")  
  4. Query OK, 1 row affected (0.00 sec) 

那么, 现在我们就准备好了所有数据了。

四、 Qt 4 的一个简单访问 mysql 的例子

1 Qt 连接 mysql 实例讲解 下面的例子非常的简单, 使用了 QTextEdit 来显示查询到的内容,主要是要说明Qt 4 中如何连接和访问数据库。至于用什么显示, 不是现在我们关心的问题。:)

  1. #include <QApplication> 
  2. #include <QTextEdit> 
  3. #include <QString> 
  4. #include <QSqlDatabase> 
  5. #include <QSqlQuery> 
  6. #include <QSqlError> 
  7. #include <QSqlDriver> 
  8. #include <QDateTime> 
  9. #include <QDebug> 
  10.  
  11. int main(int argc, char **argv)...{  
  12. QApplication app(argc, argv);  
  13. QTextEdit display; display.resize(400, 160);  
  14. display.show(); // 下面进行数据库的设置  
  15. QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); // 使用mysql数据库驱动   
  16. db.setHostName("localhost");  
  17. db.setDatabaseName("example"); // 我们之前建立的数据库  
  18. db.setUserName("test"); // 我们创建的 yunfan 用户名  
  19. db.setPassword("test"); // yunfan 用户的密码  
  20. bool ok = db.open(); // 尝试连接数据库  
  21. if(ok)...{ // 这里用yunfan已经成功连上数据库  
  22. QSqlQuery query; // 新建一个查询的实例  
  23. if(query.exec("select * from employee"))...{ // 尝试列出 employee 表的所有记录  
  24. // 本次查询成功  
  25. int numRows = 0; // 询问数据库驱动,是否驱动含有某种特性   
  26. if(db.driver()->hasFeature(QSqlDriver::QuerySize))...{  
  27. numRows = query.size(); // 如果支持结果影响的行数,那么直接记录下来  
  28. } else...{  
  29. query.last(); //否则定位到结果最后,qt 文档说,这个方法非常慢  
  30. numRows = query.at() + 1;  
  31. }  
  32. QString id, lname, fname, phone; QDateTime dob;   
  33. display.append("===========================================");   
  34. display.append(QString::fromLocal8Bit(" id | 姓名 | 生日 | 电话"));   
  35. display.append("--------------------------------------");  
  36. while(query.next())...{ // 定位结果到下一条记录  
  37. id = query.value(0).toString();  
  38. lname = QString::fromLocal8Bit(query.value(1).toByteArray());  
  39. fname = QString::fromLocal8Bit(query.value(2).toByteArray());  
  40. dob = query.value(3).toDateTime();  
  41. phone = QString::fromLocal8Bit(query.value(4).toByteArray());  
  42. QString result = id + " " + fname + lname + " " + (dob.toString()) + " "+phone;  
  43. display.append(result); }  
  44. display.append("============================================");  
  45. display.append(QString("totally %1 rows").arg( numRows) );  
  46. } else ...{ // 如果查询失败,用下面的方法得到具体数据库返回的原因  
  47. QSqlError error = query.lastError();  
  48. display.append("From mysql database: " + error.databaseText());  
  49. }  
  50.  } else ...{ // 打开数据库失败,显示数据库返回的失败描述  
  51. display.append("cannot open database.");  
  52. display.append("Reason: " + db.lastError().databaseText());  
  53. }  
  54. QApplication::connect(&app, SIGNAL(lastWindowClose()), &app, SLOT(quit()));  
  55. return app.exec();  

2 编译程序 存盘后(假定存为 client.cpp ), 我们需要生成qt 工程文件。 打开“DOS”窗口,cd 到 你client.cpp 所在的目录下, 输入

  1. qmake -project QT += sql -o client.pro  

这样就生成了工程文件 client.pro, 但是这对编译是不够的,因为还需要手动让qmake生成makefile的时候链接相关的sql库文件。 然后存盘就搞定了, 就这么简单 :)。 接下来就是固定套路

  1. qmake   
  2. mingw32-make//可以不用这个,用sql database driver中生成驱动的方法 

看看新生成的 Release 目录下, 我们的 client 程序已经编译好了。运行一下试试看 ;)

在整个上面的过程中,最郁闷的地方是Qtmysql驱动还需要用户自己编译, 相信这个会给很多人带来麻烦(如果使用linux系统, 那么按 Qt 文档生成驱动应该是完全没有问题的, windows用户会遇到库格式不兼容的问题)。

小结:Qt 4 访问 Mysql 数据库实例的内容介绍完了,希望本文对你有所帮助!

责任编辑:zhaolei 来源: 互联网
相关推荐

2011-07-01 14:06:57

Qt sqlite

2011-07-05 10:16:16

Qt 数据库 SQLite

2011-07-05 14:46:34

2011-07-05 18:04:45

QT Mysql

2011-06-21 15:11:04

QT 数据库

2011-06-27 13:49:43

Qt 数据库 QSqlQueryM

2011-06-27 13:32:21

Qt 数据库 QSqlQueryM

2010-04-14 15:45:49

Oracle 数据库

2010-05-20 14:52:42

MySQL数据库

2009-08-12 14:27:36

访问MySQL数据库C# ODBC

2010-05-12 18:41:34

MySQL数据库

2011-07-01 10:55:25

Qt 登陆窗口 界面

2011-06-10 10:00:16

Qt 数据库 MySQL

2010-06-09 17:36:45

MySQL数据库同步

2019-10-12 16:15:13

MySQL数据库多实例

2011-07-12 16:41:14

mysql处理异常

2011-07-05 10:03:00

Qt MYSQL 数据库

2011-06-10 10:31:57

QT mysql linux

2010-03-08 09:43:50

.NET应用访问数据库

2010-05-20 16:13:55

点赞
收藏

51CTO技术栈公众号