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)建一個新的連接。如果open 為true ,則嘗試打開數(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ù)庫類型的選擇,包括但不限于 SQLite
、MySQL
、PostgreSQL
、Oracle
、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ù)庫文件;
同理,只要準(zhǔn)備合理的SQL語句就可以實現(xiàn)對應(yīng)的數(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ù)庫中存儲,如下圖所示;
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ù)輸出到組件中顯示,如下圖所示;
1.5 更新表中記錄
最后一項是對記錄的更新,其實更新記錄同樣是使用exec()
函數(shù),只不過是將插入語句修改為了update
而已,如下代碼通過數(shù)據(jù)庫查詢并根據(jù)特定條件填充了界面上的兩個文本框 (ui->lineEdit_select_uname
和 ui->lineEdit_select_uage
)。下面是這段代碼的概述:
-
建立數(shù)據(jù)庫連接:
- 通過
QSqlDatabase::addDatabase
設(shè)置數(shù)據(jù)庫的驅(qū)動類型,例如 "QSQLITE"、"QMYSQL" 等。 - 使用
setDatabaseName
設(shè)置數(shù)據(jù)庫名稱,這可能是一個本地文件名或者服務(wù)器地址。 - 嘗試打開數(shù)據(jù)庫連接,如果連接失敗,通過
QMessageBox
顯示錯誤信息。
- 通過
-
執(zhí)行數(shù)據(jù)庫查詢:
- 使用
QSqlQuery
對象執(zhí)行 SQL 查詢語句 "SELECT * FROM LyShark;"。 - 通過
QSqlRecord
獲取查詢結(jié)果的記錄結(jié)構(gòu),包括字段名和字段類型。
- 使用
-
循環(huán)處理查詢結(jié)果:
- 使用
while (query.next())
循環(huán)遍歷查詢結(jié)果中的每一行記錄。 - 對于每個有效的記錄,獲取 "id" 字段的值,并與用戶輸入的 "uid" 進(jìn)行匹配。
- 如果匹配成功,獲取 "name" 和 "age" 字段的值,并將其分別填充到
ui->lineEdit_select_uname
和ui->lineEdit_select_uage
中。 - 如果沒有匹配的記錄,或者記錄無效,將
ui->lineEdit_select_uname
和ui->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ù)的查詢功能,如下圖所示;
數(shù)據(jù)的跟新只需要調(diào)用update
語句即可實現(xiàn),其他的功能與查詢保持一致,如下代碼實現(xiàn)了數(shù)據(jù)的共惡心操作,以下是代碼的概述:
-
建立數(shù)據(jù)庫連接:
- 使用
QSqlDatabase::addDatabase
設(shè)置數(shù)據(jù)庫的驅(qū)動類型,例如 "QSQLITE"、"QMYSQL" 等。 - 使用
setDatabaseName
設(shè)置數(shù)據(jù)庫名稱,這可能是一個本地文件名或者服務(wù)器地址。 - 嘗試打開數(shù)據(jù)庫連接,如果連接失敗,通過
QMessageBox
顯示錯誤信息。
- 使用
-
執(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 更新語句。
- 從用戶界面的輸入框中獲取更新所需的數(shù)據(jù),包括
-
事務(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
;文章來源:http://www.zghlxwxcb.cn/news/detail-760413.html
文章來源地址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)!