日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

【Qt】数据库SQL接口层

發布時間:2024/4/24 数据库 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Qt】数据库SQL接口层 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

00. 目錄

文章目錄

    • 00. 目錄
    • 01. 概述
    • 02. 開發環境
    • 03. QSqlDatabase類
    • 04. QSqlError類
    • 05. QSqlQuery類
    • 06. QSqlRecord類
    • 07. QSqlField類
    • 08. QSqlIndex類
    • 09. 附錄

01. 概述

SQL接口層提供了對數據庫的訪問,主要類包括Qt SQL模塊中的QSqlDatabase、QSqlQuery、QSqlError、QSqlField、QSqlIndex和QSqlRecord。QSqlDatabase類用于創建數據庫連接,QSqlQuery用于使用SQL語句實現與數據庫交互。

常用的數據庫類介紹:

QSqlDatabase 連接數據庫相關

QSqlError 數據庫操作出錯信息

QSqlQuery 執行和操作數據庫相關類

QSqlRecord 封裝了數據庫的記錄

QSqlTableModel 可編輯的模型 顯示數據庫單張表

02. 開發環境

Windows系統:Windows10

Qt版本:Qt5.15或者Qt6

03. QSqlDatabase類

3.1 QSqlDataBase類簡介

QSqlDatabase類提供了連接訪問數據庫的接口,QSqlDatabase對象本身代表一個連接,連接通過QT支持的數據庫驅動提供對數據庫的訪問。

3.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可用,返回truebool QSqlDatabase::isOpen() const 如果數據庫連接目前打開,返回truebool QSqlDatabase::isOpenError() const 如果在打開數據庫連接時發生錯誤,返回truebool QSqlDatabase::isValid() const 如果QSqlDatabase連接有一個合法的驅動,返回trueQSqlError 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 返回連接的用戶名

連接MySQL數據庫示例:

QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); db.setHostName("acidalia"); db.setDatabaseName("customdb"); db.setUserName("mojito"); db.setPassword("J0a1m8"); bool ok = db.open();

獲取一個默認的連接示例:

QSqlDatabase db = QSqlDatabase::database();

04. QSqlError類

4.1 QSqlError簡介

QSqlError類提供SQL數據庫的錯誤信息。QSqlError對象能夠提供數據庫具體的錯誤信息。

4.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) 構造QSqlError對象QString QSqlError::databaseText() const 返回數據庫報告的錯誤文本QString QSqlError::driverText() const 返回數據庫驅動報告的錯誤文本bool QSqlError::isValid() const 如果設置了錯誤,返回trueQString QSqlError::nativeErrorCode() const 返回數據庫具體錯誤碼 QString QSqlError::text() const 將錯誤信息轉化為字符串類型 ErrorType QSqlError::type() const 返回錯誤類型

參考示例:

QSqlQueryModel model; model.setQuery("select * from myTable"); if (model.lastError().isValid())qDebug() << model.lastError();

05. QSqlQuery類

5.1 QSqlQuery類簡介

QSqlQuery類提供了一種執行和操縱SQL語句的方式
QSqlQuery包括了所有的功能,像在一個QSqlDatabase上執行SQL查詢創建、導航和索取數據等等。 它可以執行DML(數據操作語言)語句,比如 SELECT, INSERT, UPDATE 和 DELETE, 還可以執行DDL(數據定義語言)語句,比如:CREATE TABLE。 不僅如此,它還可以用于執行特定數據庫而不是標準SQL語句的指令(比如 SET DATESTYLE=ISO 用于 PostgreSQL).

成功執行一SQL語句設置query為活動狀態( isActive() 返回TRUE)否則查詢置為非活動狀態。無論那種情況,執行一條新的 SQL 語句之后,查詢都被定位在一個無效的記錄上;所以在數據被獲取之前,查詢都必須被導航到一個有效的記錄上(isValid()可以確定查詢是否處在一個有效的記錄上)。

瀏覽記錄用以下一條函數:

  • next()
  • prev()
  • first()
  • last()
  • seek(int)

這些函數允許程序員向前、向后或隨心所欲地在查詢返回的記錄之間移動。一旦一個處于活動狀態的查詢 被定位在一個有效的記錄上時,就可以通過value()獲取數據。所有的數據都被用QVariants從SQL后端轉換過來。

參考代碼:

QSqlQuery query("SELECT country FROM artist"); while (query.next()) {QString country = query.value(0).toString();doSomething(country); }

要獲得從一個查詢中返回的數據,用value()方法。由SELECT語句返回的數據中的每個域可以通過指定一個索引來訪問,索引從0開始。沒有一個方法可以通過指定名字來定位域的,因為這不能得到可能確認。(請看QSqlCursor,它提供一個更加有彈性的接口用于從一個表單中選擇數據或在一個數據庫中查看數據)。
也可以參考QSqlDatabase、QSqlCursor、QVariant和數據庫類。

5.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::QSqlQuery(const QSqlQuery &other) 構造QSqlQuery對象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綁定到占位符placeholdervoid QSqlQuery::bindValue(int pos, const QVariant &val, QSql::ParamType paramType = QSql::In) QVariant QSqlQuery::boundValue(const QString &placeholder) const QVariant QSqlQuery::boundValue(int pos) constQMap<QString, QVariant> QSqlQuery::boundValues() constvoid 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 如果查詢處于活躍狀態,返回truebool QSqlQuery::isSelect() const 如果當前查詢是一條SELECT語句,返回truebool QSqlQuery::isValid() const 如果查詢的當前定位在有效的記錄上,返回trueQSqlError 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的字段的值

程序示例一:

query.exec("select * from student");query.next();QString name = query.value(1).toString();qDebug() << name;query.first();name = query.value(1).toString();qDebug() << name;

程序示例二:

當要進行多條記錄的操作時,可以利用綁定進行批處理。

QSqlQuery q;q.prepare("insert into myTable values (?, ?)");QVariantList ints;ints << 1 << 2 << 3 << 4;q.addBindValue(ints);QVariantList names;names << "Harald" << "Boris" << "Trond" << QVariant(QVariant::String);q.addBindValue(names);if (!q.execBatch())qDebug() << q.lastError();

程序示例三:

事務可以保證一個復雜操作的原子性。在QT中,如果底層的數據庫引擎支持事務,那么QSqlDriver::hasFeature(QSqlDriver::Transactions)會返回true??梢允褂肣SqlDatabase::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();

06. QSqlRecord類

6.1 QSqlRecord類簡介

QSqlRecord類封裝了數據庫記錄(通常是數據庫中表或視圖中的一行)的功能和特征。QSqlRecord支持添加和刪除字段以及設置和檢索字段值。

記錄字段的值可以使用setValue()通過名稱或位置進行設置;如果要將字段設置為null,請使用setNull()。若要按名稱查找字段的位置,請使用indexOf(),并在特定位置查找字段的名稱,請使用fieldName()。使用field()檢索給定字段的QSqlField對象。使用contains()來查看記錄是否包含特定的字段名稱。

當生成查詢以在數據庫上執行時,只有那些isGenerated()為true的字段才包含在生成的SQL中。

記錄可以具有用append()或insert()添加的字段,可以用replace()替換,而可以用remove()刪除??梢允褂胏lear()刪除所有字段。字段數由count()給出;它們的所有值都可以使用clearValues()清除(為null )。

6.2 QSqlRecord成員函數

QSqlRecord::QSqlRecord() QSqlRecord::QSqlRecord(const QSqlRecord &other) 構造函數void QSqlRecord::append(const QSqlField &field) 在記錄尾部增加一個字段fieldvoid QSqlRecord::clear() 刪除記錄的所有字段void QSqlRecord::clearValues() 清除記錄中所有字段的值并設置為空bool QSqlRecord::contains(const QString &name) const 如果記錄中包含name字段,返回trueint 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插入字段fieldbool QSqlRecord::isEmpty() const 記錄中的無字段,返回truevoid QSqlRecord::remove(int pos) 返回記錄中位置為pos的字段void QSqlRecord::replace(int pos, const QSqlField &field) 使用給定字段field替換記錄中的位置為pos的字段void QSqlRecord::setValue(int index, const QVariant &val) 設置記錄中位置為index的字段的值為valvoid QSqlRecord::setValue(const QString &name, const QVariant &val) 設置記錄中名字為name的字段的值為valQVariant QSqlRecord::value(int index) const 返回記錄中位置為index的字段的值QVariant QSqlRecord::value(const QString &name) const 返回記錄中字段名為name的字段的值void QSqlRecord::setNull(const QString &name) 設置記錄中字段名為name的字段的值為nullvoid QSqlRecord::setNull(int index) 設置記錄中位置為index的字段的值為null

07. QSqlField類

7.1 QSqlField類簡介

QSqlField用于操作SQL數據庫中表和視圖的字段。

QSqlField代表數據庫中表和視圖中一列的特性,如數據類型和列名。字段也包含數據庫中列中的值。字段的數據值存儲在QVariant變量中,使用不兼容的數據類型是不允許的。

QSqlField對象很少在應用程序代碼中顯示創建,通常通過包含字段鏈表的QSqlRecord對象直接訪問。

QSqlField對象能提供字段的很多元數據,如字段的名字、數據類型、長度、精度、默認值等。

7.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,返回truebool QSqlField::isReadOnly() const 如果字段的值為只讀類型,返回truebool QSqlField::isValid() const 如果字段的變量類型合法,返回trueint QSqlField::length() const 返回字段的長度QString QSqlField::name() const 返回字段的名字int QSqlField::precision() const 返回字段的精度,只在數字類型時有意義void QSqlField::setAutoValue(bool autoVal) autoVal為真時設置字段的值自動生成void QSqlField::setDefaultValue(const QVariant &value) 設置字段中默認的值為valuevoid QSqlField::setLength(int fieldLength) 設置字段的長度為fieldLengthvoid QSqlField::setName(const QString &name) 設置字段名為namevoid QSqlField::setPrecision(int precision) 設置字段精度為precision,只對數字字段有效void QSqlField::setReadOnly(bool readOnly) 設置字段值的只讀標識為readOnly。void QSqlField::setType(QVariant::Type type) 設置字段的數據變量類型為typevoid QSqlField::setValue(const QVariant &value) 設置字段的值為valueQVariant::Type QSqlField::type() const 返回存儲在數據中的字段的數據類型QVariant QSqlField::value() const 返回字段的值

08. QSqlIndex類

8.1 QSqlIndex類簡介

QSqlIndex類提供了操作和描述數據庫索引的功能。

8.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) 設置索引的名字為namevoid QSqlIndex::setDescending(int i, bool desc) desc為true時,索引i的字段按降序存儲

09. 附錄

總結

以上是生活随笔為你收集整理的【Qt】数据库SQL接口层的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。