Qt 数据库SQL

news2024/10/6 22:31:49

Qt 数据库SQL

  • 用户接口层
  • SQL接口层
  • 驱动层
  • 创建连接数据库
  • 查询
  • 两个数据库示例

在这里插入图片描述

用户接口层、SQL接口层和驱动层是数据库系统中的三个重要组成部分,它们分别负责不同的功能。

用户接口层

用户接口层
用户接口层是用户与数据库系统交互的界面。它提供了一些简单易用的工具和方法,使得用户可以方便地进行数据操作。例如,常见的数据库管理工具(如MySQL Workbench)就是一个典型的用户接口层应用。

SQL接口层

SQL接口层
SQL接口层是连接用户接口层和底层驱动程序之间的桥梁。它负责解析SQL语句,并将其转换为底层驱动程序可以执行的命令。同时,SQL接口层还提供了一些高级功能,例如事务处理、游标控制等。

驱动层

驱动层
驱动层是数据库系统中最底层的组成部分。它直接与物理存储设备(如磁盘)进行交互,并负责将数据读取到内存中或将内存中的数据写入到磁盘中。不同类型的数据库需要不同类型的驱动程序来实现数据访问。常见的驱动程序包括ODBC、JDBC、QtSql等。

总体来说,这三个组成部分相互协作,形成了一个完整的数据库系统,在其中用户可以通过用户接口层进行数据操作,SQL接口层负责解析和执行SQL语句,底层驱动程序则负责将数据读写到物理存储设备中。

通俗来讲

假设你是一家商店的老板,想要管理商品和客户信息。那么,你需要一个数据库系统来存储这些数据,并且可以方便地进行查询、修改、删除等操作。
1 在这个例子中,用户接口层就是你使用的商店管理软件界面,它提供了各种按钮、菜单和输入框等工具,使得你可以直观地进行商品和客户信息的管理。
2 SQL接口层就像是一个翻译,将你在用户接口层输入的指令(例如“添加一件商品”、“查询某个客户信息”)翻译成计算机可以理解的语言,并将其传递给底层驱动程序。
3 底层驱动程序则负责从物理存储设备(例如硬盘)中读取或写入数据。例如,当你在商店管理软件中添加一件商品时,底层驱动程序会将这个操作转换为一条SQL语句,并将其写入到磁盘上的数据库文件中。
总体来说,用户接口层、SQL接口层和驱动层相互协作,在后台完成了各种数据操作任务。

创建连接数据库

QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
//QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL",“name");  当建立多个数据库时 需要靠name区分 在查询中体现
QSqlQuery query;  //创建表并写入数据
    query.exec("create table student(id int primary key,name varchar(20) )");
    query.exec("insert into student values(0,'liming')");
    query.exec("insert into student values(1,'xiaoer')");
    query.exec("insert into student values(2,'xiaosan')");

查询

QSqlQuery query;  // 默认数据库 ,只有一个时
//QSqlQuery query(name);  多个数据库时,name区分
    query.exec("select * from student");
    while (query.next()) {
        qDebug()<<query.value(0).toInt()<<query.value(1).toString();
    }

两个数据库示例

main.cpp

#include <QApplication>
#include <QSqlDatabase>
#include <QDebug>
#include <QStringList>
#include "connection.h"
#include <QVariant>
#include <QSqlDriver>
#include <QSqlRecord>
#include <QSqlField>
#include <QSqlError>
/*
    这里主要是使用了QSqlDatabase的database()静态函数通过指定连接名来获取相应的数据库连接,
    然后在 QSqlQuery 中使用该连接进行数据库的查询操作。现在运行程序就可以输出两个表中的内容了,
    而在项目生成的目录中也可以看到生成的 myl.db和my2.db两个数据库文件。
*/
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    // 创建数据库连接
    if (!createConnection()) return 1;

    // 使用QSqlQuery查询连接1的整张表,先要使用连接名获取该连接
    QSqlDatabase db1 = QSqlDatabase::database("connection1");
    QSqlQuery query1(db1);
    qDebug() << "connection1:";
    query1.exec("select * from student");
    while(query1.next())
    {
        qDebug() << query1.value(0).toInt() << query1.value(1).toString();
    }

    // 使用QSqlQuery查询连接2的整张表
    QSqlDatabase db2 = QSqlDatabase::database("connection2");
    QSqlQuery query2(db2);
    qDebug() << "connection2:";
    query2.exec("select * from student");
    while(query2.next())
    {
        qDebug() << query2.value(0).toInt() << query2.value(1).toString();
    }
    return a.exec()
 }
 

connection.h

#ifndef CONNECTION_H
#define CONNECTION_H
#include <QMessageBox>
#include <QSqlDatabase>
#include <QSqlQuery>

