qt学习笔记(八)之深入QSqlQuery

2023-11-10

在上一节中,我们直接调用QSqlQuery:exec()对数据库进行增删改查等简单操作。

在项目开发中,为了实现系统的低耦合,我们就必须封装出一个数据库功能模块。

一、prepare()

首先创建一个头文件"attend_db.h"。

初始化数据库操作,包括创建数据库文件、建表、以及添加一些基础数据。最好还要返回数据库操作的一些信息(最重要的是错误信息)。

QSqlError db_Init()
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName(":memory:"); //使用内存数据库

    if(!db.open())
    {
        //打开失败
        return db.lastError();
    }

    QSqlQuery query;
    //创建组别表,人员表,考勤记录表
    if(!query.exec("CREATE TABLE table_group(group_id INTEGER PRIMARY KEY, group_name VARCHAR)"))
    {
        return query.lastError();
    }
    if(!query.exec("CREATE TABLE table_user(user_id VARCHAR PRIMARY KEY, group_id INTEGER)"))
    {
        return query.lastError();
    }
    if(!query.exec("CREATE TABLE table_record(user_id VARCHAR, datetime VARCHAR)"))
    {
        return query.lastError();
    }
    //添加组别数据
    if(!query.prepare("INSERT INTO table_group(group_id, group_name) VALUES(:gourp_id, :group_name)"))
    {
        return query.lastError();
    }

    db_AddGroup(query, 1, "student");
    db_AddGroup(query, 2, "teacher");

    //添加人员数据
    if(!query.prepare("INSERT INTO table_user(user_id, group_id) VALUES(:user_id, :group_id)"))
    {
        return query.lastError();
    }

    db_AddUser(query, "T0001", 2);
    qdb_AddUser(query, "T0002", 2);
    db_AddUser(query, "S111201", 1);

    //添加考勤记录数据
    if(!query.prepare("INSERT INTO table_record(user_id, datetime) VALUES(:user_id, :datetime)"))
    {
        return query.lastError();
    }

    db_AddRecord(query, "T0001", QDateTime::currentDateTime());
    db_AddRecord(query, "T0002", QDateTime::currentDateTime());
    db_AddRecord(query, "S111201", QDateTime::currentDateTime());

    return QSqlError();
}
这里对表的添加数据不再简单的使用QSqlQuery:exec()直接执行语句了。为了模块化,我们还要封装出对表数据的操作函数(包括增删改查)。

提供对外的接口供上层应用使用。形参最好就仅仅是表的参量,这样清晰明了。

Qt提供了bool prepare(const QString& query)接口。(SQLite也提供了该API函数)

query.prepare("INSERT INTO table_group(group_id, group_name) VALUES(:gourp_id, :group_name)")
我们先使用了prepare()函数,在其中利用了“:group_id”和“:group_name”来代替具体的数据,之后就可以利用bindValue()函数给
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

