国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C++ Qt開發(fā):QSqlDatabase數(shù)據(jù)庫組件

這篇具有很好參考價值的文章主要介紹了C++ Qt開發(fā):QSqlDatabase數(shù)據(jù)庫組件。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

Qt 是一個跨平臺C++圖形界面開發(fā)庫,利用Qt可以快速開發(fā)跨平臺窗體應(yīng)用程序,在Qt中我們可以通過拖拽的方式將不同組件放到指定的位置,實現(xiàn)圖形化開發(fā)極大的方便了開發(fā)效率,本章將重點介紹QSqlDatabase數(shù)據(jù)庫模塊的常用方法及靈活運(yùn)用。

Qt SQL模塊是Qt框架的一部分,它提供了一組類和函數(shù),用于在Qt應(yīng)用程序中進(jìn)行數(shù)據(jù)庫操作。這個模塊的目標(biāo)是簡化數(shù)據(jù)庫訪問和操作,并提供一致的接口,使得開發(fā)者可以方便地與不同數(shù)據(jù)庫系統(tǒng)進(jìn)行交互。一般SQL組件常用的操作,包括讀取數(shù)據(jù)、插入數(shù)據(jù)、更新數(shù)據(jù)、刪除數(shù)據(jù)功能,這四個功能我將分別介紹它是如何使用的。

在使用此模塊時必須要引入對應(yīng)文件,需要在*.pro文件內(nèi)增加QT += sql,并在頭文件內(nèi)導(dǎo)入QSqlDatabase模塊才可以正常使用,該模塊是用于管理數(shù)據(jù)庫連接的核心類之一。它提供了一系列方法,使得在Qt應(yīng)用程序中進(jìn)行數(shù)據(jù)庫操作變得方便和靈活。QSqlDatabase類的靈活性使得開發(fā)者能夠與多種數(shù)據(jù)庫系統(tǒng)(如SQLite、MySQL、PostgreSQL等)進(jìn)行交互,而不必?fù)?dān)心底層數(shù)據(jù)庫細(xì)節(jié)。這有助于實現(xiàn)跨數(shù)據(jù)庫的可移植性和更高層次的數(shù)據(jù)庫訪問抽象。

下面是QSqlDatabase類中一些常用的方法,以表格形式進(jìn)行說明和概述:

方法 描述
QSqlDatabase::addDatabase(const QString &type, const QString &connectionName = QLatin1String(defaultConnection)) 添加一個數(shù)據(jù)庫連接,其中type指定數(shù)據(jù)庫驅(qū)動類型,connectionName指定連接的名稱,默認(rèn)為默認(rèn)連接。返回創(chuàng)建的數(shù)據(jù)庫連接對象。
QSqlDatabase::database(const QString &connectionName = QLatin1String(defaultConnection), bool open = true) 獲取指定連接名稱的數(shù)據(jù)庫連接對象。如果數(shù)據(jù)庫連接不存在,會創(chuàng)建一個新的連接。如果opentrue,則嘗試打開數(shù)據(jù)庫連接。
QSqlDatabase::removeDatabase(const QString &connectionName = QLatin1String(defaultConnection)) 移除指定連接名稱的數(shù)據(jù)庫連接。如果該連接當(dāng)前處于打開狀態(tài),則會被關(guān)閉。
QSqlDatabase::setHostName(const QString &host) 設(shè)置數(shù)據(jù)庫服務(wù)器的主機(jī)名。
QSqlDatabase::setDatabaseName(const QString &name) 設(shè)置要連接的數(shù)據(jù)庫的名稱。
QSqlDatabase::setUserName(const QString &name) 設(shè)置用于連接數(shù)據(jù)庫的用戶名。
QSqlDatabase::setPassword(const QString &password) 設(shè)置用于連接數(shù)據(jù)庫的密碼。
QSqlDatabase::setPort(int port) 設(shè)置數(shù)據(jù)庫服務(wù)器的端口號。
QSqlDatabase::open() 打開數(shù)據(jù)庫連接。如果連接成功,返回true,否則返回false
QSqlDatabase::close() 關(guān)閉數(shù)據(jù)庫連接。
QSqlDatabase::isOpen() 判斷數(shù)據(jù)庫連接是否打開。返回true表示連接已打開,false表示連接未打開。
QSqlDatabase::tables(QSql::TableType type = QSql::Tables) 返回數(shù)據(jù)庫中的表的列表??梢灾付ū淼念愋停?code>QSql::Tables表示用戶表,QSql::SystemTables表示系統(tǒng)表。
QSqlDatabase::commit() 提交當(dāng)前事務(wù)。
QSqlDatabase::rollback() 回滾當(dāng)前事務(wù)。
QSqlDatabase::transaction() 開始一個新事務(wù)。

