Qt--数据库--增删改查操作

news2024/11/25 1:37:45

目录

1. Qt数据库简介

2. 连接与关闭

3. 建表

dialog.h

dialog.cpp

dialog.ui

4. 增删改

1.添加数据

dialog.h

dialog.cpp

 2.删除数据

dialog.h

dialog.cpp

3.修改数据

dialog.h

dialog.cpp

5. 查询

dialog.h

dialog.cpp

 判断数据是否存在

dialog.h

dialog.cpp


1. Qt数据库简介

Qt只是作为媒介去操作数据库,本身不具备数据库的功能,因此除了Qt以外,还需要在计算机中安装对应的数据库软件,但是由于SQLite数据库比较轻巧,因此Qt集成了SQLite数据库,此数据库是嵌入式中最常用的数据库。

实际上Qt支持以下类型的数据库产品:

在Qt项目中使用数据库必须在.pro项目配置文件中增加sql模块。

2. 连接与关闭

主要使用到的类是数据库连接类QSqlDatabase和数据库错误信息类QSqlError,涉及的函数有:

// 获得一个基于SQLite的数据库连接对象
QSqlDatabase QSqlDatabase::addDatabase("QSQLITE") [static]// 设置SQLite数据库文件的名称(不同的数据库此函数表示不同的功能)
// 在运行之后,此文件会在构建目录中生成
void QSqlDatabase::setDatabaseName(const QString & name)// 打开数据库连接
// 返回值是打开的结果,如果打开失败,可以通过lastError()函数获得错误信息
bool QSqlDatabase::open()// 获得上一次数据库的错误信息
QSqlError QSqlDatabase::lastError() const
// 可以通过下面的函数把错误信息转换为字符串(实际上这些信息来自于底层数据库)
QString QSqlError::text() const// 判断连接是否打开
bool QSqlDatabase::isOpen() const// 关闭连接
void QSqlDatabase::close()

连接成功后会生成数据库文件。

3. 建表

QSqlQuery主要用于执行SQL语句,相关函数如下。

// 执行SQL语句
// 参数是要执行的SQL语句
// 返回值是语句本身执行的结果,并不是数据操作的结果
bool QSqlQuery::exec(const QString & query)
// 用法与之前的同名函数完全相同
QSqlError QSqlQuery::lastError() const参考建表语句:

 

CREATE TABLE customer(id INTEGER PRIMARY KEY,name TEXT,money REAL,rate REAL);

建表成功后,可以直接到构建目录中使用SQLiteSpy工具打开.db文件验证是否建表成功。

dialog.h

#ifndef DIALOG_H
#define DIALOG_H

#include<QtWidgets>
#include<QDebug>
#include<QButtonGroup>
#include<QSqlDatabase>
#include<QSqlError>
#include<QSqlQuery>
namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
    Q_OBJECT

public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();

private:
    Ui::Dialog *ui;
    QButtonGroup *group;
    QSqlDatabase db;//数据库连接对象
    void connect2Db();//连接到数据库
    void createTable();//建表

private slots:
    void btnsClickedSlot(int);

};

#endif // DIALOG_H

dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);

    group=new QButtonGroup(this);
    group->addButton(ui->pushButtonInsert,1);
    group->addButton(ui->pushButtonDelete,2);
    group->addButton(ui->pushButtonUpdate,3);
    group->addButton(ui->pushButtonSelect,4);

    connect(group,SIGNAL(buttonClicked(int)),this,SLOT(btnsClickedSlot(int)));
    connect2Db();
}
void Dialog::btnsClickedSlot(int id)
{
    if(id==1)
    {
      
    }else if(id==2)
    {

    }else if(id==3)
    {

    }else if(id==4)
    {

    }
}

Dialog::~Dialog()//析构函数销毁创建的对象
{
    //如果数据库连接打开了,则关闭
    if(db.isOpen())
      db.close();
    delete ui;
}

void Dialog::connect2Db()
{
    //获得一个基于SQLite的数据库连接对象
    db=QSqlDatabase::addDatabase("QSQLITE");
    //设置数据库文件的名称
    db.setDatabaseName("bank_manage.db");
    //打开连接
    if(db.open())
    {
        qDebug()<<"连接打开成功!";
        createTable();
    }else
    {
        //拿到错误信息
        QString text=db.lastError().text();
        //展示错误信息
        QMessageBox::critical(this,"错误",text);
    }
}

