赞
踩
Qt只是作为媒介去操作数据库,本身不具备数据库的功能,因此除了Qt以外,还需要在计算机中安装对应的数据库软件,但是由于SQLite数据库比较轻巧,因此Qt集成了SQLite数据库,此数据库是嵌入式中最常用的数据库。
实际上Qt支持以下类型的数据库产品:
在Qt项目中使用数据库必须在.pro项目配置文件中增加sql模块。
主要使用到的类是数据库连接类QSqlDatabase(数据库的连接)和数据库错误信息类QSqlError(可能出现的错误信息),涉及的函数有:
- // 获得一个基于SQLite的数据库连接对象
- QSqlDatabase QSqlDatabase::addDatabase("QSQLITE") [static]
- // 设置SQLite数据库文件的名称(不同的数据库此函数表示不同的功能)
- // 在运行之后,此文件会在构建目录中生成
- void QSqlDatabase::setDatabaseName(const QString & name)
- // 打开数据库连接
- // 返回值是打开的结果,如果打开失败,可以通过lastError()函数获得错误信息
- bool QSqlDatabase::open()
- // 获得上一次数据库的错误信息
- QSqlError QSqlDatabase::lastError() const
- // 可以通过下面的函数把错误信息转换为字符串(实际上这些信息来自于底层数据库)
- QString QSqlError::text() const
- // 判断连接是否打开
- bool QSqlDatabase::isOpen() const
- // 关闭连接
- void QSqlDatabase::close()
连接成功后会生成数据库文件。
QSqlQuery主要用于执行SQL语句,相关函数如下。
- // 执行SQL语句
- // 参数是要执行的SQL语句
- // 返回值是语句本身执行的结果,并不是数据操作的结果
- bool QSqlQuery::exec(const QString & query)
- // 用法与之前的同名函数完全相同
- QSqlError QSqlQuery::lastError() const
参考建表语句:
CREATE TABLE customer(id INTEGER PRIMARY KEY,name TEXT,money REAL,rate REAL);
建表成功后,可以直接到构建目录中使用SQLiteSpy工具打开.db文件验证是否建表成功。
dialog.h
- #ifndef DIALOG_H
- #define DIALOG_H
-
- #include <QtWidgets>
- #include <QDebug>
- #include <QButtonGroup>
- #include <QSqlDatabase>
- #include <QSqlError>
- #include <QSqlQuery>
-
- namespace Ui {
- class Dialog;
- }
-
- class Dialog : public QDialog
- {
- Q_OBJECT
-
- public:
- explicit Dialog(QWidget *parent = 0);
- ~Dialog();
-
- private:
- Ui::Dialog *ui;
- QButtonGroup *group;
- QSqlDatabase db; //数据库连接对象
- void connect2Db(); //连接到数据库
- void createTable(); //建表
-
- private slots:
- void btnsClickedSlot(int); //按钮组点击槽函数
- };
-
- #endif // DIALOG_H

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)));
- connect2Db();
- }
-
- void Dialog::btnsClickedSlot(int id){
- if(id == 1){
-
- }else if(id == 2){
-
- }else if(id == 3){
-
- }else if(id == 4){
-
- }
- }
-
- Dialog::~Dialog()
- {
- //如果数据库连接打开了,则关闭
- if(db.isOpen()){
- db.close();
- }
- delete ui;
- }
-
- void Dialog::connect2Db()
- {
- //获得一个基于SQLite的数据库连接对象
- db = QSqlDatabase::addDatabase("QSQLITE");
- db.setDatabaseName("bank_manage.db"); //设置数据库文件的名称
- //打开链接
- //bool QSqlDatabase::open(); //lasterror函数获得错误信息
- if(db.open()){
- qDebug()<<"连接打开成功!";
- createTable();
- }else{
- //拿到错误信息
- QString text = db.lastError().text();
- //展示错误信息
- QMessageBox::critical(this,"错误",text);
-
- }
-
- }
-
- void Dialog::createTable()
- {
- QString sql = "CREATE TABLE customer(id INTEGER PRIMARY KEY,name TEXT,money REAL,rate REAL)";
- //数据库操作类
- QSqlQuery sq;
- if(sq.exec(sql)){ //执行SQL的成功or失败
- qDebug()<<"建表成功!";
- }else{
- qDebug()<<sq.lastError().text(); //输出错误信息
- }
- }

运行结果:
增删改的操作方法比较相似,需要注意是不要使用拼接的方式创建带参数的SQL语句,原因有:
Qt使用占位符替换的方式“拼接”SQL语句,占位符替换有两种方式:
本次授课使用前者,后者可以查看下面函数的文档。
预处理→绑定→执行
- // 预处理带有占位符的SQL语句
- // 参数为预处理的SQL语句
- // 返回值是预处理的结果
- bool QSqlQuery::prepare(const QString & query)
- // 添加绑定数据
- // 参数为要绑定的数据,各种类型直接传递即可,传递的顺序要按照?的顺序
- void QSqlQuery::addBindValue(const QVariant & val)
- // 执行预处理的SQL语句
- // 语句本身是否成功执行
- bool QSqlQuery::exec()
dialog.h
- #ifndef DIALOG_H
- #define DIALOG_H
-
- #include <QtWidgets>
- #include <QDebug>
- #include <QButtonGroup>
- #include <QSqlDatabase>
- #include <QSqlError>
- #include <QSqlQuery>
-
- namespace Ui {
- class Dialog;
- }
-
- class Dialog : public QDialog
- {
- Q_OBJECT
-
- public:
- explicit Dialog(QWidget *parent = 0);
- ~Dialog();
-
- private:
- Ui::Dialog *ui;
- QButtonGroup *group;
- QSqlDatabase db; //数据库连接对象
- void connect2Db(); //连接到数据库
- void createTable(); //建表
- void insertData(); //插入
- void deleteData(); //删除
- void updateData(); //更新
- void selectAll(); //查询所有
- bool isDataExists(int); //判断某个id的数据在不在
-
- private slots:
- void btnsClickedSlot(int); //按钮组点击槽函数
- };
-
- #endif // DIALOG_H

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)));
- connect2Db();
- }
-
- void Dialog::btnsClickedSlot(int id){
- if(id == 1){
- insertData();
-
- }else if(id == 2){
- deleteData();
-
- }else if(id == 3){
- updateData();
-
- }else if(id == 4){
- selectAll();
-
- }
- }
-
- Dialog::~Dialog()
- {
- //如果数据库连接打开了,则关闭
- if(db.isOpen()){
- db.close();
- }
- delete ui;
- }
-
- void Dialog::connect2Db()
- {
- //获得一个基于SQLite的数据库连接对象
- db = QSqlDatabase::addDatabase("QSQLITE");
- db.setDatabaseName("bank_manage.db"); //设置数据库文件的名称
- //打开链接
- //bool QSqlDatabase::open(); //lasterror函数获得错误信息
- if(db.open()){
- qDebug()<<"连接打开成功!";
- createTable();
- }else{
- //拿到错误信息
- QString text = db.lastError().text();
- //展示错误信息
- QMessageBox::critical(this,"错误",text);
-
- }
-
- }
-
- void Dialog::createTable()
- {
- QString sql = "CREATE TABLE customer(id INTEGER PRIMARY KEY,name TEXT,money REAL,rate REAL)";
- //数据库操作类
- QSqlQuery sq;
- if(sq.exec(sql)){ //执行SQL的成功or失败
- qDebug()<<"建表成功!";
- }else{
- //输出错误信息
- qDebug()<<sq.lastError().text(); //输出错误信息
- }
- }
-
- void Dialog::insertData()
- {
- //如果姓名不输入,引导用户输入
- QString name = ui->lineEdit->text();
- if(name == ""){
- QMessageBox::warning(this,"提示","请输入名称!");
- return;
- }
- int id = ui->spinBox->value();
- double money = ui->doubleSpinBoxCK->value();
- double rate = ui->doubleSpinBoxLL->value();
-
- //操作类对象
- QSqlQuery sq;
- //预处理的SQL语句
- QString sql = "INSERT INTO customer VALUES(?,?,?,?)";
- //预处理
- sq.prepare(sql);
- //绑定数据(顺序不能乱)
- sq.addBindValue(id);
- sq.addBindValue(name);
- sq.addBindValue(money);
- sq.addBindValue(rate);
- //真正执行SQL语句,执行的是内部预处理的语句
- if(sq.exec()){
- QMessageBox::information(this,"通知","成功插入一条数据!");
-
- }else{
- QString text = sq.lastError().text();
- QMessageBox::warning(this,"提示",text);
- }
- }
-
- void Dialog::deleteData()
- {
- int id = ui->spinBox->value();
- // 判断数据在不在
- if(!isDataExists(id)){
- QMessageBox::warning(this,"提示","数据不存在!");
- return;
- }
- QString sql = "DELETE FROM customer WHERE id=?";
- QSqlQuery sq;
- sq.prepare(sql);
- sq.addBindValue(id);
- if(sq.exec()){
- QMessageBox::information(this,"通知","成功删除一条数据!");
-
- }else{
- QString text = sq.lastError().text();
- QMessageBox::warning(this,"提示",text);
- }
-
- }
-
- void Dialog::updateData()
- {
- //如果姓名不输入,引导用户输入
- QString name = ui->lineEdit->text();
- if(name == ""){
- QMessageBox::warning(this,"提示","请输入名称!");
- return;
- }
- int id = ui->spinBox->value();
- //判断要更新的数据在不在
- if(!isDataExists(id)){
- QMessageBox::warning(this,"提示","数据不存在!");
- return;
- }
- double money = ui->doubleSpinBoxCK->value();
- double rate = ui->doubleSpinBoxLL->value();
-
- //操作类对象
- QSqlQuery sq;
- //预处理的SQL语句
- QString sql = "UPDATE customer SET name=?,money=?,rate=? WHERE id=?";
- //预处理
- sq.prepare(sql);
- //绑定
- sq.addBindValue(name);
- sq.addBindValue(money);
- sq.addBindValue(rate);
- sq.addBindValue(id);
- //执行
- if(sq.exec()){
- QMessageBox::information(this,"通知","成功修改一条数据!");
-
- }else{
- QString text = sq.lastError().text();
- QMessageBox::warning(this,"提示",text);
- }
- }
-
- void Dialog::selectAll()
- {
- QString sql = "SELECT * FROM customer";
- QSqlQuery sq;
- if(sq.exec(sql)){
- //清空上次显示的结果
- ui->textBrowser->clear();
- while(sq.next()){ //判断后面有没有数据
- //取出每列的数据
- //方式一:按照列序号(0,1,2...)取出
- QString id = sq.value(0).toString();
- //方式二:按照列名取出
- QString name = sq.value("name").toString();
- QString money = sq.value("money").toString();
- QString rate = sq.value("rate").toString();
- QString text;
- text = text+id.append("-")+name.append("-")+money.append("-")+rate;
- //展示数据
- ui->textBrowser->append(text);
- }
- }else{
- QString text = sq.lastError().text();
- QMessageBox::warning(this,"提示",text);
- }
- }
-
- bool Dialog::isDataExists(int id)
- {
- QString sql = "SELECT * FROM customer WHERE id=?";
- QSqlQuery sq;
- sq.prepare(sql); //预处理
- sq.addBindValue(id); //绑定
- sq.exec(); //执行
- return sq.next(); //只需要返回后面有没有数据
-
- }

ui界面
运行结果
利用SQLiteSpy.exe查看数据表:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。