static bool createConnection()
{
    // 创建一个数据库连接,使用“connection1”为连接名
    QSqlDatabase db1 = QSqlDatabase::addDatabase("QSQLITE", "connection1");
    db1.setDatabaseName("my1.db");
    if (!db1.open()) {
        QMessageBox::critical(0, "Cannot open database1",
                              "Unable to establish a database connection.", QMessageBox::Cancel);
        return false;
    }

    // 这里要指定连接
    QSqlQuery query1(db1);
    query1.exec("create table student (id int primary key, "
                "name varchar(20))");
    query1.exec("insert into student values(0, 'LiMing')");
    query1.exec("insert into student values(1, 'LiuTao')");
    query1.exec("insert into student values(2, 'WangHong')");

    // 创建另一个数据库连接,要使用不同的连接名,这里是“connection2”
    QSqlDatabase db2 = QSqlDatabase::addDatabase("QSQLITE", "connection2");
    db2.setDatabaseName("my2.db");
    if (!db2.open()) {
        QMessageBox::critical(0, "Cannot open database1",
                              "Unable to establish a database connection.", QMessageBox::Cancel);
        return false;
    }

    // 这里要指定连接
    QSqlQuery query2(db2);
    query2.exec("create table student (id int primary key, "
                "name varchar(20))");
    query2.exec("insert into student values(10, 'LiQiang')");
    query2.exec("insert into student values(11, 'MaLiang')");
    query2.exec("insert into student values(12, 'ZhangBin')");
    return true;
}

#endif // CONNECTION_H


dbug文件夹中就会出现这两个
在这里插入图片描述

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

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

相关文章

HDSF 简介

目录 一、HDFS 的设计特点是 二、什么零拷贝 2.1 传统情况&#xff1a; 2.2 零拷贝技术&#xff1a; 三、什么是DMA 四、HDFS 的关键元素 五、HDFS 运行原理 六、HDFS 数据合并原理 七、HDFS 写的原理 八、HDFS 读的原理 九、分块存储 十、 安全模式 十一、 MapRedu…

如何使用微服务架构?使用过程需要注意什么?

一、使用微服务架构的规范 1.1 服务拆分 微服务的服务拆分是根据业务领域和业务功能来划分的&#xff0c;目的是将复杂的单体应用程序分解为小型、自治的服务&#xff0c;每个服务都专注于处理一个特定的业务领域或功能。 以下是微服务拆分的一些常见策略&#xff1a; 领域…

JavaEE——volatile、wait、notify三个关键字的解释

文章目录一、volatile和内存可见性1.解释内存可见性问题2. volatile 的使用与相关问题二、wait 和 notify1.wait 方法2.notify() 方法3. 关于 notifyAll() 方法4. wait 和 sleep 之间的简单比较一、volatile和内存可见性 前面的文章&#xff0c;我们已经提及到了内存可见性问题…

硬件设计--stm32自动下载电路设计

1 参考博客&#xff1a; 1、Stm32 一键下载电路详解 2、启动模式&#xff0c;BOOT0和BOOT1详解 3、STM32自动ISP电路设计 4、STM32 USB接口 一键下载电路详解与过程分析 2 下载软件分享&#xff1a; 参考博客&#xff1a;FlyMcu - 用于STM32芯片ISP串口程序一键下载的免费软…

【速记】Postgresql中几个ResourceOwner的含义

几个ResourceOwner的含义 总结下几个resowner的含义&#xff1a; 事务结构内的resowner&#xff1a;TransactionState→curTransactionOwner 含义&#xff1a;跟随事务结构体创建&#xff0c;会申请内存&#xff0c;跟随事务结构释放。每层事务都有自己的curTransactionOwner…

Vivado 下按键实验

Vivado下按键实验 实验原理 PL通过按键的开关状态控制led的亮灭&#xff0c;按键按下的时候灯亮&#xff0c;按键未按下的时候灯灭。 这里的描述有些问题&#xff0c;PL_LED1为高的时候&#xff0c;LED两端的电压都为高&#xff0c;灯应该是不亮的&#xff0c;所以按照下面实…

口令暴力破解--Ftp协议暴力破解与Ssh协议暴力破解

Ftp协议暴力破解 FTP服务检测 FTP服务 FTP是一种文件传输协议&#xff0c; FTP服务默认端口为21。利用FTP服务器可以在本地主机和远程主机间进行文件传输。当FTP没有配置好安全控制&#xff0c;如对登录的源地址及密码尝试次数做限制&#xff0c;那么就会存在暴力破解可能。…

uniapp - 实现车牌号键盘与格子间隔显示组件,汽车牌照录入支持自定义样式、新能源等(附带组件完整源码,开箱即用,稍微改改就能用)

效果图 uniapp 全平台兼容,车牌号键盘输入、分格显示功能示例源码,注释很多! 可以直接复制一下,然后自己改改样式或功能就能使了。 示例源码 复制,运行。 &

基于神经网络的协同过滤-NCF

