Qt扫盲-QSqlDatabase理论总结

news2024/11/26 0:37:23

QSqlDatabase理论总结

  • 一、概述
  • 二、使用
    • 1. 连接数据库
    • 2. 数据库驱动
    • 3. 自定义数据驱动使用
    • 4. 注意事项
  • 三、常用的功能

一、概述

QSqlDatabase类提供了通过连接访问数据库的接口。QSqlDatabase的一个实例表示一个数据库连接对象。该连接是通过Qt支持的数据库驱动程序来对数据库的访问,这种数据库驱动程序派生自QSqlDriver。

我们也可以从QSqlDriver继承自己的数据库驱动程序。但这个我还没用过,但是我见过已经有人用过的,当然有官方的源码就可以看看是咋实现的就好啦。

二、使用

1. 连接数据库

QSqlDatabase 我看官方推荐的就是用静态函数的方式来进行生成对象的。通过调用一个静态 addDatabase() 函数创建一个连接(即,QSqlDatabase的一个实例),其中指定要使用的驱动程序或驱动程序类型(取决于数据库类型)和连接名称。看这个函数声明

  • QSqlDatabase QSqlDatabase::addDatabase(QSqlDriver *driver, const QString &connectionName = QLatin1String(defaultConnection))

一个连接可以通过它自己的名称,也就是connectionName而不是它所连接的数据库的名称来知道。 一个数据库可以有多个连接。QSqlDatabase还支持默认连接的概念,即未命名连接。要创建默认连接,在调用addDatabase()时不要传递连接名称参数。随后,如果调用任何静态成员函数而没有指定连接名称,则假定使用默认连接。但是如果我们有多个连接的时候,就需要指定每一个连接的 connectionName,不然可能会出那个错 QSqlQuery::exec: database not open 我之前就是遇到这个错误的。

下面的代码片段展示了如何创建和打开到PostgreSQL数据库的默认连接:

QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL");
db.setHostName("acidalia");	
db.setDatabaseName("customdb");
db.setUserName("mojito");
db.setPassword("J0a1m8");
bool ok = db.open();

创建QSqlDatabase对象后,使用设置连接参数。

  • setDatabaseName() :就是设置使用哪个数据库
  • setUserName():数据库用户名
  • setPassword():密码
  • setHostName():数据库的位置,可以是ip也可以是文件
  • setPort():通信端口
  • setConnectOptions():其他连接属性,可以不设置这个

然后调用open()来激活到数据库的物理连接。在您打开连接之前,连接是不可用的。
上面定义的连接将是默认连接,因为我们没有给addDatabase()提供连接名称。随后,你可以调用database(),不带连接名参数,得到默认连接:

QSqlDatabase db = QSqlDatabase::database();

可以看看我之前的连接 SQLsever数据库的一个博客:Qt 连接并使用 SQL Sever数据库

2. 数据库驱动

创建一个使用类型引用的驱动程序的QSqlDatabase连接。如果无法识别该类型,则数据库连接将没有任何功能。
目前可用的驱动程序类型有:

Driver TypeDescription
QDB2IBM DB2 :就是 IBM 公司的 DB2数据库驱动
QIBASEBorland InterBase Driver
QMYSQLMySQL 驱动
QOCIOracle Call Interface Driver:Oracle 驱动
QODBCODBC Driver (includes Microsoft SQL Server) :ODBC的基本思想是为用户提供简单、标准、透明的数据库连接的公共 编程接口,其他数据库驱动基本上都是可用
QPSQLPostgreSQL 驱动
QSQLITESQLite version 3 or above
QSQLITE2SQLite version 2
QTDSSybase Adaptive Server

3. 自定义数据驱动使用

  • QSqlDatabase QSqlDatabase::addDatabase(QSqlDriver *driver, const QString &connectionName = QLatin1String(defaultConnection))

