QSqlQuery类提供了一种执行和操作SQL语句的方法
Header: | #include <QSqlQuery> |
qmake: | QT += sql |
在使用的时候,需要添加头文件QSqlQuery,qmake的时候,需要在QT变量中添加sql
QSqlQuery(QSqlResult *result) | |
QSqlQuery(const QString &query = QString(), QSqlDatabase db = QSqlDatabase()) | |
QSqlQuery(QSqlDatabase db) | |
QSqlQuery(const QSqlQuery &other) | |
void | addBindValue(const QVariant &val, QSql::ParamType paramType = QSql::In) |
int | at() const |
void | bindValue(const QString &placeholder, const QVariant &val, QSql::ParamType paramType = QSql::In) |
void | bindValue(int pos, const QVariant &val, QSql::ParamType paramType = QSql::In) |
QVariant | boundValue(const QString &placeholder) const |
QVariant | boundValue(int pos) const |
QMap<QString, QVariant> | boundValues() const |
void | clear() |
const QSqlDriver * | driver() const |
bool | exec(const QString &query) |
bool | exec() |
bool | execBatch(BatchExecutionMode mode = ValuesAsRows) |
QString | executedQuery() const |
void | finish() |
bool | first() |
bool | isActive() const |
bool | isForwardOnly() const |
bool | isNull(int field) const |
bool | isNull(const QString &name) const |
bool | isSelect() const |
bool | isValid() const |
bool | last() |
QSqlError | lastError() const |
QVariant | lastInsertId() const |
QString | lastQuery() const |
bool | next() |
bool | |
int | numRowsAffected() const |
QSql::NumericalPrecisionPolicy | numericalPrecisionPolicy() const |
bool | prepare(const QString &query) |
bool | previous() |
QSqlRecord | record() const |
const QSqlResult * | result() const |
bool | seek(int index, bool relative = false) |
void | setForwardOnly(bool forward) |
void | setNumericalPrecisionPolicy(QSql::NumericalPrecisionPolicy precisionPolicy) |
int | size() const |
QVariant | value(int index) const |
QVariant | value(const QString &name) const |
QSqlQuery & | operator=(const QSqlQuery &other) |
QSqlQuery封装了在QSqlDatabase上执行的SQL查询中创建,导航和检索数据所涉及的功能 ,它能执行DML(Data manipulation language)语句,类似SELECT、INSERT、UPDATE、DELETE和DLL(data defintion language)语句,类似于CREATE TABLE,DML是用来处理数据的增删改查的,而DLL是用来创造数据和修改数据结构的,一个是对数据的实例做操作,不会影响到数据结构,一个是从顶层对数据结构进行操作
另外在QSqlQuery里面提到了一些可以执行一些非标准的命令
如果执行一个SQL statements成功,则会把query实例的状态转换为true,可以用isActive()查看状态
导航功能主要用到以下的函数
这些函数可以让你方便的遍历整个数据record,如果你只是需要向前,你可以使用setForwardOnly(),当一个active query用在了一个有效的record上时,就可以采用value()返回data value。注意返回值是QVariant
QSqlQuery query("SELECT * FROM artist");
int fieldNo = query.record().indexOf("country");
while (query.next()) {
QString country = query.value(fieldNo).toString();
doSomething(country);
}
注意理解这里的record()和value(),以及indexof(),所谓record()就是一个query的结果,这里的indexof就是以元素“country”给排序,然后可以依次访问。
QSqlQuery支持prepare和binding,以代码来理解吧,
QSqlQuery query;
query.prepare("INSERT INTO person (id, forename, surname) "
"VALUES (:id, :forename, :surname)");
query.bindValue(":id", 1001);
query.bindValue(":forename", "Bart");
query.bindValue(":surname", "Simpson");
query.exec();
可以看到prepare就是提前准备好一个查询语句,但是这个查询语句里面含有占位符,所以bindValue()就是为每个占位符设置一个默认值,回过头看看C++的bind函数吧,两者对比一下,会有更深的体会
需要注意的是,部分数据不支持这种操作,具体的自己去感受下
还需要注意的是,你必须在 create query之前load SQL Driver并且激活connection