Chinaunix首页 | 论坛 | 博客
  • 博客访问: 533125
  • 博文数量: 174
  • 博客积分: 4177
  • 博客等级: 上校
  • 技术积分: 1827
  • 用 户 组: 普通用户
  • 注册时间: 2007-10-15 14:12
文章分类

全部博文(174)

文章存档

2018年(1)

2017年(1)

2013年(3)

2012年(9)

2010年(12)

2009年(5)

2008年(106)

2007年(37)

我的朋友

分类: C/C++

2008-07-21 15:12:55

    今天尝试着用QT连接了一下MYSQL,简单的记录一下。

    首先,安装MYSQL以及QT的MYSQL驱动

     sudo apt-get install mysql-server-5.0 libqt4-sql-mysql

    它还会推荐安装一些软件包,可根据自己情况安装。

下面的内容转自%3D1

    简单配置 mysql

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

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

3.3 用 yunfan 帐号登录

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

CODE:
mysql -u yunfan -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", "热", "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:
#include
#include

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

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

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


总结一下

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

chinaunix网友2010-08-31 11:54:48

很好