QSqlDatabase(2)实例,QTableView显示数据库表数据

目录

前言

1、实现的功能

2、具体的代码实现


前言

想了解QSqlDatabase基本知识的,以及增删改查的用法,可以浏览上一篇文章:

QSqlDatabase(1)基本接口,以及(增删改除)的简单实例_Ivy_belief的博客-CSDN博客

这篇主要实战,写了一个数据动态库。

1、实现的功能

先来看看要实现的页面信息:

 数据库的动态库主要实现了:数据库的增、删、改、查的功能。

(1)增加数据的功能;

(2)删除数据的功能;

(3)修改数据的功能;

(4)查找数据的功能;

(5)用QTableView显示数据库表数据;

(6)直接执行sql语句的功能;

2、具体的代码实现

数据库测试工具GUI页面的主要功能:

(1)增加数据:

bool RobotDataBaseManager::addData2DB(string strOrderId, string strEntry, string strMoney, string strPlate, string strType, string strWeight)
{
    if (isOrderIdExist(strOrderId))
        return false;

    QString orderId = QString::fromStdString(strOrderId);
    QString entry = QString::fromStdString(strEntry);
    QString money = QString::fromStdString(strMoney);
    QString plate = QString::fromStdString(strPlate);
    QString type = QString::fromStdString(strType);
    QString weight = QString::fromStdString(strWeight);

    QSqlQuery query;
    QString sql = "INSERT INTO orderData (orderId, entry, money, plate, type, weight) VALUES (:orderId, :entry, :money, :plate, :type, :weight);";

    query.prepare(sql);
    query.bindValue(":orderId", orderId);
    query.bindValue(":entry", entry);
    query.bindValue(":money", money);
    query.bindValue(":plate", plate);
    query.bindValue(":type", type);
    query.bindValue(":weight", weight);

    if (!query.exec())
    {
        qDebug()<<tr("订单Id %1 ,加入缓存失败:%2").arg(orderId).arg(query.lastError().text());
        return false;
    }
    qDebug()<<tr("订单Id %1 已加入缓存").arg(orderId);

    return true;
}

(2)删除数据的功能;

bool RobotDataBaseManager::DeleteDataById(string strOrderId)
{
    qDebug() << "RobotDataBaseManager::DeleteDataById: " << QString::fromStdString(strOrderId);

    QString orderId = QString::fromStdString(strOrderId);

    QSqlQuery query;
    QString sql = "DELETE FROM orderData WHERE orderId=:orderId;";
    query.prepare(sql);
    query.bindValue(":orderId", orderId);
    if (!query.exec())
    {
        qDebug() << "into DeleteDataById ERROR: " << query.lastError().text();
        return false;
    }

    if(m_mutex4OrderId.tryLock(1*1000)==false)
        return false;

    m_curOrderId = orderId;
    m_mutex4OrderId.unlock();

    return true;
}

(3)修改数据的功能;

bool RobotDataBaseManager::UpdateDataById(string strOrderId, string strEntry, string strMoney, string strPlate, string strType, string strWeight)
{
    if (!isOrderIdExist(strOrderId))
        return false;

    QString orderId = QString::fromStdString(strOrderId);
    QString entry = QString::fromStdString(strEntry);
    QString money = QString::fromStdString(strMoney);
    QString plate = QString::fromStdString(strPlate);
    QString type = QString::fromStdString(strType);
    QString weight = QString::fromStdString(strWeight);

    qDebug()<< "orderId: " << orderId;
    qDebug()<< "entry: " << entry;
    qDebug()<< "money: " << money;
    qDebug()<< "plate: " << plate;
    qDebug()<< "type: " << type;
    qDebug()<< "weight: " << weight;

    QSqlQuery query;
    QString sql = "UPDATE orderData SET entry = :entry, money = :money, plate = :plate, type = :type, weight = :weight WHERE orderId=:orderId;";
    query.prepare(sql);

    query.bindValue(":orderId", orderId);
    query.bindValue(":entry", entry);
    query.bindValue(":money", money);
    query.bindValue(":plate", plate);
    query.bindValue(":type", type);
    query.bindValue(":weight", weight);

    if (!query.exec())
    {
        qDebug() << "UpdateDataById ERROR: " << query.lastError().text();
        return false;
    }

    if(m_mutex4OrderId.tryLock(1*1000)==false)
        return false;

    m_curOrderId = orderId;
    m_mutex4OrderId.unlock();

    return true;
}

