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

news2024/10/7 4:29:19

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

Qt中数据库的类有:

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

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

一:连接数据库

常用的数据库驱动:

驱动名称数据库
QDB2IBM DB2
QIBASEBorland InterBase
QMYSQLMySQL
QOCIOracle Call Interface Driver
QODBCOpen Database Connectivity(ODBC、SQL Server)
QPSQLPostgreSQL
QSQLITE2SQLite版本2
QSQLITESQLite版本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()回滚

 

 

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

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

相关文章

36. 卷积神经网络(LeNet)

通过之前几节&#xff0c;我们学习了构建一个完整卷积神经网络的所需组件。 回想一下&#xff0c;之前我们将softmax回归模型和多层感知机模型应用于Fashion-MNIST数据集中的服装图片&#xff0c;为了能够应用softmax回归和多层感知机&#xff1a; 我们首先将每个大小为的图像…

【Web开发】Python实现Web服务器(Ubuntu下Flask使用MySQL数据库)

&#x1f37a;基于Python的Web服务器系列相关文章编写如下&#x1f37a;&#xff1a; &#x1f388;【Web开发】Python实现Web服务器&#xff08;Flask快速入门&#xff09;&#x1f388;&#x1f388;【Web开发】Python实现Web服务器&#xff08;Flask案例测试&#xff09;&a…

大数据-玩转数据-Kafka实战

一、kafka使用要点 要点一&#xff1a;Producer即生产者&#xff0c;向Kafka集群发送消息&#xff0c;在发送消息之前&#xff0c;会对消息进行分类&#xff0c;即Topic&#xff0c;topic1&#xff0c;topic2。Topic即主题&#xff0c;通过对消息指定主题可以将消息分类&#…

工具-能写会看正则表达式【强烈建议收藏!】

正则表达式,很常用的一个技能点,但是一般的开发流程中都是这样的: 需要验证数据上网搜一下正则表达式CV 搞定!!!今天有时间回看了一下文档,简单整理了一下里面需要注意的点,并且通过分析几个常见的正则表达式,下次遇到正则争取不再只依靠 CV 大法! 基础部分 基本语法 …

初识指针(9)

目录 1、指针是什么&#xff1f; 2、指针和指针类型 1、指针- 整数 2、指针的解引用 3、野指针 1、野指针成因 2、如何规避野指针 4、指针运算 1、指针- 整数 2、指针- 指针 3、指针的关系运算 5、指针和数组 6、二级指针 7、指针数组 1、指针是什么&#xff1f;…

04-Hystrix

服务熔断Hystrix 1. Hystrix是什么 分布式系统环境下&#xff0c;服务间类似依赖非常常见&#xff0c;一个业务调用通常依赖多个基础服务。如下图&#xff0c;对于同步调用&#xff0c;当库存服务不可用时&#xff0c;商品服务请求线程被阻塞&#xff0c;当有大批量请求调用库…

SpringBoot-2 读取properties;自动加载127个类原理总结;全部加载,按需配置

读取properties 方式一&#xff1a;非配置类填写&#xff1a;ComponentConfigurationProperties 1)建立bean&#xff1a; /只有在容器中的组件才拥有springboot提供的强大功能 Component ConfigurationProperties(prefix "mycar") public class Car {private Stri…

【机器学习】模型评估与选择

模型评估与选择 目录一、评估方法1、留出法2、交叉验证法3、自助法二、性能度量1、错误率与准确率2、查准率、查全率阈值对查准率、查全率的影响3、F1度量&#xff08;基于查准率与查全率的调和平均&#xff09;4、P-R Curve5、ROC CurvePRC和ROC的选用准则PRC和ROC的差异6、代…

python 中文转带音调的拼音

python 中文转带音调的拼音 前言python 中文转带音调的拼音1、1.1 安装pinyin模块1.2 试验1.3 效果图1.4 代码实现前言 今天整理中药材,每个药材上标上带音调的拼音,查了些,有的易形成乱码,如Shān Mi Dōnɡ,想到python自已动手转算了 python 中文转带音调的拼音 1、 …

(五)汇编语言——[bx]和loop指令

