今天在Linux下测试了Mysql数据库与Qt结合的应用练习,Qt经常要与数据库打交道,如Oracle(甲骨文公司数据库巨人)SQL(中大型数据库)mySQL(小型关系型数据库管理系统)Access(小到办公软件的office数据库access)。经常使用的客户端数据库驱动有ODBCMySQLSQLite等。现在重点介绍MySQL,默认的情况是没有安装MySQL的驱动的,只用一个SQLite嵌入式数据库可以编写以下代码显示数据库驱动。
#include
#include
#include   
                                                                             
int main(int argc,char *argv[])
{
        QApplication app(argc,argv);
        qDebug()<<"Available drivers:"; // 输出有效的数据库驱动
        QStringList drivers = QSqlDatabase::drivers(); // 用字符列表的形式将SQL数据库设备驱动列出来
        foreach(QString drivers,drivers); //foreach 语句为数组或对象集合中的每个元素重复一个嵌入语句组,foreach语句用于循环访问集合以获取所需信息。
        qDebug()<<"\t"<
// 将数据库 驱动设备输入  
    return app.exec();
 
}
 
Qt MySQL数据库编程_第1张图片
QtSql 是数据库类的集合,要使用到因此要添加模块头文件#include ,创建工程文件时也要选中Sql库,或在*.pro中的编译入口input下方添加QT += sql
Qt MySQL数据库编程_第2张图片
QMYSQL QMYSQL3先前是没有的,编译安装QMYSQL驱动后就有,怎么安装?
有的时候没有安装数据库,在Red Hat Linux 9.0操作系统平台下安装Mysql,如果想一次安装也行,省去安装依赖包的麻烦。插入第三张镜像盘,然后挂载到光盘挂载点上,用mount命令:#mount /dev/cdrom /mnt/cdrom ,然后切换到存放的软件包目录,用cd命令:#cd /mnt/cdrom/RedHat/RPMS/ .接着安装rpm辅助安装工具包,用rpm命令:#rpm -ivh rpmdb-redhat-9-0.20030313.i386.rpm.安装完成以后,卸载挂载镜像盘,用umount命令,注意在当前目录是不允许卸载:#umount /mnt/cdrom .插入第二张镜像盘,开始安装mysql数据库的客户端与服务端及MySQL常用工具包软件。挂载与上面一样用mount 命令,切换用cd命令切换到软件包存放目录,接着安装MySQL数据库软件,#rpm -ivh --aid mysql*.rpm.到此安装就大功告成。启动MySQL服务数据库初始化:#service mysqld start ,设置数据库密码用mysqladmin命令:#mysqladmin –u root password “密码。好了登陆测试一下#mysql –u root –p回车输入密码就可以登陆了。
这是sqldrivers设备驱动路径:cd $QTDIR/src/plugins/sqldrivers/mysql,$QTDIR是我安装QT的目录路径。
添加加下面一句重新构建Makefile文件:
qmake "INCLUDEPATH+=/usr/include/mysql" "LIBS+=-L/usr/lib/mysql -lmysqlclient_r" mysql.pro
在执行make编译源代码,最后执行make install安装。
 
