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

QT4.7.3连接MYsql5.5全过程【整理】

2014-01-22 00:28 183 查看
最近由于要做一个软件,不得不又重新捡起放弃已经很久的QT,才发现版本更新的这么快。。。都到了4.7.3了

在连接MYsql数据库的时候出问题了。没有驱动,Baidu了一下,又看了文档说明,原来是其他由于权限的问题,只给出了部分数据库的驱动(只有sqlite)其他的驱动只给出了源文件还有文档说明,需要自己编译,晕死,文档全是英文的,不太喜欢,没办法,边百度边看文档终于解决了问题,还是把这些东西贴出来吧,不少像我以一样的初学者肯定也会遇到这样的问题:

首先,这样的教程在网上有很多,我选了一下比较好的贴出来网址,但是根据自己的情况不同可能会遇到很多问题。。。但是大同小异,基本上都可以解决:
http://blog.knowsky.com/201556.htm http://blog.knowsky.com/201556.htm http://no001.blog.51cto.com/1142339/300920 http://www.blogjava.net/nokiaguy/archive/2009/03/23/261502.html http://www.blogjava.net/nokiaguy/archive/2009/03/23/261502.html http://no001.blog.51cto.com/1142339/300920 http://www.blogjava.net/javabloger/archive/2008/07/14/214740.html http://space.itpub.net/22893636/viewspace-663033
mingw-utils包下载:http://www.qtcn.org/download/mingw-utils-0.3.tar.gz

闲话少说:解决问题

首先是要下载安装MYsql还有QT,这个不用多说了,接触过的都熟悉了,PS(以前下载的时候都是SDK集成的开发环境,但是,最近我下载的时候发现不一样了,SDK把不需要的塞班也加进去了,开发包很大1.5G,安装需要9G的空间)没办法我只能下载的

qt-creator-win-opensource-2.2.0

qt-win-opensource-4.7.3-mingw

安装的时候可能会遇到点错误,上面给出的网址中有解决的遮掩问题的,哈哈,放心吧。。。

然后就是MYsql,我安装的是5.5,一个比较新的版本,下载网址是:

http://www.mysql.com

安装的时候最好就一次安装好,不然就悲剧了,这个很难被卸载。。。

=================================================================================

然后就是编译mysql驱动了:

打开Qt Command Prompt。你会发现,你的环境变量他自己给你设定了,这样的话,就需要在你的编译驱动之前就修改这些环境变量,不然的话会在编译的时候遇到各种“不是命令或者内部文件”的问题

首先打开qt-win-opensource-4.7.3-mingw安装目录下面的bin目录找到Qt CommandPrompt的批处理文件,然后编辑他的环境变量的部分“PATH”记住有两处需要修改,

然后就是具体的操作了(派出了各种问题的隐患)

===================================================================================

引用::

