您的位置:首页 > 编程语言 > Qt开发

Qt 4 访问 mysql 数据库的简单教程 收藏

2010-12-05 19:04 1481 查看




先说个题外话, 我研究(算是研究吧)qt 连数据库的问题, 是为了以后写一些商业软件做基础的, 我就是怕有人骂我, 不更新eva,
却研究这么多东西。 自己先惭愧一下, 但毕竟, 我也得考虑今后吃饭的问题, 不过 eva 肯定也会更新的,
只是可能再等一段时间。虽然我是在windows下安装,测试,但在linux下也差不了多少,而且我主要是想和大家共享 Qt 连接 mysql
的编程方法,但文中确实牵扯到了一些windows设置,所以本来打算发到 KDE 版, 但发在这里也许好一点吧。好了,闲话先到这里打住。

Qt 4 访问 mysql 数据库的简单教程

云帆 2006/5/18

因为目前无法使用linux, 所以 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的驱动上面说

CODE:
[Copy to clipboard]

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.

就是一个容易搞混的地方,上面是使用的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下)

CODE:
[Copy to clipboard]

cd c:/mysql/lib/opt

reimp -d libmysql.lib

dlltool -k -d libmysql.def -l libmysql.a
如此,这样我们的命令行为(注意qmake和make):

CODE:
[Copy to clipboard]

cd %QTDIR%/src/plugins/sqldrivers/mysql

qmake -o Makefile "INCLUDEPATH+=C:/MYSQL/INCLUDE" "LIBS+=C:/MYSQL/LIB/OPT/LIBMYSQL.a" mysql.pro

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”窗口,

CODE:
[Copy to clipboard]

cd c:/mysql/bin

mysqld

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

2. 测试客户端链接

再开一个“DOS”窗口, 输入:

CODE:
[Copy to clipboard]

mysql -u root
来访问 mysql 服务, 这个非安装版, 默认含有 root 用户, 也就是mysql 里的最高用户, 什么都可以做。同时默认 root 用户没有密码。 当然你可以登录后使用

CODE:
[Copy to clipboard]

SET PASSWORD= PASSWORD("密码")
来设置自己的密码。

登录后, 就进入 mysql 环境, 提示符也成了 mysql>

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

3.1 创建一个数据库

CODE:
[Copy to clipboard]

mysql> create database example;

Query OK, 1 row affected (0.03 sec)

mysql> use example;

Database changed
这样就创建了一个叫 example 的数据库, 我们后面就使用这个库来做试验。

3.2 创建一个可以完全控制这个数据库的用户

CODE:
[Copy to clipboard]

mysql> GRANT all

-> ON example.*

-> TO yunfan@localhost;

Query OK, 0 rows affected (0.00 sec)

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

3.3 用 yunfan 帐号登录

CODE:
[Copy to clipboard]

mysql -u yunfan
如果有密码, 那么使用

CODE:
[Copy to clipboard]

mysql -u yunfan -p
或者输入完-p后直接回车, 程序会让你输入密码。

3.4 新建一个表

CODE:
[Copy to clipboard]

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)
这样就新建了一个叫做 employee 的表,含有 4 个字段, id 号, 姓, 名,生日, 电话。

我们然后插入2条记录:

CODE:
[Copy to clipboard]

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)
那么, 现在我们就准备好了所有数据了。

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

1 Qt 连接 mysql 实例讲解

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

CODE:
[Copy to clipboard]

#include <QtGui>

#include <QtSql>

int main(int argc, char **argv)

{

QApplication app(argc, argv);

QTextEdit display;

display.resize(400, 160);

display.show();

// 下面进行数据库的设置

QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); // 使用mysql数据库驱动

db.setHostName("localhost");

db.setDatabaseName("example"); // 我们之前建立的数据库

db.setUserName("yunfan"); // 我们创建的 yunfan 用户名

db.setPassword("password"); // yunfan 用户的密码

bool ok = db.open(); // 尝试连接数据库

if(ok){ // 这里用yunfan已经成功连上数据库

QSqlQuery query; // 新建一个查询的实例

if(query.exec("select * from employee")){ // 尝试列出 employee 表的所有记录

// 本次查询成功

int numRows = 0;

// 询问数据库驱动,是否驱动含有某种特性

if(db.driver()->hasFeature(QSqlDriver::QuerySize)){

numRows = query.size(); // 如果支持结果影响的行数,那么直接记录下来

} else{

query.last(); //否则定位到结果最后,qt 文档说,这个方法非常慢

numRows = query.at() + 1;

}

QString id, lname, fname, phone;

QDateTime dob;

display.append("===========================================");

display.append(QString::fromLocal8Bit(" id | 姓名 | 生日 | 电话"));

display.append("--------------------------------------");

while(query.next()){ // 定位结果到下一条记录

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 {

// 如果查询失败,用下面的方法得到具体数据库返回的原因

QSqlError error = query.lastError();

display.append("From mysql database: " + error.databaseText());

}

} else {

// 打开数据库失败,显示数据库返回的失败描述

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 所在的目录下, 输入

CODE:
[Copy to clipboard]

qmake -project -o client.pro
这样就生成了工程文件 client.pro, 但是这对编译是不够的,因为还需要手动让qmake生成makefile的时候链接相关的sql库文件。现在,打开client.pro, 随便找一行,回车来建个新行,

然后加上几个字:

CODE:
[Copy to clipboard]

QT += sql
然后存盘就搞定了, 就这么简单 :)。 接下来就是固定套路

CODE:
[Copy to clipboard]

qmake

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

五、总结一下

大家可以看到,使用 Qt 来连接 mysql 是非常简单的事情, 当然 Qt 还提供了一些数据库相关的 widget 来更好的显示,更新数据。
这个以后我用到了也会相继写些总结出来, 大家一起共享。我在整个上面的过程中, 最郁闷的地方是Qt的mysql驱动还需要用户自己编译,
相信这个会给很多人带来麻烦(如果使用linux系统, 那么按 Qt 文档生成驱动应该是完全没有问题的,
windows用户会遇到库格式不兼容的问题)。好了, 这也是我第一次用Qt 来访问数据库, 也是一次摸 mysql, 说错的,
不合适的地方,大家扔砖头吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: