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

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 的驱动上面说

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下)

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

如此,这样我们的命令行为(注意qmake和make):
cd %QTDIR%/src/plugins/sqldrivers/mysql
qmake -o Makefile "INCLUDEPATH+=C:/MYSQL/INCLUDE" "LIBS+=C:/MYSQL/LIB/OPT/LIBMYSQL.a" mysql.pro
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”窗口,
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后直接回车, 程序会让你输入密码。
3.4 新建一个表

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条记录:
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 中如何连接和访问数据库。至于用什么显示, 不是现在我们关心的问题。:)

int  main( int  argc,  char   ** argv) {
QApplication app(argc, argv);
QTextEdit display; display.resize(
400160);
display.show(); 
// 下面进行数据库的设置
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); // 使用mysql数据库驱动 
db.setHostName("localhost");
db.setDatabaseName(
"example"); // 我们之前建立的数据库
db.setUserName("test"); // 我们创建的 yunfan 用户名
db.setPassword("test"); // 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 所在的目录下, 输入
qmake -project QT += sql -o client.pro
这样就生成了工程文件 client.pro, 但是这对编译是不够的,因为还需要手动让qmake生成makefile的时候链接相关的sql库文件。 然后存盘就搞定了, 就这么简单 :)。 接下来就是固定套路
qmake
mingw32-make

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

 五、总结一下 大家可以看到,使用 Qt 来连接 mysql 是非常简单的事情, 当然 Qt 还提供了一些数据库相关的 widget 来更好的显示,更新数据。 这个以后我用到了也会相继写些总结出来, 大家一起共享。我在整个上面的过程中, 最郁闷的地方是Qt的mysql驱动还需要用户自己编译, 相信这个会给很多人带来麻烦(如果使用linux系统, 那么按 Qt 文档生成驱动应该是完全没有问题的, windows用户会遇到库格式不兼容的问题)。好了, 这也是我第一次用Qt 来访问数据库, 也是一次摸 mysql, 说错的, 不合适的地方,大家扔砖头吧。
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值