這些方法提供了管理和操作數(shù)據(jù)庫連接的基本功能,包括連接數(shù)據(jù)庫、設(shè)置連接參數(shù)、打開和關(guān)閉連接、執(zhí)行事務(wù)等。在實際使用中,開發(fā)者可以根據(jù)需要選擇適當(dāng)?shù)姆椒▉砉芾頂?shù)據(jù)庫連接和執(zhí)行數(shù)據(jù)庫操作。

1.1 逐條記錄插入

初始化數(shù)據(jù)庫我們可以通過調(diào)用QSqlDatabase::addDatabase來打開,在打開參數(shù)中支持多種數(shù)據(jù)庫類型的選擇,包括但不限于 SQLiteMySQL、PostgreSQLOracle、ODBC 等,每種數(shù)據(jù)庫類型對應(yīng)一個特定的驅(qū)動,開發(fā)者可以通過指定數(shù)據(jù)庫類型和連接名稱創(chuàng)建相應(yīng)的數(shù)據(jù)庫連接。

QSqlDatabase::addDatabase 是一個靜態(tài)方法,用于向應(yīng)用程序中添加一個數(shù)據(jù)庫連接。此方法允許你為不同的數(shù)據(jù)庫類型添加連接,并且你可以為每個連接指定一個唯一的名稱。

static QSqlDatabase QSqlDatabase::addDatabase(const QString &type, const QString &connectionName = QLatin1String(defaultConnection));

參數(shù)說明

  • type: 字符串,表示數(shù)據(jù)庫的類型,例如 "QSQLITE"、"QMYSQL" 等,具體取決于你所使用的數(shù)據(jù)庫驅(qū)動。
  • connectionName: 字符串,表示連接的名稱,默認(rèn)為 defaultConnection??梢酝ㄟ^這個名稱在應(yīng)用程序中區(qū)分不同的數(shù)據(jù)庫連接。

返回值

返回創(chuàng)建的 QSqlDatabase 對象,可以使用這個對象進(jìn)行進(jìn)一步的數(shù)據(jù)庫配置和操作。如果不提供連接名稱,將使用默認(rèn)的連接名稱 defaultConnection。在一個應(yīng)用程序中,你可以同時擁有多個數(shù)據(jù)庫連接,每個連接都有一個唯一的名稱。

在打開后接著我們就可以通過執(zhí)行db.exec()的方式向特定數(shù)據(jù)庫內(nèi)插入數(shù)據(jù),如下代碼所示,通過在編輯框內(nèi)提取出所需參數(shù)并對數(shù)據(jù)庫進(jìn)行初始化,當(dāng)出事后成功后則調(diào)用db.exec()函數(shù)插入記錄,最后通過db.commit()提交事務(wù)刷新到數(shù)據(jù)庫中。

void MainWindow::on_pushButton_clicked()
{
    // 指定數(shù)據(jù)庫驅(qū)動類型
    QSqlDatabase db = QSqlDatabase::addDatabase(ui->lineEdit_type->text());
    db.setDatabaseName(ui->lineEdit_dir->text());
     if (!db.open())
     {
            QMessageBox::information(nullptr, "信息", db.lastError().text(), QMessageBox::Ok);
     }

     // 獲取文本內(nèi)容
     QString plainText = ui->plainTextEdit->toPlainText();

     // 使用 split() 函數(shù)分割成行
     QStringList lines = plainText.split('\n', Qt::SkipEmptyParts);

     // 遍歷每一行
     for (const QString &line : lines)
     {
         db.exec(line);
     }

    // 提交事務(wù)請求
    bool ref = db.commit();
    if(ref == true)
    {
        QMessageBox::information(nullptr, "信息", "初始化失敗", QMessageBox::Ok);
    }
    else
    {
        QMessageBox::information(nullptr, "信息", "執(zhí)行初始化成功", QMessageBox::Ok);
    }

    db.close();
}

在初始化部分,我們通過create table語句創(chuàng)建一個LyShark的數(shù)據(jù)表,并插入三個字段,分別是id,name,age,當(dāng)點擊初始化時則會使用QSQLITE引擎,在當(dāng)前目錄下生成一個名為database.sqlite的數(shù)據(jù)庫文件;

C++ Qt開發(fā):QSqlDatabase數(shù)據(jù)庫組件

