【Qt】数据库SQL接口层

00. 目录

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可用,返回true

bool QSqlDatabase::isOpen() const
如果数据库连接目前打开,返回true

bool QSqlDatabase::isOpenError() const
如果在打开数据库连接时发生错误,返回true

bool QSqlDatabase::isValid() const
如果QSqlDatabase连接有一个合法的驱动,返回true

QSqlError 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
如果设置了错误,返回true

QString 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绑定到占位符placeholder

void QSqlQuery::bindValue(int pos, const QVariant &val, QSql::ParamType paramType = QSql::In)
QVariant QSqlQuery::boundValue(const QString &placeholder) const
QVariant QSqlQuery::boundValue(int pos) const

 
QMap<QString, QVariant> QSqlQuery::boundValues() const

void 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
如果查询处于活跃状态,返回true

bool QSqlQuery::isSelect() const
如果当前查询是一条SELECT语句,返回true

bool QSqlQuery::isValid() const
如果查询的当前定位在有效的记录上,返回true

QSqlError 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)
在记录尾部增加一个字段field

void QSqlRecord::clear()
删除记录的所有字段

void QSqlRecord::clearValues()
清除记录中所有字段的值并设置为空

bool QSqlRecord::contains(const QString &name) const
如果记录中包含name字段,返回true

int 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插入字段field

bool QSqlRecord::isEmpty() const
记录中的无字段,返回true

void QSqlRecord::remove(int pos)
返回记录中位置为pos的字段

void QSqlRecord::replace(int pos, const QSqlField &field)
使用给定字段field替换记录中的位置为pos的字段

void QSqlRecord::setValue(int index, const QVariant &val)
设置记录中位置为index的字段的值为val

void QSqlRecord::setValue(const QString &name, const QVariant &val)
设置记录中名字为name的字段的值为val

QVariant QSqlRecord::value(int index) const
返回记录中位置为index的字段的值

QVariant QSqlRecord::value(const QString &name) const
返回记录中字段名为name的字段的值

void QSqlRecord::setNull(const QString &name)
设置记录中字段名为name的字段的值为null

void 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,返回true

bool QSqlField::isReadOnly() const
如果字段的值为只读类型,返回true

bool QSqlField::isValid() const
如果字段的变量类型合法,返回true

int QSqlField::length() const
返回字段的长度

QString QSqlField::name() const
返回字段的名字

int QSqlField::precision() const
返回字段的精度,只在数字类型时有意义

void QSqlField::setAutoValue(bool autoVal)
autoVal为真时设置字段的值自动生成

void QSqlField::setDefaultValue(const QVariant &value)
设置字段中默认的值为value

void QSqlField::setLength(int fieldLength)
设置字段的长度为fieldLength

void QSqlField::setName(const QString &name)
设置字段名为name

void QSqlField::setPrecision(int precision)
设置字段精度为precision,只对数字字段有效

void QSqlField::setReadOnly(bool readOnly)
设置字段值的只读标识为readOnly。

void QSqlField::setType(QVariant::Type type)
设置字段的数据变量类型为type

void QSqlField::setValue(const QVariant &value)
设置字段的值为value

QVariant::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)
设置索引的名字为name

void QSqlIndex::setDescending(int i, bool desc)
desc为true时,索引i的字段按降序存储

09. 附录

© 版权声明
THE END
喜欢就支持一下吧
点赞31 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容