当前位置: 首页 > news >正文

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魔数

题意&#xff1a;有一个从 1 1 1到 n n n的连续序列&#xff0c;有 q q q次查询,对区间操作 [ l , r ] [l,r] [l,r]&#xff1a; 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绘图显示空白解决办法

问题原因&#xff1a; matplotlib版本升级之后显示代码变了&#xff0c;修改为新的 # 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工具安装&#xff1a; helloworld &#xff1a; 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.使用类模板实现栈结构 在我们初步了解编写模板类后&#xff0c;应当做一下代码练习。这节我们就做一个编写代码的补充&#xff0c;方便大家继续学习模板类的嵌套。作为新手而言&#xff0c;建议大家先写一个具体类&#x…...

Visual Studio 2022中创建的C++项目无法使用万能头<bits/stdc++.h>解决方案

目录 发现问题 解决办法 第一步 第二步 第三步 第四步 最后一步 问题解决 发现问题 如果大家也遇到下面这种问题&#xff0c;可能是没有include文件夹中没有bits/stdc.h 解决办法 第一步 打开一个C项目&#xff0c;鼠标移动至头文件上右击&#xff0c;选择转到文档或…...

webpack配置

一、很多基础方面的配置被vuecli所集成一般项目都是使用vuecli,不会真正的去从0-1进行webpack配置: 1、vuecli中的webpack基础配置: (1)入口文件默认在src/main;输出在dist; (2)集成了大量的插件和加载器:babel-loader 处理 JavaScript 文件、使用 css-loader 和 style-load…...

1 月 Web3 游戏行业概览:市场实现空前增长

作者&#xff1a;lesleyfootprint.network 今年一月&#xff0c;区块链游戏领域迎来了爆发式增长&#xff0c;活跃用户的数量大幅提升。 区块链游戏不断融合 AI 技术&#xff0c;旨在提升玩家体验并扩大其服务范围&#xff0c;公链与游戏的兼容性问题也日渐受到重视。技术革新…...

如何在 Mac 上重置网络设置

如何在 Mac 上重置网络设置 Mac 几乎在所有时间都非常可靠&#xff0c;但有时您在连接到互联网时可能会遇到困难或浏览速度缓慢。 互联网可能在您的其他设备上正常工作&#xff0c;这可能很烦人。 通常&#xff0c;问题的原因是什么并不明显&#xff0c;甚至根本不存在。 如果…...

BVH动画绑骨蒙皮并在Unity上展示

文章目录 Blender绑定骨骼Blender蒙皮Blender中导入bvh文件将FBX导入Unity Blender绑定骨骼 先左上角红框进入model模式&#xff0c;选中要绑定的模型&#xff0c;然后进入Edit模式把骨骼和关节对齐。 &#xff08;选中骨骼&#xff0c;G移动&#xff0c;R旋转&#xff09; 为…...

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、前言 学习二叉树的三种非递归遍历前&#xff0c;首先来了解一下递归序&#xff1a; 递归序就是按照先序遍历的顺序&#xff0c;遇到的所有结点按顺序排列&#xff0c;重复的结点也必须记…...

Spark Standalone 集群配置

前言 平时工作中主要用 YARN 模式,最近进行TPC测试用到了 Standalone 模式,便记录总结一下 Standalone 集群相关的配置。 集群管理类型 Spark 支持三种集群管理类型: Standalone - Spark附带的一个简单的集群管理器,可以轻松地设置集群。Apache Mesos - 一个通用的集群管…...

蓝桥杯Web应用开发-CSS3 新特性【练习二:获得焦点验证】

页面上有一个姓名输入框和一个密码输入框&#xff0c;当聚焦输入框时&#xff0c;输入框的背景颜色会发生改变&#xff0c; 新建一个 index3.html 文件&#xff0c;在其中写入以下内容。 <!DOCTYPE html> <html lang"en"><head><meta charset&…...

职业发展 - 一个专注于嵌入式物联网架构设计的攻城狮(转载)

1 关于我 很高兴大家都关注到我&#xff0c;从而看到这篇简要的介绍&#xff0c;下面有更多的关于我。 我是一个嵌入式架构师&#xff0c;早前从事过智能电网相关的电力设备开发&#xff0c;金融POS机开发&#xff0c;以及eSIM相关的软件开发&#xff0c;现在主要在做嵌入式I…...

阿里云ECS服务器Linux安装Mysql8

链接&#xff1a;https://pan.baidu.com/s/1s9j7OhiOMV9e9Qq9GDbysA 提取码&#xff1a;dd5a --来自百度网盘超级会员V5的分享 Mysql官网:MySQL 关于Mysql Yum Repository介绍可以看下 更加简单 关于X86和ARM 传到服务器 进入所在包 cd /usr/local/develop/mysql8 解压 …...

Redis中内存淘汰算法实现

Redis中内存淘汰算法实现 Redis的maxmemory支持的内存淘汰机制使得其成为一种有效的缓存方案&#xff0c;成为memcached的有效替代方案。 当内存达到maxmemory后&#xff0c;Redis会按照maxmemory-policy启动淘汰策略。 Redis 3.0中已有淘汰机制&#xff1a; noevictionall…...

人工智能(pytorch)搭建模型23-pytorch搭建生成对抗网络(GAN):手写数字生成的项目应用

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能(pytorch)搭建模型23-pytorch搭建生成对抗网络(GAN):手写数字生成的项目应用。生成对抗网络&#xff08;GAN&#xff09;是一种强大的生成模型&#xff0c;在手写数字生成方面具有广泛的应用前景。通过生成…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成&#xff0c;核心是利用 HTTP 协议的 Range 请求头指定下载范围&#xff1a; 实现原理 Range 请求头&#xff1a;向服务器请求文件的特定字节范围&#xff08;如 Range: bytes1024-&#xff09; 本地文件记录&#xff1a;保存已…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec&#xff1f; IPsec VPN 5.1 IPsec传输模式&#xff08;Transport Mode&#xff09; 5.2 IPsec隧道模式&#xff08;Tunne…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...