QT SQL框架及QSqlDatabase类

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、Q SqlDatabase

使用方法:#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 | |

相关推荐
lqj_本人5 小时前
鸿蒙Qt生命周期:后台被杀后的数据自救
qt·华为·harmonyos
2301_800256116 小时前
第七章 空间存储与索引 知识点梳理3(空间填充曲线)
数据库·笔记·sql·postgresql
打工人你好8 小时前
如何设计更安全的 VIP 权限体系
java·jvm·安全
笃行客从不躺平8 小时前
遇到大SQL怎么处理
java·开发语言·数据库·sql
爱码小白9 小时前
PyQt5 QTimer总结
开发语言·qt
Jay Chou why did9 小时前
13. Qt深入 样式表继承规则
qt
友友马9 小时前
『Qt』多元素控件
开发语言·qt
last_zhiyin10 小时前
Oracle sql tuning guide 翻译 Part 6-5 --- Hint使用报告的操作方法和例子
数据库·sql·oracle·sql tunning
Rysxt_10 小时前
Spring Boot SPI 教程
java·数据库·sql
共享家952710 小时前
QT-界面优化(中)
开发语言·qt