VS2022引入sqlite数据库交互

法一:用官网编译好的动态库(推荐)

下载所需文件

sqlite官网地址:https://www.sqlite.org/howtocompile.html

下载以下的2个压缩包

第一个压缩包
  • sqlite-amalgamation-xxxx.zip,xxxx是版本号,保持一致即可,这里面有sqite3.h
第二个压缩包,以64位为例
  • sqlite-dll-win-x64-xxxx.zip,这里面有 sqlite3.dll 和 sqlite3.def(sqlite3.def将用来生成 sqlite3.lib )
  • 32位的同理下载x86的文件就行(本文是讲的64位)

都放到一个文件夹下

比如D:\sqlite

生成静态库

  1. 打开 VS2022命令行,一般在开始菜单就可以找到
  1. 使用cd命令进入存放sqlite3相关文件的文件夹
  1. 接着输入
bash 复制代码
lib /MACHINE:X64 /DEF:sqlite3.def

生成的 sqlite3.lib 将会出现在存放sqlite3相关文件的目录

法二:自行编译源码生成所需动态库和静态库

这个方法还需要安装TCL库,稍微麻烦一些。

TCL库配置

1)TCL库下载地址

  1. 地址:https://sqlite.org/tmp/tcl9.0.0.tar.gz
  2. 下载后解压:比如我放在E:\github\third_party\sqlite\tcl9.0.0

2)安装TCL库

  1. 找到VS2022的命令行工具,64位为例

2)切换目录到安装的tcl的win目录下

3)执行命令:nmake /f makefile.vc release

4)安装 TCL 到指定目录

sqlite配置

1)下载sqlite源代码

  1. 地址:https://www.sqlite.org/howtocompile.html

2)VS2022命令行操作

1.进入源代码目录

2.设置环境变量

bash 复制代码
set TCLDIR=C:\Tcl  

3.编译sqlite生成所需库

bash 复制代码
nmake /f makefile.msc
nmake /f makefile.msc sqlite3.c
nmake /f makefile.msc sqlite3.exe

3) 可以得到sqlite3.dll和sqlite3.lib

位于E:\github\third_party\sqlite\sqlite-src-3470200路径下

VS2022项目环境配置

上面的法一和法二选一种就行,更推荐法一。

vs2022中使用sqlite3数据库需要3个文件,sqite3.h、sqlite3.dll、sqlite3.lib

新建控制台项目,64位为例,用于测试


包含目录和库目录设置好路径

链接器输入

C++与sqlite交互测试代码

测试代码

bash 复制代码
//#include <sqlite3.h>
//#include <iostream>
//int main(int argc, char* argv[])
//{
//    sqlite3* db = nullptr;      // 数据库对象
//    char* zErrMsg = nullptr;    // 错误信息
//    int rc = 0;                 // 执行结果
//    rc = sqlite3_open("test.db", &db);
//    if (rc) {
//        fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
//        exit(0);
//    }
//    else {
//        fprintf(stderr, "Opened database successfully\n");
//    }
//    sqlite3_close(db);
//    return 0;
//}


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

// 创建数据库连接
sqlite3* OpenDatabase(const char* dbFilePath) {
    sqlite3* db;

    // 打开数据库
    if (sqlite3_open(dbFilePath, &db) != SQLITE_OK) {
        std::cerr << "Error opening database." << std::endl;
        return nullptr;
    }

    return db;
}

// 关闭数据库连接
void CloseDatabase(sqlite3* db) {
    sqlite3_close(db);
}

// 创建表
void CreateTable(sqlite3* db) {
    const char* createTableSQL = "CREATE TABLE IF NOT EXISTS Users (Id INTEGER PRIMARY KEY AUTOINCREMENT, Name TEXT, Age INTEGER);";

    if (sqlite3_exec(db, createTableSQL, nullptr, nullptr, nullptr) != SQLITE_OK) {
        std::cerr << "Error creating table." << std::endl;
    }
    else {
        std::cout << "Table created or already exists." << std::endl;
    }
}

// 插入数据
void InsertData(sqlite3* db, const char* name, int age) {
    const char* insertDataSQL = "INSERT INTO Users (Name, Age) VALUES (?, ?);";
    sqlite3_stmt* statement;

    if (sqlite3_prepare_v2(db, insertDataSQL, -1, &statement, nullptr) == SQLITE_OK) {
        // 绑定参数
        sqlite3_bind_text(statement, 1, name, -1, SQLITE_STATIC);
        sqlite3_bind_int(statement, 2, age);

        // 执行语句
        if (sqlite3_step(statement) != SQLITE_DONE) {
            std::cerr << "Error inserting data." << std::endl;
        }
        else {
            std::cout << "Data inserted." << std::endl;
        }

        // 释放资源
        sqlite3_finalize(statement);
    }
}