Qt MySQL数据库编程_第3张图片
下面是最终的现实效果如下:
Qt MySQL数据库编程_第4张图片
现在先做一个显示的界面,界面是由一个表格试图和三个按钮组成。我的大概流程是:
<1> 在对话框窗口先创建一个栅格布局管理器,添加一个表格视图窗口部件。
<2> 创建一个水平布局管理器,在水平布局管理器中添加三个按钮,最后将水平布局管理器添加到栅格布局管理器中。
<3> 创建三个按钮的信号与槽
<4> 数据库的使用分为三步:(1QsqlDatabase建立数据库的链接(2QsqlQuery用于执行SQL语句(3QsqlTableModel结合QtableView可以输出数据库的表。
<5> 效果测试点击connect按钮链接打开数据库
参考:http://blog.csdn.net/MicroSky2813/archive/2010/03/02/5338040.aspx
#include
#include "table.h"                   
int main(int argc,char *argv[])
{
        QApplication app(argc,argv);
        Table *table = new Table;
        table->show();
        return app.exec();
}
 
#ifndef TABLE_H
#define TABLE_H
                                 
#include
#include
class QGridLayout;
class QPushButton;
class QHBoxLayout;
class Table:public QDialog
{
        Q_OBJECT
                                                                               
        public:
     // 继承公共对话框窗体派生类
        Table(QWidget *parent = 0);
     // 创建各个类的指针
        QTableView *table;
        QGridLayout *gridLayout;
        QPushButton *connectButton;
        QPushButton *executionButton;
        QPushButton *displayButton;
        QHBoxLayout *verticalLayout;
                                                                               
        private slots:
// 创建三个按钮槽函数
        void on_connectButton_clicked();
        void on_executionButton_clicked();
        void on_displayButton_clicked();
                                                                               
};
                                                                               
#endif
 
 
#include
#include
#include
#include
#include "table.h"
                                                                               
Table::Table(QWidget *parent)
        :QDialog(parent)
{
// 创建视图及按钮的对象
        table = new QTableView;
                                                                               
        connectButton = new QPushButton("connect");
        executionButton = new QPushButton("execution");
        displayButton = new QPushButton("display");
// 建立三个信号与槽函数链接
        connect(connectButton,SIGNAL(clicked()),this,SLOT(on_connectButton_clicked()));
 
        connect(executionButton,SIGNAL(clicked()),this,SLOT(on_executionButton_clicked()));
        connect(displayButton,SIGNAL(clicked()),this,SLOT(on_displayButton_clicked()));
// 创建一个水平布局管理器,布局三个按钮
                                                                               
        verticalLayout = new QHBoxLayout;
        verticalLayout->addWidget(connectButton);
        verticalLayout->addWidget(executionButton);
        verticalLayout->addWidget(displayButton);
// 创建一个栅格布局管理器对整体窗口部件的排布。                                                                       
        gridLayout = new QGridLayout;
        gridLayout->addWidget(table,0,0,1,1);
        gridLayout->addLayout(verticalLayout,1,0,1,1);
                                                                               
        setLayout(gridLayout);
// 设置窗口的大小
        resize(500,400);
                                                                               
}
void Table::on_connectButton_clicked()
{
// 链接函数实现数据库的链接功能
        QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); // 添加QMYSQL数据库驱动
        db.setHostName("localhost"); // 设置登陆的主机名为localhost
        db.setUserName("root"); // 登陆的用户是超级用户 root
        db.setPassword("123456"); // 登陆密码是123456
        db.setDatabaseName("student"); // 打开的数据库表格,这个表格式预先创建好的。用>create database student;创建。
        bool ok = db.open();
// 布尔类型,打开数据。
        if(ok) //if 判断
        {
                qDebug()<<"open Database!"<
// 如果打开数据库在终端输出open Database信息
  
        }
        else
        {
                QMessageBox::critical(0,QObject::tr("Database Error"),db.lastError().text());
   // 否则输出数据库的消息框错误信息
        }
                                                                               
}
                                                                               
void Table::on_executionButton_clicked()
{
   // executionButton按钮执行SQL语句
        QSqlQuery query;
   // 创建一个执行数据库SQL语句对象
        query.exec("drop table employee");
// 如果存在employee数据库表格,先删除
        query.exec("create table employee(id int(11) primary key,name varchar(50),description varchar(255))");
// 在创建数据库表格employee
        query.exec("insert into employee values(1,'zhangsan','student')");
        query.exec("insert into employee values(2,'lisi','teacher')");
        query.exec("insert into employee values(3,'wangwu','professor')");
 // 插入三个记录
}
                                                                               
void Table::on_displayButton_clicked()
{
   // 用数据库表格模式结合试图显示数据库内容。
        QSqlTableModel *model = new QSqlTableModel;
   // 创建数据表模式对象
        model->setTable("employee");
    // 设置数据库表上的运作模式以employee表名,不选择从数据表格以外获取信息
        model->setEditStrategy(QSqlTableModel::OnManualSubmit);
   // 所有更改将被缓存在模型中,直到submitAll()revertAll()函数被调用
        model->select();
//select() 函数用于确定一个或多个套接口的状态。对每一个套接口,调用者可查询它的可读性、可写性及错误状态信息。
        model->setHeaderData(0,Qt::Horizontal,QObject::tr("ID"));
        model->setHeaderData(1,Qt::Horizontal,QObject::tr("name"));
        model->setHeaderData(2,Qt::Horizontal,QObject::tr("description"));
   // 对应指定的字段并设置对应的水平标题显示
                                                                                
        table->setModel(model);
   // 将这个数据库表格模式用视图显示出来。
                                                                               
}
 
在关闭对话框后出现查询应用默认数据库连接错误:
QSqlDatabasePrivate::removeDatabase: connection 'qt_sql_default_connection' is still in use, all queries will cease to work.
googel以下,参照http://www.cnblogs.com/codingmylife/archive/2010/04/27/1722404.html
的内容测试,还是解决不了。
在第二个按钮末尾添加下面的语句:
QString name;
{
        name = QSqlDatabase::database().connectionName();
}
QSqlDatabase::removeDatabase(name);
On_executionButton_clicked() 函数末尾添加,执行SQL语句后关闭窗口时有效的,但在on_displayButton_clicked()函数末尾添加却没有效。问题还在解决当中。。。。。
 
Qt MySQL数据库编程_第5张图片