C++实现sqlite单表增删改查的详细步骤

news2024/12/24 10:22:39

1.环境准备

coding之前需要先安装好C++的集成开发环境, 我这里选择的是Visual Studio 2022,本来想使用CLion的, 但是破解太麻烦,懒得整了。

  • Visual Studio 2022

2.项目创建及编码

启动visual studio, 点击创建项目,选择“空项目”
在这里插入图片描述
配置项目名称和项目工作目录以及解决方案名称,之后, 点击“创建”即可创建一个C++空项目。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

CREATE TABLE IF NOT EXISTS t_student (
    id INTEGER PRIMARY KEY,
    name TEXT,
    age INTEGER,
    gender TEXT,
    class_no TEXT,
    grade_no TEXT,
    nation TEXT
);

代码实现

#include <sqlite3.h>
#include <iostream>
#include <vector>
#include <string>

const char* DB_FILE_PATH = "D:/commonTools/sqliteDB/student.db";

class DatabaseManager {
public:
    DatabaseManager() {
        int result = sqlite3_open(DB_FILE_PATH, &db_);
        if (result != SQLITE_OK) {
            std::cerr << "Failed to open database." << std::endl;
        }
    }

    ~DatabaseManager() {
        sqlite3_close(db_);
    }

    int executeSQL(const std::string& sql) {
        char* errMsg = nullptr;
        int result = sqlite3_exec(db_, sql.c_str(), nullptr, nullptr, &errMsg);
        if (result != SQLITE_OK) {
            std::cerr << "SQL error: " << errMsg << std::endl;
            sqlite3_free(errMsg);
        }
        return result;
    }

    sqlite3* getDB() {
        return db_;
    }

private:
    sqlite3* db_;
};

class Student {
public:
    Student(DatabaseManager& dbManager)
        : dbManager_(dbManager) {}


    void createTable() {
        const std::string sql = "CREATE TABLE IF NOT EXISTS t_student ("
            "id INTEGER PRIMARY KEY,"
            "name TEXT,"
            "age INTEGER,"
            "gender TEXT,"
            "class_no TEXT,"
            "grade_no TEXT,"
            "nation TEXT"
            ");";

        int result = dbManager_.executeSQL(sql);
        if (result != SQLITE_OK) {
            std::cerr << "Failed to create table." << std::endl;
        }
    }

    bool addStudent(const std::string& name, int age, const std::string& gender, const std::string& classNo, const std::string& gradeNo, const std::string& nation) {
        std::string sql = "INSERT INTO t_student (name, age, gender, class_no, grade_no, nation) VALUES ('" + name + "', " + std::to_string(age) + ", '" + gender + "', '" + classNo + "', '" + gradeNo + "', '" + nation + "');";
        int result = dbManager_.executeSQL(sql);
        return (result == SQLITE_OK);
    }

    bool deleteStudent(int id) {
        std::string sql = "DELETE FROM t_student WHERE id = " + std::to_string(id) + ";";
        int result = dbManager_.executeSQL(sql);
        return (result == SQLITE_OK);
    }

    bool updateStudent(int id, const std::string& name, int age, const std::string& gender, const std::string& classNo, const std::string& gradeNo, const std::string& nation) {
        std::string sql = "UPDATE t_student SET name = '" + name + "', age = " + std::to_string(age) + ", gender = '" + gender + "', class_no = '" + classNo + "', grade_no = '" + gradeNo + "', nation = '" + nation + "' WHERE id = " + std::to_string(id) + ";";
        int result = dbManager_.executeSQL(sql);
        return (result == SQLITE_OK);
    }

    std::vector<std::vector<std::string>> getAllStudents() {
        std::vector<std::vector<std::string>> students;
        std::string sql = "SELECT * FROM t_student;";
        sqlite3_stmt* statement;

        if (sqlite3_prepare_v2(dbManager_.getDB(), sql.c_str(), -1, &statement, nullptr) == SQLITE_OK) {
            while (sqlite3_step(statement) == SQLITE_ROW) {
                std::vector<std::string> studentData;
                int columnCount = sqlite3_column_count(statement);

                for (int i = 0; i < columnCount; ++i) {
                    const unsigned char* columnText = sqlite3_column_text(statement, i);
                    if (columnText) {
                        studentData.push_back(reinterpret_cast<const char*>(columnText));
                    }
                    else {
                        studentData.push_back("");
                    }
                }

                students.push_back(studentData);
            }

            sqlite3_finalize(statement);
        }
        else {
            std::cerr << "Failed to execute SQL statement: " << sql << std::endl;
        }

        return students;
    }

private:
    DatabaseManager& dbManager_;
};

