MySQL on Qt (2):SQL的连接、断开与增删查改基本操作
更新于 2021.12.11
文章目录
MySQL on Qt (2): SQL的连接、断开与增删查改基本操作
写在前面:
大一下学期的 CPP 大作业“自主订餐系统”可真是颇费了一些力气,每天晚睡早起撸代码,课都没听,很多知识都是现学现用。
为了避免当时学到的东西给全部忘光光(`_>`,我这脑子啊。。。),所以我把当时大作业的一些核心部分(一些零碎的小细节,能记就记)给记录一下,一方面是复习,一方面也方便以后用到的时候查阅。
这篇文章是大作业 MySQL + SQLite 操作相关部分的第二章,主要讲一下 Qt 中 MySQL 和 SQLite 连接、断开与增删查改的基本操作。
Qt SQL 类

- 用户接口层:实现将数据库中的数据链接到窗口部件上
- SQL接口层:提供对数据库的访问
- 驱动层:为具体的数据库和SQL接口层之间提供了底层的桥梁
要使用Qt SQL的类,需要在项目文件(.pro文件)中添加:
QT += sql
Qt SQL 的连接、断开与增删查改操作
下面用一个 demo 来演示 Qt 中 SQL 的连接、断开与增删查改操作。

先来讲数据库的连接与断开。
连接数据库
上一章已经讲过如何连接 SQL 数据库,这里就简简单单放一下代码。
// Connect to db
bool Widget::connectToDb(const QString & hostName, const int & port, const QString & databaseName, const QString & username, const QString & password)
{
qDebug()<<hostName;
qDebug()<<port;
qDebug()<<databaseName;
qDebug()<<username;
qDebug()<<password;
// Set info
_db.setHostName(hostName);
_db.setPort(port);
_db.setDatabaseName(databaseName);
_db.setUserName(username);
_db.setPassword(password);
// Open Db
bool ret = _db.open();
// Error Info
QSqlError error = _db.lastError();
if(error.type() != QSqlError::NoError)
qDebug()<<error.text();
return ret;
}
这里要注意下打印出错信息的技巧,这样可以方便查错。
断开数据库
啊这,更简单:
// Close Db
void Widget::closeDb()
{
_db.close();
}
接下来讲数据库的增删查改操作。这些操作主要是对 Query 语句的简单利用。
注意: MySQL 与 SQLite 的 SQL 语法存在一定区别,要注意区分使用。
创建数据表
// Create Table
void Widget::createTable()
{
// Query
QSqlQuery query;
// Create table
query.exec("CREATE TABLE `runoob_tbl` \
(`runoob_id` INT UNSIGNED AUTO_INCREMENT, \
`runoob_title` VARCHAR(100) NOT NULL,\
`runoob_author` VARCHAR(40) NOT NULL,\
`submission_date` DATE,\
PRIMARY KEY ( `runoob_id`)) ");
// Error Info
QSqlError error = _db.lastError();
if(error.type() != QSqlError::NoError)
qDebug()<<error.text();
}
增加字段
// Add new column
void Widget::addNewcolumn()
{
// Query
QSqlQuery query;
// Add column
query.exec("ALTER TABLE runoob_tbl ADD COLUMN new1 VARCHAR(20) DEFAULT NULL;");
// Error Info
QSqlError error = _db.lastError();
if(error.type() != QSqlError::NoError)
qDebug()<<error.text();
}
检验表是否存在
检验数据库中是否存在某表,可以利用 QSqlDatabase 提供的 QSqlDatabase::tables()函数。
// Is Table Exists
bool Widget::isTableExists(const QString &)
{
if(_db.tables().contains("user"))
qDebug()<<"Table exists";
else qDebug()<<"Table not exists";
return _db.tables().contains("user");
}
QSqlDatabase::tables()函数返回一个 QStringList 类型的数据,里面储存着所有表名,所以我们可以很方便的调用 QStringList::contains() 函数了来检验表是否存在。
查询、遍历数据表
// Query Table
void Widget::queryTable(const QString &)
{
// Query
QSqlQuery query;
// Query the database
query.exec("SELECT * FROM user WHERE 1");
// Get record
while(query.next())
{
QSqlRecord record = query.record();
qDebug()<<record.value(0)<<" "<<record.value(1)<<" "<<record.value(2)<<" "<<record.value(3)<<" "<<record.value(4);
}
// Error Info
QSqlError error = _db.lastError();
if(error.type() != QSqlError::NoError)
qDebug()<<error.text();
}
数据表的遍历技巧要记住。
插入数据
// Insert Data
void Widget::insertData()
{
//Query
QSqlQuery query;
// Prepare
query.prepare("INSERT INTO user VALUES (:ID, :Name, :Age, :Type, :Gender)");
// Bind value
query.bindValue(":ID",0);
query.bindValue(":Name","test");
query.bindValue(":Age",22);
query.bindValue(":Type","testType");
query.bindValue(":Gender",1);
// Exec inserting
qDebug()<<query.exec();
// Error Info
QSqlError error = _db.lastError();
if(error.type() != QSqlError::NoError)
qDebug()<<error.text();
}
插入数据时使用了QSqlDatabase::prepare() 与 QSqlDatabase::bindValue()方法,当然我们也可以直接调用 QSqlDatabase::exec(),使用tr("%1").arg(arg1)方法来指定参数。
更新数据
// Update Data
void Widget::updateData()
{
// Query
QSqlQuery query;
// Update
qDebug()<<query.exec("UPDATE user SET Age=233 WHERE Name='Joker'");
// Error Info
QSqlError error = _db.lastError();
if(error.type() != QSqlError::NoError)
qDebug()<<error.text();
}
删除数据
// Delete Data
void Widget::deleteData()
{
// Query
QSqlQuery query;
// Delete
query.exec("DELETE FROM user WHERE Name='test'");
// Error Info
QSqlError error = _db.lastError();
if(error.type() != QSqlError::NoError)
qDebug()<<error.text();
}
至此本章的内容基本结束。下一章将讲解 Qt SQL 操作中最为精彩的部分:Model/View 模式。
简单的 MySQL 和 SQLite 教程: