QT开发(四十八)——数据库SQL接口层
SQL接口层提供了对数据库的访问,主要类包括Qt SQL模块中的QSqlDatabase、QSqlQuery、QSqlError、QSqlField、QSqlIndex和QSqlRecord。QSqlDatabase类用于创建数据库连接,QSqlQuery用于使用SQL语句实现与数据库交互。
一、QSqlDatabase
1、QSqlDatabase简介
QSqlDatabase类提供了通过连接访问数据库的接口,QSqlDatabase对象本身代表一个连接,连接通过QT支持的数据库驱动提供对数据库的访问。
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
返回连接的用户名
二、QSqlQuery
1、QSqlQuery简介
QSqlQuery类提供了执行、操作SQL语句的一种手段。QSqlQuery封装了涉及创建、导航和通过连接执行SQL查询语句获取数据的功能。QSqlQuery能用于执行DML语句(如SELECT、INSERT、UPDATE、DELETE)和DDL语句(如CREATE TABLE),也能够用于执行非标准SQL的特定数据库的命令(如PostgreSQL语句:SET DATESTYLE=ISO)。
执行SQL语句成功会设置QSqlQuery对象的状态为活跃,否则设置为非活跃。无论哪种情况,当执行一条新的SQL语句时,查询都被定位在一条无效的记录上。在数据被获取前,一个活跃的查询必须被导航到一条有效的记录上。
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(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
1、QSqlRecord简介
QSqlRecord封装了数据库记录的功能和特性,支持增加和删除字段以及设置和获取字段值。
记录的字段的值可以由名字和位置使用setValue函数设置。如果将字段社会中为空,使用setNull函数。通过字段名字使用indexOf函数可以找到字段的位置。通过特定的位置使用fieldName函数可以找到字段名字。使用field()函数获取给定字段的QSqlField对象。
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
四、QSqlField
1、QSqlField简介
QSqlField用于操作SQL数据库中表和视图的字段。
QSqlField代表数据库中表和视图中一列的特性,如数据类型和列名。字段也包含数据库中列中的值。字段的数据值存储在QVariant变量中,使用不兼容的数据类型是不允许的。
QSqlField对象很少在应用程序代码中显示创建,通常通过包含字段链表的QSqlRecord对象直接访问。
QSqlField对象能提供字段的很多元数据,如字段的名字、数据类型、长度、精度、默认值等。
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
返回字段的值
五、QSqlIndex
1、QSqlIndex简介
QSqlIndex类提供了操作和描述数据库索引的函数。
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的字段按降序存储
六、QSqlError
1、QSqlError简介
QSqlError类提供类SQL数据的错误信息。QSqlError对象能够提供数据库具体的错误数据。
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)
QString QSqlError::databaseText() const
返回数据库报告的错误文本
QString QSqlError::driverText() const
返回数据库驱动报告的错误文本
bool QSqlError::isValid() const
如果设置了错误,返回true
QString QSqlError::nativeErrorCode() const
返回数据库具体错误码
ErrorType QSqlError::type() const
返回错误类型