Qt 数据库操作V1.0
1、pro文件
QT += sql
2、h文件
#ifndef DATABASEOPERATION_H
#define DATABASEOPERATION_H#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QSqlRecord>
#include <QDebug>
#include <QVariant>class DatabaseOperation
{
public:enum DatabaseType{Sqlite = 0,MySql = 1,};public:DatabaseOperation();void SetDatabaseType(const DatabaseType& dbType);// void SetHostName(const QString& hostName);
// void SetUserName(const QString& userName);
// void SetPassword(const QString& password);bool Open(const QString& dbFilePath);bool IsOpen() const;void Close();bool CreateTable(const QString& tableName, const QMap<QString, QString>& columns);bool DropTable(const QString& tableName);bool InsertData(const QString& tableName, const QMap<QString, QVariant>& values);bool SelectData(const QString& tableName, const QMap<QString, QVariant>& conditions, QList<QList<QVariant>>& results);bool DeleteData(const QString& tableName, const QMap<QString, QVariant>& conditions);
private:void ExecuteQuery(const QString& sql, const QMap<QString, QVariant>& params = QMap<QString, QVariant>());QSqlDatabase m_db;QString m_dbFilePath;};#endif // DATABASEOPERATION_H
3、cpp文件
#include "DatabaseOperation.h"DatabaseOperation::DatabaseOperation()
{}void DatabaseOperation::SetDatabaseType(const DatabaseType& dbType)
{QString dbName;switch (dbType){case DatabaseOperation::Sqlite: dbName = "QSQLITE"; break;case DatabaseOperation::MySql: dbName = "QMYSQL"; break;}m_db = QSqlDatabase::addDatabase(dbName);
}bool DatabaseOperation::Open(const QString &dbFilePath)
{m_dbFilePath = dbFilePath;m_db.setDatabaseName(dbFilePath);if (!m_db.open()){throw std::runtime_error("Database open failed: " + m_db.lastError().text().toStdString());}return true;
}//void DatabaseOperation::SetHostName(const QString& hostName)
//{
// m_db.setHostName(hostName);
//}//void DatabaseOperation::SetUserName(const QString& userName)
//{
// m_db.setUserName(userName);
//}//void DatabaseOperation::SetPassword(const QString& password)
//{
// m_db.setPassword(password);
//}void DatabaseOperation::Close()
{if (m_db.isOpen()){m_db.close();}
}bool DatabaseOperation::CreateTable(const QString& tableName, const QMap<QString, QString>& columns)
{QStringList columnDefinitions;for (auto it = columns.constBegin(); it != columns.constEnd(); ++it){columnDefinitions << QString("%1 %2").arg(it.key(), it.value());}QString sql = QString("CREATE TABLE IF NOT EXISTS %1 (%2)").arg(tableName, columnDefinitions.join(", "));try{ExecuteQuery(sql);}catch (const std::exception& e){qDebug() << "Create table failed: " << e.what();return false;}return true;
}bool DatabaseOperation::DropTable(const QString& tableName)
{QString sql = QString("DROP TABLE IF EXISTS %1").arg(tableName);try{ExecuteQuery(sql);}catch (const std::exception& e){qDebug() << "Drop table failed: " << e.what();return false;}return true;
}bool DatabaseOperation::InsertData(const QString& tableName, const QMap<QString, QVariant>& values)
{QStringList keys = values.keys();QStringList placeholders;for (const auto& key : keys){placeholders << ":" + key;}QString sql = QString("INSERT INTO %1 (%2) VALUES (%3)").arg(tableName, keys.join(", "), placeholders.join(", "));try{ExecuteQuery(sql, values);}catch (const std::exception& e){qDebug() << "Insert data failed: " << e.what();return false;}return true;
}bool DatabaseOperation::SelectData(const QString& tableName, const QMap<QString, QVariant>& conditions, QList<QList<QVariant>>& results)
{QStringList conditionStrings;for (const auto& key : conditions.keys()){conditionStrings << QString("%1 = :%1").arg(key);}QString sql = QString("SELECT * FROM %1").arg(tableName);if (!conditionStrings.isEmpty()){sql += " WHERE " + conditionStrings.join(" AND ");}QSqlQuery query(m_db);query.prepare(sql);// 绑定条件参数for (auto it = conditions.constBegin(); it != conditions.constEnd(); ++it){query.bindValue(":" + it.key(), it.value());}if (!query.exec()){qDebug() << "Select data failed: " << query.lastError().text();return false;}results.clear();while (query.next()){QList<QVariant> row;for (int i = 0; i < query.record().count(); ++i){row.append(query.value(i));}results.append(row);}return true;
}bool DatabaseOperation::DeleteData(const QString& tableName, const QMap<QString, QVariant>& conditions)
{QStringList conditionStrings;for (const auto& key : conditions.keys()){conditionStrings << key + "=:" + key; // 构造条件字符串,例如 "id=:id"}QString sql = QString("DELETE FROM %1 WHERE %2").arg(tableName, conditionStrings.join(" AND "));try{ExecuteQuery(sql, conditions);}catch (const std::exception& e){qDebug() << "Delete data failed: " << e.what();return false;}return true;
}void DatabaseOperation::ExecuteQuery(const QString& sql, const QMap<QString, QVariant>& params/* = QMap<QString, QVariant>()*/)
{QSqlQuery query(m_db);query.prepare(sql);for (auto it = params.constBegin(); it != params.constEnd(); ++it){query.bindValue(":" + it.key(), it.value());}if (!query.exec()){throw std::runtime_error("Execute query failed: " + query.lastError().text().toStdString());}
}
4、测试文件
#include "Widget.h"
#include <QApplication>
#include "DatabaseOperation.h"int main(int argc, char *argv[])
{// 创建数据库对象DatabaseOperation dbOperation;// 设置数据库类型dbOperation.SetDatabaseType(DatabaseOperation::Sqlite);// 打开SQLite数据库if (!dbOperation.Open("test.db")){qDebug() << "Open database failed";return -1;}// 删除表if(!dbOperation.DropTable("users")){qDebug() << "Drop table failed";}// 创建表QMap<QString, QString> columns{{"id", "INTEGER PRIMARY KEY AUTOINCREMENT"},{"name", "TEXT NOT NULL"},{"age", "INTEGER DEFAULT 18"}};if (!dbOperation.CreateTable("users", columns)){qDebug() << "Create table failed";return -1;}// 插入数据1QMap<QString, QVariant> values{{"name", "Tom"},{"age", 21}};if (!dbOperation.InsertData("users", values)){qDebug() << "Insert data failed";return -1;}// 插入数据2QMap<QString, QVariant> values2{{"name", "Jie"},{"age", 22}};if (!dbOperation.InsertData("users", values2)){qDebug() << "Insert data failed";return -1;}QList<QList<QVariant>> results;QMap<QString, QVariant> conditions{{"age", 20}};// 查询数据if (!dbOperation.SelectData("users", conditions, results)){qDebug() << "Select data failed";return -1;}for (const auto& row : results){QString name = row[1].toString();int age = row[2].toInt();qDebug() << "name: " << name << ", age: " << age;}// // 删除数据
// if (!dbOperation.DeleteData("users", conditions))
// {
// qDebug() << "Delete data failed";
// return -1;
// }// // 删除表
// if (!dbOperation.DropTable("users"))
// {
// qDebug() << "Drop table failed";
// return -1;
// }// 关闭数据库dbOperation.Close();QApplication a(argc, argv);Widget w;w.show();return a.exec();
}相关文章:
Qt 数据库操作V1.0
1、pro文件 QT sql2、h文件 #ifndef DATABASEOPERATION_H #define DATABASEOPERATION_H#include <QSqlDatabase> #include <QSqlQuery> #include <QSqlError> #include <QSqlRecord> #include <QDebug> #include <QVariant>clas…...
【Eclipse插件开发】3工作台workbench探索【上篇】
3工作台workbench探索 文章目录 3工作台workbench探索前言视图编辑器一、工作台Workbench入门工作台页透视图视图和编辑器二、使用命令的基本工作台扩展点2.1 org.eclipse.ui.views2.2 org.eclipse.ui.editors编辑器和内容大纲2.3 org.eclipse.ui.comm...
201912CSPT5魔数
题意:有一个从 1 1 1到 n n n的连续序列,有 q q q次查询,对区间操作 [ l , r ] [l,r] [l,r]: 1. 输出 s f ( A l ) f ( A l 1 ) . . . f ( A r ) , f ( x ) ( x 1.输出sf(A_l)f(A_{l1})...f(A_r),f(x)(x 1.输出sf(Al)f(Al1)...f(A…...
Pycharm python用matplotlib 3D绘图显示空白解决办法
问题原因: matplotlib版本升级之后显示代码变了,修改为新的 # ax Axes3D(fig) # 原代码 ax fig.add_axes(Axes3D(fig)) # 新代码import numpy as np import matplotlib.pyplot as plt from matplotlib import cm from mpl_toolkits.mplot3d import Ax…...
java hello world
1、java IDEA工具安装: helloworld : package com.company;public class Main {public static void main(String[] args) {// write your code hereString a "hello world";System.out.println(a);} } java一些注意事项 1、大小写敏感 2、类…...
典型数据结构的模板实现
栈和数组 1.使用类模板实现数组结构定长数组可变数组 2.使用类模板实现栈结构 在我们初步了解编写模板类后,应当做一下代码练习。这节我们就做一个编写代码的补充,方便大家继续学习模板类的嵌套。作为新手而言,建议大家先写一个具体类&#x…...
Visual Studio 2022中创建的C++项目无法使用万能头<bits/stdc++.h>解决方案
目录 发现问题 解决办法 第一步 第二步 第三步 第四步 最后一步 问题解决 发现问题 如果大家也遇到下面这种问题,可能是没有include文件夹中没有bits/stdc.h 解决办法 第一步 打开一个C项目,鼠标移动至头文件上右击,选择转到文档或…...
webpack配置
一、很多基础方面的配置被vuecli所集成一般项目都是使用vuecli,不会真正的去从0-1进行webpack配置: 1、vuecli中的webpack基础配置: (1)入口文件默认在src/main;输出在dist; (2)集成了大量的插件和加载器:babel-loader 处理 JavaScript 文件、使用 css-loader 和 style-load…...
1 月 Web3 游戏行业概览:市场实现空前增长
作者:lesleyfootprint.network 今年一月,区块链游戏领域迎来了爆发式增长,活跃用户的数量大幅提升。 区块链游戏不断融合 AI 技术,旨在提升玩家体验并扩大其服务范围,公链与游戏的兼容性问题也日渐受到重视。技术革新…...
如何在 Mac 上重置网络设置
如何在 Mac 上重置网络设置 Mac 几乎在所有时间都非常可靠,但有时您在连接到互联网时可能会遇到困难或浏览速度缓慢。 互联网可能在您的其他设备上正常工作,这可能很烦人。 通常,问题的原因是什么并不明显,甚至根本不存在。 如果…...
BVH动画绑骨蒙皮并在Unity上展示
文章目录 Blender绑定骨骼Blender蒙皮Blender中导入bvh文件将FBX导入Unity Blender绑定骨骼 先左上角红框进入model模式,选中要绑定的模型,然后进入Edit模式把骨骼和关节对齐。 (选中骨骼,G移动,R旋转) 为…...
c# 缓存帮助类
public class CacheHelper { private static Dictionary<string, object> dic new Dictionary<string, object>(); // 定义一个静态变量来保存类的实例 private static CacheHelper session; // 定义一个标识确保线程同步 pr…...
红队渗透靶机:TIKI: 1
目录 信息收集 1、arp 2、nmap 3、nikto 4、whatweb 目录探测 1、dirsearch 2、gobuster WEB web信息收集 searchsploit cms信息收集 ssh登录 提权 信息收集 1、arp ┌──(root㉿ru)-[~/kali] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:2…...
【数据结构】二叉树的三种遍历(非递归讲解)
目录 1、前言 2、二叉树的非递归遍历 2.1、先序遍历 2.2、中序遍历 2.3、后序遍历 1、前言 学习二叉树的三种非递归遍历前,首先来了解一下递归序: 递归序就是按照先序遍历的顺序,遇到的所有结点按顺序排列,重复的结点也必须记…...
Spark Standalone 集群配置
前言 平时工作中主要用 YARN 模式,最近进行TPC测试用到了 Standalone 模式,便记录总结一下 Standalone 集群相关的配置。 集群管理类型 Spark 支持三种集群管理类型: Standalone - Spark附带的一个简单的集群管理器,可以轻松地设置集群。Apache Mesos - 一个通用的集群管…...
蓝桥杯Web应用开发-CSS3 新特性【练习二:获得焦点验证】
页面上有一个姓名输入框和一个密码输入框,当聚焦输入框时,输入框的背景颜色会发生改变, 新建一个 index3.html 文件,在其中写入以下内容。 <!DOCTYPE html> <html lang"en"><head><meta charset&…...
职业发展 - 一个专注于嵌入式物联网架构设计的攻城狮(转载)
1 关于我 很高兴大家都关注到我,从而看到这篇简要的介绍,下面有更多的关于我。 我是一个嵌入式架构师,早前从事过智能电网相关的电力设备开发,金融POS机开发,以及eSIM相关的软件开发,现在主要在做嵌入式I…...
阿里云ECS服务器Linux安装Mysql8
链接:https://pan.baidu.com/s/1s9j7OhiOMV9e9Qq9GDbysA 提取码:dd5a --来自百度网盘超级会员V5的分享 Mysql官网:MySQL 关于Mysql Yum Repository介绍可以看下 更加简单 关于X86和ARM 传到服务器 进入所在包 cd /usr/local/develop/mysql8 解压 …...
Redis中内存淘汰算法实现
Redis中内存淘汰算法实现 Redis的maxmemory支持的内存淘汰机制使得其成为一种有效的缓存方案,成为memcached的有效替代方案。 当内存达到maxmemory后,Redis会按照maxmemory-policy启动淘汰策略。 Redis 3.0中已有淘汰机制: noevictionall…...
人工智能(pytorch)搭建模型23-pytorch搭建生成对抗网络(GAN):手写数字生成的项目应用
大家好,我是微学AI,今天给大家介绍一下人工智能(pytorch)搭建模型23-pytorch搭建生成对抗网络(GAN):手写数字生成的项目应用。生成对抗网络(GAN)是一种强大的生成模型,在手写数字生成方面具有广泛的应用前景。通过生成…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