同理,只要準(zhǔn)備合理的SQL語句就可以實現(xiàn)對應(yīng)的數(shù)據(jù)庫記錄的插入功能;

C++ Qt開發(fā):QSqlDatabase數(shù)據(jù)庫組件

1.2 多條記錄插入

多條記錄的插入依賴于QSqlQuery類,該類是Qt中用于執(zhí)行和處理SQL查詢的類。它允許你向數(shù)據(jù)庫發(fā)送 SQL 查詢并檢索查詢結(jié)果。以下是QSqlQuery類中一些常用的方法,以表格形式進(jìn)行說明和概述:

方法 描述
QSqlQuery::QSqlQuery(QSqlDatabase db = QSqlDatabase()) 構(gòu)造函數(shù),創(chuàng)建一個數(shù)據(jù)庫查詢對象。如果提供了數(shù)據(jù)庫連接對象 db,則該查詢對象將與指定的數(shù)據(jù)庫連接關(guān)聯(lián)。
QSqlQuery::~QSqlQuery() 析構(gòu)函數(shù),釋放查詢對象。在對象銷毀時,會自動關(guān)閉查詢。
exec(const QString &query) 執(zhí)行指定的 SQL 查詢。返回 true 表示執(zhí)行成功,false 表示執(zhí)行失敗。
execBatch(BatchExecutionMode mode = ValuesAsRows) 批量執(zhí)行多個 SQL 查詢??梢栽O(shè)置批量執(zhí)行模式。
isActive() const 判斷查詢是否處于活動狀態(tài)(已執(zhí)行并且未關(guān)閉)。
isSelect() const 判斷當(dāng)前查詢是否是 SELECT 查詢。
lastError() const 獲取最后一次執(zhí)行的查詢的錯誤信息。如果查詢成功,返回一個空的 QSqlError 對象。
next() 移動到結(jié)果集中的下一條記錄。返回 true 表示移動成功,false 表示已經(jīng)沒有更多記錄。
seek(int index, bool relative = false) 定位到結(jié)果集中的指定記錄。
value(int index) 獲取當(dāng)前記錄中指定列的值。
value(const QString &name) 獲取當(dāng)前記錄中指定列名的值。
prepare(const QString &query) 準(zhǔn)備一個 SQL 查詢。可以在查詢中使用占位符 ? 作為參數(shù)的占位符。
bindValue(const QString &placeholder, const QVariant &val, QSql::ParamType type = QSql::In) 綁定參數(shù)到查詢??梢允褂谜嘉环?? 或者命名占位符 :name
executedQuery() const 獲取實際執(zhí)行的 SQL 查詢。當(dāng)使用占位符時,這個方法返回實際執(zhí)行的 SQL 語句。
record() const 獲取查詢的元數(shù)據(jù)信息,包括字段名、字段類型等。
size() const 獲取結(jié)果集的記錄數(shù)。

這些方法提供了一些基本的數(shù)據(jù)庫查詢和結(jié)果處理功能,包括執(zhí)行查詢、處理結(jié)果、錯誤處理、綁定參數(shù)、獲取元數(shù)據(jù)等。在實際應(yīng)用中,可以根據(jù)具體的需求選擇適當(dāng)?shù)姆椒▉聿僮鲾?shù)據(jù)庫。

如下代碼所示,首先我們通過split的方式將兩個plainEditText中的內(nèi)容進(jìn)行分割,并分別將結(jié)果存儲至QStringList容器內(nèi),接著通過使用query.prepare綁定一個SQL語句對應(yīng)關(guān)系,并通過循環(huán)的方式以此插入數(shù)據(jù),代碼如下所示;