目录 [...]与&#xff08;...&#xff09; [...] &#xff08;...&#xff09; idata Loop指令 段前缀 总结 [...]与&#xff08;...&#xff09; [...] 这个我们其实见过&#xff0c;代表的是一个内存单元&#xff0c;段地址在DS中&#xff0c;偏移地址就是[bx]。 &am…

《图解TCP/IP》阅读笔记(第七章 7.4)—— RIP 路由信息协议

7.4 RIP RIP&#xff08;Routing Information Protocol&#xff0c;路由信息协议&#xff09;&#xff0c;是一种距离向量算法&#xff0c;广泛用于LAN。 该协议将路由控制信息定期&#xff08;30秒一次&#xff09;向全网广播。如果没有收到路由控制信息&#xff0c;连接就会…

【1739. 放置盒子】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 有一个立方体房间&#xff0c;其长度、宽度和高度都等于 n 个单位。请你在房间里放置 n 个盒子&#xff0c;每个盒子都是一个单位边长的立方体。放置规则如下&#xff1a; 你可以把盒子放在地板上的…

筛法(线性筛,厄拉多塞筛)

在前前前前前前…的博客中,我们主要谈了欧拉筛和埃氏筛. 今天我们主要来聊一聊线性筛和厄拉多塞筛(其实和埃氏筛和欧拉筛本质上没区别哎).其实在这两种筛法中厄拉多塞筛最好懂(就连本蒟蒻一看代码就明白了…别看这个名字,容易糊弄人) 首先是厄拉多塞筛"粉墨登场"::…

HRTransNet阅读理解

E. Dual-direction short connection fusion module HRFormer applies transformer blocks to enlarge receptive field of fused feature Frs, and uses exchange units to absorb the merits of multi-scales features. The process is described as: HRFormer使用TRM块来扩…

《教育的目的》笔记——如何让学生通过树木看见森林

目录 作者简介 个人感悟 经典摘录 1、学生所受的训练应该比他们最终投身的专业更为广泛 2、学习新语言用途 3、教师的责任 4、教育的主题 5、学到的有用之物 6、教育目的 7、所有事物都不是静态的、定型的&#xff0c;而是处于形成&#xff08;becoming&#xff09;过…

Merry Xmas | 用Matplotlib画个3D圣诞树送给你!~

1写在前面 Merry Christmas ! &#x1f973; 过完圣诞就要跨年了&#xff0c;希望2023年自己可以一扫霉运&#xff0c;顺顺利利&#xff01;&#xff01;&#xff01;&#x1f618; 从网上抄了个英文的祝福语送给大家&#xff08;主要是懒&#xff09;: &#x1f447; I hope S…

【Unity】VideoPlayer实现视频播放

【Unity】VideoPlayer实现视频播放 背景&#xff1a;开发影院场景需要在荧幕上播放视频 环境&#xff1a;Unity2021.3 VideoPlayer的简单使用&#xff1a;http://t.csdn.cn/K8665 局限&#xff1a;上述方法会使得视频播放窗口强制在相机前&#xff1b; 需求&#xff1a;视频播…

怎么看懂单片机时序图?

本人没有上过单片机相关的专业课&#xff0c;是在《计算机系统结构》里遇见的时序图。由于看不懂加之老师没有专门讲&#xff0c;因此自行查阅了相关的视频和博客。&#xff08;参考视频已放在文末&#xff09; 网上资源贫瘠&#xff0c;不过我也不需要太过深入的知识。 大家…

spring事物使用示例及原理总结

目录 事务示例 示例一 示例二 示例三 示例四 示例五 示例六 事务原理 EnableTransactionManagement 执行代理对象目标方法 事务示例 示例一 在test()方法直接调用abc()方法&#xff0c;并在test()方法添加Transactional&#xff0c;test()和abc()方法分别会更新id…

力扣刷题笔记day10(树的子结构+二叉树镜像+对称的二叉树)

文章目录树的子结构题目思路代码二叉树镜像题目思路代码对称的二叉树题目思路代码树的子结构 输入两棵二叉树A和B&#xff0c;判断B是不是A的子结构。(约定空树不是任意一个树的子结构) B是A的子结构&#xff0c; 即 A中有出现和B相同的结构和节点值。 题目 思路 dfs(A, B) …