QSqlDatabase提供了一个连接数据库的接口,一个QSqlDatabase象征一个连接,为了获取数据库数据,这个连接需要支持数据库的驱动,这些驱动在QSqlDriver里面,当然你可以根据QSqlDriver派生自己的类,在帮助文档里面,你可以学到如何写自己的数据库驱动
Static Public Members:
QSqlDatabase | addDatabase(const QString &type, const QString &connectionName = QLatin1String( defaultConnection )) |
QSqlDatabase | addDatabase(QSqlDriver *driver, const QString &connectionName = QLatin1String( defaultConnection )) |
QSqlDatabase | cloneDatabase(const QSqlDatabase &other, const QString &connectionName) |
QStringList | |
bool | contains(const QString &connectionName = QLatin1String( defaultConnection )) |
QSqlDatabase | database(const QString &connectionName = QLatin1String( defaultConnection ), bool open = true) |
QStringList | drivers() |
bool | isDriverAvailable(const QString &name) |
void | registerSqlDriver(const QString &name, QSqlDriverCreatorBase *creator) |
void | removeDatabase(const QString &connectionName) |
Protected Functions:
QSqlDatabase(const QString &type) |
QSqlDatabase(QSqlDriver *driver) |
可以通过静态成员函数QSqlDatabase::addDatabase()去创建连接,需要在参数里面指明驱动的类型,每个连接都有自己的名称,如果采用默认连接(defaultConnection)则表示采用匿名连接
当创建一个连接之后,首先你需要调用setDatabaseName(),setUserName(),setPassword(),setHostName(),setPort()和setconnectOptions()去设置你的连接,然后需要调用oepn()去激活物理连接,这个时候才算真正的连接上。
cloneDatabase()相当于从一个现有的connection去构造另外一个相同的连接,但是是相互独立的,注意感受下这里用到的线程池的知识,有点意思,值得注意的是,QSqlDatabase的copy构造函数被声明为了protected类型,这将让private继承类无法使用复制构造函数
根据连接的名字,可以用database()去获取这个连接,同样我们要考虑这个连接是复制还是引用,我认为是引用,但是函数的写法上有点与引用有出入,记下这一点,实际用的时候再看看情况
removeDatabase()是通过一个connectionName去remove一个连接
contains()可以根据一个connectionName去查看这个连接是否存在在连接list上
一旦连接上,你可以通过调用tables()去得到数据库的各个表,通过primaryIndex()去得到标的主键索引,通过调用record()去得到元组信息
Qt5.7解释了QSqlDatabase::exec()已经弃用,而是采用QSqlQuery::exec()替代
可以通过hasFeature()查看数据库是否支持事务机制,需要解释一下事务机制,事务就是一系列操作的集合,事务机制指的就是要么这些操作都执行,要么都不执行,这与原子操作有相似之处,但是还是有区别,注意体会
通过transaction()去开始一个事务,这需要在create query之前,而commit()(我理解为去查询是不是可以执行,即该数据库是不是正在被操作)和rollback(终止)就是去完成它
Note: For some databases, the commit will fail and return false if there is an active query using the database for a SELECT. Make the query inactive before doing the commit. (这句话是qt的帮助文件里面的)
lastError()会返回错误的相关信息
使用drivers()会返回可用的数据库驱动,如果自己创建了一个驱动,必须采用registerSqlDriver()去完成注册,然后才能使用
public functions:
QSqlDatabase(const QSqlDatabase &other) | |
void | close() |
bool | commit() |
QString | connectOptions() const |
QString | connectionName() const |
QString | databaseName() const |
QSqlDriver * | driver() const |
QString | driverName() const |
QSqlQuery | exec(const QString &query = QString()) const |
QString | hostName() const |
bool | isOpen() const |
bool | isOpenError() const |
bool | isValid() const |
QSqlError | lastError() const |
QSql::NumericalPrecisionPolicy | numericalPrecisionPolicy() const |
bool | open() |
bool | open(const QString &user, const QString &password) |
QString | password() const |
int | port() const |
QSqlIndex | primaryIndex(const QString &tablename) const |
QSqlRecord | record(const QString &tablename) const |
bool | rollback() |
void | setConnectOptions(const QString &options = QString()) |
void | setDatabaseName(const QString &name) |
void | setHostName(const QString &host) |
void | setNumericalPrecisionPolicy(QSql::NumericalPrecisionPolicy precisionPolicy) |
void | setPassword(const QString &password) |
void | setPort(int port) |
void | setUserName(const QString &name) |
QStringList | tables(QSql::TableType type = QSql::Tables) const |
bool | |
QString | userName() const |
QSqlDatabase & | operator=(const QSqlDatabase &other) |