Qt中的数据库(简单使用)

2023-11-01

在Qt中支持对数据库的操作

Qt中数据库的类有:

  • 驱动层:为具体的数据库和SQL接口层之间提供底层的桥梁
  • SQL层:提供对数据库的访问
    • QSqlDateBase类用来创建连接
    • QSqlQuery可以使用SQL语句实现交互
  • 用户接口层:实现将数据库中的数据链接到窗口部件中

想要使用数据库需要在pro文件中添加:QT+=sql

一:连接数据库

常用的数据库驱动:

驱动名称 数据库
QDB2 IBM DB2
QIBASE Borland InterBase
QMYSQL MySQL
QOCI Oracle Call Interface Driver
QODBC Open Database Connectivity(ODBC、SQL Server)
QPSQL PostgreSQL
QSQLITE2 SQLite版本2
QSQLITE SQLite版本3

 QSqlDatabase类:

QSqlDatabase类提供通过连接访问数据库的接口。

常用函数:

addDataBase() 添加驱动
setHostName() 设置连接的主机名
setDataBaseName() 设置连接的数据库的名称
setUserName() 设置使用者名称
setPassword() 设置连接密码
setPort() 设置端口
removeDataBase() 从数据库连接列表中删除数据库连接名称
open() 使用当前连接值打开数据库连接。成功回报;否则返回 
close() 关闭连接
isValid() 是否为有效的驱动        
exec()

在数据库上执行 SQL 语句并返回 QSQLQuery对象

lastError() 返回最后一个错误
driver() 返回用于访问数据库连接的数据库驱动程序
drivers() 返回全部可用的驱动
commit() 提交事务

1.返回可用的数据库驱动:

    QSqlDatabase db;
    qDebug()<<db.drivers();

 2.创建一个数据库连接

连接 SQL Server的话可以点击该链接,这位大佬总结的比较详细:

Qt与SQL server的连接使用_YJin_Woo的博客-CSDN博客_qt sql serverchaungjian

以下为我总结上面大佬的笔记:

  1. 先创建数据库,然后创建相应的表
  2. 点击安全性
    1. 创建一个新的登录名,设置好登录名和密码
    2. 点击用户映射,选择项目中使用的数据库,点击确定
    3. 右键点击新的登录名,然后点击属性,选择数据库角色
  3. 创建一个ODBC
    1. 电脑上搜索ODBC,点击添加,选择SQL Server,然后设置名称和服务器,描述的话可有可无。名称的话可以随便起一个,服务器的话就是你登录SQL Server的账户

     设置完后进入该页面:填入在安全性中创建的登录名和密码

    之后直确定就可以。

在QT上进行连接:

首先要在pro文件中添加QT+=sql

在main文件中添加以下代码:


    QSqlDatabase db=QSqlDatabase::addDatabase("QODBC");//设置数据库驱动 这里使用的是SQL Server
    db.setHostName("127.0.0.1");//设置主机名称,本地主机为127.0.0.1
    db.setDatabaseName("1234");//添加数据源,在ODBC中添加的
    db.setUserName("aaa");//登录名称,在SQL Server中添加的登录名
    db.setPassword("123456");//密码,在SQL Server中添加的登录名的密码
    if(!db.open())
    {
        qDebug()<<"打开失败";
    }
    else
    {
        qDebug()<<"打开成功";
    }

在我这里测试成功:

 移除数据库连接

  • 首先使用 close()函数关闭连接
  • 再使用removeDataBase()函数进行删除

使用QSqlQuery对数据库进行操作:

QSqlQuery 封装了从再QSqlDataBase 上执行的 SQL 查询中创建、导航和检索数据所涉及的功能。它可用于执行 DML(数据操作语言)语句,例如 、 和 ,以及 DDL(数据定义语言)语句

构造函数:

 常用的函数:

exec() 执行SQL语句(执行成功返回true)
prepare() 准备要执行的 SQL 查询查询
addBindValue() 使用位置值绑定时,将值 val 添加到值列表中。addBindValue() 调用的顺序决定了值将在准备好的查询中绑定到哪个占位符。
bindValue() 设置占位符的值
at() 获取当前位置
clear() 清除结果集并释放相关资源
execBatch() 批量执行以前准备好的 SQL 查询
frist() 返回第一条数据
last() 返回最后一条数据
isSelect() 判断是否是查询语句
isValid() 查询的是否是有效数据
lastQuery() 返回当前查询的文本
next() 检索下一条记录
size() 返回结果的大小()行数
value() 返回当前记录中字段的索引值

