QT开发(四十八)——数据库SQL接口层

    SQL接口层提供了对数据库的访问,主要类包括Qt SQL模块中的QSqlDatabaseQSqlQueryQSqlErrorQSqlFieldQSqlIndexQSqlRecordQSqlDatabase类用于创建数据库连接,QSqlQuery用于使用SQL语句实现与数据库交互。

一、QSqlDatabase

1QSqlDatabase简介

QSqlDatabase类提供了通过连接访问数据库的接口,QSqlDatabase对象本身代表一个连接,连接通过QT支持的数据库驱动提供对数据库的访问。

2QSqlDatabase成员函数

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

返回连接的用户名

二、QSqlQuery

1QSqlQuery简介

    QSqlQuery类提供了执行、操作SQL语句的一种手段。QSqlQuery封装了涉及创建、导航和通过连接执行SQL查询语句获取数据的功能。QSqlQuery能用于执行DML语句(如SELECTINSERTUPDATEDELETE)和DDL语句(如CREATE TABLE),也能够用于执行非标准SQL的特定数据库的命令(如PostgreSQL语句:SET DATESTYLE=ISO)。

    执行SQL语句成功会设置QSqlQuery对象的状态为活跃,否则设置为非活跃。无论哪种情况,当执行一条新的SQL语句时,查询都被定位在一条无效的记录上。在数据被获取前,一个活跃的查询必须被导航到一条有效的记录上。

2QSqlQuery成员函数

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(const QSqlQuery &other)

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的字段的值

3、操作结果集

使用QSqlQuery对象执行SQL语句查询操作得到的所有记录是一个结果集,QSqlQuery类提供了多个函数来处理得到的结果集。通常结果集中的记录从0开始。

bool seek(int index, bool relative = false)query指向结果集的第n条记录

bool first()query指向结果集的第一条记录

bool last()query指向结果集的最后一条记录

bool next()query指向下一条记录,每执行一次函数,便指向相邻的下一条记录

bool previous()query指向上一条记录,每执行一次函数,便指向相邻的上一条记录

QSqlRecord record() const获得现在指向的记录

QVariant value(int index) const获得记录中第n属性的值

int at() const获得现在query指向的记录在结果集中的编号

    执行完query.exec("select *from student");代码时,query是指向结果集外的,可以利用query.next()使得query指向结果集的第一条记录。也可以利用seek(0)函数或者first()函数使query指向结果集的第一条记录。为了节省内存开销,推荐的方法是,在query.exec("select * from student");代码前加上query.setForwardOnly(true);代码,此后只能使用next()seek()函数。

    query.exec("select * from student");

    query.next();

    QString name = query.value(1).toString();

    qDebug() << name;

    query.first();

    name = query.value(1).toString();

    qDebug() << name;

    通过对结果集的记录的逐条遍历,可以操作数据库中的数据项。

4、批处理操作

当要进行多条记录的操作时,可以利用绑定进行批处理

    QSqlQuery query;

    query.prepare("insert into student values (?, ?)");

    QVariantList ints;

    ints << 10 << 11 << 12 << 13;

    query.addBindValue(ints);

    QVariantList names;

    names << "xiaoming" << "xiaoliang"

          << "xiaogang" << QVariant(QVariant::String);

    query.addBindValue(names);

    if (!query.execBatch())

        qDebug() << query.lastError();

5、事务操作

    事务可以保证一个复杂操作的原子性。在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();

三、QSqlRecord

1QSqlRecord简介

    QSqlRecord封装了数据库记录的功能和特性,支持增加和删除字段以及设置和获取字段值。

    记录的字段的值可以由名字和位置使用setValue函数设置。如果将字段社会中为空,使用setNull函数。通过字段名字使用indexOf函数可以找到字段的位置。通过特定的位置使用fieldName函数可以找到字段名字。使用field()函数获取给定字段的QSqlField对象。

2QSqlRecord成员函数

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

四、QSqlField

1QSqlField简介

    QSqlField用于操作SQL数据库中表和视图的字段。

    QSqlField代表数据库中表和视图中一列的特性,如数据类型和列名。字段也包含数据库中列中的值。字段的数据值存储在QVariant变量中,使用不兼容的数据类型是不允许的。

    QSqlField对象很少在应用程序代码中显示创建,通常通过包含字段链表的QSqlRecord对象直接访问。

    QSqlField对象能提供字段的很多元数据,如字段的名字、数据类型、长度、精度、默认值等。

2QSqlField成员函数

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

返回字段的值

五、QSqlIndex

1QSqlIndex简介

    QSqlIndex类提供了操作和描述数据库索引的函数。

2QSqlIndex成员函数

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)

desctrue时,索引i的字段按降序存储

六、QSqlError

1QSqlError简介

QSqlError类提供类SQL数据的错误信息。QSqlError对象能够提供数据库具体的错误数据。

2QSqlError成员函数

QSqlError::QSqlError(const QString &driverText = QString(), const QString &databaseText = QString(), ErrorType type = NoError, const QString &code = QString())

构造一个包含驱动错误文本driverText、数据库具体错误文本databaseText、类型type和错误码codeQSqlError对象

QSqlError::QSqlError(const QSqlError &other)

QString QSqlError::databaseText() const

返回数据库报告的错误文本

QString QSqlError::driverText() const

返回数据库驱动报告的错误文本

bool QSqlError::isValid() const

如果设置了错误,返回true

QString QSqlError::nativeErrorCode() const

返回数据库具体错误码

ErrorType QSqlError::type() const

返回错误类型