QT SQL框架及QSqlDatabase类

devtools/2025/2/22 10:40:48/

1、概述

本文对QT的SQL模块进行了整理,可供新同事参考,Qt SQL模块提供数据库编程的支持,MySQL、Oracle、MS SQL Server、SQlite等,作者未来的工作的其中一个接口将是QT接口。

Qt SQL模块包含多个类,实现数据库的连接,SQL语句执行,数据获取与界面显示等,方便的实现数据的显示和操作。

使用框架需要包含语句:#include <QtSql>;使用Qt接口需要添加对应数据库驱动

2、QT SQL模块的主要类

QT的SQL框架主要包含以下的主要类:

类名称

功能描述

QSqlDatabase

用于建立与数据库的连接。

QSqlDriver

用于访问具体的SQL数据库的底层抽象类。

QSqlDriverCreator

为某个具体的数据库驱动提供SQL驱动的模板类。

QSqlDriverCreatorBase

所有SQL驱动器的基类。

QSqlDriverPlugin

用于定制QSqlDriver插件的抽线基类。

QSqlError

SQL数据库错误信息,用于访问上一次出错的信息。

QSqlField

操作数据表或视图(View)字段的类。

QSqlIndex

操作数据库索引的类。

QSqlQuery

执行各种SQL语句的类。

QSqlQueryModel

SQL查询结果数据的只读模型(data model),用于SELECT查询结果数据记录的只读显示。

QSqlRecord

数据记录操作的类。

QSqlRelation 

存储SQL外键信息的类,用于QSqlRelationTableModel数据源中设置代码字段与关联数据表的关系。

QSqlRelationalDelegate 

用于QSqlRelationTableModel的一个代码字段的显示和编辑代理组件,一般是一个QComboBox组件,下拉列表中自动填充代码表的代码字段对应的实际内容。

QSqlRelationalTableModel

用于一个数据表的可编辑的数据模型,支持代码字段外键。

QSqlResult

访问SQL数据库的抽象接口。

QSqlTableModel

编辑一个单一数据表的数据模型类。

QDataWidgetMapper

用于界面组件与字段之间实现映射,实现字段内容自动显示的类。

3、QSqlDatabase

使用方法:#include <QSqlDatabase>

方法

功能描述

备注

QSqlDatabase();

构造函数,创建一个空的、无效的QSqlDatebasedioxide

QSqlDatabase(const QSqlDatabase &other);

构造函数,创建other的副本

~QSqlDatabase();

析构函数,销毁对象并释放所有分配的资源

注意:当最后一个连接被销毁时,析构函数隐式调用close()来释放数据库连接

QSqlDatabase &operator=(const QSqlDatabase &other);

等号运算符重载

bool open();

使用当前连接值打开数据库连接,成功时返回true;否则返回false,可以使用lastError()检索错误信息

bool open(const QString& user, const QString& password);

这是一个重载函数,使用给定的用户名和密码打开数据库连接,成功时返回true;否则返回false,可以使用lastError()函数检索错误信息,此功能不存储给定的密码,相反,密码被直接传递给驱动程序以打开连接,然后被丢弃。

void close();

关闭数据库连接,释放所有获取的资源,并使与数据库一起使用的任何现有的QSqlQuery对象无效,这也将影响该QSqlDatabase对象的副本

bool isOpen() const;

如果数据库连接当前打开,则返回true,否则返回false

bool isOpenError() const;

如果打开数据库连接时出错,则返回true,否则返回false,可以使用lastError()函数检索错误信息

QStringList tables(QSql::TableType type = QSql::Tables) const;

返回由参数类型指定的数据库表、系统表和视图的列表

QSqlIndex primaryIndex(const QString& tablename) const;

返回表tablename的主索引,如果不存在主索引,将返回一个空的QSqlIndex

注意:如果表在创建时没有被引用,某些驱动程序,如QPSQL驱动程序,可能会要求您以小写形式传递表名

QSqlRecord record(const QString& tablename) const;

返回一个由tablename表(或视图)中所有字段的名称填充的QSqlRecord,字段在记录中出现的顺序未定义,如果不存在这样的表(或视图),将返回一个空记录

注意:如果表在创建时没有被引用,某些驱动程序,如QPSQL驱动程序,可能会要求您以小写形式传递表名

QSqlQuery exec(const QString& query = QString()) const;

在数据库上执行一条SQL语句,并返回一个QSqlQuery对象,使用lastError()检索错误信息,如果查询为空,将返回一个空的无效查询,并且lastError()不受影响

QSqlError lastError() const;

返回数据库上发生的最后一个错误的信息,QSqlQuery::lastError()报告与单个查询结合发生的失败

bool isValid() const;

如果QSqlDatabase是有效的驱动程序,则返回true

bool transaction();

如果驱动程序支持事务,则在数据库上开始事务,如果操作成功,则返回true,否则返回false

bool commit();

如果驱动程序支持事务,并且transaction() 已启动,则向数据库提交事务。如果操作成功,则返回true,否则返回false

注意:对于某些数据库,如果有使用数据库进行选择的活动查询,提交将失败并返回false,在提交之前,使查询处于非活动状态

bool rollback();

如果驱动程序支持事务,并且transaction() 已启动,则回滚数据库上的事务,如果操作成功,则返回true,否则返回false

注意:对于某些数据库,如果有使用数据库进行选择的活动查询,回滚将失败并返回false,在执行回滚之前,使查询处于非活动状态,调用lastError()获取有关错误的信息

void setDatabaseName(const QString& name);

将连接的数据库名称设置为name,若要生效,必须在打开连接之前设置数据库名称,或者,您可以close()连接,设置数据库名称,然后再次调用open()。

注意:数据库名不是连接名,连接名称必须在连接对象创建时传递给addDatabase(),对于QSQLITE驱动程序,如果指定的数据库名称不存在,那么它将为您创建文件,除非设置了

void setUserName(const QString& name);

将连接的用户名设置为name,若要生效,必须在连接打开之前设置用户名,或者,您可以colse()连接,设置用户名,然后再次调用open(),没有默认值

void setPassword(const QString& password);

将连接密码设置为password,要生效,必须在连接打开之前设置密码,或者,您可以colse()连接,设置密码,然后再次调用open(),没有默认值

警告:该函数将密码以纯文本形式存储在Qt中,使用以密码为参数的open()调用来避免这种行为

void setHostName(const QString& host);

将连接的主机名设置为host,要生效,必须在连接打开之前设置主机名,或者,您可以close()连接,设置主机名,然后再次调用open(),没有默认值

void setPort(int p);

将连接的端口号设置为port,为了生效,必须在连接打开之前设置端口号,或者,您可以close()连接,设置端口号,然后再次调用open(),没有默认值

void setConnectOptions(const QString& options = QString());

设置数据库特定的选项,这必须在连接打开之前完成,否则没有效果,另一种可能是关闭连接,调用QSqlDatabase::setConnectOptions(),然后再次open()连接

注意:选项字符串的格式是以分号分隔的选项名称或选项=值对列表,选项取决于所使用的数据库客户端

QString databaseName() const;

返回连接的数据库名称,该名称可能为空

注意:数据库名不是连接名。

QString userName() const;

返回连接的用户名,它可能是空的

QString password() const;

返回连接的密码,如果密码不是用setPassword()设置的,如果密码是在open()调用中给出的,或者如果没有使用密码,将返回一个空字符串

QString hostName() const;

返回连接的主机名;它可能是空的

QString driverName() const;

返回连接的驱动程序名称

int port() const;

返回连接的端口号,如果端口号尚未设置,则该值未定义

QString connectOptions() const;

返回用于此连接的连接选项字符串,字符串可能为空

QString connectionName() const;

返回连接名称,该名称可能为空

注意:连接名不是数据库名

void setNumericalPrecisionPolicy(QSql::NumericalPrecisionPolicy precisionPolicy);

将在此数据库连接上创建的查询使用的默认数字精度策略设置为precisionPolicy

注意:不支持获取低精度数值的驱动程序将忽略精度策略,您可以使用QSqlDriver::hasFeature()来查找驱动程序是否支持此功能
注意:将默认精度策略设置为precisionPolicy不会影响任何当前活动的查询

QSql::NumericalPrecisionPolicy numericalPrecisionPolicy() const;

返回数据库连接的当前默认精度策略

QSqlDriver* driver() const;

返回用于访问数据库连接的数据库驱动程序

static QSqlDatabase addDatabase(const QString& type,const QString& connectionName = QLatin1String(defaultConnection));

使用驱动程序类型和连接名称connectionName,将数据库添加到数据库连接列表中,如果已经存在一个名为connectionName的数据库连接,该连接将被删除

注意:这个函数是线程安全的

static QSqlDatabase addDatabase(QSqlDriver* driver,const QString& connectionName = QLatin1String(defaultConnection));

当您想要使用自己实例化的驱动程序创建数据库连接时,此重载非常有用,它可能是您自己的数据库驱动程序,或者您可能只需要自己实例化一个Qt驱动程序,如果这样做,建议您在应用程序中包含驱动程序代码。

static QSqlDatabase cloneDatabase(const QSqlDatabase &other, const QString& connectionName);

克隆其他数据库连接,并将其存储为连接名称,原始数据库中的所有设置,例如databaseName(),hostName()等等都是复制过来的,如果其他数据库无效,则不执行任何操作,返回新创建的数据库连接。

注意:新连接没有打开,使用此新连接之前,您必须调用open()

static QSqlDatabase database(const QString& connectionName = QLatin1String(defaultConnection),bool open = true);

这是一个返回名为connectionName的数据库连接,数据库连接必须是以前用addDatabase()添加的,如果“打开”为true (the default),并且数据库连接尚未打开,则它现在已打开,如果未指定连接名称,则使用默认连接,如果数据库列表中不存在连接名,则返回无效连接重载函数,克隆其他数据库连接,并将其存储为连接名称,原始数据库中的所有设置,例如databaseName(),hostName()等等都是复制过来的,如果其他数据库无效,则不执行任何操作,返回新创建的数据库连接

注意:新连接没有打开,在使用此新连接之前,您必须调用open();当将另一个线程中的数据库克隆到由其他线程表示的数据库所使用的线程时,此重载非常有用。

static void removeDatabase(const QString& connectionName);

从数据库连接列表中删除数据库连接连接名称

警告:调用此函数时,数据库连接上不应有打开的查询,否则将发生资源泄漏

static bool contains(const QString& connectionName = QLatin1String(defaultConnection));

如果数据库连接列表包含连接名称,则返回true否则返回false

static QStringList drivers();

返回所有可用数据库驱动程序的列表

static QStringList connectionNames();

返回包含所有连接名称的列表

static void registerSqlDriver(const QString &name, QSqlDriverCreatorBase *creator);

这个函数在SQL框架中注册一个名为name的新的SQL驱动程序,如果您有一个自定义的SQL驱动程序,并且不想将其编译为插件,这很有用

static bool isDriverAvailable(const QString &name);

如果名为的驱动程序可用,则返回true,否则返回false


http://www.ppmy.cn/devtools/160921.html

相关文章

C++17中的std::scoped_lock:简化多锁管理的利器

文章目录 1. 为什么需要std::scoped_lock1.1 死锁问题1.2 异常安全性1.3 锁的管理复杂性 2. std::scoped_lock的使用方法2.1 基本语法2.2 支持多种互斥锁类型2.3 自动处理异常 3. std::scoped_lock的优势3.1 避免死锁3.2 简化代码3.3 提供异常安全保证 4. 实际应用场景4.1 数据…

【Python爬虫(37)】解锁分布式爬虫:原理与架构全解析

【Python爬虫】专栏简介&#xff1a;本专栏是 Python 爬虫领域的集大成之作&#xff0c;共 100 章节。从 Python 基础语法、爬虫入门知识讲起&#xff0c;深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑&#xff0c;覆盖网页、图片、音频等各类数据爬取&#xff…

计算机视觉算法实战——图像合成(主页有源码)

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​ ✨✨1. 图像合成领域简介✨✨ 图像合成是计算机视觉中的一个重要研究方向&#xff0c;旨在通过算法生成或修改图像内容。图像合成技术广泛应…

DOS网络安全

ping -t 不间断地ping目标主机&#xff0c;直到用户用ctrlc键强行终止。经常用来排除网络故障 -l 定制ping信息包的容量,最大上限是65500字节 -n 向远程主机发送的数据 包个数&#xff0c;默认是4。 语法&#xff1a; ping 参数 IP地址 netstat -a 显示所有连接…

基于eBPF的全栈可观测性系统:重新定义云原生环境诊断范式

引言&#xff1a;突破传统APM的性能桎梏 某头部电商平台采用eBPF重构可观测体系后&#xff0c;生产环境指标采集性能提升327倍&#xff1a;百万QPS场景下传统代理模式CPU占用达63%&#xff0c;而eBPF直采方案仅消耗0.9%内核资源。核心业务的全链路追踪时延从900μs降至18μs&a…

搜索引擎快速收录:关键词布局的艺术

搜索引擎快速收录中的关键词布局&#xff0c;是一项既精细又富有策略性的工作。以下是对关键词布局艺术的详细阐述&#xff1a; 一、关键词布局的重要性 关键词布局影响着后期页面是否被收录&#xff0c;以及网站在搜索引擎中的排名。合理的关键词布局能够提升网站的可见性&a…

从0-1搭建mac环境最新版

从0-1搭建mac环境 先查看自己的芯片信息 bash uname -mbash-3.2$ uname -m arm64这里是自己的型号安装brew xcode-select --install xcode-select -p /bin/zsh -c “$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)” source /Users/lanren/.…