qt学习笔记(八)之深入QSqlQuery 的相关文章

  • 如何在 QT 安装程序框架中区分每用户安装与系统范围安装?

    我正在使用一些名为 pgModeler 的应用程序 它的当前版本提供了一个基于 QT 安装程序框架的安装程序 Windows 上该安装程序的问题是它安装每个用户的开始菜单条目 https github com pgmodeler pgmod
  • 如何将 QByteArray 转换为十六进制字符串?

    我有打击QByteArray QByteArray ba ba 0 0x01 ba 1 0x10 ba 2 0x00 ba 3 0x07 我真的不知道如何将此 QByteArray 转换为结果字符串 其中包含 01100007 我将使用 Q
  • 我应该使用 QCoreApplication::processEvents() 还是 QApplication::processEvents()?

    我有一个从两者调用的方法QThreads和主线程 这个方法有时可能需要很长时间才能在循环中进行计算 所以我把QCoreApplication processEvents 这可以防止 GUI 冻结 在某个时刻我已经改变了QCoreApplic
  • 如何在 QT 中绘制点?

    我正在用 QT 用 C 编写一个应用程序 其中有 n 个点并计算它的凸包 然而 一旦计算出来 我不知道如何绘制点并绘制船体的边界 制作菜单按钮等很简单 但我不确定我是否知道执行此操作的工具 你怎么做到这一点 图形视图 addEllipse
  • Qml 和模糊图像

    我想使用 QML 实现模糊效果 我找到了有关 效果 模糊 的参考资料 例子 http qt gitorious org lscunha qt components lscunha qt components blobs d78feec567
  • 从 python 数据帧插入 DB2 表

    我正在使用 python 库 IBM DB 通过它我可以建立连接并将表读入数据帧 当从 python 中的数据帧源写入 DB2 表 INSERT 查询 时 就会出现问题 下面是连接的示例代码 但有人可以帮助我如何将数据帧中的所有记录插入到
  • new 运算符(以及 malloc)无法分配约 450 MB 的内存 [重复]

    这个问题在这里已经有答案了 我正在开发一个程序 该程序在内存中存储大约 2 2 亿个短值的数组 该数据块的分配方式如下 short arrayName new short SIZE OF ARRAY 然后将文件的内容读入内存 在团队中的另一
  • QMutex 是否需要是静态的,以便此类实例的其他线程调用知道暂停其操作?

    从多个线程调用以下附加函数 我不希望数据重写附加 因为计数器尚未增加 除了当前使用 Append 的线程之外 这是否会挂起所有进入的线程 或者其他线程会继续运行而不追加数据吗 互斥锁是否需要是 静态 的 或者每个实例都知道要暂停操作吗 如果
  • 从MySQL插入查询中获取新记录主键ID?

    假设我正在做一个 MySQLINSERT进入我的一张桌子 该桌子有一列item id设置为autoincrement and primary key 如何让查询输出新生成的主键的值item id在同一个查询中 目前我正在运行第二个查询来检索
  • 获取 QListView 中所有可见项目的简单方法

    我正在尝试使用 Qt Framework 开发一个图像库应用程序 应用程序从所选文件夹加载所有图像 并使用 QListView 控件显示这些图像 但现在我想通过仅加载用户可见的图像来减少内存消耗 由于没有直接函数来获取视图中的所有可见项目
  • Retina 显示屏中具有 QOpenGLWIdget 的 Qt MainWindow 显示错误大小

    我有一个 Qt 应用程序MainWindow 我嵌入一个QOpenGLWidget在里面 一切正常 直到我开始使用 Apple Retina 显示屏并在高 DPI 模式下运行我的应用程序 我的QOpenGLWidget只是它应该具有的大小的
  • 完全彻底卸载QT Creator

    问题 如何从 Linux 机器上卸载 QT Creator 我的 Debian Jessie 机器上的安装已损坏 我尝试过重新安装 修复等 但没有成功 建议我完全卸载 获取最新版本并重新安装 问题是我不确定如何执行此操作 每次我尝试时 QT
  • QMainWindow 上的 Qt 布局

    我设计了一个QMainWindow with QtCreator s设计师 它由默认的中央小部件 aQWidget 其中包含一个QVBoxLayout以及其中的所有其他小部件 现在我想要的一切就是QVBoxLayout自动占据整个中央小部件
  • 将 jstring 转换为 QString

    我正在调用一个返回字符串的 Java 函数 QAndroidJniObject obj QAndroidJniObject callStaticObjectMethod
  • 针对初学者的 QT 商业许可证与非商业许可证 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 QT 许可似乎非常反学习 因为据我所知 用它开发的任何东西都只能是商业的当且仅当 its entire开发是在使用商业许可证的情况下完成的
  • Qt 5.1.1 与 Visual Studio 2012 - 这些 QT 版本无法访问

    打开 Visual Studio 时出现此错误 我安装自http qt project org downloads http qt project org downloads 适用于 Windows 64 位的 Qt 5 1 1 VS 20
  • 连接到 QNetworkReply::error 信号

    我正在使用 Qt5 的新连接语法 QNetworkReply 有一个名为error http qt project org doc qt 5 0 qtnetwork qnetworkreply html error 2还有一个函数叫做err
  • 了解 Qt3D 创建的网格

    我创建了一个 Qt3D 网格 如下所示 Qt3DCore QEntity newEntity new Qt3DCore QEntity Qt3DExtras QConeMesh mesh new Qt3DExtras QConeMesh m
  • PyQt4 信号和槽

    我正在使用 PyQt4 编写我的第一个 Python 应用程序 我有一个 MainWindow 和一个 Dialog 类 它是 MainWindow 类的一部分 self loginDialog LoginDialog 我使用插槽和信号 这
  • 无法运行 Qt 应用程序:找不到版本“Qt_5”

    我运行 Ubuntu 16 04 LTS 我的问题是我无法运行可以编译的 Qt5 应用程序 这是我尝试运行它时得到的结果 home user Desktop sconfig dist Release GNU Linux SCongif us

