QT操作数据库

思维导图:


学习内容:

1. QSqlDatabase:数据库管理类

        主要完成数据库的创建、数据库的打开、关闭等操作

        该类中常用函数:

1、 QSqlDatabase addDatabase(const QString &type, const QString &connectionName = QLatin1String(defaultConnection))

功能:为应用程序添加一个数据库,如果数据库不存在则添加,如果数据库存在,则直接构造

参数:数据库驱动类型

2、 bool contains(const QString &connectionName = QLatin1String(defaultConnection))

功能:判断某个数据库是否存在

参数:数据库的名称 返回值:存在返回真,否则返回假

3、bool QSqlDatabase::open()

功能:打开一个数据库,如果数据库存在则打开,否则创建一个数据库

参数:无 返回值:bool类型,成功打开返回true失败返回false

4、void QSqlDatabase::setDatabaseName(const QString &name)

功能:设置数据库的名称

参数:数据库名称 返回值:无

2. QSqlQuerry:查询类

        能完成对select语句的执行

        该类常用的函数

1、bool QSqlQuery::exec(const QString &query)

功能:执行sql语句,并将结果放入到该类的对象中以便于后期的使用

参数:要执行的sql语句

返回值:成功执行返回true,失败返回false

2、bool QSqlQuery::next() bool QSqlQuery::previous()

功能:返回下一条或上一条记录

参数:无

返回值:bool类型

3、QSqlRecord QSqlQuery::record() const

功能:返回当前查询的记录值

参数:无

返回值:QSqlRecord类对象

3. QSqlRecord类

        1> 该类用于存储某一条记录的信息

        2> 常用函数

1、int QSqlRecord::count() const

功能:返回当前记录的字段的个数

参数:无

返回值:字段的个数

2、QVariant QSqlRecord::value(int index) const

功能:返回给定下标的字段的值

参数:字段的下标

返回值:给定下标的字段值

头文件

#ifndef WIDGET_H
#define WIDGET_H


#include <QWidget>
#include<QSqlDatabase>        //数据库管理类
#include<QSqlQuery>            //数据库查询类
#include<QSqlError>            //数据库错误信息类
#include<QSqlRecord>          //数据库记录类


QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE


class Widget : public QWidget
{
    Q_OBJECT


public:
    Widget(QWidget *parent = nullptr);
    ~Widget();


private slots:
    void on_addBtn_clicked();


    void on_showBtn_clicked();


private:
    Ui::Widget *ui;


    QSqlDatabase db;           //使用无参构造,实例化一个数据库管理类对象


};
#endif // WIDGET_H

源文件 

#include "widget.h"
#include "ui_widget.h"
#include<QMessageBox>
#include<QDebug>


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


    //当界面被关闭时,断开数据库的连接
    connect(this, &Widget::destroyed, [&](){
        db.close();
    });






    //1、添加数据库
    db = QSqlDatabase::addDatabase("QSQLITE");      //添加的是sqlite3的数据库驱动


    //2、设置数据库的名称
    db.setDatabaseName("my.db");




    //4、打开数据库
    if(!db.open())
    {
        QMessageBox::information(this,"提示","数据库打开失败");
        return;
    }


    //完成对数据表的创建,需要一个sql语句的执行者
    QSqlQuery querry;           //实例化对象
    //准备sql语句
    QString sql = "create table if not exists Stu(id int, name char, score double);";
    //执行sql语句
    if(!querry.exec(sql))
    {
        QMessageBox::information(this,"提示","数据表创建失败");
        return;
    }


}


Widget::~Widget()
{
    delete ui;
}


//添加信息对应的槽函数
void Widget::on_addBtn_clicked()
{




    //1、获取ui界面上的信息
    int ui_id = ui->idEdit->text().toInt();    //id号
    QString ui_name = ui->nameEdit->text();    //name
    double ui_score = ui->scoreEdit->text().toDouble();   //score


    //判断是否某个数据没有填写
    if(ui_id==0 || ui_name.isEmpty() || ui_score==0)
    {
        QMessageBox::information(this,"提示","请将信息填写完整");
        return;
    }


    //2、准备sql语句
    QString sql =tr("insert into Stu(id, name, score) values(%1, '%2', %3);").arg(ui_id).arg(ui_name).arg(ui_score);


    //qDebug()<<sql;


    //3、准备语句执行者
    QSqlQuery querry;
    if(!querry.exec(sql))
    {
        QMessageBox::information(this,"提示","数据添加失败");
        return;
    }




    QMessageBox::information(this,"提示","数据添加成功");


}