(4)查找数据的功能;

bool RobotDataBaseManager::getDataById(string strOrderId, string& strEntry, string& strMoney, string& strPlate, string& strType, string& strWeight)
{
    qDebug() << "[数据库]:getDataById 查询所有数据: 开始~~~~~~~~~~~~~~~~~";

    QString orderId = QString::fromStdString(strOrderId);

    QSqlQuery query;
    QString sql = "SELECT * FROM orderData WHERE orderId=:orderId;";
    query.prepare(sql);
    query.bindValue(":orderId", orderId);

    if (!query.exec())
    {
        qDebug() << "into getDataById ERROR: " << query.lastError().text();
        return false;
    }

    while (query.next())
    {
        QString orderId = query.value("orderId").toString();

        qDebug() << "取得1条订单缓存数据: " << orderId;
        if (!orderId.isEmpty())
        {
            strEntry = query.value("entry").toString().toStdString();
            strMoney = query.value("money").toString().toStdString();
            strPlate = query.value("plate").toString().toStdString();
            strType = query.value("type").toString().toStdString();
            strWeight = query.value("weight").toString().toStdString();
        }
    }

    query.exec("SELECT * FROM orderData");

    qDebug() << "[数据库]:SELECT * FROM orderData:";

    while (query.next())
    {
        // 读取字段值
        QString name = query.value("entry").toString();
        QString money = query.value("money").toString();
        QString plate = query.value("plate").toString();
        QString type = query.value("type").toString();
        QString weight = query.value("weight").toString();

        // 输出结果
        qDebug() << "entry:" << name << ", money:" << money << ", plate:" << plate << ", type:" << type << ", weight:" << weight;
    }


    qDebug() << "[数据库]:getDataById 查询所有数据: 结束~~~~~~~~~~~~~~~~~";
    return true;
}

(5)用QTableView显示数据库表数据;

void RobotDataBaseManager::on_btn_showAll_clicked()
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", "Connection1");
    db.setDatabaseName("trawe.db"); // 数据库文件名


    if (!db.open())
    {
        qDebug() << "Failed to connect to database 1.";
        return;
    }

    QSqlQuery query(db);
    QString selectQuery = "SELECT * FROM orderData";
    if (!query.exec(selectQuery))
    {
        qDebug() << "Failed to select data from trawe.db.";
        return;
    }

    QSqlTableModel * model = new QSqlTableModel(this,db);
    model->setTable("orderData");
    ui->tableView->setModel(model);
    model->select();

    QStringList tables;
    tables << "id"<< "订单id" << "入口" << "金额" << "车牌" << "车型" << "重量" << "时间";
    for(int i = 1 ; i < tables.count(); i++)
        model->setHeaderData(i,Qt::Horizontal,tables[i]);//设置显示框表头显示
    model->setSort(1, Qt::AscendingOrder);//设置按照第0列排序
    ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);//设置单元格不可编辑
    ui->tableView->horizontalHeader()->setStretchLastSection(true);//设置最后一列填充后面表格
    //ui->tableView->setColumnHidden(0,true);//设置第0行隐藏
    ui->tableView->setColumnWidth(1,100);//设置列宽,界面看起来更舒适
    ui->tableView->setColumnWidth(2,100);//设置列宽,界面看起来更舒适
}

(6)直接执行sql语句的功能;

/*
(1)INSERT INTO orderData (orderId, entry, money, plate, type, weight) VALUES ("63945", "滘口", "99", "粤G717Q1", "客一", "1800");
(2)UPDATE orderData SET entry = "滘口", money = "99", plate = "粤G717Q1", type = "客一", weight = "客一" WHERE orderId="22834";
(3)DELETE FROM orderData WHERE orderId=1234567;
*/
bool RobotDataBaseManager::queryExec(string strSql)
{
    QString sql = QString::fromStdString(strSql);

    QSqlQuery query;
    query.prepare(sql);
    if (!query.exec())
    {
        qDebug() << " queryExec ERROR: " << query.lastError().text();
        return false;
    }

    qDebug() << "[数据库]: sql 语句执行成功: 结束~~~~~~~~~~~~~~~~~";
    return true;
}