int main() {
    // 创建数据库管理器对象
    DatabaseManager dbManager;

    // 创建学生对象
    Student student(dbManager);

    // 如果表不存在,先创建表
    student.createTable();

    // 添加学生
    student.addStudent("zhangsan", 20, "Female", "2301", "大一", "中国");

    // 更新学生信息
    student.updateStudent(1, "hanmeimei", 22, "Male", "2203", "大二", "中国");


    // 查询所有学生信息
    std::vector<std::vector<std::string>> allStudents = student.getAllStudents();
    for (const auto& studentData : allStudents) {
        for (const auto& value : studentData) {
            std::cout << value << " ";
        }
        std::cout << std::endl;
    }

    // 删除学生
    // student.deleteStudent(1);

    std::cin.get();

    return 0;
}

在这里插入图片描述
上面代码写完之后,IDE中关于sqlite数据哭的操作会出现大量的错误提示,这里是因为没有在项目中引入sqlite3的相关库文件导致的问题, 下面详细说说怎么怎么把sqlite3的库文件引入到当前项目中。

3.下载sqlite3相关库

下载地址:https://www.sqlite.org/download.html
需要下载的文件:

源码包:https://www.sqlite.org/2023/sqlite-amalgamation-3420000.zip

预编译二进制文件:https://www.sqlite.org/2023/sqlite-dll-win64-x64-3420000.zip
在这里插入图片描述

4.生成sqlite3.lib库文件

解压这两个包
在这里插入图片描述将解压后的文件都拷贝到一个目录中,目录暂且命名为sqlitelib
在这里插入图片描述
通过visual Studio安装目录下的lib.exe对sqlitelib目录进行编译生成sqlite.lib文件

一般lib.exe的所在目录就是[安装目录]\VisualStudio\2022\Community\VC\Tools\MSVC\14.36.32532\bin\Hostx64\,我这里自定义了安装目录,如果是默认安装,应该就在C盘下, 如果不知道目录在哪里,就找到启动的快捷方式, 鼠标右键,有一个“打开文件在目录”就可以找到安装目录了。
在这里插入图片描述
特别提示:在进行sqlite.lib文件的生成的时候, 如果你是32位的系统, 请使用[安装目录]\VisualStudio\2022\Community\VC\Tools\MSVC\14.36.32532\bin\Hostx86\x86目录下的lib.exe,

  • 如果是64位的操作系统:

lib.exe /out:D:\commonTools\CPPExtensions\sqlitelib\sqlite3.lib /DEF:D:\commonTools\CPPExtensions\sqlitelib\sqlite3.def

  • 如果是32位的操作系统:

lib.exe /out:D:\commonTools\CPPExtensions\sqlitelib\sqlite3.lib /MACHINE:IX86 /DEF:D:\commonTools\CPPExtensions\sqlitelib\sqlite3.def

编译成功之后会在sqlitelib目录下生成两个文件sqlite3.libsqlite3.exp.如下图所示:
在这里插入图片描述

拷贝sqlite3.dllC:\Windows\System32目录下,运行时需要这个动态库,反正照做就对了。
在这里插入图片描述

5.引入sqlite3.lib库文件到项目

【项目】-右键-【属性】
在这里插入图片描述

5.1.附加包含目录设置

【C/C++】-【常规】-【附加包含目录】
在这里插入图片描述
选择我们刚刚使用lib.exe编译生成sqlite.lib文件所在的目录sqlitelib(注意这里只需要选择到sqlite.lib文件所在的目录即可)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.2.附加库目录设置

【链接器】-【常规】-【附加库目录】
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
选择我们刚刚使用lib.exe编译生成sqlite.lib文件所在的目录sqlitelib(注意这里只需要选择到sqlite.lib文件所在的目录即可)
在这里插入图片描述
点击【确定】
在这里插入图片描述

5.3.附加依赖项设置

