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)是一种强大的生成模型,在手写数字生成方面具有广泛的应用前景。通过生成…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