void Dialog::createTable()
{
    QString sql="CREATE TABLE customer(id INTERGER PERIMARY KEY,name TEXT,money REAL,rate REAL)";
    //数据库操作类
    QSqlQuery sq;
    if(sq.exec(sql))
    {
        qDebug()<<"建表成功!";
    }else
    {
        qDebug()<<sq.lastError().text();//上一次操作的错误信息
    }
}

dialog.ui

4. 增删改

增删改的操作方法比较相似,需要注意是不要使用拼接的方式创建带参数的SQL语句,原因有:

  • 拼接复杂,容易出错
  • 容易引发SQL注入的安全问题

Qt使用占位符替换的方式“拼接”SQL语句,占位符替换有两种方式:

  • ODBC style (?)
  • Oracle style colon-name 
// 预处理带有占位符的SQL语句
// 参数为预处理的SQL语句
// 返回值是预处理的结果
bool QSqlQuery::prepare(const QString & query)// 添加绑定数据
// 参数为要绑定的数据,各种类型直接传递即可,传递的顺序要按照?的顺序
void QSqlQuery::addBindValue(const QVariant & val)// 执行预处理的SQL语句
// 语句本身是否成功执行
bool QSqlQuery::exec()

1.添加数据

dialog.h

private:
    Ui::Dialog *ui;
    QButtonGroup *group;
    QSqlDatabase db;//数据库连接对象
    void connect2Db();//连接到数据库
    void createTable();//建表
    void insertData();//增加

dialog.cpp


void Dialog::btnsClickedSlot(int id)
{
    if(id==1)
    {
       insertData();//添加数据
    }else if(id==2)
    {

    }else if(id==3)
    {

    }else if(id==4)
    {

    }
}
void Dialog::insertData()
{
    //如果姓名为空,引导用户输入
    QString name=ui->lineEdit->text();
    if(name=="")
    {
        QMessageBox::warning(this,"提示","请输入姓名:");
        return;
    }
    int id=ui->spinBoxId->value();
    double money=ui->doubleSpinBox->value();
    double rate=ui->doubleSpinBoxLv->value();
    //操作类对象
    QSqlQuery sq;
    //预处理的SQL语句
    QString sql="INSERT INTO customer VALUES(?,?,?,?)";
    //预处理
    sq.prepare(sql);
    //绑定数据 按照顺序添加数据
    sq.addBindValue(id);
    sq.addBindValue(name);
    sq.addBindValue(money);
    sq.addBindValue(rate);
    //执行sql语句(执行的是内部预处理的语句)
    if(sq.exec())
    {
        QMessageBox::information(this,"通知","成功插入一条数据!");
    }else
    {
        QString text=sq.lastError().text();
        QMessageBox::warning(this,"提示",text);
    }

}

 

 2.删除数据

dialog.h

private:
    Ui::Dialog *ui;
    QButtonGroup *group;
    QSqlDatabase db;//数据库连接对象
    void connect2Db();//连接到数据库
    void createTable();//建表
    void insertData();//增加
    void deleteData();//删除

dialog.cpp


void Dialog::btnsClickedSlot(int id)
{
    if(id==1)
    {
       insertData();
    }else if(id==2)
    {
       deleteData();
    }else if(id==3)
    {
       
    }else if(id==4)
    {

    }
}
void Dialog::deleteData()
{
    int id=ui->spinBoxId->value();
    //判断表中数据是否存在

    //预处理的SQL语句
    QString sql="DELETE FROM customer WHERE id=?";
    QSqlQuery sq;
    sq.prepare(sql);
    sq.addBindValue(ui->spinBoxId->value());
    //执行sql语句(执行的是内部预处理的语句)
    if(sq.exec())
    {
        QMessageBox::information(this,"通知","成功删除一条数据!");
    }else
    {
        QString text=sq.lastError().text();
        QMessageBox::warning(this,"提示",text);
    }
}

 

3.修改数据

dialog.h

private:
    Ui::Dialog *ui;
    QButtonGroup *group;
    QSqlDatabase db;//数据库连接对象
    void connect2Db();//连接到数据库
    void createTable();//建表
    void insertData();//增加
    void deleteData();//删除
    void updateData();//修改