【链接器】-【输入】-【附加依赖项】
在这里插入图片描述
在这里插入图片描述

选择我们刚刚使用lib.exe编译生成sqlite3.lib文件(注意这里需要将sqlite3.lib文件的绝对路径配置到这里)
在这里插入图片描述
在这里插入图片描述

最后点击【应用】并【确定】保存设置修改。
在这里插入图片描述
再打开项目,发现跟sqlite相关的语法报错都没有了。运行调试测试一下
在这里插入图片描述
调试成功,数据库操作成功了。
在这里插入图片描述

链接数据库看看数据, 发现数据也成功写入了, 中文乱码是因为编码的问题, 这里设置一下编码就行了,也很简单。
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/591737.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《MYSQL必知必会》读书笔记1

目录 行 主键 MYSQL工具 使用MYSQL 连接 检索数据 检索&#xff08;SELECT&#xff09; 限制结果&#xff08;LIMIT&#xff09; 排序检索&#xff08;ORDER BY&#xff09; 过滤数据&#xff08;WHERE&#xff09; 过滤数据&#xff08;AND、OR&#xff09; 通配符…

软件测试总结

软件生命周期(SDLC)的六个阶段 1、问题的定义及规划 此阶段是软件开发方与需求方共同讨论&#xff0c;主要确定软件的开发目标及其可行性。 2、需求分析 在确定软件开发可行的情况下&#xff0c;对软件需要实现的各个功能进行详细分析。需求分析阶段是一个很重要…

ML | 6 支持向量机

ML | 6 支持向量机 文章目录 ML | 6 支持向量机SVM介绍线性不可分数据线性可分数据 寻找最大间隔分类器求解的优化问题 SMO高效优化算法简化版SMO处理小规模数据集伪代码程序清单 完整Platt SMO 算法加速优化完整 Platt SMO的支持函数完整Platt SMO算法中的优化例程完整Platt S…

记录--Vue3自定义一个Hooks,实现一键换肤

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 核心 使用CSS变量, 准备两套CSS颜色, 一套是在 light模式下的颜色,一套是在dark模式下的颜色dark模式下的 CSS 权重要比 light 模式下的权重高, 不然当我们给html添加自定义属性[data-themedark]的时候…

CVPR 2023 | 南大王利民团队提出LinK:用线性核实现3D激光雷达感知任务中的large kernel...

点击下方卡片&#xff0c;关注“CVer”公众号 AI/CV重磅干货&#xff0c;第一时间送达 点击进入—>【Transformer】微信交流群 【CVPR 2023】LinK&#xff1a;用线性核实现3D激光雷达感知任务中的large kernel 本文介绍我们媒体计算研究组&#xff08;MCG&#xff09;在3D激…

chatgpt赋能python:Python中的提取函数——数据清洗中必不可少的利器

Python中的提取函数——数据清洗中必不可少的利器 数据清洗是数据分析过程中不可或缺的一步&#xff0c;而Python中的提取函数则是数据清洗中必不可少的利器。本文将重点介绍一些Python中常用的提取函数&#xff0c;以帮助数据分析师更好地应对实际问题。 什么是提取函数&…

react antd Modal里Form设置值不起作用

问题描述&#xff1a; react antd Modal里Form设置值不起作用&#xff0c;即使用form的api。比如&#xff1a;编辑时带出原有的值。 造成的原因&#xff1a;一般设置值都是在声明周期里设置&#xff0c;比如&#xff1a;componentDidMounted里设置&#xff0c;hook则在useEff…

云网络安全与数据中心安全

近年来&#xff0c;许多云架构师宣称随着公共云的采用&#xff0c;网络安全性将消亡。然而&#xff0c;网络安全仍然是最大的安全市场之一&#xff0c;并且是每个主要云服务提供商 (CSP) 在过去几年中推出重要新产品的领域。 网络对安全仍然至关重要&#xff0c;即使在云中也是…

【软考系统规划与管理师笔记】第4篇 信息技术服务知识

目录 1 产品、服务和信息技术服务 1.1 产品 1.2 服务 1.3 信息技术服务 2运维、运营和经营 2.1运维 2.2运营 2.3经营 3 IT治理 4 IT服务管理 4.1传统管理方式 4.2体系化管理方式 5项目管理 6质量管理理论 6.1质量管理发展历史 6.2质量管理常见理论方法 6.3质…

