QSqlQuery 学习

QSqlQuery类提供了一种执行和操作SQL语句的方法

Header:

#include

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)

 

~QSqlQuery()

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

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

nextResult()

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()查看状态

导航功能主要用到以下的函数

  • next()
  • previous()
  • first()
  • last()
  • seek()

这些函数可以让你方便的遍历整个数据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

 

你可能感兴趣的:(QSql,qt)