dialog.cpp


void Dialog::btnsClickedSlot(int id)
{
    if(id==1)
    {
       insertData();
    }else if(id==2)
    {
       deleteData();
    }else if(id==3)
    {
       updateData();
    }else if(id==4)
    {

    }
}

void Dialog::updateData()
{
    //如果姓名为空,引导用户输入
    QString name=ui->lineEdit->text();
    if(name=="")
    {
        QMessageBox::warning(this,"提示","请输入姓名:");
        return;
    }
    int id=ui->spinBoxId->value();
    //判断更新数据是否存在

    double money=ui->doubleSpinBox->value();
    double rate=ui->doubleSpinBoxLv->value();

    //操作类对象
    QSqlQuery sq;
    //预处理的SQL语句
    QString sql="UPDATE customer SET name=?,money=?,rate=? WHERE id=?";
    //预处理
    sq.prepare(sql);
    //绑定
    sq.addBindValue(name);
    sq.addBindValue(money);
    sq.addBindValue(rate);
    sq.addBindValue(id);
    //执行
    if(sq.exec())
    {
        QMessageBox::information(this,"通知","成功修改一条数据!");
    }else
    {
        QString text=sq.lastError().text();
        QMessageBox::warning(this,"提示",text);
    }
}

5. 查询

查询与迭代器指针的工作原理类似,相关函数如下。

// 取出结果中的下一个记录,如果没有下一个记录则返回false
bool QSqlQuery::next()// 按照列序号取出对应的列数据
// 参数是列序号,从0开始
// 返回值是取出的数据,支持各种常见类型的转换
QVariant QSqlQuery::value(int index) const// 按照列名取出对应的列数据
// 参数是列名
// 返回值是取出的数据,支持各种常见类型的转换
QVariant QSqlQuery::value(const QString & name) const

dialog.h

private:
    Ui::Dialog *ui;
    QButtonGroup *group;
    QSqlDatabase db;//数据库连接对象
    void connect2Db();//连接到数据库
    void createTable();//建表
    void insertData();//增加
    void deleteData();//删除
    void updateData();//修改
    void selectAll();//查询所有

dialog.cpp


void Dialog::btnsClickedSlot(int id)
{
    if(id==1)
    {
       insertData();
    }else if(id==2)
    {
       deleteData();
    }else if(id==3)
    {
       updateData();
    }else if(id==4)
    {
       selectAll();
    }
}


void Dialog::selectAll()
{
    QString sql="SELECT * FROM customer";
    QSqlQuery sq;
    if(sq.exec(sql))
    {
        //清空上次显示结果
        ui->textBrowser->clear();
        while(sq.next())
        {
            //取出每列数据
            //方式一:按照序号(0,1,2,3...)取出
            QString id=sq.value(0).toString();
            //方式二:按照列名取出
            QString name=sq.value("name").toString();
            QString money=sq.value("money").toString();
            QString rate=sq.value("rate").toString();
            QString text;
            text=text+id.append("-")+name.append("-")+money.append("-")+rate;
            //展示数据
            ui->textBrowser->append(text);
        }
    }else
    {
        QString text=sq.lastError().text();
        QMessageBox::warning(this,"提示",text);
    }
}

 判断数据是否存在

dialog.h

private:
    Ui::Dialog *ui;
    QButtonGroup *group;
    QSqlDatabase db;//数据库连接对象
    void connect2Db();//连接到数据库
    void createTable();//建表
    void insertData();//增加
    void deleteData();//删除
    void updateData();//修改
    void selectAll();//查询所有
    bool isDataExists(int);//判断某个id的数据是否存在

dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);

    group=new QButtonGroup(this);
    group->addButton(ui->pushButtonInsert,1);
    group->addButton(ui->pushButtonDelete,2);
    group->addButton(ui->pushButtonUpdate,3);
    group->addButton(ui->pushButtonSelect,4);

    connect(group,SIGNAL(buttonClicked(int)),this,SLOT(btnsClickedSlot(int)));
    connect2Db();
}
void Dialog::btnsClickedSlot(int id)
{
    if(id==1)
    {
       insertData();
    }else if(id==2)
    {
       deleteData();
    }else if(id==3)
    {
       updateData();
    }else if(id==4)
    {
       selectAll();
    }
}