创建一个QSqlQuery对象并执行一条语句:

 创建一个QSqlQuery对象时,可以指定是哪一个数据库,不指定的话使用默认连接。

 创建一个Person表:

    QSqlQuery query;
    query.exec("create table Person("
               "id int identity(1000,1) primary key  not null,"
               "name char(10)not null,"
               "pnumber int not null,"
               "age int not null,"
               "height int not null,)");

 在表中添加数据:

    QSqlQuery query;
    query.exec("insert into Person"
               "value('王',123456,12,150),('赵',456789,15,160)");

 遍历整个结果:

    if(query.exec("select * from Person"))//如果查询成功
    {
        while(query.next())
        {
            //每一条记录有5个数据使用value(0-4)来访问
            //query.value()的数据类型为QVariant,输出数据时需要强制转换
            qDebug()<<query.value(0).toInt();
            qDebug()<<query.value(1).toString();
            qDebug()<<query.value(2).toInt();
            qDebug()<<query.value(3).toInt();
            qDebug()<<query.value(4).toInt();
        }
    }

 定位:

  • frist()第一条数据
  • last()最后一条数据
  • seek(int n)定位到第n条数据    位置从0开始计算

获取第一条数据:

    QSqlQuery query;
    query.exec("select * from Person");
    query.first();//获取第一条数据
    qDebug()<<query.value(0).toInt();
    qDebug()<<query.value(1).toString();
    qDebug()<<query.value(2).toInt();
    qDebug()<<query.value(3).toInt();
    qDebug()<<query.value(4).toInt();

 获取最后一条数据:

    QSqlQuery query;
    query.exec("select * from Person");
    query.last();//获取最后一条数据
    qDebug()<<query.value(0).toInt();
    qDebug()<<query.value(1).toString();
    qDebug()<<query.value(2).toInt();
    qDebug()<<query.value(3).toInt();
    qDebug()<<query.value(4).toInt();

使用seek()定位:

    QSqlQuery query;
    query.exec("select * from Person");
    query.seek(1);//获取第2条数据
    qDebug()<<query.value(0).toInt();
    qDebug()<<query.value(1).toString();
    qDebug()<<query.value(2).toInt();
    qDebug()<<query.value(3).toInt();
    qDebug()<<query.value(4).toInt();

 使用prepare()函数来进行准备执行语句:

  • 名称绑定   占位符格式为     :XXX    一定要加:
    • 使用bindValue()来设置值
  • 位置绑定   使用?来表示
    • ​​​​​​​使用addBindValue()来设置值

名称绑定:

    query.prepare("insert into Person values(:n1,:n2,:n3,:n4)");
    //添加数据,使用了name,number,age,height占位符
    char a[10]="李";
    int b=1234567;
    int c=16;
    int d=170;

    query.bindValue(":n1",a);
    query.bindValue(":n2",b);
    query.bindValue(":n3",c);
    query.bindValue(":n4",d);
    query.exec();//执行以上语句

 位置绑定:

    query.prepare("insert into Person values(?,?,?,?)");
    char a[10]="张";
    int b=2345678;
    int c=17;
    int d=175;

    query.addBindValue(a);
    query.addBindValue(b);
    query.addBindValue(c);
    query.addBindValue(d);
    query.exec();//执行以上语句

 批量添加数据:

  • 使用QVaiantList 存储数据
  • 使用addBindValue()添加数据
  • 使用execBatch()执行
    query.prepare("insert into Person values(?,?,?,?)");
    QVariantList list1;
    list1<<"谢"<<"宋"<<"邱";
    query.addBindValue(list1);
    QVariantList list2;
    list2<<12121212<<13131313<<14141414;
    query.addBindValue(list2);
    QVariantList list3;
    list3<<18<<19<<20;
    query.addBindValue(list3);
    QVariantList list4;
    list4<<180<<185<<190;
    query.addBindValue(list4);
    query.execBatch();//执行以上语句

 在Qt数据库中使用事务:

  • hasFeature()检测是否支持事务
  • transaction()启动一个事务
  • commit()提交
  • rollback()回滚

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt中的数据库(简单使用) 的相关文章