【公网远程Jellyfin】——本地部署Jellyfin影音服务器

文章目录 1. 前言2. Jellyfin服务网站搭建2.1. Jellyfin下载和安装2.2. Jellyfin网页测试 3.本地网页发布3.1 cpolar的安装和注册3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5. 结语 1. 前言 随着移动智能设备的普及&#xff0c;各种各样的使用需求也被开发出来&…

面向Java开发者的ChatGPT提示词工程(5)

GPT 的局限性 在探讨开发大型语言模型应用程序时&#xff0c;我们必须认识到 GPT 存在一些局限性。这些限制对于我们保持清醒的头脑至关重要。 尽管在 GP T的训练过程中融入了大量知识&#xff0c;但它并非能够完美地记住所见之物&#xff0c;并且对这些知识的边界了解有限。…

玩转用户旅程地图

图&#xff1a;史江鸿 从事需求分析和产品设计工作已经有几个年头了&#xff0c;我很享受这个职业。因为在这段职业历程中&#xff0c;我学到了很多有意思的方法和工具&#xff0c;用户旅程地图就是其中一个。 如今在国内外许多IT公司&#xff0c;用户旅程地图已经成为需求分析…

ElasticSearch安装部署

ElasticSearch安装部署 简介 全文搜索属于最常见的需求&#xff0c;开源的 Elasticsearch &#xff08;以下简称 es&#xff09;是目前全文搜索引擎的首选。 它可以快速地储存、搜索和分析海量数据。维基百科、Stack Overflow、Github 都采用它。 Elasticsearch简称es&…

C++【实现红黑树(核心插入)】

文章目录 一、红黑树概念介绍二、红黑树模拟实现&#xff08;1&#xff09;红黑树节点&#xff08;2&#xff09;红黑树插入分析(核心)&#xff08;3&#xff09;插入代码思路(如何快速写插入算法)&#xff08;4&#xff09;判断平衡函数&#xff08;5&#xff09;查找函数&…

01_java基础语法

1. Java概述 1.1 Java语言背景介绍&#xff08;了解&#xff09; 语言&#xff1a;人与人交流沟通的表达方式 计算机语言&#xff1a;人与计算机之间进行信息交流沟通的一种特殊语言 Java语言是美国Sun公司&#xff08;Stanford University Network&#xff09;在1995年推出的…

【软硬件测试】测试经验:软硬件结合测试要点

目录 一、应用行业 二、测试要点 三、硬件测试 &#xff08;1&#xff09;测试含义 &#xff08;2&#xff09;测试方法 &#xff08;3&#xff09;相关链接 四、结合测试 &#xff08;1&#xff09;测试含义 &#xff08;2&#xff09;测试工具 &#xff08;3&am…

NIO之SocketChannel,SocketChannel ,DatagramChannel解读

目录 基本概述 ServerSocketChannel 打开 ServerSocketChannel 关闭 ServerSocketChannel 监听新的连接 阻塞模式 非阻塞模式 SocketChannel SocketChannel 介绍 SocketChannel 特征 创建 SocketChannel 连接校验 读写模式 读写 DatagramChannel 打开 Datagr…

chatgpt赋能python:Python中的开方指令:介绍和使用

Python中的开方指令&#xff1a;介绍和使用 Python是一种流行的编程语言&#xff0c;广泛用于数据科学、机器学习、Web开发和其他领域。在许多情况下&#xff0c;需要对数值进行数学计算&#xff0c;其中包括开方运算。Python中有多种方法可以执行开方运算&#xff0c;本文将介…

chatgpt赋能python:Python中的“或”语句:使用方法和示例

Python中的“或”语句&#xff1a;使用方法和示例 在Python编程中&#xff0c;“或"语句表示为"or”&#xff0c;它是逻辑运算符的一种形式。"或"语句可以用于组合两个或多个条件&#xff0c;只要其中一个条件成立&#xff0c;整个语句就会返回True。在本…

Rust每日一练(Leetday0016) 全排列I\II、旋转图像

目录 46. 全排列 Permutations &#x1f31f;&#x1f31f; 47. 全排列 II Permutations II &#x1f31f;&#x1f31f; 48. 旋转图像 Rotate Image &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专…