随机推荐

  • Python 列表推导式、矩阵、格式化输出

    列表推导式 列表推导式提供了从列表 元组创建列表的简单途径 语法 表达式 for语句 if语句 创建并返回一个列表 if语句可选 示例 list1 1 2 3 4 使用元组也行 list2 x 2 for x in list1 print
  • Node.js 学习系列(四)—— 回调函数

    Node js 异步编程的直接体现就是回调 异步编程依托于回调来实现 但不能说使用了回调后程序就异步化了 回调函数在任务完成后就会被调用 Node 使用了大量的回调函数 Node 的所有 API 都支持回调函数 例如 我们可以一边读取文件
  • 【干货】dockerfastdfs集群

    正文 最近整理了一份 Netty 相关的文档干货 讲解很系统 今天分享给大家 看完这份文档你将获得哪些收获 理解当下火热的 Netty 框架 核心概念 开发流程 手写 RPC 框架 聊天室 Tomcat等 对照知识点进行查漏补缺 帮助扫除知
  • 类 AudioInputStream 说明文档 中文版

    javax sound sampled 类 AudioInputStreamjava lang Object java io InputStream javax sound sampled AudioInputStream 所有已实现的接口
  • angular 整理

    文章目录 网址 npm 知识点 参考 https www cnblogs com wjw1014 p 10262309 html 网址 angular https angular cn docs ag grid https www ag g
  • RHEL6.4启动一直在加载界面,无法进入图形化界面的解决办法

    在下在上午的时候将我另一个机器上面的虚拟机拷贝到了我现在用的机器上 发现rhel6 4启动加载的时候一直开在这个界面 如图 就一直卡在这个界面了 我用ctrl shift f1一看 哎 有点迷 咋回事啊 为了验证 我将我原来的机器也打开看了
  • 猪齿鱼平台的部署教程

    以下是基于猪齿鱼平台的部署教程 安装 Docker 在猪齿鱼平台中 应用会运行在 Docker 容器中 所以首先需要安装 Docker 可以按照以下步骤在 CentOS 7 系统上安装 Docker 安装依赖 sudo yum instal
  • kong认证插件添加第二认证方式

    在认证插件对象 如ldap auth 的anonymous 字段添加第二认证方式 查看ldap的插件设置 anonymous 为basic auth的plugin的consumer id 在Authorization中设置认证密码 user
  • vulnhub-sick0s1.2简单靶场提权

    以下均在测试环境进行 遵纪守法 靶场下载地址 https download vulnhub com sickos sick0s1 2 zip 下载后直接用vm导入 网卡NAT模式即可 首先进行信息收集 nmap 192 168 111 0
  • 500报错及故障排除

    500 Internal Server Error 每次打开网页时 浏览器都会向托管站点的服务器发送请求 服务器将返回请求的数据和响应代码 HTTP响应状态代码指示请求是否成功 500到599范围内的代码表示服务器错误 该错误不是由浏览器或
  • 论文英文参考文献[10]的时候后面多空格_毕业论文格式问题批量修改

    今天 给大家介绍一下毕业论文中常见的格式错误批量修改方法 问题一 英文摘要部分或参考文献的英文标点符号检查 采用ENDNOTE ZOTERO这类文献管理软件直接导入的 不存在这类问题 主要针对不会使用软件的而手动复制编写的参考文献 主要涉及
  • Mysql视图

    文章目录 1 简介 2 视图的操作语法 3 视图检查选项 4 视图的更新与作用 1 简介 视图 view 是一种虚拟存在的表 视图中的数据并不在数据库中实际存在 行和列数据来自定义视图的查询中使用的表 并且是在使用视图时动态生成的 通俗来讲
  • 缺页中断过程详解

    缺页中断机构 总而言之 对于我们的缺页的访问 会发生一个缺页中断 缺页中断由当前指令发出 所以属于内中断 中断后该程序就阻塞了 然后等待中断程序结束 再执行 中断程序判断 内存中是否有空闲内存块 如果有 就调入该内存块 并且修改页表项 如果
  • 【thinkphp5】使用tp5开发api接口 定义全局异常处理

    1 新建文件夹以及文件 路径 application lib exception ExceptionHandler php 并键入以下代码
  • Eigen库Vector3d定义及赋值学习

    include
  • JVM--基础--20--对象的创建过程

    JVM 基础 20 对象的创建过程 1 对象的创建过程 讨论的对象限于普通Java对象 不包括数组和Class对象等 虚拟机遇到一条new指令时 过程如下 1 1 类加载 当虚拟机遇到一条new指令时 首先去检查这个指令的参数是否能在常量池
  • 封装一个可变参数打印函数

    在开发中 经常会用到打印 而这些打印在程序运行阶段不需要 仅在调试或开启现象的时候需要 我们用printf来打印往往不能对其进行灵活的控制 这个时候 我们就可以自己封装一个与printf功能相同的打印函数 加一些调试开关 就可以 用到的接口
  • 你真的了解background-position

    background属性是CSS中最常见的属性之一 它是一个简写属性 其包含background color background image background repeat background attachment backgrou
  • Verilog中的变量节选(part-select):中括号[]中的加号(+:)和减号(-:)的作用?

    Verilog 1995 允许在节选范围的索引为常数时从一个向量中节选连续的比特 Verilog 2001 2005 提供了两个新的节选运算符来支持固定宽度的变量节选 和 其语法分别为 lt starting bit gt lt width
  • qt学习笔记(八)之深入QSqlQuery

    在上一节中 我们直接调用QSqlQuery exec 对数据库进行增删改查等简单操作 在项目开发中 为了实现系统的低耦合 我们就必须封装出一个数据库功能模块 一 prepare 首先创建一个头文件 attend db h 初始化数据库操作