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

来源:互联网 发布:杜特尔特 知乎 编辑:程序博客网 时间:2024/05/16 02:03

环境:Windows XP

          qt-sdk-win-opensource-2009.02.exe(Qt Creator 1.1.0)= Qt 4.5.1

          mysql-essential-5.1.44-win32

 

一、配置windows下开发环境。

1. 下载MySQL

地址:

http://www.filewatcher.com/ftp-search.html

http://www.mysql.com

2. MySQL 的安装
这里选择定制安装Custom;然后选中安装include 和 lib文件。如下图:

 

然后更改安装路径为C:/MySQL,防止有空格,因为有空格以后非常麻烦。

最终的界面如下:

然后一路Next,到下图时选中第一项,去掉第二项:

 

 

当到最后的时候可能需要配置数据库,根据自己的情况配置一下。

 

二、解决 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

 

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


CODE: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  "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目录下面。如果想要在每个文件夹下都可以执行这些命令,可以把mingw这个目录加到XP环境变量PATH中,例如:C:/Program Files/Microsoft Visual Studio/Common/Tools/WinNT;C:/Program Files/Microsoft Visual Studio/Common/MSDev98/Bin;C:/Program Files/Microsoft Visual Studio/Common/Tools;C:/Program Files/Microsoft Visual Studio/VC98/bin;C:/Qt/2009.02/mingw/bin;C:/MySQL/bin。)


CODE:

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


2. 进行编译

然后输入第一条命令:

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

 

按回车输入第二条命令
  qmake "INCLUDEPATH+=C:/MySQL/include" "LIBS+=C:/MySQL/lib/opt/libmysql.a" mysql.pro

(有的资料说是改成这样 qmake "INCLUDEPATH+=C:/MySQL/include" "LIBS+=C:/MySQL/lib/opt/libmysql.lib" mysql.pro  我按第一个敲的)


按回车输入第三条命令

mingw32-make

 

经过编译后,会生成libqsqlmysql.a, qsqlmysql.dll这两个文件了,关于目录好多资料上说会自动安装到qt的plugins/sqldriver下,但是我的是在%QTDIR%/src/plugins/sqldrivers/mysql/release下生成的,读者可以自行参考去各个目录找一下

 

将编译生成的libqsqlmysql.a, qsqlmysql.dll这两个文件拷贝到

C:/Qt/2009.02/qt/plugins/sqldrivers下。到这儿就完成了驱动编译。接下来要测试是否能用。


三、简单配置 mysql

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


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

2. 测试客户端链接
再开一个“DOS”窗口, 输入:


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


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

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

 

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

3.1 创建一个数据库


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

 

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


CODE:mysql> GRANT all
       -> ON example.*
       -> TO zyx@'localhost';

Query OK, 0 rows affected (0.00 sec)


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

3.3 用 zyx 帐号登录


CODE:mysql -u zyx

如果有密码, 那么使用


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

 

3.4 新建一个表


CODE: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:mysql> INSERT INTO employee VALUES ("001", "Xre", "X", "2005-05-18", "5188");
Query OK, 1 row affected (0.05 sec)


mysql> INSERT INTO employee VALUES ("002", "Yri", "y", "2005-05-18", "5198")
Query OK, 1 row affected (0.00 sec)


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

 

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

最简单的测试例子:

#include <QtCore/QCoreApplication>

#include <QtSql/QSqlDatabase>

 

int main(int argc, char *argv[])

{

          QCoreApplication a(argc, argv);

  

          QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); //添加数据库驱动

  

          return a.exec();

}

编译运行:正确的情况下cmd窗口中应该什么也没有。

如果提示:QMYSQL driver no loaded。需要将C:/MySQL/bin目录下的libmySQL.dll文件复制到C:/Qt/2009.02/qt/bin目录下。再运行程序就没错误提示了。

 

1. Qt 连接 mysql 实例讲解

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

用Qt Creator 创建一个Qt4 GUI Application工程,敲入一下代码。
#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("zyx"); // 我们创建的 zyx 用户名
        db.setPassword("000000"); // zyx用户的密码
       
        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 ),如果在创建工程的时候未选择QtSql模块的话一定要在工程文件中加上如下一句:
QT += sql


然后存盘编译就行了。


3.  运行看是否成功。

 

 

注:再贴一些测试程序

#include <QtCore/QCoreApplication>

#include <QtDebug>

#include <QtSql/QSqlDatabase>

#include <QStringList>

#include <QStringListIterator>

 

int main(int argc, char *argv[])

{

          QCoreApplication a(argc, argv);

 

          qDebug() << "Available drivers:";

 

          QStringList drivers = QSqlDatabase::drivers();

 

           foreach(QString driver, drivers);

 

          qDebug() << "/n" <<drivers;

          return a.exec();

}

运行结果会显示出你可用的驱动名称(因为我把其他驱动都删掉了,所以只显示了mysql):

 

 

 

 

原创粉丝点击