void MainWindow::on_pushButton_3_clicked()
{
    // 指定數(shù)據(jù)庫驅(qū)動類型
    QSqlDatabase db = QSqlDatabase::addDatabase(ui->lineEdit_type->text());
    db.setDatabaseName(ui->lineEdit_dir->text());
    if (!db.open())
    {
        QMessageBox::information(nullptr, "信息", db.lastError().text(), QMessageBox::Ok);
    }

    // 定義字符串鏈表
    QStringList user_name;
    QStringList user_age;

    // 獲取文本內(nèi)容
    QString plainText_uname = ui->plainTextEdit_uname->toPlainText();
    QString plainTextEdit_uage = ui->plainTextEdit_uage->toPlainText();

    // 使用 split() 函數(shù)分割成行
    QStringList lines_uname = plainText_uname.split('\n', Qt::SkipEmptyParts);
    QStringList lines_uage = plainText_uname.split('\n', Qt::SkipEmptyParts);

    // 遍歷每一行
    for (const QString &line : lines_uname)
    {
        user_name.append(line);
    }

    for (const QString &line : lines_uage)
    {
        user_age.append(line);
    }

    // 綁定數(shù)據(jù)記錄
    QSqlQuery query;
    query.prepare("INSERT INTO LyShark(name,age) ""VALUES (:name, :age)");

    // 判斷兩張表中字段數(shù)據(jù)量是否一致
    if(user_name.size() == user_age.size())
    {
        // 循環(huán)插入數(shù)據(jù)
        for(int x=0;x< user_name.size(); x++)
        {
            query.bindValue(":name",user_name[x]);
            query.bindValue(":age",user_age[x]);
            query.exec();
        }
    }

    // 提交事務(wù)請求
    bool ref = db.commit();
    if(ref == true)
    {
        QMessageBox::information(nullptr, "信息", "插入數(shù)據(jù)失敗", QMessageBox::Ok);
    }
    else
    {
        QMessageBox::information(nullptr, "信息", "插入數(shù)據(jù)成功", QMessageBox::Ok);
    }

    db.close();
}

運(yùn)行后則可以將如下所示的字段依次插入到數(shù)據(jù)庫中存儲,如下圖所示;

C++ Qt開發(fā):QSqlDatabase數(shù)據(jù)庫組件

1.3 查詢表中記錄

查詢表中記錄離不開QSqlRecord 類,它是Qt中用于表示數(shù)據(jù)庫記錄(行)的元數(shù)據(jù)的類。提供了關(guān)于記錄中字段(列)的信息,包括字段名、字段類型等。通常用于表示數(shù)據(jù)庫查詢的結(jié)果集中的一行記錄的元數(shù)據(jù),以便在程序中處理這些記錄的信息。

以下是QSqlRecord類中一些常用的方法,以表格形式進(jìn)行說明和概述:

方法 描述
QSqlRecord::QSqlRecord(const QSqlRecord &other) 復(fù)制構(gòu)造函數(shù),創(chuàng)建一個 QSqlRecord 對象,復(fù)制另一個記錄的信息。
QSqlRecord::~QSqlRecord() 析構(gòu)函數(shù),釋放 QSqlRecord 對象。
append(const QSqlField &field) 向記錄中添加一個字段。
clear() 清空記錄中的所有字段。
field(int index) const 獲取指定索引的字段信息。
field(const QString &name) const 獲取指定字段名的字段信息。
fieldName(int index) const 獲取指定索引的字段名。
indexOf(const QString &name) const 獲取指定字段名的索引。如果字段不存在,返回 -1。
isEmpty() const 判斷記錄是否為空(沒有字段)。
isGenerated(int index) const 判斷指定索引的字段是否為自動生成的。
setGenerated(int index, bool generated) 設(shè)置指定索引的字段是否為自動生成的。
setGenerated(const QString &name, bool generated) 設(shè)置指定字段名的字段是否為自動生成的。
setField(int index, const QSqlField &field) 設(shè)置指定索引的字段信息。
count() const 獲取記錄中字段的數(shù)量。
contains(const QString &name) const 判斷記錄中是否包含指定字段名的字段。
operator=() 賦值運(yùn)算符重載,將一個記錄的內(nèi)容復(fù)制給另一個記錄。

這些方法提供了一些基本的記錄處理功能,包括添加字段、獲取字段信息、設(shè)置字段信息、判斷字段是否存在等。在實際應(yīng)用中,可以根據(jù)具體的需求選擇適當(dāng)?shù)姆椒▉聿僮饔涗洝?/p>

在查詢數(shù)據(jù)時,我們只需要通過QSqlQuery得到完整的數(shù)據(jù)表記錄條數(shù),然后就可以使用QSqlRecord來創(chuàng)建一個查詢對象,此時每次調(diào)用query.next()都會向后遍歷一行記錄,通過rec.indexOf就可以得到對應(yīng)字段的參數(shù)值,而query.value則可以將其提取出來,最后我們將其插入到TreeWidget中用于展示,代碼如下所示;

