QT-数据库的使用

前言

数据库的使用是现在码农的必备技能之一。
基于QT开发应用软件时,有很多方面都要用到数据库。
QT提供了相应的模块,便利基于QT的开发者使用数据库。
Qt SQL 是一个必不可少的模块,它为 SQL 数据库提供支持。
QTSQL的详细信息见官网https://doc.qt.io/qt-5/qtsql-index.html

一、数据库的基本知识

首先要了解SQL 的基本知识,简单的使用SELECT,INSERT,UPDATE,和DELETE语句。
SQL的基本知识学习可以看菜鸟教程,这是一个非常好的网站,强烈推荐!
菜鸟教程网址:https://www.runoob.com/sqlite/sqlite-tutorial.html

二、使用步骤

1.引入库

首先,在项目文件pro中添加:

QT       += sql

其次,添加头文件:

#include <QtSql/QSqlDatabase>
#include <QtSql/QSqlTableModel>
#include <QItemSelectionModel>
#include<QtSql/QSqlQuery>
#include <Qt>
#include <QSqlError>
#include <QMessageBox>
#include <QSqlQueryModel>

2.与数据库建立连接

在这里我使用的时sqlite数据库,数据库文件时.db格式。
注意:有些sqlite数据库文件格式是.sqlite,本程序无法访问,我使用python的sqlite3库却能够访问.sqlite格式的数据库文件。但是,Linux 下文件有无后缀名没本质上的区别。具体原因尚未得知,希望有人能够解答!

/************************打开数据库***************************/
    DB = QSqlDatabase::addDatabase("QSQLITE");
    DB.setDatabaseName("ceshi.db");//
    if (DB.open() == true)
    {
        qDebug()<<"打开数据库成功!";
        query = QSqlQuery(DB);
    }
    else {
        qDebug()<<"打开数据库失败!";
    }

3.创建表

/************************************   创建表   **********************************************/
    query.exec("DROP TABLE  CESHI");
    query.exec("CREATE TABLE CESHI(CESHIID INTEGER PRIMARY KEY NOT NULL,"
                       "CESHIName TEXT,"
                       "CarryOut INT,"
                       "CycleIndex INT,"
                       "CESHItime INT)");

4.设置数据模型

/***************************选择数据表,设置数据模型***************************************************/
    //CESHI表
    Eq_Model = new QSqlTableModel(this, DB);  //# 数据模型
    Eq_Model->setTable("CESHI");   //# 设置数据表
    Eq_Model->setSort(Eq_Model->fieldIndex("CESHIID"), Qt::AscendingOrder);  //# 排序
    Eq_Model->setEditStrategy(QSqlTableModel::OnManualSubmit);
    if (Eq_Model->select() == false)
        qDebug()<<"打开数据表错误!";
    //模型表头设置
	Eq_Model->setHeaderData(Eq_Model->fieldIndex("CESHIID"), Qt::Horizontal, "ID");
    Eq_Model->setHeaderData(Eq_Model->fieldIndex("CESHIName"), Qt::Horizontal, "名字");
    Eq_Model->setHeaderData(Eq_Model->fieldIndex("CarryOut"), Qt::Horizontal, "XXX");
    Eq_Model->setHeaderData(Eq_Model->fieldIndex("CycleIndex"), Qt::Horizontal, "YYY");
    Eq_Model->setHeaderData(Eq_Model->fieldIndex("CESHItime"), Qt::Horizontal, "TTT");

5.数据库操作流程

执行SQL语句

首先,按照SQL语法写一段SQL语句:
“SELECT CESHIID, CESHIName, CESHItime FROM CESHI”
然后,调用query.prepare()准备SQL语句,调用query.bindValue()进行命名绑定。
最后,query.exec();执行语句。
例如:
根据CESHItime的不同,获取CESHI表不同CESHItime的同列数据。

//SQL语句
QString SQL_SELECT = "SELECT CESHIID,CESHIName,CarryOut,CycleIndex,CESHItime FROM CESHI WHERE CESHItime=:ceshitime";
//准备语句
query.prepare(SQL_SELECT);
//命名绑定,可以通过query.bindValue()来设置ceshitime的值
query.bindValue(":ceshitime", 2021);
//执行语句
query.exec();

获取数据

当执行完获取数据的语句后,数据将被存query中,
首先检测语句是否执行了调用query.isActive(),然后检测query中是否存在数据,调用query.first()判断首列是否有数据,进而确定语句执行成功,数据获取成功。
最后执行query.value(“CESHIID”).toInt();获取首列的CESHIID数据。

if (query.isActive()==true)
{
	if (query.first()==true)
	{
		query.value("CESHIID").toInt();
	}

如果,执行的获取数据的语句是获取多列数据,需要遍历query来查看。

if (query.isActive()==true)
    {
        if (query.first()==true)
        {
            query.last(); //移动到尾列
            order = query.at(); //获取总列数
            my_ceshilist_data = new CeShiList_data[order+1];
            int number = 0;
            for(int i = order; i>=0; i--)
            {
                query.seek(i); //移动到第i列
                /*****查看第i列数据******/
                ceshi_data.ceshiID = query.value("CESHIID").toInt();
                ceshi_data.ceshiName = query.value("CESHIName").toString();
                ceshi_data.CarryOut = query.value("CarryOut").toInt();
                ceshi_data.CycleIndex = query.value("CycleIndex").toInt();
                ceshi_data.CESHItime = query.value("CESHItime").toInt();
                /**********************/
                my_ceshilist_data[number] = ceshi_data;
                number++;
            }
        }
    }

总结

注意:SQL语句一定要写对。
如有错误希望请大家指导,谢谢点赞!
希望和大家一起学习,交流

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值