Youneed
to get the MySQL installation files. Run SETUP.EXE and choose"Custom Install". Install the "Libs & IncludeFiles" Module. Build the plugin as follows (here it is assumed thatMySQL 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 makein the line above.

这就是一个容易搞混的地方,上面是使用的libmysql.lib和nmake来编译的,如果使用的是msvc的编译器,那上面是没问题的,但是如果使用的是mingw编译器,那就会出错,有undefinedreference....等类错误字样。这是因为mingw使用的库和msvc使用的不同格式的库而引起的。而mysql只提供了msvc可使用的库。qt4
formingw要想编译出qsqlmysql库来,我们先得编译出mingw需要的libmysql.a这个文件来,可使用mingw工具来生成。

mingw-utils包里的reimp命令(如果没有这个命令的话,可从本帖开头处给出的地址中下载这个文件,并把它解压开后的bin目录里的reimp内容拷贝到mingw的bin目录下面。mysql安装的时候默认的安装路径中有空格,我们得先把它的include和lib目录拷贝到没有空格的路径下,比如C:\mysql下)

CODE:

cdc:\mysql\lib\opt

reimp -d libmysql.lib

dlltool -k -d libmysql.def -llibmysql.a

这时候你会发现你的lib文件夹下面会多出两文件:

libmysql.a & libmysql.def

(推荐使用mysql5.5,其他的貌似没有libmysql*.lib文件)

然后使用qmake和make命令:

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这两个文件了。

注意这里可能会遇到这种问题:

WARNING: (internal):1: d backslashes are deprecated.

WARNING: (internal):1: d backslashes are deprecated.

WARNING: (internal):1: d backslashes are deprecated.

我也遇到了你的这个问题,我把我的解决方法给你,希望对你有用。

(1)dos下进入:D:\Qt\2010.05\qt\src\plugins\sqldrivers\mysql>

(2)用记事本打开D:\Qt\2010.05\qt\src\plugins\sqldrivers\mysql\mysql.pro文件,在第二行加入:

INCLUDEPATH += "C:\Program Files\MySQL\MySQL Server5.1\include"

LIBS += "C:\Program Files\MySQL\MySQL Server5.1\lib\opt\libmysql.lib"

并保存

(3)在dos下输入:qmake -o Makefile mysql.pro

此时可能也会提示:

WARNING: d:\Qt\2010.05\qt\src\plugins\sqldrivers\mysql\mysql.pro:2:d ba

ckslashes are deprecated.

WARNING: d:\Qt\2010.05\qt\src\plugins\sqldrivers\mysql\mysql.pro:2:d ba

ckslashes are deprecated.

WARNING: d:\Qt\2010.05\qt\src\plugins\sqldrivers\mysql\mysql.pro:2:d ba

ckslashes are deprecated.

但是好像对最后的结果没有影响

然后使用make命令;

但是这时候只有在debug文件夹有两个文件

然后使用 make release

生成release目录下的文件

qsqlmysql4.dll

libqsqlmysql4.a

qsqlmysqld4.dll

libqsqlmysqld4.a

这时候把这几个文件拷贝到

C:\Qt\……\plugins\sqldrivers下面;
另外,根据文档所说的,还要把libmysql.dll复制到system32目录

ok,解决了

一下是引用的我参考的文章:

文章的出处是:http://no001.blog.51cto.com/1142339/300920

==============================================================================

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

首 先说个题外话,我研究(算是研究吧)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 notloaded”。不过还好, 在 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 andchoose "Custom Install". Install the "Libs &Include Files" Module. Build the plugin as follows (here it isassumed 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 makein the line above.
这就是一个容易搞混的地方,上面是使用的libmysql.lib和nmake来编译的,如果使用的是msvc的编译器,那上面是没问题的,但是如果使用的是mingw编译器,那就会出错,有undefinedreference....等类错误字样。这是因为mingw使用的库和msvc使用的不同格式的库而引起的。而mysql只提供了msvc可使用的库。qt4 formingw要想编译出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

-> ONexample.*

-> TOyunfan@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 * fromemployee")){ // 尝试列出 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, 说错的, 不合适的地方,大家扔砖头吧。

------------------------------------------------

在Windows下面利用QT开发数据库应用,如MYSQL,首先,我们必须利用源码编译MYSQL驱动库;

1)安装qt-sdk-win-opensource-2010.02.1.exe

此时,QT安装了QT Creator,假定目录为:

E:\Qt\2010.02.1\,可以选择安装MingW;

此时,E:\Qt\2010.02.1\QT为Qt库的安装位置;

2)安装MySQl,假定目录为:

include 路径为:D:\MySQL\MySQL Server 5.0\include

lib路径为:D:\MySQL\MySQL Server 5.0\lib\opt

由于两路径还有空格;拷贝至C:\mysql文件夹下;

3)将E:\Qt\2010.02.1\QT\bin 和MINGW\bin加入到PATH中;

4)cd E:\Qt\2010.02.1\qt\src\plugins\sqldrivers\mysql文件夹

运行:

E:\Qt\2010.02.1\qt\src\plugins\sqldrivers\mysql>qmake-o Makefile "INCLUDEPA

TH+=C:\mysql\INCLUDE" "LIBS+=C:\mysql\lib\opt\libmysql.lib" mysql.pro

nmake

在E:\Qt\2010.02.1\qt\plugins\sqldrivers下生成MYSQL的驱动;

编写数据库访问代码:

view
plaincopyto
clipboardprint?

QSqlDatabase db=QSqlDatabase::addDatabase("QMYSQL");

db.setHostName("127.0.0.1");

db.setPort(3306);

db.setDatabaseName("test");

db.setUserName("root");

db.setPassword("**********");

if(!db.open()){

QMessageBox::warning(this,"warning!","failure");

}else{

QMessageBox::information(this,"OK!","success!");

}

访问成功;

------------------------------------------------

在windows下编译好的QT程序在其他没有安装QT的机器上会出现无法连接数据库的问题。

这时我们可以通过以下方式来解决:

在release文件夹里创建plugins文件夹,并将QT安装目录下的plugins\sqldrivers文件夹复制到release\plugins文件夹(我的程序使用的是SQLite数据库,由于plugins\sqldrivers文件夹里有默认的数据库驱动,所以直接复制过去就可以了,如果是其他数据库可能需要下载其他第三方的sql驱动)

然后最重要的一步是在main.cpp中添加以下语句

QApplication::addLibraryPath("./plugins");

编译程序之后再发布就可以了。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: