【Qt】数据库SQL接口层
00. 目录
文章目录
- 00. 目录
- 01. 概述
- 02. 开发环境
- 03. QSqlDatabase类
- 04. QSqlError类
- 05. QSqlQuery类
- 06. QSqlRecord类
- 07. QSqlField类
- 08. QSqlIndex类
- 09. 附录
01. 概述
SQL接口层提供了对数据库的访问,主要类包括Qt SQL模块中的QSqlDatabase、QSqlQuery、QSqlError、QSqlField、QSqlIndex和QSqlRecord。QSqlDatabase类用于创建数据库连接,QSqlQuery用于使用SQL语句实现与数据库交互。
常用的数据库类介绍:
QSqlDatabase 连接数据库相关
QSqlError 数据库操作出错信息
QSqlQuery 执行和操作数据库相关类
QSqlRecord 封装了数据库的记录
QSqlTableModel 可编辑的模型 显示数据库单张表
02. 开发环境
Windows系统:Windows10
Qt版本:Qt5.15或者Qt6
03. QSqlDatabase类
3.1 QSqlDataBase类简介
QSqlDatabase类提供了连接访问数据库的接口,QSqlDatabase对象本身代表一个连接,连接通过QT支持的数据库驱动提供对数据库的访问。
3.2 QSqlDatabase成员函数
QSqlDatabase::QSqlDatabase(const QSqlDatabase &other)
[protected] QSqlDatabase::QSqlDatabase(const QString &type)
[protected] QSqlDatabase::QSqlDatabase(QSqlDriver *driver)
使用给定的驱动创建一个数据库连接[static] QSqlDatabase QSqlDatabase::addDatabase(const QString &type, const QString &connectionName = QLatin1String( defaultConnection ))
根据给定的数据库驱动类型type、数据库连接名connectionName 创建一个数据库连接,如果有已经存在的同名连接,则新建立连接替换旧连接;如果没有指定数据库连接名,则新建立的数据库连接将成为应用程序的默认连接。[static] QSqlDatabase QSqlDatabase::addDatabase(QSqlDriver *driver, const QString &connectionName = QLatin1String( defaultConnection ))
根据给定的数据库驱动driver、连接名connectionName 创建数据库连接[static] QSqlDatabase QSqlDatabase::cloneDatabase(const QSqlDatabase &other, const QString &connectionName)
根据数据库连接other克隆创建一个名字为connectionName的数据库连接void QSqlDatabase::close()
关闭数据库连接,释放申请的任何资源,数据库使用的任何QSqlQuery对象将无效bool QSqlDatabase::commit()
如果数据库驱动支持事务机制并且已经启动,提交事务给数据库。对于某些数据库,如果有一个使用数据库的活跃查询SELECT,提交将会失败,返回false。在提交前需要确保查询不在活跃。QString QSqlDatabase::connectOptions() const
返回连接选项使用的字符串QString QSqlDatabase::connectionName() const
返回连接名[static] QStringList QSqlDatabase::connectionNames()
返回包含所有连接的名字的链表[static] bool QSqlDatabase::contains(const QString &connectionName = QLatin1String( defaultConnection ))
如果数据库连接的链表中包含connectionName 连接,返回true[static] QSqlDatabase QSqlDatabase::database(const QString &connectionName = QLatin1String( defaultConnection ), bool open = true)
返回名字为connectionName 的数据库连接。数据库连接需事先添加,如果open为true,并且数据库连接没有打开,则调用本函数时打开连接。如果connectionName没有指定,返回默认的链接;如果connectionName不存在数据库链表中,返回非法的链接QString QSqlDatabase::databaseName() const
返回连接的数据库名字QSqlDriver *QSqlDatabase::driver() const
返回用于数据库连接访问的数据库驱动QString QSqlDatabase::driverName() const
返回连接的驱动名字[static] QStringList QSqlDatabase::drivers()
返回所有可用的数据库驱动的链表QSqlQuery QSqlDatabase::exec(const QString &query = QString()) const
在数据库执行一条SQL语句query,返回QSqlQuery对象QString QSqlDatabase::hostName() const
返回连接的主机名[static] bool QSqlDatabase::isDriverAvailable(const QString &name)
如果驱动name可用,返回truebool QSqlDatabase::isOpen() const
如果数据库连接目前打开,返回truebool QSqlDatabase::isOpenError() const
如果在打开数据库连接时发生错误,返回truebool QSqlDatabase::isValid() const
如果QSqlDatabase连接有一个合法的驱动,返回trueQSqlError QSqlDatabase::lastError() const
返回数据库发生的最后一个错误的信息QSql::NumericalPrecisionPolicy QSqlDatabase::numericalPrecisionPolicy() const
返回数据库连接当前的默认精度策略bool QSqlDatabase::open()
使用当前的连接值打开数据库连接bool QSqlDatabase::open(const QString &user, const QString &password)
使用给定的用户名和密码打开数据库连接QString QSqlDatabase::password() const
返回数据库连接的密码int QSqlDatabase::port() const
返回数据库连接的端口号QSqlRecord QSqlDatabase::record(const QString &tablename) const
返回表tablename中所有字段的名字的记录[static] void QSqlDatabase::registerSqlDriver(const QString &name, QSqlDriverCreatorBase *creator)
在SQL框架内注册新的名字为name的SQL驱动[static] void QSqlDatabase::removeDatabase(const QString &connectionName)
从数据库连接链表中删除名字为connectionName的数据库连接bool QSqlDatabase::rollback()
回滚操作,中止数据库上的一件事务void QSqlDatabase::setConnectOptions(const QString &options = QString())
设置数据库指定选项,必须在连接打开之前或是连接失效时完成void QSqlDatabase::setDatabaseName(const QString &name)
设置连接的数据库名字为name,为了生效,必须在连接被打开前设置。void QSqlDatabase::setHostName(const QString &host)
设置连接的主机名为host,为了生效,必须在连接被打开前设置。void QSqlDatabase::setNumericalPrecisionPolicy(QSql::NumericalPrecisionPolicy precisionPolicy)
在创建的数据库连接上设置默认的数字精度策略,用于查询。在当前活跃的查询上设置将无效void QSqlDatabase::setPassword(const QString &password)
设置连接的密码,需要在连接打开前设置void QSqlDatabase::setPort(int port)
设置连接的端口号,需要在连接打开前设置void QSqlDatabase::setUserName(const QString &name)
设置连接的用户名,需要在连接打开前设置QStringList QSqlDatabase::tables(QSql::TableType type = QSql::Tables) const
返回由type指定的数据库的表、系统表和视图的链表bool QSqlDatabase::transaction()
如果数据库驱动支持事务机制,在数据库上开始一个事务QString QSqlDatabase::userName() const
返回连接的用户名
连接MySQL数据库示例:
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("acidalia");
db.setDatabaseName("customdb");
db.setUserName("mojito");
db.setPassword("J0a1m8");
bool ok = db.open();
获取一个默认的连接示例:
QSqlDatabase db = QSqlDatabase::database();
04. QSqlError类
4.1 QSqlError简介
QSqlError类提供SQL数据库的错误信息。QSqlError对象能够提供数据库具体的错误信息。
4.2 QSqlError成员函数
QSqlError::QSqlError(const QString &driverText = QString(), const QString &databaseText = QString(), ErrorType type = NoError, const QString &code = QString())
构造一个包含驱动错误文本driverText、数据库具体错误文本databaseText、类型type和错误码code的QSqlError对象QSqlError::QSqlError(const QSqlError &other)
构造QSqlError对象QString QSqlError::databaseText() const
返回数据库报告的错误文本QString QSqlError::driverText() const
返回数据库驱动报告的错误文本bool QSqlError::isValid() const
如果设置了错误,返回trueQString QSqlError::nativeErrorCode() const
返回数据库具体错误码
QString QSqlError::text() const
将错误信息转化为字符串类型
ErrorType QSqlError::type() const
返回错误类型
参考示例:
QSqlQueryModel model;
model.setQuery("select * from myTable");
if (model.lastError().isValid())qDebug() << model.lastError();
05. QSqlQuery类
5.1 QSqlQuery类简介
QSqlQuery类提供了一种执行和操纵SQL语句的方式
QSqlQuery包括了所有的功能,像在一个QSqlDatabase上执行SQL查询创建、导航和索取数据等等。 它可以执行DML(数据操作语言)语句,比如 SELECT, INSERT, UPDATE 和 DELETE, 还可以执行DDL(数据定义语言)语句,比如:CREATE TABLE。 不仅如此,它还可以用于执行特定数据库而不是标准SQL语句的指令(比如 SET DATESTYLE=ISO 用于 PostgreSQL).
成功执行一SQL语句设置query为活动状态( isActive() 返回TRUE)否则查询置为非活动状态。无论那种情况,执行一条新的 SQL 语句之后,查询都被定位在一个无效的记录上;所以在数据被获取之前,查询都必须被导航到一个有效的记录上(isValid()可以确定查询是否处在一个有效的记录上)。
浏览记录用以下一条函数:
- next()
- prev()
- first()
- last()
- seek(int)
这些函数允许程序员向前、向后或随心所欲地在查询返回的记录之间移动。一旦一个处于活动状态的查询 被定位在一个有效的记录上时,就可以通过value()获取数据。所有的数据都被用QVariants从SQL后端转换过来。
参考代码:
QSqlQuery query("SELECT country FROM artist");
while (query.next()) {QString country = query.value(0).toString();doSomething(country);
}
要获得从一个查询中返回的数据,用value()方法。由SELECT语句返回的数据中的每个域可以通过指定一个索引来访问,索引从0开始。没有一个方法可以通过指定名字来定位域的,因为这不能得到可能确认。(请看QSqlCursor,它提供一个更加有弹性的接口用于从一个表单中选择数据或在一个数据库中查看数据)。
也可以参考QSqlDatabase、QSqlCursor、QVariant和数据库类。
5.2 QSqlQuery成员函数
QSqlQuery::QSqlQuery(QSqlResult *result)
使用result构建一个QSqlQuery对象QSqlQuery::QSqlQuery(const QString &query = QString(), QSqlDatabase db = QSqlDatabase())
使用SQL语句query、数据库db构建一个QSqlQuery对象,如果数据库db为指定、非法,使用应用程序默认的数据库QSqlQuery::QSqlQuery(QSqlDatabase db)
构造QSqlQuery对象
QSqlQuery::QSqlQuery(const QSqlQuery &other)
构造QSqlQuery对象void QSqlQuery::addBindValue(const QVariant &val, QSql::ParamType paramType = QSql::In)
当使用位置值绑定时,增加val到值链表中int QSqlQuery::at() const
返回查询的当前内部位置void QSqlQuery::bindValue(const QString &placeholder, const QVariant &val, QSql::ParamType paramType = QSql::In)
将值val绑定到占位符placeholdervoid QSqlQuery::bindValue(int pos, const QVariant &val, QSql::ParamType paramType = QSql::In)
QVariant QSqlQuery::boundValue(const QString &placeholder) const
QVariant QSqlQuery::boundValue(int pos) constQMap<QString, QVariant> QSqlQuery::boundValues() constvoid QSqlQuery::clear()
清除结果集,释放查询占用的任何资源。设置查询状态到非活跃const QSqlDriver *QSqlQuery::driver() const
返回查询关联的数据库的驱动bool QSqlQuery::exec(const QString &query)
执行SQL语句query,查询执行成功时,返回true,设置查询为活跃状态在查询执行后,查询定位在一个无效的记录上,在获取数据值前必须把查询移动到有效的记录上。对于SQLite数据库,query字符串每次只能包含一条语句。bool QSqlQuery::exec()
执行一条事先准备的SQL语句bool QSqlQuery::execBatch(BatchExecutionMode mode = ValuesAsRows)
批处理执行事先准备的SQL查询语句QString QSqlQuery::executedQuery() const
返回最后成功执行的查询语句bool QSqlQuery::first()
如果结果集可用,查询的位置在获取记录的查询上,则获取结果集中的第一条记录bool QSqlQuery::isActive() const
如果查询处于活跃状态,返回truebool QSqlQuery::isSelect() const
如果当前查询是一条SELECT语句,返回truebool QSqlQuery::isValid() const
如果查询的当前定位在有效的记录上,返回trueQSqlError QSqlQuery::lastError() const
返回查询发生的最后一次错误的错误信息bool QSqlQuery::next()
如果查询可用,并且定位在获取的记录上,获取结果中的下一条记录bool QSqlQuery::prepare(const QString &query)
事先准备要执行的SQL语句bool QSqlQuery::previous()
如果查询可用,并且定位在获取的记录上,则获取结果中的前一条记录QSqlRecord QSqlQuery::record() const
返回当前查询的包含字段信息的一条记录QVariant QSqlQuery::value(int index) const
返回当前记录中index字段的值QVariant QSqlQuery::value(const QString &name) const
返回当前记录中字段名为name的字段的值
程序示例一:
query.exec("select * from student");query.next();QString name = query.value(1).toString();qDebug() << name;query.first();name = query.value(1).toString();qDebug() << name;
程序示例二:
当要进行多条记录的操作时,可以利用绑定进行批处理。
QSqlQuery q;q.prepare("insert into myTable values (?, ?)");QVariantList ints;ints << 1 << 2 << 3 << 4;q.addBindValue(ints);QVariantList names;names << "Harald" << "Boris" << "Trond" << QVariant(QVariant::String);q.addBindValue(names);if (!q.execBatch())qDebug() << q.lastError();
程序示例三:
事务可以保证一个复杂操作的原子性。在QT中,如果底层的数据库引擎支持事务,那么QSqlDriver::hasFeature(QSqlDriver::Transactions)会返回true。可以使用QSqlDatabase::transaction()来启动一个事务,然后编写一些希望在事务中执行的SQL语句,最后调用QSqlDatabase::commit()或者QSqlDatabase::rollback()。当使用事务时必须在创建查询以前就开始事务。
QSqlDatabase::database().transaction();QSqlQuery query1;query1.exec("select * from student");query1.next();QString name = query1.value(1).toString();qDebug() << name;query1.first();name = query1.value(1).toString();qDebug() << name;QSqlDatabase::database().commit();
06. QSqlRecord类
6.1 QSqlRecord类简介
QSqlRecord类封装了数据库记录(通常是数据库中表或视图中的一行)的功能和特征。QSqlRecord支持添加和删除字段以及设置和检索字段值。
记录字段的值可以使用setValue()通过名称或位置进行设置;如果要将字段设置为null,请使用setNull()。若要按名称查找字段的位置,请使用indexOf(),并在特定位置查找字段的名称,请使用fieldName()。使用field()检索给定字段的QSqlField对象。使用contains()来查看记录是否包含特定的字段名称。
当生成查询以在数据库上执行时,只有那些isGenerated()为true的字段才包含在生成的SQL中。
记录可以具有用append()或insert()添加的字段,可以用replace()替换,而可以用remove()删除。可以使用clear()删除所有字段。字段数由count()给出;它们的所有值都可以使用clearValues()清除(为null )。
6.2 QSqlRecord成员函数
QSqlRecord::QSqlRecord()
QSqlRecord::QSqlRecord(const QSqlRecord &other)
构造函数void QSqlRecord::append(const QSqlField &field)
在记录尾部增加一个字段fieldvoid QSqlRecord::clear()
删除记录的所有字段void QSqlRecord::clearValues()
清除记录中所有字段的值并设置为空bool QSqlRecord::contains(const QString &name) const
如果记录中包含name字段,返回trueint QSqlRecord::count() const
返回记录中的字段的数量QSqlField QSqlRecord::field(int index) const
返回记录中位置为index的字段,如果index超出范围,返回默认构造值QSqlField QSqlRecord::field(const QString &name) const
返回记录中字段名为name的字段QString QSqlRecord::fieldName(int index) const
返回记录中位置为index的字段的名字int QSqlRecord::indexOf(const QString &name) const
返回记录中字段名字为name的字段的位置,没有此字段则返回-1,字段名大小写不敏感,有多个匹配则返回第一个匹配的void QSqlRecord::insert(int pos, const QSqlField &field)
在记录中的位置pos插入字段fieldbool QSqlRecord::isEmpty() const
记录中的无字段,返回truevoid QSqlRecord::remove(int pos)
返回记录中位置为pos的字段void QSqlRecord::replace(int pos, const QSqlField &field)
使用给定字段field替换记录中的位置为pos的字段void QSqlRecord::setValue(int index, const QVariant &val)
设置记录中位置为index的字段的值为valvoid QSqlRecord::setValue(const QString &name, const QVariant &val)
设置记录中名字为name的字段的值为valQVariant QSqlRecord::value(int index) const
返回记录中位置为index的字段的值QVariant QSqlRecord::value(const QString &name) const
返回记录中字段名为name的字段的值void QSqlRecord::setNull(const QString &name)
设置记录中字段名为name的字段的值为nullvoid QSqlRecord::setNull(int index)
设置记录中位置为index的字段的值为null
07. QSqlField类
7.1 QSqlField类简介
QSqlField用于操作SQL数据库中表和视图的字段。
QSqlField代表数据库中表和视图中一列的特性,如数据类型和列名。字段也包含数据库中列中的值。字段的数据值存储在QVariant变量中,使用不兼容的数据类型是不允许的。
QSqlField对象很少在应用程序代码中显示创建,通常通过包含字段链表的QSqlRecord对象直接访问。
QSqlField对象能提供字段的很多元数据,如字段的名字、数据类型、长度、精度、默认值等。
7.2 QSqlField类常用成员函数
QSqlField::QSqlField(const QString &fieldName = QString(), QVariant::Type type = QVariant::Invalid)
构造一个名字为fieldName、数据类型为type的空字段QSqlField::QSqlField(const QSqlField &other)void QSqlField::clear()
清除字段的值并设置为空QVariant QSqlField::defaultValue() const
返回字段的默认值bool QSqlField::isAutoValue() const
如果字段的值字段生成,返回true。如主键的值自动增加bool QSqlField::isNull() const
如果字段的值为null,返回truebool QSqlField::isReadOnly() const
如果字段的值为只读类型,返回truebool QSqlField::isValid() const
如果字段的变量类型合法,返回trueint QSqlField::length() const
返回字段的长度QString QSqlField::name() const
返回字段的名字int QSqlField::precision() const
返回字段的精度,只在数字类型时有意义void QSqlField::setAutoValue(bool autoVal)
autoVal为真时设置字段的值自动生成void QSqlField::setDefaultValue(const QVariant &value)
设置字段中默认的值为valuevoid QSqlField::setLength(int fieldLength)
设置字段的长度为fieldLengthvoid QSqlField::setName(const QString &name)
设置字段名为namevoid QSqlField::setPrecision(int precision)
设置字段精度为precision,只对数字字段有效void QSqlField::setReadOnly(bool readOnly)
设置字段值的只读标识为readOnly。void QSqlField::setType(QVariant::Type type)
设置字段的数据变量类型为typevoid QSqlField::setValue(const QVariant &value)
设置字段的值为valueQVariant::Type QSqlField::type() const
返回存储在数据中的字段的数据类型QVariant QSqlField::value() const
返回字段的值
08. QSqlIndex类
8.1 QSqlIndex类简介
QSqlIndex类提供了操作和描述数据库索引的功能。
8.2 QSqlIndex类常用成员函数
QSqlIndex::QSqlIndex(const QString &cursorname = QString(), const QString &name = QString())
QSqlIndex::QSqlIndex(const QSqlIndex &other)
构造函数void QSqlIndex::append(const QSqlField &field)
追加一个字段field到字段链表中,默认按升序排序void QSqlIndex::append(const QSqlField &field, bool desc)void QSqlIndex::setName(const QString &name)
设置索引的名字为namevoid QSqlIndex::setDescending(int i, bool desc)
desc为true时,索引i的字段按降序存储
09. 附录
【Qt】数据库SQL接口层相关推荐
- 【Qt】数据库用户接口层
00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. QSqlQueryModel类 04. QSqlTableModel类 05. QSqlRelationalTableMo ...
- 【Qt】Qt数据库驱动层
00. 目录 文章目录 00. 目录 01. Qt驱动层 02. QSqlDriver 03. QSqlDriverCreator 04. QSqlDriverCreatorBase 05. QSql ...
- Qt 数据库操作(一)
Qt 中的数据库操作比较简单,因为Qt提供了不需要SQL知识就可以浏览和编辑数据库的接口. Qt中的Qtsql模块提供了对数据库的支持,该模块中的众多类基本可以分为3层: 用户接口层: QSqlQue ...
- 【Qt】Qt数据库简介
00. 目录 文章目录 00. 目录 01. Qt SQL模块简介 02. 数据库类 03. 数据库驱动 04. 测试代码 05. 附录 01. Qt SQL模块简介 本概述假定您至少具有SQL的基本 ...
- [Qt教程] 第21篇 数据库(一)Qt数据库应用简介
[Qt教程] 第21篇 数据库(一)Qt数据库应用简介 楼主 发表于 2013-5-13 20:56:39 | 查看: 1403| 回复: 13 Qt数据库应用简介 版权声明 该文章原创于作者yaf ...
- QT数据库访问技术简介
目录 背景介绍 功能对比 QT中数据库操作常用类介绍 用法实例 数据准备 创建实体类 创建数据库访问类 个人总结 关于如何获取数据库执行过程中的错误以及判断SQL语句执行是否成功执行 关于参数化SQL ...
- Qt连接SQL Server 2014数据库
Qt连接SQL Server 2014数据库 1. 建立目标数据库 连接数据库之前,需先在SQL Server中建立一个目标数据库,建立数据库和添加表的步骤这里不详述. 如建立一个名为DataBase ...
- QT连接SQL server 数据库
Qt连接SQL server数据库 由于课程设计需要,需要用qt设计一个界面来操作数据库,在建立数据库连接时,期间遇到各种问题. Qt 连接SQL server数据大致可以概括为下图的三层模型,箭头代 ...
- 数据库访问抽象层系列-1(介绍数据库编程接口及数据库访问抽象层概念)
摘要 本人最近完成了一个封装数据库访问抽象层的项目.我们开发的数据库访问抽象层作为分布式集群基础平台的一个组件.可以支持不同数据库编程接口(OCI.mysql.ODBC.pgsql)等.本系列博客主要 ...
最新文章
- 转:[大数据竞赛]夺冠感言:走进业务,提升对世界的认知能力
- c++内存管理的一些资料
- [AI开发]基于深度学习的视频多目标跟踪实现
- 优先队列如何按照pair 的第二关键字排序(对比vector按照pair第二关键字排序)
- 数据库基础之一--DDL(数据库定义语言),DCL(数据库控制语言)
- Python: max和min函数的高级使用
- 操作系统(十八)进程同步与进程互斥
- How Many Tables
- Java内存模型和优化
- 处理Easyui的Datagrid无法及时刷新问题
- Android的Service组件
- 基于qt开发的轻量级浏览器
- IEC62304-2006解读
- 文本表达:解决BERT中的各向异性方法总结
- charles——教程——转载
- 基于EasyX使用Wu反走样算法画线
- 国内交互智能平板品类首创者希沃联手倍市得,进一步蓄力品牌发展势能
- sqlserver设计表不允许保存更改,阻止保存要求重新创建表的更改
- ChatGPT 类大语言模型为什么会带来“神奇”的涌现能力?
- npm包本地离线安装
热门文章
- 巧用EditPlus包含VS2010网站项目资源
- java 容器_JAVA的容器
- hadoot配置环境变量win_Windows 下Hadoop的环境变量配置
- android 点击跳过,android开发里跳过的坑——button不响应点击事件
- N*N匹马,N个赛道,求出最快N匹马的解法
- Spring Boot下的lombok安装以及使用简介
- Post方式之百度翻译的爬取
- 常用UI模板,loading框,提醒框,弹框确认框
- 关于MySQL字符集和校对集问题
- 仿照微信的效果,实现了一个支持多选、选原图和视频的图片选择器,适配了iOS6-10系统,3行代码即可集成....