目录 1、摘要 2、引言 2.1协同过滤 2.2矩阵分解 3.准备工作 3.1学习隐性数据 3.2矩阵分解 ​3.3神经协同过滤 3.4广义矩阵分解 3.5多层感知器 3.6GMF和MLP的融合-NeuMF(神经矩阵分解) 4.总结 1、摘要 尽管最近的一些工作已经把深度学习运用到了推荐中&#xff0…

【mysql性能调优 • 一】mysql企业级安装部署(保姆级别教程)

前言 MySQL是一个关系型数据库管理系统&#xff0c;由瑞典MySQL AB 公司开发&#xff0c;属于 Oracle 旗下产品。MySQL是最流行的关系型数据库管理系统之一&#xff0c;在 WEB 应用方面&#xff0c;MySQL是最好的 RDBMS (Relational Database Management System&#xff0c;关系…

k8s 认证基础

0x00 前言 要想研究一个东西是不是存在安全问题&#xff0c;那么就要知道这个东西是什么&#xff0c;怎么用的&#xff0c;如何认证&#xff0c;认证方式等问题&#xff0c;了解这些才能更好的去解释学习安全问题。 0x01 访问控制 首先是k8s用户k8s用户分为service account以…

涨点技巧:Yolov5/Yolov7引入CVPR2023 Demystify Transformers Convolutions ,提升小目标检测精度

Demystify Transformers & Convolutions in Modern Image Deep Networks 论文:https://arxiv.org/pdf/2211.05781.pdf 视觉转换器最近的成功激发了一系列具有新颖特征转换范例的视觉主干,这些范例报告了稳定的性能增益。尽管新颖的特征转换设计通常被认为是收益的来源,…

0302Prim算法-最小生成树-图-数据结构和算法(Java)

文章目录1 Prim算法1.1 概述1.1.1 算法描述1.1.2 数据结构1.1.3 横切边集合维护1.2 延时实现1.2.1 实现代码1.2.2 性能分析1.3 即时实现1.3.1 分析1.3.2 实现代码1.3.3 性能分析结语1 Prim算法 1.1 概述 1.1.1 算法描述 算法描述&#xff1a; 初始化最小生成树&#xff0c;只…

Java classLoader

一. 什么是类加载器 类加载器 classLoader 类加载器&#xff1a;负责将.class文件(存储在硬盘上的物理文件)加载到内存中&#xff0c;是类加载器把类的字节码文件加载到内存当中的。二. 类加载的过程 每个编写的”.java”拓展名类文件都存储着需要执行的程序逻辑&#xff0c;…

vue项目Agora声网实现一对一视频聊天Demo示例(Agora声网实战及agora-rtc-vue使用,新增在线预览地址)

最终效果 在线预览地址 一、声网简介---->请查看官网 二、声网注册---->请自行百度&#xff08;创建音视频连接需要在Agora注册属于您的appid&#xff09; 三、具体实现视频聊天步骤 1、 实现音视频通话基本逻辑 1、创建对象 调用 createClient 方法创建 AgoraRTCCli…

ELK 日志系统收集K8s中日志

容器特性给日志采集带来的困难 • K8s弹性伸缩性&#xff1a;导致不能预先确定采集的目标 • 容器隔离性&#xff1a;容器的文件系统与宿主机是隔离&#xff0c;导致日志采集器读取日志文件受阻。 日志按体现方式分类 应用程序日志记录体现方式分为两类&#xff1a; • 标准…

最大似然估计法和Zero Forcing算法的思考

文章目录一、Zero Forcing 算法思想二、MMSE三、MIMO检测中 Zero Forcing 算法比 Maximum Likelihood 差的思考本篇文章是学习了B站UP主 乐吧的数学 之后的笔记总结&#xff0c;老师讲的非常好&#xff0c;大家有兴趣的可以关注一波&#xff01;一、Zero Forcing 算法思想 那…

Linux应用编程(文件IO基础)

1.1、个简单的文件 IO 示例 #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> int main(void) {char buff[1024];int fd1, fd2;int ret;/* 打开源文件 src_file(只读方式) */fd1 open("./src_file",…

差分矩阵算法

前言&#xff1a;我们熟悉一维数组的前缀和和差分数组的相关操作和原理&#xff0c;但是对于二维数组也就是矩阵来说&#xff0c;它的差分和前缀和又会有什么不同之处呢&#xff1f;下面我们一起来研究&#xff0c; 1.二维数组的前缀和 首先&#xff0c;我们一般规定二维数组的…

【RocketMQ】主从同步实现原理

主从同步的实现逻辑主要在HAService中&#xff0c;在DefaultMessageStore的构造函数中&#xff0c;对HAService进行了实例化&#xff0c;并在start方法中&#xff0c;启动了HAService&#xff1a; public class DefaultMessageStore implements MessageStore {public DefaultM…