//展示信息按钮对应的槽函数
void Widget::on_showBtn_clicked()
{
    ui->tableWidget->clearContents();         //清空表格内容


    //准备sql语句
    QString sql;
    if(ui->nameEdit->text().isEmpty())
    {
        sql = "select * from Stu;";         //表示查询所有表中信息
    }else
    {
        sql = tr("select * from Stu where name='%1';").arg(ui->nameEdit->text());
    }
    qDebug()<<sql;


    //准备sql执行者
    QSqlQuery querry;
    if(!querry.exec(sql))
    {
        QMessageBox::information(this,"提示","查询失败");
        qDebug() << "失败原因:"<< querry.lastError().text();
        return;
    }


    //程序执行至此,查询结果保存在querry类对象中了
    //可以调用该类的成员函数next进行遍历该结果集
    int i = 0;
    while(querry.next())
    {
        //循环中表示,querry指向的任意一条记录
        //可以调用成员函数record函数获取当前指向的记录数据:querry.record
        //querry.record().count():返回当前记录的字段个数
        //querry.record().value(i):表示的是当前记录的下标为i的字段的值
        //qDebug()<<querry.record().value(1).toString();
        //将查询的数据展示到ui界面
        //准备数据容器
        for(int j=0; j<querry.record().count(); j++)
        {
            QTableWidgetItem *item = new QTableWidgetItem(querry.record().value(j).toString());
            //将当前项目设置到 ui界面的(i,j)下标处
            ui->tableWidget->setItem(i,j, item);
        }




        i++;            //表示遍历下一行
    }


}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Science Robotics 在小动物模型中实现渐进和可逆主动脉收缩的软机器人平台

前言速览&#xff1a;目前对左心室压力过载引起心脏重构过程的理解主要来源于主动脉束带的动物模型。然而&#xff0c;这些研究未能同时控制疾病的进展和逆转&#xff0c;阻碍了其临床意义。为此&#xff0c;来自哈佛大学、麻省理工学院等的研究人员介绍了一种基于植入式可扩张…

@Transactional和@Synchronized的冲突

Transactional和Synchronized的冲突 场景 方法是先进行检查&#xff0c;然后新增&#xff0c;添加了事务注解&#xff0c;为了保证检查&#xff08;要求业务上唯一&#xff09;&#xff0c;添加了Synchronized注解 想法很简单&#xff0c;事务注解保证方法原子性&#xff0c…

git一个项目关联多个远程仓库

一行代码就行&#xff1a; git remote set-url origin [想要关联的远程仓库地址]想要关联哪个就切换哪个 或者不用每次切换&#xff0c;集中管理&#xff1a; Git->Manage Remotes 点击“”&#xff0c;填入Name和想要关联的远程库地址 每次push时执行命令 git push [为…

ssrf漏洞利用+CTF实例

引发ssrf漏洞的几个函数 file_get_contents() 把整个文件读入一个字符串中&#xff0c;获取本地或者远程文件内容fsockopen() 获得套接字信息curl_exec() 执行一个curl会话&#xff0c;由curl_init()初始化一个新的会话&#xff0c;返回一个curl句柄fopen() 打开文件或者URLre…

全国历年高考真题2008-2024

目录 分享链接&#xff1a; ⬇️⬇️⬇️ 点击下载

2024网络安全学习路线,最全保姆级教程,学完直接拿捏!

关键词&#xff1a; 网络安全入门、渗透测试学习、零基础学安全、网络安全学习路线 首先咱们聊聊&#xff0c;学习网络安全方向通常会有哪些问题 前排提示&#xff1a;文末有CSDN独家网络安全资料包&#xff01; 1、打基础时间太长 学基础花费很长时间&#xff0c;光语言都有…

基于微信小程序的高校实验室管理系统的设计与实现

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 基于微信小程序JavaSpringBootVueMySQL的高…

QT:音视频播放器

目录 一.播放器设计 二.需要使用的控件 三.选择视频 四.播放视频 五.暂停视频 六.关闭视频 七.播放状态设置 八.切换视频(上一首) 九.切换视频(下一首) 十.设置视频滑块 十一.更新滑块显示 十二.实现效果 十三.代码设计 1.mainwindow.h 2.mainwindow.cpp 一.播放…

并行程序设计基础——并行I/O(2)