上面基本也涵盖主要的代码了。

完整的项目代码已上传,需要的可以下载。

QSqlDatabase实现数据库的基本功能,以及QTableView显示数据库表数据资源-CSDN文库

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/95617.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电脑识别不了固态硬盘怎么办?

在使用固态硬盘时&#xff0c;可能会出现电脑无法识别的情况&#xff0c;这时我们就无法使用固态硬盘中的数据。那么&#xff0c;电脑识别不了固态硬盘怎么办&#xff1f; 为什么电脑识别不了固态硬盘&#xff1f; 一般来说&#xff0c;电脑识别不了固态硬盘是因为以下3个原因…

HTML及CSS入门及精通

前言 HTML&#xff08;超文本标记语言&#xff09;和CSS&#xff08;层叠样式表&#xff09;是构建网页的两个基本技术。HTML用于定义网页的结构和内容&#xff0c;而CSS用于控制网页的样式和布局。本教程将介绍HTML和CSS的入门知识&#xff0c;并逐步引导您掌握更高级的技巧和…

css元素定位:通过元素的标签或者元素的id、class属性定位

前言 大部分人在使用selenium定位元素时&#xff0c;用的是xpath元素定位方式&#xff0c;因为xpath元素定位方式基本能解决定位的需求。xpath元素定位方式更直观&#xff0c;更好理解一些。 css元素定位方式往往被忽略掉了&#xff0c;其实css元素定位方式也有它的价值&…

CVE-2023-36874 Windows错误报告服务本地权限提升漏洞分析

CVE-2023-36874 Windows错误报告服务本地权限提升漏洞分析 漏洞简介 Windows错误报告服务在提交错误报告前会创建wermgr.exe进程&#xff0c;而攻击者使用特殊手法欺骗系统创建伪造的wermgr.exe进程&#xff0c;从而以system权限执行代码。 影响版本 Windows10 1507 * Wind…

液体神经网络LLN:通过动态信息流彻底改变人工智能

巴乌米克泰吉 一、说明 在在人工智能领域&#xff0c;神经网络已被证明是解决复杂问题的非常强大的工具。多年来&#xff0c;研究人员不断寻求创新方法来提高其性能并扩展其能力。其中一种方法是液体神经网络&#xff08;LNN&#xff09;的概念&#xff0c;这是一个利用动态计算…

LLMs之Code:SQLCoder的简介、安装、使用方法之详细攻略

LLMs之Code&#xff1a;SQLCoder的简介、安装、使用方法之详细攻略 目录 SQLCoder的简介 1、结果 2、按问题类别的结果 SQLCoder的安装 1、硬件要求 2、下载模型权重 3、使用SQLCoder 4、Colab中运行SQLCoder 第一步&#xff0c;配置环境 第二步&#xff0c;测试 第…

华为云云服务器评测|基于华为云云耀云服务器L实例开展性能评测,例如 MySQL、Clickhouse、Elasticsearch等等

在当今云计算时代&#xff0c;越来越多的企业和个人开始选择将应用部署在云服务器上&#xff0c;以便更好地满足高性能、可靠性和可扩展性等需求。而华为云云耀云服务器L实例不仅提供了高性能和可靠性的计算和存储资源&#xff0c;而且具有灵活和高效的成本控制&#xff0c;深受…

Spring Boot框架以及它的优势

文章目录 介绍1. **简化配置**2. **快速启动**3. **自动配置**4. **集成第三方库和框架**5. **微服务支持**6. **内嵌式数据库支持**7. **健康监控和管理**8. **可插拔的开发工具**9. **丰富的社区和生态系统**10. **良好的测试支持&#xff1a;** 核心特性**1. 依赖注入&#…

WSL Opencv with_ffmpeg conan1.60.0

我是ubuntu18. self.options[“opencv”].with_ffmpeg True 关键是gcc版本需要conan支持&#xff0c;比如我的是&#xff1a; compilergcc compiler.version7.5 此外还需要安装系统所需库&#xff1a; https://qq742971636.blog.csdn.net/article/details/132559789 甚至来…

自然语言处理-NLP

目录 自然语言处理-NLP 致命密码&#xff1a;一场关于语言的较量 自然语言处理的发展历程 兴起时期 符号主义时期 连接主义时期 深度学习时期 自然语言处理技术面临的挑战 语言学角度 同义词问题 情感倾向问题 歧义性问题 对话/篇章等长文本处理问题 探索自然语言…

