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)是一种强大的生成模型,在手写数字生成方面具有广泛的应用前景。通过生成…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...

微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...

2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...

人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...
libfmt: 现代C++的格式化工具库介绍与酷炫功能
libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库,提供了高效、安全的文本格式化功能,是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全:…...