MySQL on Qt (2): SQL的连接、断开与增删查改基本操作
写在前面:
大一下学期的 CPP 大作业“自主订餐系统”可真是颇费了一些力气,每天晚睡早起撸代码,课都没听,很多知识都是现学现用。
为了避免当时学到的东西给全部忘光光(`_>`,我这脑子啊。。。),所以我把当时大作业的一些核心部分(一些零碎的小细节,能记就记)给记录一下,一方面是复习,一方面也方便以后用到的时候查阅。
这篇文章是大作业 MySQL + SQLite 操作相关部分的第二章,主要讲一下 Qt 中 MySQL 和 SQLite 连接、断开与增删查改的基本操作。
Qt SQL 类
- 用户接口层:实现将数据库中的数据链接到窗口部件上
- SQL接口层:提供对数据库的访问
- 驱动层:为具体的数据库和SQL接口层之间提供了底层的桥梁
要使用Qt SQL的类,需要在项目文件(.pro文件)中添加:
Qt SQL 的连接、断开与增删查改操作
下面用一个 demo 来演示 Qt 中 SQL 的连接、断开与增删查改操作。
先来讲数据库的连接与断开。
连接数据库
上一章已经讲过如何连接 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
| 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;
_db.setHostName(hostName); _db.setPort(port); _db.setDatabaseName(databaseName); _db.setUserName(username); _db.setPassword(password);
bool ret = _db.open();
QSqlError error = _db.lastError(); if(error.type() != QSqlError::NoError) qDebug()<<error.text();
return ret; }
|
这里要注意下打印出错信息的技巧,这样可以方便查错。
断开数据库
啊这,更简单:
1 2 3 4 5
| 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
| void Widget::createTable() { QSqlQuery query;
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`)) ");
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
| void Widget::addNewcolumn() { QSqlQuery query;
query.exec("ALTER TABLE runoob_tbl ADD COLUMN new1 VARCHAR(20) DEFAULT NULL;");
QSqlError error = _db.lastError(); if(error.type() != QSqlError::NoError) qDebug()<<error.text(); }
|
检验表是否存在
检验数据库中是否存在某表,可以利用 QSqlDatabase 提供的 QSqlDatabase::tables()
函数。
1 2 3 4 5 6 7 8 9
| 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
| void Widget::queryTable(const QString &) { QSqlQuery query;
query.exec("SELECT * FROM user WHERE 1");
while(query.next()) { QSqlRecord record = query.record();
qDebug()<<record.value(0)<<" "<<record.value(1)<<" "<<record.value(2)<<" "<<record.value(3)<<" "<<record.value(4); }
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
| void Widget::insertData() { QSqlQuery query;
query.prepare("INSERT INTO user VALUES (:ID, :Name, :Age, :Type, :Gender)");
query.bindValue(":ID",0); query.bindValue(":Name","test"); query.bindValue(":Age",22); query.bindValue(":Type","testType"); query.bindValue(":Gender",1);
qDebug()<<query.exec();
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
| void Widget::updateData() { QSqlQuery query;
qDebug()<<query.exec("UPDATE user SET Age=233 WHERE Name='Joker'");
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
| void Widget::deleteData() { QSqlQuery query;
query.exec("DELETE FROM user WHERE Name='test'");
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