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

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

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

1、QSqlDatabase

1QSqlDatabase简介

QSqlDatabase类提供了经过链接访问数据库的接口,QSqlDatabase对象自己表明一个链接,链接经过QT支持的数据库驱动提供对数据库的访问。sql

2QSqlDatabase成员函数

QSqlDatabase::QSqlDatabase(const QSqlDatabase &other)数据库

[protected] QSqlDatabase::QSqlDatabase(const QString &type)app

[protected] QSqlDatabase::QSqlDatabase(QSqlDriver *driver)框架

使用给定的驱动建立一个数据库链接ide

[static] QSqlDatabase QSqlDatabase::addDatabase(const QString &type, const QString &connectionName = QLatin1String( defaultConnection ))函数

    根据给定的数据库驱动类型type、数据库链接名connectionName 建立一个数据库链接,若是有已经存在的同名链接,则新创建链接替换旧链接;若是没有指定数据库链接名,则新创建的数据库链接将成为应用程序的默认链接。spa

[static] QSqlDatabase QSqlDatabase::addDatabase(QSqlDriver *driver, const QString &connectionName = QLatin1String( defaultConnection ))code

根据给定的数据库驱动driver、链接名connectionName 建立数据库链接htm

[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

返回链接的用户名

2、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;

    经过对结果集的记录的逐条遍历,能够操做数据库中的数据项。

四、批处理操做

当要进行多条记录的操做时,能够利用绑定进行批处理

    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();

五、事务操做

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

3、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

4、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

返回字段的值

5、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的字段按降序存储

6、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

返回错误类型

相关文章
相关标签/搜索