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.lib
    
    和
    
     sqlite3.exp
    
    .如下图所示:
    
     
   
    拷贝
    
     sqlite3.dll
    
    到
    
     C:\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相关的语法报错都没有了。运行调试测试一下
    
    
    
    调试成功,数据库操作成功了。
    
     
   
    链接数据库看看数据, 发现数据也成功写入了, 中文乱码是因为编码的问题, 这里设置一下编码就行了,也很简单。
    
    
    
     
   
 