Dialog::~Dialog()//析构函数销毁创建的对象
{
    //如果数据库连接打开了,则关闭
    if(db.isOpen())
      db.close();
    delete ui;
}

void Dialog::connect2Db()
{
    //获得一个基于SQLite的数据库连接对象
    db=QSqlDatabase::addDatabase("QSQLITE");
    //设置数据库文件的名称
    db.setDatabaseName("bank_manage.db");
    //打开连接
    if(db.open())
    {
        qDebug()<<"连接打开成功!";
        createTable();
    }else
    {
        //拿到错误信息
        QString text=db.lastError().text();
        //展示错误信息
        QMessageBox::critical(this,"错误",text);
    }
}

void Dialog::createTable()
{
    QString sql="CREATE TABLE customer(id INTERGER PERIMARY KEY,name TEXT,money REAL,rate REAL)";
    //数据库操作类
    QSqlQuery sq;
    if(sq.exec(sql))
    {
        qDebug()<<"建表成功!";
    }else
    {
        qDebug()<<sq.lastError().text();//上一次操作的错误信息
    }
}

void Dialog::insertData()
{
    //如果姓名为空,引导用户输入
    QString name=ui->lineEdit->text();
    if(name=="")
    {
        QMessageBox::warning(this,"提示","请输入姓名:");
        return;
    }
    int id=ui->spinBoxId->value();
    double money=ui->doubleSpinBox->value();
    double rate=ui->doubleSpinBoxLv->value();
    //操作类对象
    QSqlQuery sq;
    //预处理的SQL语句
    QString sql="INSERT INTO customer VALUES(?,?,?,?)";
    //预处理
    sq.prepare(sql);
    //绑定数据 按照顺序添加数据
    sq.addBindValue(id);
    sq.addBindValue(name);
    sq.addBindValue(money);
    sq.addBindValue(rate);
    //执行sql语句(执行的是内部预处理的语句)
    if(sq.exec())
    {
        QMessageBox::information(this,"通知","成功插入一条数据!");
    }else
    {
        QString text=sq.lastError().text();
        QMessageBox::warning(this,"提示",text);
    }

}

void Dialog::deleteData()
{
    int id=ui->spinBoxId->value();
    //判断表中数据是否存在
    if(!isDataExists(id))
    {
        QMessageBox::warning(this,"提示","数据不存在!");
        return ;
    }
    //预处理的SQL语句
    QString sql="DELETE FROM customer WHERE id=?";
    QSqlQuery sq;
    sq.prepare(sql);
    sq.addBindValue(ui->spinBoxId->value());
    //执行sql语句(执行的是内部预处理的语句)
    if(sq.exec())
    {
        QMessageBox::information(this,"通知","成功删除一条数据!");
    }else
    {
        QString text=sq.lastError().text();
        QMessageBox::warning(this,"提示",text);
    }
}

void Dialog::updateData()
{
    //如果姓名为空,引导用户输入
    QString name=ui->lineEdit->text();
    if(name=="")
    {
        QMessageBox::warning(this,"提示","请输入姓名:");
        return;
    }
    int id=ui->spinBoxId->value();
    //判断更新数据是否存在
    if(!isDataExists(id))
    {
        QMessageBox::warning(this,"提示","数据不存在!");
        return ;
    }
    double money=ui->doubleSpinBox->value();
    double rate=ui->doubleSpinBoxLv->value();

    //操作类对象
    QSqlQuery sq;
    //预处理的SQL语句
    QString sql="UPDATE customer SET name=?,money=?,rate=? WHERE id=?";
    //预处理
    sq.prepare(sql);
    //绑定
    sq.addBindValue(name);
    sq.addBindValue(money);
    sq.addBindValue(rate);
    sq.addBindValue(id);
    //执行
    if(sq.exec())
    {
        QMessageBox::information(this,"通知","成功修改一条数据!");
    }else
    {
        QString text=sq.lastError().text();
        QMessageBox::warning(this,"提示",text);
    }
}

