QT SQL框架及QSqlDatabase类

news/2025/2/22 22:34:49

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.niftyadmin.cn/n/5862812.html

相关文章

C语言 数据上溢

在C语言中&#xff0c;数据上溢&#xff08;overflow&#xff09;通常发生在整数运算中&#xff0c;当一个数值超出其数据类型的最大值时。例如&#xff0c;如果你有一个unsigned char类型的变量&#xff08;通常范围是0到255&#xff09;&#xff0c;当你尝试给它赋一个更大的…

推荐几款开源免费的 .NET MAUI 组件库

前言 今天大姚给大家推荐 3 款开源且免费的 .NET MAUI 组件库。 .NET MAUI介绍 .NET 多平台应用 UI (.NET MAUI) 是一个跨平台框架&#xff0c;用于使用 C# 和 XAML 创建本机移动和桌面应用。使用 .NET MAUI&#xff0c;可从单个共享代码库开发可在 Android、iOS、macOS 和 …

[GESP202406 六级] 二叉树

题目描述 小杨有⼀棵包含 n n n 个节点的二叉树&#xff0c;且根节点的编号为 1 1 1。这棵二叉树任意⼀个节点要么是白色&#xff0c;要么是黑色。之后小杨会对这棵二叉树进行 q q q 次操作&#xff0c;每次小杨会选择⼀个节点&#xff0c;将以这个节点为根的子树内所有节点…

数据结构:双链表list

list 是 C 标准库中的双向链表容器。 list初始化示例&#xff1a; #include <list>int n 7;std::list<int> lst; // 初始化一个空的双向链表 lststd::list<int> lst(n); // 初始化一个大小为 n 的链表 lst&#xff0c;链表中的值默认都为 0std::list<i…

计算机网络:应用层 —— 文件传送协议 FTP

文章目录 FTP 是什么&#xff1f;FTP 的应用FTP 的基本工作原理主动模式被动模式 总结 FTP 是什么&#xff1f; 将某台计算机中的文件通过网络传送到可能相很远的另一台计算机中&#xff0c;是一项基本的网络应用&#xff0c;即文件传送。 文件传送协议FTP&#xff08;File T…

使用Docker Desktop部署GitLab

1. 环境准备 确保Windows 10/11系统支持虚拟化技术&#xff08;需在BIOS中开启Intel VT-x/AMD-V&#xff09;内存建议≥8GB&#xff0c;存储空间≥100GB 2. 安装Docker Desktop 访问Docker官网下载安装包安装时勾选"Use WSL 2 instead of Hyper-V"&#xff08;推荐…

【MCU输入捕获模式】

MCU输入捕获模式 目录 MCU输入捕获模式引言一、基本概念二、实现原理三、应用案例四、优势与局限五、配置与注意事项&#xff08;以STM32为例&#xff09; 引言 输入捕获模式 &#xff08;Input Capture Mode&#xff09;是一种用于捕获外部输入信号变化的微控制器&#xff08…

js中 ES6 新特性详解

ES6&#xff08;ECMAScript 2015&#xff09;是 JavaScript 的一次重大更新&#xff0c;引入了许多新的特性&#xff0c;使 JavaScript 代码更加简洁、可读和高效。以下是 ES6 的主要新特性及其原理 1. let 和 const 关键字 原理解析 1.1 作用域 var 关键字的作用域&#xf…