QT实现oracle数据库分页查询

1.表格

十几万条数据的表格如果一次性查询会导致tableview显示时卡死。则需要分页,按下按键点击下一页实时显示20条数据,如下表格。

2.sql语句

例如:查询warn_record表格第20-40条数据

SELECT * FROM(SELECT A.*,ROWNUM RN FROM(SELECT * FROM "warn_record")
 A WHERE ROWNUM <= 40)WHERE RN >= 20;

3.qt关键代码

#ifndef SQL_TEST_H
#define SQL_TEST_H

#include <QWidget>
#include "SQL_test.h"
#include <QtSql/QSqlDatabase>	// 连接数据库
#include <QtSql/QSqlError>		// 数据库连接失败打印报错语句
#include <QtSql/QSqlQuery>		// 数据库操作(增删改查)
#include <QMessageBox>
#include <QVariantList>			// 泛型链表,可以存储任何类型的数据
#include <QDebug>
#include <QString>
#include <QSqlQueryModel>

#include <QTableView>
#include <QStandardItemModel>
class SQL_TEST : public QWidget
{
    Q_OBJECT

public:
    explicit SQL_TEST(QWidget *parent = nullptr);
    ~SQL_TEST();

    QStandardItemModel* model;
    QTableView * view;


private:
    Ui::SQL_TEST *ui;
    void on_MySql_Connet();//数据库连接
    void on_next();//下一页

    QSqlDatabase db;
    QSqlQuery query1;
  
    long int aaa ;//当前数据行数
    int x ;//当前页数
};


#endif // SQL_TEST_H
SQL_TEST::SQL_TEST(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::SQL_TEST)
{
    ui->setupUi(this);

    //tableview 和 QStanditenmodel
    model = new QStandardItemModel(this);
    view = new QTableView(this) ;
    view->setModel(model);
    view->setGeometry(0,0,600,700);
    QStringList table_h_headers;
    table_h_headers << "编号" << "库号" << "报警名称" << "报警类型" << "报警等级" << "报警时间"<< "变位信息";
    model->setHorizontalHeaderLabels(table_h_headers);//设置表头及颜色
    view->horizontalHeader()->setStyleSheet("QHeaderView::section{background:skyblue;}");
    view->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);// 表格宽度随内容自动扩展
    view->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);// 表格宽度自动根据UI进行计算,不可手动调整宽度
    view->verticalHeader()->setSectionResizeMode(QHeaderView::Fixed);// 固定表格高度不可扩展,不可手动调整高度
    //view->verticalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);// 表格高度随内容自动扩展
    //view->verticalHeader()->setSectionResizeMode(QHeaderView::Stretch);// 表格高度自动根据UI进行计算,不可手动调整高度
    //view->setShowGrid(false);// 隐藏网格线
    view->setShowGrid(true);// 显示网格线
    //view->setGridStyle(Qt::DotLine);// 线的样式
    //view->setAlternatingRowColors(true);//隔行换颜色
    view->setSelectionBehavior(QAbstractItemView::SelectRows);//选择整行
    view->setFocusPolicy(Qt::NoFocus);//取消选中框
    //view->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);//布局排版是全部伸展开的效果


connect(ui->pushButton, &QPushButton::clicked, this, &SQL_TEST::on_MySql_Connet);//数据库连接
connect(ui->pushButton_9, &QPushButton::clicked, this, &SQL_TEST::on_next);//下一页

}

SQL_TEST::~SQL_TEST()
{
    db.close();	  // 关闭数据库
    delete ui;
}


//数据库连接
void SQL_TEST::on_MySql_Connet()
{
    //oracle数据库
    db = QSqlDatabase::addDatabase("QOCI");
    db.setHostName("192.168.1.130");//数据库地址
    db.setDatabaseName("xe");//安装时全局数据库名
    db.setUserName("whxwkj_222");//数据库名称
    db.setPassword("XwKj@123");//密码
    db.setPort(1521);//oracle数据库端口
    aaa=0; //清0
    x=0;

    // 打开数据库
    if (!db.open()) {	// 数据库打开失败
        db.exec("SET NAMES 'GBK'");
        QMessageBox::warning(this, "警报", db.lastError().text());	// 显示错误信息
        return;
    }
    else {
        QMessageBox::information(this, "提示", "数据库连接成功");
        }

    query1 = QSqlQuery(db);
}

//未处理数据不足一页情况,数据低于20。
void SQL_TEST::on_next()
{
    QVariant temp;
    QString sql;
    model->clear();
    QStringList table_h_headers;
    table_h_headers << "编号" << "库号" << "报警名称" << "报警类型" << "报警等级" << "报警时间"<< "变位信息";
    model->setHorizontalHeaderLabels(table_h_headers);//设置表头及颜色
    //查询表的行数
    sql = QString("SELECT * FROM \"warn_record\"");
        query1.exec(sql);  // 查询数据库user_def的表的所有行和列
        qDebug() << sql;
        QSqlRecord rec = query1.record();
    qDebug() << "表的总列数:" << QString::number(rec.count()); // 表一共有多少列
    ui->lineEdit_7->setText(QString::number(rec.count()));
    int j= 0;
    //查询行数
    sql = QString("SELECT count(\"Id\") FROM \"warn_record\"");
    query1.exec(sql);
    query1.next();
    temp = query1.value(0);
    int numhang =  query1.value(0).toInt();
    qDebug() << "行数:" << numhang;
    int numtrue;//余数
    int num = numhang/20;//页数
    if((num%20))
    {
        numtrue = num%20;
        num = num+1;
        ui->label_17->setText(QString::number(num));
        qDebug() << "表的页数:" << num;
    }
    else{
        qDebug() << "表的页数:" << num;
        ui->label_17->setText(QString::number(num));
    }
    qDebug() << "表余数:" << numtrue;
    if(num >0 || (numtrue > 0))
    {
        QSqlQuery query2;
        sql = QString("SELECT * FROM(SELECT A.*,ROWNUM RN FROM(SELECT * FROM \"warn_record\") A WHERE ROWNUM <= %2)WHERE RN >= %1").arg(QString::number(aaa+1)).arg((QString::number(aaa+20)));
        qDebug() << sql;
        query2.exec(sql);
        //qDebug() << aaa;
        //qDebug() << query2.next();
        while (query2.next())
        {
            int i = 0;
            QVariant temp;
            while ((temp = query2.value(i++)).isValid()){

                model ->setItem(j, i-1, new  QStandardItem(temp.toString()));
                if (i==7)//数据库中只有7个字段//过滤掉别名字段
                    break;
            }
            j++;
        }
        x++;//记录当前页数
        ui->label_19->setText(QString::number(x));
    }
    aaa = aaa+20;//翻页数据加20
    //居中显示
    if(num >0)
    for (int i = 0; i<20; i++)
    {
        for (int j = 0; j<7; j++)
        {
             model->item (i,j)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
        }
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值