void Dialog::selectAll()
{
    QString sql="SELECT * FROM customer";
    QSqlQuery sq;
    if(sq.exec(sql))
    {
        //清空上次显示结果
        ui->textBrowser->clear();
        while(sq.next())
        {
            //取出每列数据
            //方式一:按照序号(0,1,2,3...)取出
            QString id=sq.value(0).toString();
            //方式二:按照列名取出
            QString name=sq.value("name").toString();
            QString money=sq.value("money").toString();
            QString rate=sq.value("rate").toString();
            QString text;
            text=text+id.append("-")+name.append("-")+money.append("-")+rate;
            //展示数据
            ui->textBrowser->append(text);
        }
    }else
    {
        QString text=sq.lastError().text();
        QMessageBox::warning(this,"提示",text);
    }
}

bool Dialog::isDataExists(int id)
{
    //查询语句
    QString sql="SELECT * FROM customer WHERE id=?";
    //操作类对象
    QSqlQuery sq;
    //预处理
    sq.prepare(sql);
    //绑定
    sq.addBindValue(id);
    //执行
    sq.exec();
    return sq.next();//判断后面有无数据
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/519872.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何在IVD行业运用IPD?

IVD&#xff08;体外诊断&#xff0c;In Vitro Diagnostic&#xff09;是指对人体样本&#xff08;血液、体液、组织&#xff09;进行定性或定量的检测&#xff0c;进而判断疾病或机体功能的诊断方法。IVD目前已经成为疾病预防、诊断治疗必不可少的医学手段&#xff0c;约80%左…

ChatGPT国内使用办法,无需魔法上网,免费使用ChatGPT,长期更新!!

新建了一个网站 每天给大家更新可用的免翻国内可用chatGPT https://ai.weoknow.com/ 2023.5.7新增一个 软件名称ChatGPT✦ ▌ 软件摘要 软件名称&#xff1a;ChatGPT 适用设备&#xff1a;浏览器 文件大小&#xff1a;0MB ▌ 软件简介 ChatGPT非常强大&#xff0c;但国内合…

12-CSS-语法和选择器

一、语法格式&#xff1a; 选择器指向需要设置样式的 HTML 元素。声明块包含一条或多条用分号分隔的声明。每条声明都包含一个 CSS 属性名称和一个值&#xff0c;以冒号分隔。多条 CSS 声明用分号分隔&#xff0c;声明块用花括号括起来。 二、选择器&#xff1a; CSS 选择器…

第一章 计算机系统概述

1.1 计算机发展历程 1.1.1 计算机硬件的发展 计算机系统硬件软件 计算机硬件的发展&#xff1a; 第一代计算机&#xff1a;(使用电子管)&#xff0c;第二代计算机&#xff1a;(使用晶体管)&#xff0c;第三代计算机&#xff1a;(使用较小规模的集成)&#xff0c;第四代计算…

Strategy 模式

文章目录 &#x1f4a1;问题引入&#x1f4a1;概念&#x1f4a1;例子&#x1f4a1;总结 &#x1f4a1;问题引入 软件为什么总是隔一段时间就要更新迭代&#xff1f;当然是因为不同的需求而发生了改变。 在软件构建过程中&#xff0c;某些对象使用的算法可能多种多样&#xff…

MySQL——通过C语言连接

文章目录 1、前置安装2、正式连接增加删除修改select 1、前置安装 前提&#xff1a; 如果你的mysql是通过yum安装的&#xff0c;那么那些库文件依赖&#xff0c;都是有的&#xff0c;不用你安装了。 但是如果是用 rpm包安装的&#xff0c;就需要去官网下载对应的包。 这些是…

操作系统与进程调度

文章目录 一、计算机操作系统1.操作系统&#xff08;Operating System&#xff09;2.计算机系统示意图 二、进程1.进程/任务&#xff08;Process/Task&#xff09;2.进程控制块抽象(PCB Process Control Block)3.进程调度(Process Scheduling&#xff09;4.内存管理&#xff08…

知识点回顾(一)

1.final,finally ,finalize final?修饰符&#xff08;关键字&#xff09;如果一个类被声明为final&#xff0c;意味着它不能再派生出新的子类&#xff0c;不能作为父类被继承。因此一个类不能既被声明为 abstract的&#xff0c;又被声明为final的。将变量或方法声明为final&…

ChatGPT潜能无限:多个震撼应用场景一一揭晓

ChatGPT 具有对个人、公司和各个行业非常有用的各种应用程序。在本文中&#xff0c;我们继续解释ChatGPT 应用&#xff08;基础应用场景&#xff0c;请点击这里查看&#xff09;。 看完此篇文章中&#xff0c;你会非常惊讶于起潜能无限的应用场景及其强大的功能&#xff0c;那…

Nginx之rewrite实现URL重写

1.开篇 rewrite是nginx服务器提供的一个重要功能&#xff0c;用于实现URL的重写。例如我们访问https://aa.qq.com&#xff0c;打开的是https://age.qq.com/&#xff0c;这就是使用URL重写的特性来实现的。 ngx_http_rewrite_module为实现URL重写提供了指令支持。 官方文档地…

ChatGPT教程(终极版)

新建了一个网站 https://ai.weoknow.com/ 每天给大家更新可用的国内可用chatGPT 这是一篇姗姗来迟的ChatGPT教程。 小白对ChatGPT的介绍足以让你阅读我的文章。 如果你已经使用过ChatGPT&#xff0c;那么祝贺你发现了宝藏。未来的先进技术一定会帮助你有所收获。 前提是你可…

我的『1024』创作纪念日

记得&#xff0c;2020年07月22日我撰写了第1篇技术博客&#xff1a;《遗传算法实例解析》在这平凡的一天&#xff0c;我赋予了它不平凡的意义也许是立志成为一名专业T作者、也许是记录一段刚实践的经验但在那一刻&#xff0c;我已在创作这趟旅程中出发今天&#xff0c;是我成为…

百度蜘蛛简介

百度蜘蛛简介 工作机制百度蜘蛛的工作要素百度蜘蛛原理的应用Baiduspider对一个网站服务器造成的访问压力如何&#xff1f;Baiduspider多长时间之后会重新抓取我的网页&#xff1f; 工作机制 百度蜘蛛的构建的原理。搜索引擎构建一个调度程序&#xff0c;来调度百度蜘蛛的工作…

2023.5.13>>Eclipse+exe4j打包Java项目及获取exe所在文件的路径

Eclipseexe4j打包Java项目及获取exe所在文件的路径 1、打包exe文件1.1 打jar包1.2 打包exe2、在程序中获取exe所在路径3、遇到问题4、JDK version和class file version(Class编译版本号)对应关系5、参考文章 1、打包exe文件 1.1 打jar包 右单击项目选择“Export…” 1.2…

软考A计划-真题-分类精讲汇总-第三章(数据库)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…

小程序开发中的插件、组件、控件到底有什么区别?

小程序插件代码由一些自定义组件和 JS 代码文件构成&#xff0c;插件开发者在发布插件时&#xff0c;这些代码被上传到后台保存起来。当小程序使用插件时&#xff0c;使用者需填写插件的 AppID 和版本号&#xff0c;就可从后台获取相应的插件代码。小程序代码编译时&#xff0c…

基于 CentOS 7 构建 LVS-DR 群集

如有错误&#xff0c;敬请谅解&#xff01; 此文章仅为本人学习笔记&#xff0c;仅供参考&#xff0c;如有冒犯&#xff0c;请联系作者删除&#xff01;&#xff01; 前言&#xff1a; 对比 LVS 负载均衡群集的 NAT 模式和 DR 模式其各自的优势 DR 模式 原理&#xff1a;首先…

Hadoop之block切片

切片是一个逻辑概念 在不改变现在数据存储的情况下&#xff0c;可以控制参与计算的节点数目 通过切片大小可以达到控制计算节点数量的目的 有多少个切片就会执行多少个Map任务 hdfs上数据存储的一个单元,同一个文件中块的大小都是相同的 因为数据存储到HDFS上不可变&#xff0…

Qt--QString字符串类、QTimer定时器类

目录 1. QString 字符串类 dialog.cpp 2. 容器类 2.1 顺序容器 QList 示例代码&#xff1a; student.h student.cpp dialog.h dialog.cpp 运行结果&#xff1a; 2.2 关联容器 QMap 示例代码&#xff1a; dialog.h dialog.cpp 运行结果&#xff1a; 3. Qt类型 3.1 跨平台数据类型…

中断相关内容大全

中断基本概念&#xff1a;程序中断指计算机执行现行程序过程中&#xff0c;出现某种急需处理的异常情况或特殊请求&#xff0c;CPU暂时中止现行程序&#xff0c;而转去对这些异常情况或特殊请求进行处理&#xff0c;处理完毕后CPU又自动返回到现行程序的断点处&#xff0c;继续…