如果想使用自己实例化的驱动程序创建数据库连接时,上面的重载非常有用。它可能是我们自己的数据库驱动程序,或者需要自己实例化其中一个Qt驱动程序。如果这样做,建议在应用程序中包含驱动程序代码。例如,你可以用你自己的QPSQL驱动程序创建一个PostgreSQL连接,如下使用的是标准的数据库驱动所示:

  • 注意:我们假设qtdir是Qt安装的目录。这将引入使用PostgreSQL客户端库和实例化QPSQLDriver对象所需的代码,假设您的包含搜索路径中有PostgreSQL头文件。
#include "qtdir/src/sql/drivers/psql/qsql_psql.cpp" //这个位置在我的Qt 5.14.2 的位置在下图

PGconn *con = PQconnectdb("host=server user=bart password=simpson dbname=springfield");
QPSQLDriver *drv =  new QPSQLDriver(con);
QSqlDatabase db = QSqlDatabase::addDatabase(drv); // becomes the new default connection
QSqlQuery query;
query.exec("SELECT NAME, ID FROM STAFF");
...

下面就是源码中Qt官方数据库的驱动源码,也就是上面 include的位置
在这里插入图片描述

上面的代码设置了一个PostgreSQL连接并实例化了一个QPSQLDriver对象。接下来,调用addDatabase()将连接添加到已知的连接中,以便Qt SQL类可以使用它。当使用连接句柄(或一组句柄)实例化一个驱动程序时。

请记住,必须将应用程序链接到数据库客户端库。确保数据库驱动库在链接器的搜索路径中,当然这个是使用自定义的库才需要,使用Qt提供的驱动就不用啦,并在你的.pro文件中添加如下行:

unix:LIBS += -lpq
win32:LIBS += libpqdll.lib

所描述的方法适用于所有提供的驱动程序。唯一的区别在于驱动构造函数的参数。下面是Qt中包含的驱动程序及其源代码文件和构造函数参数的表格。

驱动名类名构造参数需要包括的cpp
QPSQLQPSQLDriverPGconn *connectionqsql_psql.cpp
QMYSQLQMYSQLDriverMYSQL *connectionqsql_mysql.cpp
QOCIQOCIDriverOCIEnv *environment, OCISvcCtx *serviceContextqsql_oci.cpp
QODBCQODBCDriverSQLHANDLE environment, SQLHANDLE connectionqsql_odbc.cpp
QDB2QDB2SQLHANDLE environment, SQLHANDLE connectionqsql_db2.cpp
QTDSQTDSDriverLOGINREC *loginRecord, DBPROCESS *dbProcess, const QString &hostNameqsql_tds.cpp
QSQLITEQSQLiteDriversqlite *connectionqsql_sqlite.cpp
QIBASEQIBaseDriverisc_db_handle connectionqsql_ibase.cpp

4. 注意事项

QSqlDatabase是一个值类。通过QSqlDatabase的一个实例对数据库连接所做的更改将影响表示相同连接的其他QSqlDatabase实例。使用cloneDatabase()在现有数据库的基础上创建一个独立的数据库连接。

最好将QSqlDatabase的副本作为类的成员保存,因为这将防止在关闭时正确清除实例。如果需要访问已存在的QSqlDatabase,应该使用database()来访问。 如果选择使用QSqlDatabase成员变量,则需要在删除QCoreApplication实例之前删除该成员变量,否则可能导致未定义的行为。

如果创建多个数据库连接,请在调用addDatabase()时为每个连接指定唯一的连接名。使用database()和连接名来获取该连接。使用removeDatabase()和连接名来删除连接。如果您试图删除由其他QSqlDatabase对象引用的连接,QSqlDatabase将输出警告。使用contains()检查指定的连接名是否在连接列表中。

三、常用的功能

函数名含义
tables()返回数据库的所有表
primaryIndex()返回一个表的主键
record()返回表字段的元信息
transaction()启动事务
commit()保存并完成所有操作
rollback()回滚取消操作
lastError()返回关于上次错误的信息
drivers()返回可用SQL驱动程序的名称
isDriverAvailable()检查是否有特定的驱动程序可用
registerSqlDriver()注册一个定制的驱动程序

