【Qt】Qt数据库驱动层
00. 目錄
文章目錄
- 00. 目錄
- 01. Qt驅(qū)動(dòng)層
- 02. QSqlDriver
- 03. QSqlDriverCreator
- 04. QSqlDriverCreatorBase
- 05. QSqlDriverPlugin
- 06. QSqlResult
- 07. 附錄
01. Qt驅(qū)動(dòng)層
驅(qū)動(dòng)層為具體的數(shù)據(jù)庫和SQL接口層之間提供了底層的橋梁,主要類包括QSqlDriver、QSqlDriverCreator、QSqlDriverCreatorBase、QSqlDriverPlugin和QSqlResult。
02. QSqlDriver
QSqlDriver是訪問具體SQL數(shù)據(jù)庫的抽象基類,不能直接使用。如果要?jiǎng)?chuàng)建自定義的數(shù)據(jù)庫驅(qū)動(dòng),可以根據(jù)需要重寫QSqlDriver類的純虛函數(shù)和虛函數(shù)。
該類不能直接使用,如果要使用使用QSqlDatabase代替。
QSqlDatabase負(fù)責(zé)加載和管理數(shù)據(jù)庫驅(qū)動(dòng)插件。當(dāng)某個(gè)數(shù)據(jù)庫添加時(shí),相應(yīng)的數(shù)據(jù)庫驅(qū)動(dòng)插件會(huì)被加載。QSqlDatabase依靠驅(qū)動(dòng)插件為QSqlDriver和QSqlResult提供接口。
QSqlDriver是定義了SQL數(shù)據(jù)庫功能的抽象基類。
公有成員方法
QSqlDriver(QObject *parent = nullptr) virtual ~QSqlDriver() virtual bool beginTransaction() virtual void close() = 0 virtual bool commitTransaction() virtual QSqlResult * createResult() const = 0 virtual QString escapeIdentifier(const QString &identifier, QSqlDriver::IdentifierType type) const virtual QString formatValue(const QSqlField &field, bool trimStrings = false) const virtual QVariant handle() const virtual bool hasFeature(QSqlDriver::DriverFeature feature) const = 0 virtual bool isIdentifierEscaped(const QString &identifier, QSqlDriver::IdentifierType type) const virtual bool isOpen() const bool isOpenError() const QSqlError lastError() const QSql::NumericalPrecisionPolicy numericalPrecisionPolicy() const virtual bool open(const QString &db, const QString &user = QString(), const QString &password = QString(), const QString &host = QString(), int port = -1, const QString &options = QString()) = 0 virtual QSqlIndex primaryIndex(const QString &tableName) const virtual QSqlRecord record(const QString &tableName) const virtual bool rollbackTransaction() void setNumericalPrecisionPolicy(QSql::NumericalPrecisionPolicy precisionPolicy) virtual QString sqlStatement(QSqlDriver::StatementType type, const QString &tableName, const QSqlRecord &rec, bool preparedStatement) const virtual QString stripDelimiters(const QString &identifier, QSqlDriver::IdentifierType type) const virtual bool subscribeToNotification(const QString &name) virtual QStringList subscribedToNotifications() const virtual QStringList tables(QSql::TableType tableType) const virtual bool unsubscribeFromNotification(const QString &name)03. QSqlDriverCreator
QSqlDriverCreator是為指定驅(qū)動(dòng)類型提供SQL驅(qū)動(dòng)工廠的模板類。QSqlDriverCreator實(shí)例化對象的類型T就是QSqlDriver的子類。
成員方法:
[override virtual] QSqlDriver *QSqlDriverCreator::createObject() const Reimplemented from QSqlDriverCreatorBase::createObject().04. QSqlDriverCreatorBase
QSqlDriverCreatorBase是SQL驅(qū)動(dòng)工廠的基類。
重新實(shí)現(xiàn)createObject()以返回要提供的特定QSqlDriver子類的實(shí)例。
成員方法:
virtual ~QSqlDriverCreatorBase() virtual QSqlDriver *createObject() const = 005. QSqlDriverPlugin
QSqlDriverPlugin類提供自定義QSqlDriver插件的抽象基類。
SQL數(shù)據(jù)庫驅(qū)動(dòng)插件是一個(gè)能被QT動(dòng)態(tài)加載的自定義SQL數(shù)據(jù)庫驅(qū)動(dòng)插件創(chuàng)建變得容易的簡單插件接口。
寫SQL插件可以通過派生QSqlDriverPlugin類實(shí)現(xiàn),重寫純虛函數(shù)create(),使用宏Q_PLUGIN_METADATA()導(dǎo)出類。
成員方法:
QSqlDriverPlugin(QObject *parent = nullptr) virtual ~QSqlDriverPlugin() virtual QSqlDriver *create(const QString &key) = 006. QSqlResult
QSqlResult類提供了訪問具體SQL數(shù)據(jù)庫數(shù)據(jù)的抽象接口。
通常會(huì)使用QSqlQuery代替QSqlResult,因?yàn)镼SqlQuery提供了具體數(shù)據(jù)庫的QSqlResult實(shí)現(xiàn)的通用包裝。
如果通過派生QSqlDriver實(shí)現(xiàn)自定義SQL驅(qū)動(dòng),需要提供實(shí)現(xiàn)了全部純虛函數(shù)和需要的虛函數(shù)的自定義的QSqlResult子類。
成員方法:
QSqlResult(const QSqlDriver *db) void addBindValue(const QVariant &val, QSql::ParamType paramType) int at() const virtual void bindValue(int index, const QVariant &val, QSql::ParamType paramType) virtual void bindValue(const QString &placeholder, const QVariant &val, QSql::ParamType paramType) QSql::ParamType bindValueType(int index) const QSql::ParamType bindValueType(const QString &placeholder) const QSqlResult::BindingSyntax bindingSyntax() const QVariant boundValue(int index) const QVariant boundValue(const QString &placeholder) const int boundValueCount() const QString boundValueName(int index) const QVector<QVariant> & boundValues() const void clear() virtual QVariant data(int index) = 0 const QSqlDriver * driver() const virtual bool exec() QString executedQuery() const virtual bool fetch(int index) = 0 virtual bool fetchFirst() = 0 virtual bool fetchLast() = 0 virtual bool fetchNext() virtual bool fetchPrevious() bool hasOutValues() const bool isActive() const bool isForwardOnly() const virtual bool isNull(int index) = 0 bool isSelect() const bool isValid() const QSqlError lastError() const virtual QVariant lastInsertId() const QString lastQuery() const virtual int numRowsAffected() = 0 virtual bool prepare(const QString &query) virtual QSqlRecord record() const virtual bool reset(const QString &query) = 0 void resetBindCount() virtual bool savePrepare(const QString &query) virtual void setActive(bool active) virtual void setAt(int index) virtual void setForwardOnly(bool forward) virtual void setLastError(const QSqlError &error) virtual void setQuery(const QString &query) virtual void setSelect(bool select) virtual int size() = 007. 附錄
7.1 關(guān)鍵字:How to Write Your Own Database Driver
7.2 關(guān)鍵字:How to Create Qt Plugins
總結(jié)
以上是生活随笔為你收集整理的【Qt】Qt数据库驱动层的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Qt】Qt数据库简介
- 下一篇: 【数据库】Ubuntu18.04安装My