随机推荐

  • 华东地区响应最快的DNS服务排名

    223 5 5 5 阿里DNS 约 29 ms 114 114 115 115 114DNS 约 30 ms 114 114 115 119 114DNS 约 30 ms 114 114 114 114 114DNS 约 31 ms 114
  • OpenGL学习脚印: 环境搭建

    写在前面 如果你正在阅读本文 那么你和我一样可能喜欢图形学或者游戏编程 想尝试编写自己的图形App 图形学的初学者往往非常着急 希望能立即编写出丰富生动 逼真又富有交互性的3D应用 至少我是这样 笔者翻看了图形学教材 红宝书 3D数学基础等
  • 【Shiro】SpringBoot继承Shiro

    项目版本 springboot2 x shiro 1 3 2 Maven配置
  • 【OLAP(联机分析处理)】简单理解

    OnLine Analysis Processing 联机分析处理 功能 支持复杂的分析操作 侧重决策支持 并且提供直观易懂的查询结果 原理 OLAP联机分析首先是把数据预处理成数据立方 Cube 并把有可能的汇总都预先算出来 即预聚合处理
  • android卸载应用程序代码,android-关闭应用程序并从最近的应用程序中删除/

    我的解决方案基于上述的guest 以及下面的gilsaints88的评论 用于Android L兼容性 将此活动添加到您的AndroidManifest xml文件中 android name com example ExitActivit
  • Linux下安装mysql5.7.25,rpm安装方式保姆级教程!

    目录 前言 一 下载mysql5 7 25rpm安装压缩包 1 进入mysql官网的下载主页MySQL 2 进入社区下载 3 找到社区版服务器 4 进入历史版本库找到目标版本 二 检查并卸载已有的MySQL数据库 三 解压安装MySQL5
  • K8s(kubernetes)集群搭建及dashboard安装、基础应用部署

    基础介绍 概念 本质是一组服务器集群 在集群每个节点上运行特定的程序 来对节点中的容器进行管理 实现资源管理的自动化 功能 自我修复 弹性伸缩 服务发现 负载均衡 版本回退 存储编排 组件 控制节点 master 控制平面 APIserve
  • 解决VScode中无法激活conda虚拟环境的问题

    1 点击 终端 gt 新建终端 2 默认新建的终端是PowerShell 我们可以对其进行修改 3 此时进入cmd模式 就可以正常激活虚拟环境啦
  • 活动代码页简介

    代码页是字符集编码的别名 也有人称 内码表 早期 代码页是IBM称呼电脑BIOS本身支持的字符集编码的名称 当时通用的操作系统都是命令行界面系统 这些操作系统直接使用BIOS供应的VGA功能来显示字符 操作系统的编码支持也就依靠BIOS的编
  • 考虑设备动作损耗的配电网分布式电压无功优化(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 文献来源 摘要 电压无功控制是保证配电网经
  • Acwing 282. 石子合并

    区间DP循环一般是 区间长度从小到大来循环 然后再循环区间的左端点 然后再枚举我们的决策 f i j 表示将所有第i堆石子到第j堆石子合并成一堆石子的合并方式 这些方式中代价的最小值 我们可以以最后一次合并的分界线来划分集合 k i j 1
  • el-table使用时,获取index索引

    因为本人对vue不熟悉 特此记录开发时遇到的这个问题 1 获取表格列的索引 2 table选项卡点击事件
  • C++ Primer 学习笔记 第五章 语句

    C 中大多语句以分号 结束 一个表达式 如ival 5 末尾加上分号就变成了表达式语句 表达式语句的作用是执行表达式并丢弃掉求值结果 ival 5 一条没什么用的表达式语句 cout lt lt ival 一条有用的表达式语句 最简单的语句
  • PHPStudy介绍、下载与安装

    介绍 phpStudy是一个PHP调试环境的程序集成包 该程序包集成最新的 Apache PHP MySQL phpMyAdmin ZendOptimizer 一次性安装 无须配置即可使用 是非常方便 好用的PHP调试环境 下载地址 php
  • GunPG使用教程(含密钥生成删除以及文件加密解密签名)

    GunPG是一个开源免费的加密解密的GPG软件 使用命令行 在Windows Linux macOS Android等平台上都有 如果Mac平台需要可视化的操作方式 那么可以使用GPGTools 是一款收费的商业软件 官网地址是 https
  • android监听输入框光标,EditText光标的移动

    在做项目时 我们可能会遇到当输入框的内容变化后让光标自动显示在下一个输入框 这样就省去了手工的点击 从而提高了效率 requestFocus 获取焦点 即光标的显示 setOnFocusChangeListener 监听EditText焦点
  • 使用Vuepress自动生成markdown的目录时,一旦标题有数字时便无法跳转的问题解决

    问题描述 最近在用vuepress写网页文档的时候发现了一个问题 就是我用markdown书写的标题中如果有类似 1 2 XXX 的标题时 当使用官方文档给出的 toc 自动生成目录时 最终生成的网页 含有数字的标题是无法跳转到相应位置的
  • 竞赛 基于机器视觉的银行卡识别系统 - opencv python

    1 前言 优质竞赛项目系列 今天要分享的是 基于深度学习的银行卡识别算法设计 该项目较为新颖 适合作为竞赛课题方向 学长非常推荐 更多资料 项目分享 https gitee com dancheng senior postgraduate
  • 跟着代码随想录练算法——二叉树(JS)(上)

    跟着代码随想录练算法 二叉树 144 二叉树的前序遍历 https leetcode cn problems binary tree preorder traversal 145 二叉树的后序遍历 https leetcode cn pro
  • Qt中的数据库(简单使用)

    在Qt中支持对数据库的操作 Qt中数据库的类有 驱动层 为具体的数据库和SQL接口层之间提供底层的桥梁 SQL层 提供对数据库的访问 QSqlDateBase类用来创建连接 QSqlQuery可以使用SQL语句实现交互 用户接口层 实现将数