注意:QSqlDatabase::exec()已弃用。请改用QSqlQuery::exec()。
注意:当使用事务时,必须在创建查询之前开始事务。

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

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

相关文章

再学C语言26:分支和跳转——goto语句

goto语句包括两个部分:goto和一个标签名称 goto point1; 为使goto语句工作,程序中必须包含由point1标签定位的其他语句 point1: printf("hello world! \n"); // 标签 冒号 一条语句 示例代码: /* test of goto */ #include &…

高一数学试题-2022年秋期末试卷

一、选择题 已知集合A{x∈N∣−2<x<52}A \{x \in \mathbf{N}| -2 < x < \frac{5}{2}\}A{x∈N∣−2<x<25​}&#xff0c;B{−2,−1,0,1,2,4}B \{-2, -1, 0, 1, 2, 4\}B{−2,−1,0,1,2,4}&#xff0c;则A∩BA \cap BA∩B A. {−1,0,1,2}\{-1, 0, 1, 2\}{−…

什么是AI预训练模型?

什么是预训练模型? 预训练 AI 模型是一种深度学习模型&#xff0c;在大型数据集上进行训练以完成特定任务&#xff0c;它可以按原样使用或定制以满足多个行业的应用需求。 想象一下&#xff0c;试图教一个蹒跚学步的孩子什么是独角兽。 一个好的起点可能是展示该生物的子图像…

[NOIP2017 提高组] 奶酪(C++,并查集)

题目背景 NOIP2017 提高组 D2T1 题目描述 现有一块大奶酪&#xff0c;它的高度为 hhh&#xff0c;它的长度和宽度我们可以认为是无限大的&#xff0c;奶酪中间有许多半径相同的球形空洞。我们可以在这块奶酪中建立空间坐标系&#xff0c;在坐标系中&#xff0c;奶酪的下表面…

用纯C实现单链表

前言 什么是单链表&#xff1f;链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。链表的创建 需要创建一个小项目工程 创建三个文件 ⭐SListNode.h放单链表的头文件&#xff0c;函数声明 ⭐SListNode.c放单…

springcloud之Gateway服务网关

1.Gateway服务网关 Spring Cloud Gateway 是 Spring Cloud 的一个全新项目&#xff0c;该项目是基于 Spring 5.0&#xff0c;Spring Boot 2.0 和 Project Reactor 等响应式编程和事件流技术开发的网关&#xff0c;它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式…

游戏行业(北区)客户沙龙丨阿里云用户组北京站

2022 年 8 月 30 日&#xff0c;阿里云在北京举办了第 9 场阿里云用户组&#xff08;AUG&#xff09;活动&#xff0c;活动主题为“游戏行业&#xff08;北区&#xff09;客户沙龙”吸引了众多技术从业者及企业管理者来到现场交流分享。 通过本次活动&#xff0c;参会企业在不同…

Java探针技术详解

简介 在JVM中运行中&#xff0c;类是通过classLoader加载.class文件进行生成的。在类加载器加载.class文件生成对应的类对象之前时&#xff0c;我们可以通过修改.class文件内容&#xff08;就是字节码修改技术&#xff09;&#xff0c;达到修改类的目的。JDK提供了对字节码进行…

rhel配置zfs

rhel配置zfs环境声明ZFS简介ZFS块指针的结构ZFS的存储池布局rhel8/rhel9安装zfs始终在启动时加载OpenZFS模块开机自启zfs服务zfs基本操作查看磁盘创建pool和ZFS文件系统创建一个存储池设置zfs挂载点为多个用户创建起始目录向池中添加更多空间修改文件系统名称删除文件系统修改存…

数据库的存储引擎和事务

Mysql默认使用INNODB存储引擎 数据库中的各表均被&#xff08;在创建表时&#xff09;指定的存储引擎来处理。 服务器可用的引擎依赖于以下因素&#xff1a;MySql的版本、服务器在开发时如何被配置、启动选项 为了解当前服务器中有哪些存储引擎可用&#xff0c;可使用show e…

2022 年 项目中常用的工具函数

目录1. 数字千分位化&#xff0c;支持保留小数点2. 前端生成 uuid3. 传入日期换算出是周几4. 通过计算 text-indent 偏移的负值&#xff0c;实现文字居右隐藏, 右侧对齐 ...text5. 时间格式化函数6. 防抖和节流7. 前端文件流下载8. 后端返回 无格式化时间处理为格式化 20220101…

回收租赁商城系统功能拆解03讲-商品分类

回收租赁系统适用于物品回收、物品租赁、二手买卖交易等三大场景。 可以快速帮助企业搭建类似闲鱼回收/爱回收/爱租机/人人租等回收租赁商城。 回收租赁系统支持智能评估回收价格&#xff0c;后台调整最终回收价&#xff0c;用户同意回收后系统即刻放款&#xff0c;用户微信零…

【C语言进阶】指针进阶-回调函数

作者:匿名者Unit 目录一.函数指针数组1.定义2.转移表二.回调函数1.定义2.qsort的使用3.冒泡模拟实现qsort一.函数指针数组 1.定义 在之前我们已经了解过了函数指针: int(*p)(int,int)&add;我们还可以将函数的地址存放在数组&#xff0c;也就是函数指针数组 int (*p[10…

Qt音视频开发10-ffmpeg内核硬解码

一、前言 为了极大的降低CPU的占用&#xff0c;实现硬解码&#xff08;也叫硬件加速&#xff09;非常有必要&#xff0c;一个视频文件或者一路视频流还好&#xff0c;如果增加到64路视频流呢&#xff0c;如果是4K、8K这种高分辨率的视频呢&#xff0c;必须安装上硬解码才是上上…

初始Spring

初始Spring SSM框架的老大是&#xff1a;Spring大管家&#xff0c;无处不在 Spring是应用了很多优秀的设计模式,对于项目的实现,提供了优秀的解决方案;Spring是一个轻量级(低侵入) 框架.类与类之间的解耦合 IOC控制反转 实现大管家 AOP 增强&#xff0c;面向切面编程&…

QT—QPalette调色板类

Qt提供的调色板类QPalette专门用于管理部件的外观显示&#xff0c;相当于部件或对话框的调色板&#xff0c;管理他们所有的颜色信息。每个部件都包含一个QPalette对象&#xff0c;在显示时&#xff0c;按照它的QPalette对象中对各部分各状态下的颜色的描述进行绘制。示例点击左…

C语言-数据的存储-浮点数的存储(8.2)​​​​​​​

目录​​​​​​​ 思维导图&#xff1a; 浮点型在内存中的存储 1.1一个经典的例子 1.2 浮点数存储规则 1.3实践举例 写在最后&#xff1a; 思维导图&#xff1a; 浮点型在内存中的存储 1.1一个经典的例子 #include <stdio.h>int main() {int n 9;//以整形的形式…

SHELL脚本学习 --- 第七次作业(awk)

SHELL脚本学习 — 第七次作业 思路&#xff1a; 1&#xff0c;df -h获取磁盘情况&#xff0c;先用grep过滤出根分区所属行&#xff0c;然后awk打印相应的域 2&#xff0c;首先把多个空格缩成一个&#xff0c;然后用grep找到ens160所属的IP&#xff0c;在awk中使用正则匹配inet…

C++ STL 容器类和迭代器

一、STL容器类 1.1 STL介绍 容器就是盛放东西的东西&#xff0c;这里被盛放的一般是数据对象&#xff0c;用来盛放的是容器类容器类的内核就是&#xff1a;数据结构 算法STL(Standard Template Library,标准模板库)STL从广义上分为:容器(container)算法(algorithm)迭代器(it…

在泰国旅居的第5天,我定了两个新目标

点击上方 "大数据肌肉猿"关注, 星标一起成长点击下方链接&#xff0c;进入高质量学习交流群今日更新| 1052个转型案例分享-大数据交流群我在12月14号写了2023年&#xff0c;重新扬帆起航&#xff01;&#xff0c;里面说了2023年开始全球旅居办公&#xff0c;而在元旦…