目录 一、显式偏移的并行文件读写 1、阻塞方式 1.1 MPI_FILE_READ_AT 1.2 MPI_FILE_WRITE_AT 1.3 MPI_FILE_READ_AT_ALL 1.4 MPI_FILE_WRITE_AT_ALL 2、非阻塞方式 2.1 MPI_FILE_IREAD_AT 2.2 MPI_FILE_IWRITE_AT 3、两步非阻塞组调用 3.1 MPI_FILE_READ_AT_ALL_BEG…

基于SpringBoot的医院挂号预约管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的医院挂号…

港科夜闻 | 叶玉如校长出席2024科技+新质生产力高峰论坛发表专题演讲,贡献国家科技强国战略...

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、叶玉如校长出席“2024科技新质生产力高峰论坛”&#xff0c;做了题为“三个创新&#xff1a;培育和发展新质生产力、贡献国家科技强国战略”的主题演讲。该论坛于9月2日在香港召开。论坛围绕夯实基础科研、推动源头创新、…

『功能项目』管理器基类【38】

我们打开上一篇37单例模式框架的项目&#xff0c; 本章要做的事情是编写管理器基类 首先创建脚本&#xff1a;ManagerBase.cs using UnityEngine; public abstract class ManagerBase : MonoBehaviour{public virtual void Init() { } } public class ManagerBase<T> : …

Docker容器技术1——docker基本操作

Docker容器技术 随着云计算和微服务架构的普及&#xff0c;容器技术成为了软件开发、测试和部署过程中的重要组成部分。其中&#xff0c;Docker作为容器技术的代表之一&#xff0c;以其简便易用的特点赢得了广大开发者的青睐。 Docker允许开发者在轻量级、可移植的容器中打包和…

JAVA——方法

public static 返回值类型 方法名(参数){//方法体return 数据; } 一、定义与调用 public class demo9_12 {public static void main(String[] args) {// 调用myName();}//定义public static void myName(){System.out.println("Hello World");} } 运行 二、含参数…

类和对象(c++)

欢迎来到本期频道&#xff01; 类和对象 类定义&#xff1a;格式&#xff1a;类域&#xff1a;访问限定符友元内部类this指针静态与非静态成员关系类型转换六大默认成员函数&#xff08;C98&#xff09;1️⃣构造函数2️⃣拷贝构造函数浅拷贝与深拷贝 3️⃣赋值重载拷贝函数4️…

产线工控安全之防勒索病毒杀手锏

在当今数字化时代&#xff0c;数据安全已成为企业运营中不可或缺的一部分。勒索病毒和内部泄密事件的频发&#xff0c;使得企业必须采取更为严格的安全措施来保护其关键数据和运营系统。苏州深信达网络科技推出的MCK主机加固解决方案&#xff0c;正是为了应对这些挑战而设计的。…

Excel图片批量插入单元格排版处理插件【图片大师】

为了方便大家在图片的插入排版的重复工作中解放出来&#xff0c;最近发布了一款批量插入图片的插件&#xff0c;欢迎大家下载&#xff0c;免费试用。 这是图片的文件夹&#xff1a; 主要功能如下: 1&#xff0c;匹配单元格名称的多张图批量插入到一个单元格 该功能支持设置图…

vivo手机已删除的短信还能恢复吗?

虽然现在我们很少使用vivo手机的短信功能&#xff0c;但是我们偶尔还会通过vivo手机短信功能接收一些重要的信息。如果我们在清理垃圾短信的时候误删了vivo手机重要短信&#xff0c;该怎么恢复呢&#xff1f; 方法一&#xff1a;通过vivo云服务恢复 1、确保您已开启vivo云服务…

IP包头的总长度字段和UDP包头的长度字段之间的关系

IP包头的总长度字段和UDP包头的长度字段之间的关系&#xff0c;并通过实例加以说明。 IP包头的总长度字段 **总长度&#xff08;Total Length&#xff09;**字段是一个16位的字段&#xff0c;表示整个IP数据包的总长度&#xff0c;包括IP包头和数据部分。单位是字节。由于该字…

实操了 AI 大模型项目落地, 程序员成功转变为 AI 大模型工程师

前言 根据《2024 年全球人工智能行业报告》最新的数据显示&#xff0c;全球 AI 市场预计将以每年超过 40% 的速度增长&#xff0c;到 2030 年市值将达到数万亿美元&#xff0c;这也是预示着在接下来的十年到十五年里&#xff0c;人工智能将获得巨大的发展红利。 在过去的一年…