// 查询数据
void QueryData(sqlite3* db) {
    const char* queryDataSQL = "SELECT * FROM Users;";
    sqlite3_stmt* statement;

    if (sqlite3_prepare_v2(db, queryDataSQL, -1, &statement, nullptr) == SQLITE_OK) {
        std::cout << "Id\tName\tAge" << std::endl;

        // 遍历结果集
        while (sqlite3_step(statement) == SQLITE_ROW) {
            std::cout << sqlite3_column_int(statement, 0) << "\t"
                << sqlite3_column_text(statement, 1) << "\t"
                << sqlite3_column_int(statement, 2) << std::endl;
        }

        // 释放资源
        sqlite3_finalize(statement);
    }
}

// 更新数据
void UpdateData(sqlite3* db, int id, const char* name, int age) {
    const char* updateDataSQL = "UPDATE Users SET Name=?, Age=? WHERE Id=?;";
    sqlite3_stmt* statement;

    if (sqlite3_prepare_v2(db, updateDataSQL, -1, &statement, nullptr) == SQLITE_OK) {
        // 绑定参数
        sqlite3_bind_text(statement, 1, name, -1, SQLITE_STATIC);
        sqlite3_bind_int(statement, 2, age);
        sqlite3_bind_int(statement, 3, id);

        // 执行语句
        if (sqlite3_step(statement) != SQLITE_DONE) {
            std::cerr << "Error updating data." << std::endl;
        }
        else {
            std::cout << "Data updated." << std::endl;
        }

        // 释放资源
        sqlite3_finalize(statement);
    }
}

// 删除数据
void DeleteData(sqlite3* db, int id) {
    const char* deleteDataSQL = "DELETE FROM Users WHERE Id=?;";
    sqlite3_stmt* statement;

    if (sqlite3_prepare_v2(db, deleteDataSQL, -1, &statement, nullptr) == SQLITE_OK) {
        // 绑定参数
        sqlite3_bind_int(statement, 1, id);

        // 执行语句
        if (sqlite3_step(statement) != SQLITE_DONE) {
            std::cerr << "Error deleting data." << std::endl;
        }
        else {
            std::cout << "Data deleted." << std::endl;
        }

        // 释放资源
        sqlite3_finalize(statement);
    }
}

int main() {
    // 指定数据库文件路径
    const char* dbFilePath = "test.db";

    // 创建数据库连接
    sqlite3* db = OpenDatabase(dbFilePath);

    if (db) {
        // 创建表
        CreateTable(db);

        // 插入数据
        InsertData(db, "zhang san", 30);
        InsertData(db, "li si", 40);
        InsertData(db, "wang wu", 50);

        // 查询数据
        QueryData(db);

        // 更新数据
        //UpdateData(db, 1, "Updated Name", 35);

         查询更新后的数据
        //QueryData(db);

         删除数据
        //DeleteData(db, 1);

         查询删除后的数据
        //QueryData(db);

        // 关闭数据库连接
        CloseDatabase(db);
    }

    return 0;
}

生成文件

正常输出

sqlite的db文件的查看工具

sqliteexpert下载地址

地址:http://www.sqliteexpert.com

使用方法

安装后即可使用,将db文件直接拖进去即可

相关推荐
NCIN EXPE2 小时前
redis 使用
数据库·redis·缓存
MongoDB 数据平台2 小时前
为编码代理引入 MongoDB 代理技能和插件
数据库·mongodb
极客on之路2 小时前
mysql explain type 各个字段解释
数据库·mysql
代码雕刻家3 小时前
MySQL与SQL Server的基本指令
数据库·mysql·sqlserver
lThE ANDE3 小时前
开启mysql的binlog日志
数据库·mysql
yejqvow123 小时前
CSS如何控制placeholder文字的颜色_使用--placeholder伪元素
jvm·数据库·python
handler013 小时前
从源码到二进制:深度拆解 Linux 下 C 程序的编译与链接全流程
linux·c语言·开发语言·c++·笔记·学习
oLLI PILO3 小时前
nacos2.3.0 接入pgsql或其他数据库
数据库
m0_743623923 小时前
HTML怎么创建多语言切换器_HTML语言选择下拉结构【指南】
jvm·数据库·python