MySQL on Qt (2): SQL的连接、断开与增删查改基本操作

写在前面:

大一下学期的 CPP 大作业“自主订餐系统”可真是颇费了一些力气,每天晚睡早起撸代码,课都没听,很多知识都是现学现用。

为了避免当时学到的东西给全部忘光光(`_>`,我这脑子啊。。。),所以我把当时大作业的一些核心部分(一些零碎的小细节,能记就记)给记录一下,一方面是复习,一方面也方便以后用到的时候查阅。

这篇文章是大作业 MySQL + SQLite 操作相关部分的第二章,主要讲一下 Qt 中 MySQL 和 SQLite 连接、断开与增删查改的基本操作。

Qt SQL 类

Qt 中 SQl 相关类

  • 用户接口层:实现将数据库中的数据链接到窗口部件上
  • SQL接口层:提供对数据库的访问
  • 驱动层:为具体的数据库和SQL接口层之间提供了底层的桥梁

要使用Qt SQL的类,需要在项目文件(.pro文件)中添加:

1
QT += sql

Qt SQL 的连接、断开与增删查改操作

下面用一个 demo 来演示 Qt 中 SQL 的连接、断开与增删查改操作。

demo


先来讲数据库的连接与断开。

连接数据库

上一章已经讲过如何连接 SQL 数据库,这里就简简单单放一下代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 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;
}

这里要注意下打印出错信息的技巧,这样可以方便查错。

断开数据库

啊这,更简单:

1
2
3
4
5
// Close Db
void Widget::closeDb()
{
_db.close();
}

接下来讲数据库的增删查改操作。这些操作主要是对 Query 语句的简单利用。

注意: MySQL 与 SQLite 的 SQL 语法存在一定区别,要注意区分使用。

创建数据表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 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();
}

增加字段

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 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()函数。

1
2
3
4
5
6
7
8
9
// 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() 函数了来检验表是否存在。

查询、遍历数据表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 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();
}

数据表的遍历技巧要记住。

插入数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 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)方法来指定参数。

更新数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 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();
}

删除数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 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 教程:

MySQL: https://www.runoob.com/mysql/mysql-tutorial.html

SQLite: https://www.runoob.com/sqlite/sqlite-tutorial.html