// 查詢表中數(shù)據(jù)
void MainWindow::on_pushButton_4_clicked()
{
    // 指定數(shù)據(jù)庫驅(qū)動類型
    QSqlDatabase db = QSqlDatabase::addDatabase(ui->lineEdit_type->text());
    db.setDatabaseName(ui->lineEdit_dir->text());
    if (!db.open())
    {
        QMessageBox::information(nullptr, "信息", db.lastError().text(), QMessageBox::Ok);
    }

    // 查詢數(shù)據(jù)
    QSqlQuery query("SELECT * FROM LyShark;",db);
    QSqlRecord rec = query.record();

    // 循環(huán)所有記錄
    while(query.next())
    {
        // 判斷當(dāng)前記錄是否有效
        if(query.isValid())
        {
            // 讀出數(shù)據(jù)
            int id_ptr = rec.indexOf("id");
            int id_value = query.value(id_ptr).toInt();

            int name_ptr = rec.indexOf("name");
            QString name_value = query.value(name_ptr).toString();

            int age_ptr = rec.indexOf("age");
            int age_value = query.value(age_ptr).toInt();

            // 設(shè)置treeWidget屬性
            ui->treeWidget->setColumnCount(3);         // 設(shè)置總列數(shù)
            ui->treeWidget->setColumnWidth(0,300);     // 設(shè)置最后一列寬度自適應(yīng)
            ui->treeWidget->setIndentation(0);         // 設(shè)置表頭縮進(jìn)為0

            // 設(shè)置表頭數(shù)據(jù)
            QStringList headers;
            headers.append("UID");
            headers.append("用戶名");
            headers.append("年齡");

            ui->treeWidget->setHeaderLabels(headers);

            // 模擬插入數(shù)據(jù)到表中
            QTreeWidgetItem* item=new QTreeWidgetItem();
            item->setText(0,QString::number(id_value));
            item->setText(1,name_value);
            item->setText(2,QString::number(age_value));
            ui->treeWidget->addTopLevelItem(item);
        }
    }
}

編譯并運(yùn)行程序,當(dāng)點擊查詢按鈕時,則可以將數(shù)據(jù)庫中的數(shù)據(jù)輸出到組件中顯示,如下圖所示;

C++ Qt開發(fā):QSqlDatabase數(shù)據(jù)庫組件

1.5 更新表中記錄

最后一項是對記錄的更新,其實更新記錄同樣是使用exec()函數(shù),只不過是將插入語句修改為了update而已,如下代碼通過數(shù)據(jù)庫查詢并根據(jù)特定條件填充了界面上的兩個文本框 (ui->lineEdit_select_unameui->lineEdit_select_uage)。下面是這段代碼的概述:

  1. 建立數(shù)據(jù)庫連接:
    • 通過 QSqlDatabase::addDatabase 設(shè)置數(shù)據(jù)庫的驅(qū)動類型,例如 "QSQLITE"、"QMYSQL" 等。
    • 使用 setDatabaseName 設(shè)置數(shù)據(jù)庫名稱,這可能是一個本地文件名或者服務(wù)器地址。
    • 嘗試打開數(shù)據(jù)庫連接,如果連接失敗,通過 QMessageBox 顯示錯誤信息。
  2. 執(zhí)行數(shù)據(jù)庫查詢:
    • 使用 QSqlQuery 對象執(zhí)行 SQL 查詢語句 "SELECT * FROM LyShark;"。
    • 通過 QSqlRecord 獲取查詢結(jié)果的記錄結(jié)構(gòu),包括字段名和字段類型。
  3. 循環(huán)處理查詢結(jié)果:
    • 使用 while (query.next()) 循環(huán)遍歷查詢結(jié)果中的每一行記錄。
    • 對于每個有效的記錄,獲取 "id" 字段的值,并與用戶輸入的 "uid" 進(jìn)行匹配。
    • 如果匹配成功,獲取 "name" 和 "age" 字段的值,并將其分別填充到 ui->lineEdit_select_unameui->lineEdit_select_uage 中。
    • 如果沒有匹配的記錄,或者記錄無效,將 ui->lineEdit_select_unameui->lineEdit_select_uage 的文本設(shè)置為 "-1"。

這段代碼主要完成了從數(shù)據(jù)庫查詢數(shù)據(jù)并將結(jié)果填充到用戶界面的操作。需要注意的是,如果涉及用戶輸入的 ui->lineEdit_select_uid->text() 不是數(shù)字,可能需要額外的驗證和處理。此外,數(shù)據(jù)庫的表結(jié)構(gòu)和字段名需要與代碼中的對應(yīng)關(guān)系一致。

void MainWindow::on_pushButton_5_clicked()
{
    // 指定數(shù)據(jù)庫驅(qū)動類型
    QSqlDatabase db = QSqlDatabase::addDatabase(ui->lineEdit_type->text());
    db.setDatabaseName(ui->lineEdit_dir->text());
    if (!db.open())
    {
        QMessageBox::information(nullptr, "信息", db.lastError().text(), QMessageBox::Ok);
    }

    // 查詢數(shù)據(jù)
    QSqlQuery query("SELECT * FROM LyShark;",db);
    QSqlRecord rec = query.record();

    // 循環(huán)所有記錄
    while(query.next())
    {
        // 判斷當(dāng)前記錄是否有效
        if(query.isValid())
        {
            // 讀出數(shù)據(jù)
            int id_ptr = rec.indexOf("id");
            int id_value = query.value(id_ptr).toInt();

            // 如果是則填充表格
            if(QString::number(id_value) == ui->lineEdit_select_uid->text())
            {
                int name_ptr = rec.indexOf("name");
                QString name_value = query.value(name_ptr).toString();
                ui->lineEdit_select_uname->setText(QString(name_value.data()));

                int age_ptr = rec.indexOf("age");
                QString age_value = query.value(age_ptr).toString();
                ui->lineEdit_select_uage->setText(QString(age_value.data()));
            }
        }
        else
        {
            ui->lineEdit_select_uname->setText("-1");
            ui->lineEdit_select_uage->setText("-1");
        }
    }
}

讀者可通過輸入一個唯一的標(biāo)識符,例如UID號,來實現(xiàn)對特定數(shù)據(jù)的查詢功能,如下圖所示;

C++ Qt開發(fā):QSqlDatabase數(shù)據(jù)庫組件

數(shù)據(jù)的跟新只需要調(diào)用update語句即可實現(xiàn),其他的功能與查詢保持一致,如下代碼實現(xiàn)了數(shù)據(jù)的共惡心操作,以下是代碼的概述:

  1. 建立數(shù)據(jù)庫連接:
    • 使用 QSqlDatabase::addDatabase 設(shè)置數(shù)據(jù)庫的驅(qū)動類型,例如 "QSQLITE"、"QMYSQL" 等。
    • 使用 setDatabaseName 設(shè)置數(shù)據(jù)庫名稱,這可能是一個本地文件名或者服務(wù)器地址。
    • 嘗試打開數(shù)據(jù)庫連接,如果連接失敗,通過 QMessageBox 顯示錯誤信息。
  2. 執(zhí)行數(shù)據(jù)庫更新:
    • 從用戶界面的輸入框中獲取更新所需的數(shù)據(jù),包括 uid、name、和 age。
    • 構(gòu)建 SQL 更新語句,例如 UPDATE LyShark SET name='newName', age=25 WHERE id=123;。
    • 使用 db.exec(sql) 執(zhí)行 SQL 更新語句。
  3. 事務(wù)的提交和關(guān)閉:
    • 嘗試提交事務(wù),如果成功,顯示更新數(shù)據(jù)成功的消息,否則顯示更新數(shù)據(jù)失敗的消息。
    • 關(guān)閉數(shù)據(jù)庫連接。

需要注意:

  • 在一般情況下,Qt 的數(shù)據(jù)庫操作會自動處理事務(wù),你不必顯式調(diào)用 commit()
  • 使用 std::cout 輸出日志不太符合 Qt 的風(fēng)格,Qt 提供了 qDebug() 用于輸出調(diào)試信息。
  • 對于事務(wù),通常在更新操作后關(guān)閉數(shù)據(jù)庫連接,而不是在提交事務(wù)之前。
void MainWindow::on_pushButton_6_clicked()
{
    // 指定數(shù)據(jù)庫驅(qū)動類型
    QSqlDatabase db = QSqlDatabase::addDatabase(ui->lineEdit_type->text());
    db.setDatabaseName(ui->lineEdit_dir->text());
    if (!db.open())
    {
        QMessageBox::information(nullptr, "信息", db.lastError().text(), QMessageBox::Ok);
    }

    // 執(zhí)行SQL更新記錄
    int uid = ui->lineEdit_select_uid->text().toInt();
    QString name = ui->lineEdit_select_uname->text();
    int age = ui->lineEdit_select_uage->text().toInt();

    QString sql = QString("UPDATE LyShark SET name='%1', age=%2 WHERE id=%3;").arg(name).arg(age).arg(uid);
    db.exec(sql);
    std::cout << "update => " << sql.toStdString() << std::endl;

    // 提交事務(wù)請求
    bool ref = db.commit();
    if(ref == true)
    {
        QMessageBox::information(nullptr, "信息", "更新數(shù)據(jù)失敗", QMessageBox::Ok);
    }
    else
    {
        QMessageBox::information(nullptr, "信息", "更新數(shù)據(jù)成功", QMessageBox::Ok);
    }

    db.close();
}

讀者可通過輸入一個UID編號查詢數(shù)據(jù)記錄,接著在修改對應(yīng)的字段值,并點擊更新按鈕刷新數(shù)據(jù)庫,如下圖所示將第一個記錄的姓名刷新為lyshark;

C++ Qt開發(fā):QSqlDatabase數(shù)據(jù)庫組件文章來源地址http://www.zghlxwxcb.cn/news/detail-760413.html

到了這里,關(guān)于C++ Qt開發(fā):QSqlDatabase數(shù)據(jù)庫組件的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • QT學(xué)習(xí)筆記-開發(fā)環(huán)境編譯Qt MySql數(shù)據(jù)庫驅(qū)動與交叉編譯Qt MySql數(shù)據(jù)庫驅(qū)動

    QT學(xué)習(xí)筆記-開發(fā)環(huán)境編譯Qt MySql數(shù)據(jù)庫驅(qū)動與交叉編譯Qt MySql數(shù)據(jù)庫驅(qū)動

    如果需要在QT程序中實現(xiàn)與MySQL數(shù)據(jù)庫的交互,那么必不可少的一環(huán)就是對Qt MySql數(shù)據(jù)庫驅(qū)動的編譯。 操作系統(tǒng):Windows10 專業(yè)版 64位 Qt版本:Qt 5.15.2 開發(fā)環(huán)境Qt安裝路徑:D:Qt 交叉編譯服務(wù)器:Ubuntu 18.4 交叉編譯服務(wù)器Qt安裝路徑:/opt/Qt 目標(biāo)芯片:rk3568 目標(biāo)平臺:arm64 Qt安裝

    2024年02月11日
    瀏覽(44)
  • C++ Qt開發(fā):StandardItemModel數(shù)據(jù)模型組件

    C++ Qt開發(fā):StandardItemModel數(shù)據(jù)模型組件

    Qt 是一個跨平臺C++圖形界面開發(fā)庫,利用Qt可以快速開發(fā)跨平臺窗體應(yīng)用程序,在Qt中我們可以通過拖拽的方式將不同組件放到指定的位置,實現(xiàn)圖形化開發(fā)極大的方便了開發(fā)效率,本章將重點介紹 StandardItemModel 數(shù)據(jù)模型組件的常用方法及靈活運(yùn)用。 QStandardItemModel 是 Qt 中用

    2024年02月04日
    瀏覽(28)
  • 軟件設(shè)計開發(fā)筆記4:QT操作SQLite數(shù)據(jù)庫

    軟件設(shè)計開發(fā)筆記4:QT操作SQLite數(shù)據(jù)庫

    ??有時候我們需要在軟件中記錄一些歷史數(shù)據(jù)以便于對數(shù)據(jù)的查詢。而我們希望軟件不能太復(fù)雜,體量也不要太大,這個時候就需要如SQLite這樣輕量級的數(shù)據(jù)庫。這篇中我們就來討論如何在使用QT開發(fā)應(yīng)用是操作SQLite數(shù)據(jù)庫。 ??SQLite是一款開源、輕量級、跨平臺的數(shù)據(jù)庫

    2024年02月09日
    瀏覽(24)
  • C++畢業(yè)設(shè)計基于QT實現(xiàn)的超市收銀管理系統(tǒng)源代碼+數(shù)據(jù)庫

    C++畢業(yè)設(shè)計基于QT實現(xiàn)的超市收銀管理系統(tǒng)源代碼+數(shù)據(jù)庫

    C++畢業(yè)設(shè)計基于QT實現(xiàn)的超市收銀管理系統(tǒng)源代碼+數(shù)據(jù)庫 編譯使用 編譯完成后,需要拷貝 file目錄下的數(shù)據(jù)庫 POP.db文件到可執(zhí)行程序目錄下 登錄界面 主界面 會員管理 完整代碼下載地址:基于QT實現(xiàn)的超市收銀管理系統(tǒng)源代碼+數(shù)據(jù)庫

    2024年02月09日
    瀏覽(34)
  • 跨平臺C++ Qt數(shù)據(jù)庫管理系統(tǒng)設(shè)計與實戰(zhàn):從理論到實踐的全面解析

    跨平臺C++ Qt數(shù)據(jù)庫管理系統(tǒng)設(shè)計與實戰(zhàn):從理論到實踐的全面解析

    在我們的日常生活中,數(shù)據(jù)無處不在。無論是我們的個人信息,還是我們的購物習(xí)慣,甚至是我們的工作記錄,都可以被視為數(shù)據(jù)。這些數(shù)據(jù)的管理和處理,對于個人和企業(yè)來說,都是至關(guān)重要的。這就是數(shù)據(jù)庫管理系統(tǒng)(Database Management System,簡稱DBMS)的重要性所在。 數(shù)據(jù)

    2024年02月06日
    瀏覽(95)
  • QT學(xué)習(xí)筆記-oracle oci數(shù)據(jù)庫驅(qū)動交叉編譯并移植到ARM開發(fā)板

    QT學(xué)習(xí)筆記-oracle oci數(shù)據(jù)庫驅(qū)動交叉編譯并移植到ARM開發(fā)板

    在上一文《QT學(xué)習(xí)筆記-QT安裝oracle oci驅(qū)動》中介紹了在Windows環(huán)境下使用QT訪問oracle數(shù)據(jù)庫時遇到驅(qū)動無法加載問題的解決辦法,大體思路是對QT源碼中數(shù)據(jù)庫驅(qū)動的源碼oci進(jìn)行編譯,要想通過編譯需要依賴對應(yīng)數(shù)據(jù)庫的頭文件和庫(可以通過下載oracle instant client),編譯通過

    2024年02月13日
    瀏覽(31)
  • Qt+MySql開發(fā)筆記:Qt5.9.3的msvc2017x64版本編譯MySql8.0.16版本驅(qū)動并Demo連接數(shù)據(jù)庫測試

    Qt+MySql開發(fā)筆記:Qt5.9.3的msvc2017x64版本編譯MySql8.0.16版本驅(qū)動并Demo連接數(shù)據(jù)庫測試

    若該文為原創(chuàng)文章,轉(zhuǎn)載請注明原文出處 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/130381428 紅胖子網(wǎng)絡(luò)科技博文大全:開發(fā)技術(shù)集合(包含Qt實用技術(shù)、樹莓派、三維、OpenCV、OpenGL、ffmpeg、OSG、單片機(jī)、軟硬結(jié)合等等)持續(xù)更新中… ??mysql驅(qū)動版本msvc2015x32版本調(diào)

    2023年04月26日
    瀏覽(50)
  • 05-1_Qt 5.9 C++開發(fā)指南_Model/View結(jié)構(gòu)基礎(chǔ)(基本原理;數(shù)據(jù)模型;試圖組件;代理)

    05-1_Qt 5.9 C++開發(fā)指南_Model/View結(jié)構(gòu)基礎(chǔ)(基本原理;數(shù)據(jù)模型;試圖組件;代理)

    Model/View(模型/視圖) 結(jié)構(gòu)是 Qt 中用界面組件顯示與編輯數(shù)據(jù)的一種結(jié)構(gòu),視圖 (View)是顯示和編輯數(shù)據(jù)的界面組件,模型 (Model) 是視圖與原始數(shù)據(jù)之間的接口。 Model/View 結(jié)構(gòu)的典型應(yīng)用是在數(shù)據(jù)庫應(yīng)用程序中,例如數(shù)據(jù)庫中的一個數(shù)據(jù)表可以在一個 OTableView 組件中顯示和編輯。

    2024年02月17日
    瀏覽(41)
  • C++ Qt開發(fā):TableWidget表格組件

    C++ Qt開發(fā):TableWidget表格組件

    Qt 是一個跨平臺C++圖形界面開發(fā)庫,利用Qt可以快速開發(fā)跨平臺窗體應(yīng)用程序,在Qt中我們可以通過拖拽的方式將不同組件放到指定的位置,實現(xiàn)圖形化開發(fā)極大的方便了開發(fā)效率,本章將重點介紹 TableWidget 表格組件的常用方法及靈活運(yùn)用。 QTableWidget 是 Qt 中用于顯示表格數(shù)

    2024年02月04日
    瀏覽(27)
  • C++ Qt開發(fā):PushButton按鈕組件

    C++ Qt開發(fā):PushButton按鈕組件

    Qt 是一個跨平臺C++圖形界面開發(fā)庫,利用Qt可以快速開發(fā)跨平臺窗體應(yīng)用程序,在Qt中我們可以通過拖拽的方式將不同組件放到指定的位置,實現(xiàn)圖形化開發(fā)極大的方便了開發(fā)效率,本章將重點介紹 QPushButton 按鈕組件的常用方法及靈活運(yùn)用。 QPushButton 是 Qt 框架中用于創(chuàng)建按鈕

    2024年02月05日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包