Qt操作数据库1

Qt使用SQL

主要是下面的几个类
 QSqlDatabase 建立于数据库的链接
 QSqlQuery 用于执行SQL语句
 QSqlTableModel 结合QTableView可以输出数据库的表

贴下我写的简单Demo
   

  1. QSqlDatabase db =QSqlDatabase::addDatabase("QMYSQL"); // becomes the new default connection   
  2.     db.setUserName("root");//用户名   
  3.     db.setPassword("password");//密码   
  4.     db.setHostName("localhost");  
  5.     db.setDatabaseName("test");//数据库名   
  6.     db.setConnectOptions("CLIENT_SSL=1;CLIENT_IGNORE_SPACE=1");//使用SSL   
  7.     db.setPort(3306);//端口   
  8.     if(db.open()){  
  9.         qDebug()<<"open/n"<<db.lastError().driverText()<<"/n" 
  10.      
  11.     else 
  12.         qDebug()<<"open faile/n" 
  13.      
  14.     QSqlQuery query;//用于执行SQL语言   
  15.      query.exec("show databases");//很方便的   
  16.      while (query.next())  
  17.          qDebug()<<query.value(0).toString()<<"/n" 
  18.   
  19.      
  20.   
  21.     QSqlTableModel *model new QSqlTableModel;//间接将数据库表装入QTableView   
  22.     model->setTable("people");   //表名   
  23.     model->setEditStrategy(QSqlTableModel::OnManualSubmit);  
  24.     model->select();  
  25.     //model->removeColumn(0); // don't show the ID   
  26.     //model->setHeaderData(0, Qt::Horizontal, QObject::tr("ID"));   
  27.     model->setHeaderData(0, Qt::Horizontal, tr("Name"));  
  28.     model->setHeaderData(1, Qt::Horizontal, tr("Age"));  
  29.     model->setHeaderData(2, Qt::Horizontal, tr("Sex"));  
  30.   
  31.   
  32.     QTableView *view new QTableView(this);  
  33.     view->setModel(model);  
  34.   
  35.     db.close();  
  36.   
  37.     QGridLayout gl=new QGridLayout();  
  38.     gl->addWidget(view);  
  39.     this->setLayout(gl);  

 

 

 

2、 

下面是最终的现实效果如下:
Qt中MySQL数据库编程

 
 
现在先做一个显示的界面,界面是由一个表格试图和三个按钮组成。我的大概流程是:
<1>在对话框窗口先创建一个栅格布局管理器,添加一个表格视图窗口部件。
<2>创建一个水平布局管理器,在水平布局管理器中添加三个按钮,最后将水平布局管理器添加到栅格布局管理器中。
<3>创建三个按钮的信号与槽
<4>数据库的使用分为三步:(1QsqlDatabase建立数据库的链接(2QsqlQuery用于执行SQL语句(3QsqlTableModel结合QtableView可以输出数据库的表。
<5>效果测试点击connect按钮链接打开数据库
 
#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!"<<endl;
//如果打开数据库在终端输出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.
的内容测试,还是解决不了。
在第二个按钮末尾添加下面的语句:
QString name;
{
        name = QSqlDatabase::database().connectionName();
}
QSqlDatabase::removeDatabase(name);
On_executionButton_clicked()函数末尾添加,执行SQL语句后关闭窗口时有效的,但在on_displayButton_clicked()函数末尾添加却没有效。问题还在解决当中。。。。。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值