八、数据库
- 准备工作
Qt本身并没有数据库功能,但是Qt支持调用其他主流的数据库产品。并且这些数据库产品指定了统一的Qt接口,实际上是一种数据库的中间件。
Qt支持以下数据库类型:
嵌入式常用的数据库式SQLite3,本体只有几兆大小,非常适合集成到嵌入式产品中,在Qt5版本及以上也集成了SQLite数据库,因此可以直接通过驱动名称连接SQLite。
数据库编程中需要用到以下几个相关类:
- QSqlDatabase
数据库相关类,表示一个数据库连接。
- QSqlQuery
数据库操作类,可以操作SQL语句
- QSqlError
数据库错误信息类,用于收集数据库底层传递到Qt中的错误信息。
数据库相关类无法直接使用,需要在.pro项目配置文件中添加sql模块。
添加完成后要保存
- 连接数据库
主要通过QSqlDatabase类进行连接,相关函数实现:
// 获得一个数据库连接对象
// 参数位数据库类型,详见本章第一节表格(注意大小写)
// 返回值为连接对象
QSqlDatabase QSqlDatabase::addDatabase(const QString & type)
[static]
// 设置数据库名称
// 参数因不同的数据类型表示不同的含义,对于SQLite,此函数表示数据文件名,此文件会在项目中构建目录中生成。
void QSqlDatabase::setDatabaseName(const QString & name)
// 打开数据库连接
// 返回值为连接打开的结果,如果打开失败,可以通过lastError函数获得错误信息
bool QSqlDatabase::open()
// 返回上一次的错误信息封装类
QSqlError QSqlDatabase::lastError() const
// 从QSqlError对象中提取错误信息文本QString
QString QSqlError::text() const
在构造函数中开启数据库连接,在析构函数中关闭数据连接。
// 返回数据库连接的打开状态
bool QSqlDatabase::isOpen() const
// 关闭数据库连接
void QSqlDatabase::close()
dialog.cpp
#include "dialog.h"
#include "ui_dialog.h"
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
group = new QButtonGroup(this);
group->addButton(ui->pushButtonInsert,1);
group->addButton(ui->pushButtonDelete,2);
group->addButton(ui->pushButtonUpdate,3);
group->addButton(ui->pushButtonSelect,4);
connect(group,SIGNAL(buttonClicked(int)),
this,SLOT(btnsClickedSlot(int)));
connectD2B();
}
Dialog::~Dialog()
{
// 关闭数据库连接
if(db.isOpen())
{
db.close();
}
delete ui;
}
// 连接数据库
void Dialog::connectD2B()
{
// 获取数据库连接对象
db = QSqlDatabase::addDatabase("QSQLITE");
// 设置数据库名称
db.setDatabaseName("book_manmgement.db");
// 打开数据库连接
bool ret = db.open();
if(ret == true)
{
qDebug() << "打开成功" ;
}
else
{
// 数据库连接打开失败
QSqlError errorInfo = db.lastError();
QString text = errorInfo.text();
QMessageBox::critical(this,"错误",text);
}
}
void Dialog::btnsClickedSlot(int id)
{
if(id == 1)
{
qDebug() << "增加" ;
}
else if(id == 2)
{
qDebug() << "删除" ;
}
else if(id == 3)
{
qDebug() << "修改" ;
}
else if(id == 4)
{
qDebug() << "查找" ;
}
else
{
}
}
3、创建表
建表语句:
CREATE TABLE book(id INTEGER PRIMARY KEY,name TEXT,price REAL,author TEXT);
CREATE TABLE book(
id INTEGER PRIMARY KEY,
name TEXT,
price REAL,
author TEXT
);
一个操作SQLite的可视化软件
下载链接:百度网盘 请输入提取码
提取码:hqyj
// 执行sql语句
// 参数为执行的sql语句内容
// 返回值为执行的结果
bool QSqlQuery::exec(const QString & query)
建表成功后,可以使用SQLiteSpy打开数据库文件查看表结构是否成功。
#include "dialog.h"
#include "ui_dialog.h"
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
group = new QButtonGroup(this);
group->addButton(ui->pushButtonInsert,1);
group->addButton(ui->pushButtonDelete,2);
group->addButton(ui->pushButtonUpdate,3);
group->addButton(ui->pushButtonSelect,4);
connect(group,SIGNAL(buttonClicked(int)),
this,SLOT(btnsClickedSlot(int)));
connectD2B();
}
Dialog::~Dialog()
{
// 关闭数据库连接
if(db.isOpen())
{
db.close();
}
delete ui;
}
// 连接数据库
void Dialog::connectD2B()
{
// 获取数据库连接对象
db = QSqlDatabase::addDatabase("QSQLITE");
// 设置数据库名称
db.setDatabaseName("book_manmgement.db");
// 打开数据库连接
bool ret = db.open();
if(ret == true)
{
qDebug() << "打开成功" ;
createTable();
}
else
{
// 数据库连接打开失败
QSqlError errorInfo = db.lastError();
QString text = errorInfo.text();
QMessageBox::critical(this,"错误",text);
}
}
// 创建表
void Dialog::createTable()
{
QString sql = "CREATE TABLE book(id INTEGER PRIMARY KEY,name TEXT,price REAL,author TEXT)";
sql = "CREATE TABLE book(\
id INTEGER PRIMARY KEY,\
name TEXT,\
price REAL,\
author TEXT\);";
// 创建数据库操作类
QSqlQuery sq;
if(sq.exec(sql)) // 表创建成功
{
qDebug() << "建表成功";
}
else // 建表失败: 注意 建表成功或失败都很正常,如果要建的表已经存在,就会建表失败
{
QSqlError errInfo = sq.lastError();
QString text = errInfo.text();
qDebug() << "建表失败" << text;
}
}
void Dialog::btnsClickedSlot(int id)
{
if(id == 1)
{
qDebug() << "增加" ;
}
else if(id == 2)
{
qDebug() << "删除" ;
}
else if(id == 3)
{
qDebug() << "修改" ;
}
else if(id == 4)
{
qDebug() << "查找" ;
}
else
{
}
}
4、增删改
增删改操作都需要先录入用户输入,然后把用户如数的数据组装成SQL预取,最后执行。
组装SQL语句有两种方式:
- 字符串拼接
这种方式虽然原理简单,但是容易拼接出错。且安全性低。
- 预处理+占位符
推荐使用这种方式,这种方式需要先编写有占位符的预处理SQL语句,交给Qt,Qt内部就直到要执行的SQL语句格式,然后再进行参数与占位符的替换,最终执行。
占位符有两种风格:
- Oracle风格
使用:字段的格式
UPDATE book SET name=:name,price=:price,author=:author WHERE id=:id;
- ODBC风格
使用?的格式
-- 一个ODBC风格的预处理语句
INSERT INTO book VALUES(?,?,?,?);
// 预处理SQL语句,此时SQL语句并没有执行,只是送到Qt内部
// 参数为要预处理的SQL语句
// 返回值为预处理的结果
bool QSqlQuery::prepare(const QString & query)
// 绑定ODBC风格的占位符参数,绑定时一定要注意参数的顺序
// 参数为要绑定的数据
void QSqlQuery::addBindValue(const QVariant & val)
// 添加数据
void Dialog::insertData()
{
QString name = ui->lineEdit->text();
if(name == "")
{
QMessageBox::warning(this,"提示","请输入书名");
return;
}
QString author = ui->lineEditAuthor->text();
if(author == "")
{
QMessageBox::warning(this,"提示","请输入作者名");
return;
}
int id = ui->spinBox->value();
double price = ui->doubleSpinBox->value();
// 预处理的SQL语句
QString sql = "INSERT INTO book VALUES(?,?,?,?);";
// 预处理
QSqlQuery sq;
sq.prepare(sql);
// 绑定参数
sq.addBindValue(id);
sq.addBindValue(name);
sq.addBindValue(price);
sq.addBindValue(author);
// 执行绑定后的SQL语句
if(sq.exec())
{
QMessageBox::information(this,"通知","数据插入成功");
}
else
{
QSqlError errInfo = sq.lastError();
QString text = errInfo.text();
QMessageBox::warning(this,"警告","数据插入失败");
}
}
// 绑定Oracle风格的占位符参数,绑定时可以乱序
// 参数1:占位符
// 参数2:要绑定的数据
void QSqlQuery::bindValue(const QString & placeholder, const QVariant & val)
#include "dialog.h"
#include "ui_dialog.h"
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
group = new QButtonGroup(this);
group->addButton(ui->pushButtonInsert,1);
group->addButton(ui->pushButtonDelete,2);
group->addButton(ui->pushButtonUpdate,3);
group->addButton(ui->pushButtonSelect,4);
connect(group,SIGNAL(buttonClicked(int)),
this,SLOT(btnsClickedSlot(int)));
connectD2B();
}
Dialog::~Dialog()
{
// 关闭数据库连接
if(db.isOpen())
{
db.close();
}
delete ui;
}
// 连接数据库
void Dialog::connectD2B()
{
// 获取数据库连接对象
db = QSqlDatabase::addDatabase("QSQLITE");
// 设置数据库名称
db.setDatabaseName("book_manmgement.db");
// 打开数据库连接
bool ret = db.open();
if(ret == true)
{
qDebug() << "打开成功" ;
createTable();
}
else
{
// 数据库连接打开失败
QSqlError errorInfo = db.lastError();
QString text = errorInfo.text();
QMessageBox::critical(this,"错误",text);
}
}
// 创建表
void Dialog::createTable()
{
QString sql = "CREATE TABLE book(id INTEGER PRIMARY KEY,name TEXT,price REAL,author TEXT)";
sql = "CREATE TABLE book(\
id INTEGER PRIMARY KEY,\
name TEXT,\
price REAL,\
author TEXT\);";
// 创建数据库操作类
QSqlQuery sq;
if(sq.exec(sql)) // 表创建成功
{
qDebug() << "建表成功";
}
else // 建表失败: 注意 建表成功或失败都很正常,如果要建的表已经存在,就会建表失败
{
QSqlError errInfo = sq.lastError();
QString text = errInfo.text();
qDebug() << "建表失败" << text;
}
}
// 添加数据
void Dialog::insertData()
{
QString name = ui->lineEdit->text();
if(name == "")
{
QMessageBox::warning(this,"提示","请输入书名");
return;
}
QString author = ui->lineEditAuthor->text();
if(author == "")
{
QMessageBox::warning(this,"提示","请输入作者名");
return;
}
int id = ui->spinBox->value();
double price = ui->doubleSpinBox->value();
// 预处理的SQL语句
QString sql = "INSERT INTO book VALUES(?,?,?,?);";
// 预处理
QSqlQuery sq;
sq.prepare(sql);
// 绑定参数
sq.addBindValue(id);
sq.addBindValue(name);
sq.addBindValue(price);
sq.addBindValue(author);
// 执行绑定后的SQL语句
if(sq.exec())
{
QMessageBox::information(this,"通知","数据插入成功");
}
else
{
QSqlError errInfo = sq.lastError();
QString text = errInfo.text();
QMessageBox::warning(this,"警告","数据插入失败");
}
}
// 删除按照id删除
void Dialog::deleteData()
{
int id = ui->spinBox->value();
// 查询表中id是否存在
// TODO --
// 预处理的SQL语句
QString sql = "DELETE FROM book WHERE id=?";
QSqlQuery sq;
sq.prepare(sql); // 预处理
// 绑定参数id
sq.addBindValue(id);
// 执行绑定后的sql语句
if(sq.exec())
{
QMessageBox::information(this,"通知","数据删除成功");
}
else
{
// 获取错误信息封装类
QSqlError errInfo = sq.lastError();
QString text = errInfo.text();
QMessageBox::warning(this,"警告",text);
}
}
// 更改数据
void Dialog::updateData()
{
// 获取用户输入数据
QString name = ui->lineEdit->text();
if(name == "")
{
QMessageBox::warning(this,"提示","请输入书名");
return;
}
QString author = ui->lineEditAuthor->text();
if(author == "")
{
QMessageBox::warning(this,"提示","请输入作者名");
return;
}
int id = ui->spinBox->value();
double price = ui->doubleSpinBox->value();
// 判断id是否再数据库中存在
// TODO
// 预处理语句(Oracle风格)
QString sql = "UPDATE book SET name=:name,price=:price,author=:author WHERE id=:id";
// 预处理
QSqlQuery sq;
sq.prepare(sql);
// 绑定参数
sq.bindValue(":id",id);
sq.bindValue(":price",price);
sq.bindValue(":author",author);
sq.bindValue(":name",name);
// 执行绑定后的数据
if(sq.exec())
{
qDebug() << "更新成功" ;
QMessageBox::information(this,"提示","数据更改成功");
}
else
{
QSqlError errInfo = sq.lastError();
QString text = errInfo.text();
QMessageBox::warning(this,"警告",text);
}
}
void Dialog::btnsClickedSlot(int id)
{
if(id == 1)
{
qDebug() << "增加" ;
insertData();
}
else if(id == 2)
{
qDebug() << "删除" ;
deleteData();
}
else if(id == 3)
{
qDebug() << "修改" ;
updateData();
}
else if(id == 4)
{
qDebug() << "查找" ;
}
else
{
}
}
5、查询
5.1 全查
相关函数
// 判断查询结果有无数据,如果有则移动游标并取出,没有返回false
bool QSqlQuery::next()
// 按照字段序号取出对应的值,序号从0开始
// 返回值为QVariant类型,可以根据需要直接转换为所需数据类型
QVariant QSqlQuery::value(int index) const
// 按照字段名称取出对应的值
// 返回值为QVariant类型,可以根据需要直接转换为所需数据类型
QVariant QSqlQuery::value(const QString & name) const
#include "dialog.h"
#include "ui_dialog.h"
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
group = new QButtonGroup(this);
group->addButton(ui->pushButtonInsert,1);
group->addButton(ui->pushButtonDelete,2);
group->addButton(ui->pushButtonUpdate,3);
group->addButton(ui->pushButtonSelect,4);
connect(group,SIGNAL(buttonClicked(int)),
this,SLOT(btnsClickedSlot(int)));
connectD2B();
}
Dialog::~Dialog()
{
// 关闭数据库连接
if(db.isOpen())
{
db.close();
}
delete ui;
}
// 连接数据库
void Dialog::connectD2B()
{
// 获取数据库连接对象
db = QSqlDatabase::addDatabase("QSQLITE");
// 设置数据库名称
db.setDatabaseName("book_manmgement.db");
// 打开数据库连接
bool ret = db.open();
if(ret == true)
{
qDebug() << "打开成功" ;
createTable();
}
else
{
// 数据库连接打开失败
QSqlError errorInfo = db.lastError();
QString text = errorInfo.text();
QMessageBox::critical(this,"错误",text);
}
}
// 创建表
void Dialog::createTable()
{
QString sql = "CREATE TABLE book(id INTEGER PRIMARY KEY,name TEXT,price REAL,author TEXT)";
sql = "CREATE TABLE book(\
id INTEGER PRIMARY KEY,\
name TEXT,\
price REAL,\
author TEXT\);";
// 创建数据库操作类
QSqlQuery sq;
if(sq.exec(sql)) // 表创建成功
{
qDebug() << "建表成功";
}
else // 建表失败: 注意 建表成功或失败都很正常,如果要建的表已经存在,就会建表失败
{
QSqlError errInfo = sq.lastError();
QString text = errInfo.text();
qDebug() << "建表失败" << text;
}
}
// 添加数据
void Dialog::insertData()
{
QString name = ui->lineEdit->text();
if(name == "")
{
QMessageBox::warning(this,"提示","请输入书名");
return;
}
QString author = ui->lineEditAuthor->text();
if(author == "")
{
QMessageBox::warning(this,"提示","请输入作者名");
return;
}
int id = ui->spinBox->value();
double price = ui->doubleSpinBox->value();
// 预处理的SQL语句
QString sql = "INSERT INTO book VALUES(?,?,?,?);";
// 预处理
QSqlQuery sq;
sq.prepare(sql);
// 绑定参数
sq.addBindValue(id);
sq.addBindValue(name);
sq.addBindValue(price);
sq.addBindValue(author);
// 执行绑定后的SQL语句
if(sq.exec())
{
QMessageBox::information(this,"通知","数据插入成功");
}
else
{
QSqlError errInfo = sq.lastError();
QString text = errInfo.text();
QMessageBox::warning(this,"警告","数据插入失败");
}
}
// 删除按照id删除
void Dialog::deleteData()
{
int id = ui->spinBox->value();
// 查询表中id是否存在
if(!isDataExists(id))
{
QMessageBox::warning(this,"提示","没有找到要修改的数据");
return;
}
// 预处理的SQL语句
QString sql = "DELETE FROM book WHERE id=?";
QSqlQuery sq;
sq.prepare(sql); // 预处理
// 绑定参数id
sq.addBindValue(id);
// 执行绑定后的sql语句
if(sq.exec())
{
QMessageBox::information(this,"通知","数据删除成功");
}
else
{
// 获取错误信息封装类
QSqlError errInfo = sq.lastError();
QString text = errInfo.text();
QMessageBox::warning(this,"警告",text);
}
}
// 更改数据
void Dialog::updateData()
{
// 获取用户输入数据
QString name = ui->lineEdit->text();
if(name == "")
{
QMessageBox::warning(this,"提示","请输入书名");
return;
}
QString author = ui->lineEditAuthor->text();
if(author == "")
{
QMessageBox::warning(this,"提示","请输入作者名");
return;
}
int id = ui->spinBox->value();
double price = ui->doubleSpinBox->value();
// 判断id是否再数据库中存在
if(!isDataExists(id))
{
QMessageBox::warning(this,"提示","没有找到要修改的数据");
return;
}
// 预处理语句(Oracle风格)
QString sql = "UPDATE book SET name=:name,price=:price,author=:author WHERE id=:id";
// 预处理
QSqlQuery sq;
sq.prepare(sql);
// 绑定参数
sq.bindValue(":id",id);
sq.bindValue(":price",price);
sq.bindValue(":author",author);
sq.bindValue(":name",name);
// 执行绑定后的数据
if(sq.exec())
{
qDebug() << "更新成功" ;
QMessageBox::information(this,"提示","数据更改成功");
}
else
{
QSqlError errInfo = sq.lastError();
QString text = errInfo.text();
QMessageBox::warning(this,"警告",text);
}
}
// 查找全部数据
void Dialog::selectAll()
{
ui->textBrowser->clear();
QString sql = "SELECT * FROM book";
QSqlQuery sq;
if(sq.exec(sql))
{
while(sq.next()) // 循环取出
{
// 取出一条记录中的每个字段值
QString id = sq.value(0).toString();
QString name = sq.value(1).toString();
QString price = sq.value("price").toString();
QString author = sq.value("author").toString();
// 显示
QString text = id.append("-")+name.append("-")+price.append("-")+author;
ui->textBrowser->append(text);
}
}
}
// 判断数据是否存在,采用字符串拼接
bool Dialog::isDataExists(int id)
{
QString idText = QString::number(5.2id);
QString sql = "SELECT * FROM book WHERE id=";
sql.append(idText); // 拼接只为证明可行,但不建议
QSqlQuery sq;
if(sq.exec(sql))
{
return sq.next();
}
else
{
return false;
}
}
void Dialog::btnsClickedSlot(int id)
{
if(id == 1)
{
qDebug() << "增加" ;
insertData();
}
else if(id == 2)
{
qDebug() << "删除" ;
deleteData();
}
else if(id == 3)
{
qDebug() << "修改" ;
updateData();
}
else if(id == 4)
{
qDebug() << "查找" ;
selectAll();
}
else
{
}
}
5.2 模糊查询
可以使用LIKE关键字配合两个通配符实现模糊查询。
- %
任意多个(0,1........n)个字符
- _
任意一个字符
【例子】查询‘春’字辈人员信息
SELECT * FROM book WHERE name LIKE "_春%"
【例子】查询姓名中包含”春“的人员信息
SELECT * FROM book WHERE name LIKE "%春%"
// 模糊查询,按照书名进行查询
void Dialog::selectLike()
{
// 获取用户输入信息
QString name = ui->lineEdit->text();
if(name == "")
{
QMessageBox::warning(this,"提示","请输入书名");
return;
}
// 预处理SQL
QString sql = "SELECT * FROM book WHERE name LIKE ?";
QSqlQuery sq;
// 预处理
sq.prepare(sql);
sq.addBindValue(name.prepend("%").append("%")); // 通配符
if(sq.exec())
{
// 是否查到状态
bool reState = true;
// 清空上次显示
ui->textBrowser->clear();
while(sq.next())
{
QString id = sq.value(0).toString();
QString name = sq.value(1).toString();
QString price = sq.value(2).toString();
QString author = sq.value(3).toString();
// 显示
QString text = id.append("-")+name.append("-")+price.append("-")+author;
ui->textBrowser->append(text);
reState = false;
}
if(reState)
{
QMessageBox::information(this,"提示","没有找到相关数据");
}
}
else
{
QString text = sq.lastError().text();
text.prepend("查询失败:");
QMessageBox::critical(this,"错误",text);
}
}
5.1 全查
相关函数
// 判断查询结果有无数据,如果有则移动游标并取出,没有返回false
bool QSqlQuery::next()
// 按照字段序号取出对应的值,序号从0开始
// 返回值为QVariant类型,可以根据需要直接转换为所需数据类型
QVariant QSqlQuery::value(int index) const
// 按照字段名称取出对应的值
// 返回值为QVariant类型,可以根据需要直接转换为所需数据类型
QVariant QSqlQuery::value(const QString & name) const
#include "dialog.h"
#include "ui_dialog.h"
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
group = new QButtonGroup(this);
group->addButton(ui->pushButtonInsert,1);
group->addButton(ui->pushButtonDelete,2);
group->addButton(ui->pushButtonUpdate,3);
group->addButton(ui->pushButtonSelect,4);
connect(group,SIGNAL(buttonClicked(int)),
this,SLOT(btnsClickedSlot(int)));
connectD2B();
}
Dialog::~Dialog()
{
// 关闭数据库连接
if(db.isOpen())
{
db.close();
}
delete ui;
}
// 连接数据库
void Dialog::connectD2B()
{
// 获取数据库连接对象
db = QSqlDatabase::addDatabase("QSQLITE");
// 设置数据库名称
db.setDatabaseName("book_manmgement.db");
// 打开数据库连接
bool ret = db.open();
if(ret == true)
{
qDebug() << "打开成功" ;
createTable();
}
else
{
// 数据库连接打开失败
QSqlError errorInfo = db.lastError();
QString text = errorInfo.text();
QMessageBox::critical(this,"错误",text);
}
}
// 创建表
void Dialog::createTable()
{
QString sql = "CREATE TABLE book(id INTEGER PRIMARY KEY,name TEXT,price REAL,author TEXT)";
sql = "CREATE TABLE book(\
id INTEGER PRIMARY KEY,\
name TEXT,\
price REAL,\
author TEXT\);";
// 创建数据库操作类
QSqlQuery sq;
if(sq.exec(sql)) // 表创建成功
{
qDebug() << "建表成功";
}
else // 建表失败: 注意 建表成功或失败都很正常,如果要建的表已经存在,就会建表失败
{
QSqlError errInfo = sq.lastError();
QString text = errInfo.text();
qDebug() << "建表失败" << text;
}
}
// 添加数据
void Dialog::insertData()
{
QString name = ui->lineEdit->text();
if(name == "")
{
QMessageBox::warning(this,"提示","请输入书名");
return;
}
QString author = ui->lineEditAuthor->text();
if(author == "")
{
QMessageBox::warning(this,"提示","请输入作者名");
return;
}
int id = ui->spinBox->value();
double price = ui->doubleSpinBox->value();
// 预处理的SQL语句
QString sql = "INSERT INTO book VALUES(?,?,?,?);";
// 预处理
QSqlQuery sq;
sq.prepare(sql);
// 绑定参数
sq.addBindValue(id);
sq.addBindValue(name);
sq.addBindValue(price);
sq.addBindValue(author);
// 执行绑定后的SQL语句
if(sq.exec())
{
QMessageBox::information(this,"通知","数据插入成功");
}
else
{
QSqlError errInfo = sq.lastError();
QString text = errInfo.text();
QMessageBox::warning(this,"警告","数据插入失败");
}
}
// 删除按照id删除
void Dialog::deleteData()
{
int id = ui->spinBox->value();
// 查询表中id是否存在
if(!isDataExists(id))
{
QMessageBox::warning(this,"提示","没有找到要修改的数据");
return;
}
// 预处理的SQL语句
QString sql = "DELETE FROM book WHERE id=?";
QSqlQuery sq;
sq.prepare(sql); // 预处理
// 绑定参数id
sq.addBindValue(id);
// 执行绑定后的sql语句
if(sq.exec())
{
QMessageBox::information(this,"通知","数据删除成功");
}
else
{
// 获取错误信息封装类
QSqlError errInfo = sq.lastError();
QString text = errInfo.text();
QMessageBox::warning(this,"警告",text);
}
}
// 更改数据
void Dialog::updateData()
{
// 获取用户输入数据
QString name = ui->lineEdit->text();
if(name == "")
{
QMessageBox::warning(this,"提示","请输入书名");
return;
}
QString author = ui->lineEditAuthor->text();
if(author == "")
{
QMessageBox::warning(this,"提示","请输入作者名");
return;
}
int id = ui->spinBox->value();
double price = ui->doubleSpinBox->value();
// 判断id是否再数据库中存在
if(!isDataExists(id))
{
QMessageBox::warning(this,"提示","没有找到要修改的数据");
return;
}
// 预处理语句(Oracle风格)
QString sql = "UPDATE book SET name=:name,price=:price,author=:author WHERE id=:id";
// 预处理
QSqlQuery sq;
sq.prepare(sql);
// 绑定参数
sq.bindValue(":id",id);
sq.bindValue(":price",price);
sq.bindValue(":author",author);
sq.bindValue(":name",name);
// 执行绑定后的数据
if(sq.exec())
{
qDebug() << "更新成功" ;
QMessageBox::information(this,"提示","数据更改成功");
}
else
{
QSqlError errInfo = sq.lastError();
QString text = errInfo.text();
QMessageBox::warning(this,"警告",text);
}
}
// 查找全部数据
void Dialog::selectAll()
{
ui->textBrowser->clear();
QString sql = "SELECT * FROM book";
QSqlQuery sq;
if(sq.exec(sql))
{
while(sq.next()) // 循环取出
{
// 取出一条记录中的每个字段值
QString id = sq.value(0).toString();
QString name = sq.value(1).toString();
QString price = sq.value("price").toString();
QString author = sq.value("author").toString();
// 显示
QString text = id.append("-")+name.append("-")+price.append("-")+author;
ui->textBrowser->append(text);
}
}
}
// 判断数据是否存在,采用字符串拼接
bool Dialog::isDataExists(int id)
{
QString idText = QString::number(5.2id);
QString sql = "SELECT * FROM book WHERE id=";
sql.append(idText); // 拼接只为证明可行,但不建议
QSqlQuery sq;
if(sq.exec(sql))
{
return sq.next();
}
else
{
return false;
}
}
void Dialog::btnsClickedSlot(int id)
{
if(id == 1)
{
qDebug() << "增加" ;
insertData();
}
else if(id == 2)
{
qDebug() << "删除" ;
deleteData();
}
else if(id == 3)
{
qDebug() << "修改" ;
updateData();
}
else if(id == 4)
{
qDebug() << "查找" ;
selectAll();
}
else
{
}
}
5.2 模糊查询
可以使用LIKE关键字配合两个通配符实现模糊查询。
- %
任意多个(0,1........n)个字符
- _
任意一个字符
【例子】查询‘春’字辈人员信息
SELECT * FROM book WHERE name LIKE "_春%"
【例子】查询姓名中包含”春“的人员信息
SELECT * FROM book WHERE name LIKE "%春%"
// 模糊查询,按照书名进行查询
void Dialog::selectLike()
{
// 获取用户输入信息
QString name = ui->lineEdit->text();
if(name == "")
{
QMessageBox::warning(this,"提示","请输入书名");
return;
}
// 预处理SQL
QString sql = "SELECT * FROM book WHERE name LIKE ?";
QSqlQuery sq;
// 预处理
sq.prepare(sql);
sq.addBindValue(name.prepend("%").append("%")); // 通配符
if(sq.exec())
{
// 是否查到状态
bool reState = true;
// 清空上次显示
ui->textBrowser->clear();
while(sq.next())
{
QString id = sq.value(0).toString();
QString name = sq.value(1).toString();
QString price = sq.value(2).toString();
QString author = sq.value(3).toString();
// 显示
QString text = id.append("-")+name.append("-")+price.append("-")+author;
ui->textBrowser->append(text);
reState = false;
}
if(reState)
{
QMessageBox::information(this,"提示","没有找到相关数据");
}
}
else
{
QString text = sq.lastError().text();
text.prepend("查询失败:");
QMessageBox::critical(this,"错误",text);
}
}