RV64和ARM64栈结构差异

RV64和ARM64栈结构差异 1 RV64和ARM64栈结构差异示意图1.1 RV64和ARM64寄存器介绍1.1.1 RV64寄存器1.1.2 ARM64寄存器 1.2 RV64和ARM64栈结构差异示意图 2 RV64和ARM64栈使用示例2.1 测试的程序2.2 RV64反汇编的汇编程序2.3 ARM64反汇编的汇编程序2.4 RV64和ARM64测试程序的栈结…

Ansible学习笔记2

Ansible是Python开发的自动化运维工具&#xff0c;集合了众多运维工具&#xff08;Puppet、cfengine、chef、func、fabric&#xff09;的优点&#xff0c;实现了批量系统配置&#xff0c;批量程序部署、批量运行命令等功能。 特点&#xff1a; 1&#xff09;部署简单&#xff…

前端基础1——HTML标记语言

文章目录 一、基本了解二、HTML常用标签2.1 文本格式化标签2.2 列表标签2.3 超链接标签2.4 图片标签2.5 表格标签2.6 表单标签2.6.1 提交表单2.6.2 下拉表单2.6.3 按钮标签 2.7 布局标签 一、基本了解 网页组成&#xff08;index.html页面&#xff09;&#xff1a; HTML标记语言…

微软用 18 万行 Rust 重写了 Windows 内核

微软正在使用 Rust 编程语言重写其核心 Windows 库。 5 月 11 日——Azure 首席技术官 Mark Russinovich 表示&#xff0c;最新的 Windows 11 Insider Preview 版本是第一个包含内存安全编程语言 Rust 的版本。 “如果你参加了 Win11 Insider 环&#xff0c;你将在 Windows 内…

MySQL官网下载安装包

MySQL官网&#xff1a; MySQL MySQL 8.0官网下载地址&#xff1a; MySQL :: Download MySQL Community Server 2023-07-18 MySQL 8.1.0 发布&#xff0c;这是 MySQL 变更发版模型后的第一个创新版本 (Innovation Release) 。 如果在官网中找不到下载位置&#xff0c;点击第二个…

Royal TSX 6 Mac多协议远程软件

Royal TSX是一款功能强大的远程桌面管理软件&#xff0c;适用于Mac操作系统。它允许用户通过一个集成的界面来管理和访问多个远程计算机和服务器。 Royal TSX支持多种远程协议&#xff0c;包括RDP、VNC、SSH、Telnet和FTP等&#xff0c;可以方便地连接到Windows、Linux、Mac和其…

python3对接godaddy API,实现自动更改域名解析(DDNS)

python3对接godaddy API&#xff0c;实现自动更改域名解析&#xff08;DDNS&#xff09; 文章开始前&#xff0c;先解释下如下问题&#xff1a; ①什么是域名解析&#xff1f; 域名解析一般是指通过一个域名指向IP地址&#xff08;A解析&#xff09;&#xff0c;然后我们访问…

SOLIDWORKS中多实体文件到装配体的转换技巧

我们在做机械等工程设计中&#xff0c;有时为了节省时间&#xff0c;需要把多实体的“零件”&#xff0c;直接转换为装配体&#xff0c;不再另外装配&#xff0c;这样能大大简化设计的操作时间&#xff0c;复杂程度。 在这里&#xff0c;我们首先要了解&#xff0c;SOLIDWORKS文…

微信小程序 实时日志

目录 实时日志 背景 如何使用 如何查看日志 注意事项 实时日志 背景 为帮助小程序开发者快捷地排查小程序漏洞、定位问题&#xff0c;我们推出了实时日志功能。从基础库2.7.1开始&#xff0c;开发者可通过提供的接口打印日志&#xff0c;日志汇聚并实时上报到小程序后台…

数据库CPU飙高问题定位及解决

在业务服务提供能力的时候&#xff0c;常常会遇到CPU飙高的问题&#xff0c;遇到这类问题&#xff0c;大多不是数据库自身问题&#xff0c;都是因为使用不当导致&#xff0c;这里记录下业务服务如何定位数据库CPU飙高问题并给出常见的解决方案。 CPU 使用率飙升根因分析 在分…