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. 接着输入
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.设置环境变量

set TCLDIR=C:\Tcl  

3.编译sqlite生成所需库

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交互测试代码

测试代码

//#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文件直接拖进去即可

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

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

相关文章

Java后端常用的4种请求方式(通俗易懂)

文章目录 前言通用接口类(ControllerDemo)通用实体类(UserEntity)通用响应类(HttpClientResult)成功截图(先启动项目,然后右键执行main方法) HttpClientHttpClient 的主要类代码案例导入依赖工具类(HttpClientUtil)测试类 HttpURLConnection简介调用步骤代码案例导入依赖工具类…

STM32烧写失败之Contents mismatch at: 0800005CH (Flash=FFH Required=29H) !

一&#xff09;问题&#xff1a;用ULINK2给STM32F103C8T6下载程序&#xff0c;下载方式设置如下&#xff1a; 出现下面两个问题&#xff1a; 1&#xff09;下载问题界面如下&#xff1a; 这个错误的信息大概可以理解为&#xff0c;在0x08000063地址上读取到flash存储为FF&am…

Spring Boot教程之五十二:CrudRepository 和 JpaRepository 之间的区别

Spring Boot – CrudRepository 和 JpaRepository 之间的区别 Spring Boot建立在 Spring 之上&#xff0c;包含 Spring 的所有功能。由于其快速的生产就绪环境&#xff0c;使开发人员能够直接专注于逻辑&#xff0c;而不必费力配置和设置&#xff0c;因此如今它正成为开发人员…

【SQL】Delete使用

目录 语法 需求 示例 分析 代码 语法 DELETE删除表中所需内容 删除表中满足特点条件的行&#xff1a;DELETE FROM 表名 WHERE 条件; 删除表中所有行&#xff1a;DELETE FROM 表名; WHERE子句 WHERE子句用于指定从表中选取记录的条件。允许筛选数据&#xff0c;只返回满足…

【express-generator】05-路由中间件和错误处理(第一阶段收尾)

一、前言 上篇文章我们介绍了express-generator的请求体解析&#xff0c;重点讲了常用的请求体数据格式&#xff08;JSON/URL 编码的表单数据&#xff09;以及一个FILE文件上传&#xff0c;同时搭配代码示范进行辅助理解。 二、本篇重点 我们继续第一阶段的知识&#xff0c;…

Vue3(elementPlus) el-table替换/隐藏行箭头,点击整行展开

element文档链接&#xff1a; https://element-plus.org/zh-CN/component/form.html 一、el-table表格行展开关闭箭头替换成加减号 注&#xff1a;Vue3在样式中修改箭头图标无效&#xff0c;可能我设置不对&#xff0c;欢迎各位来交流指导 转变思路&#xff1a;隐藏箭头&…

GitLab创建用户,设置访问SSH Key

继上一篇 Linux Red Hat 7.9 Server安装GitLab-CSDN博客 安装好gitlab&#xff0c;启用管理员root账号后&#xff0c;开始创建用户账户 1、创建用户账户 进入管理后台页面 点击 New User 输入用户名、邮箱等必填信息和登录密码 密码最小的8位&#xff0c;不然会不通过 拉到…

数据库环境安装(day1)

网址&#xff1a;MySQL 下载&#xff08;环境准备&#xff09;&#xff1a; &#xff08;2-5点击此处&#xff0c;然后选择合适的版本&#xff09; 1.linux在线YUM仓库 下载/安装: wget https://repo.mysql.com//mysql84-community-release-el9-1.noarch.rpm rpm -i https://r…

Qt 5.14.2 学习记录 —— 칠 QWidget 常用控件(2)

文章目录 1、Window Frame2、windowTitle3、windowIcon4、qrc机制5、windowOpacity 1、Window Frame 在运行Qt程序后&#xff0c;除了用户做的界面&#xff0c;最上面还有一个框&#xff0c;这就是window frame框。对于界面的元素&#xff0c;它们的原点是Qt界面的左上角或win…

牛客网刷题 ——C语言初阶(6指针)——BC105 矩阵相等判定

1. 题目描述&#xff1a;BC105 矩阵相等判定 牛客网OJ题链接 描述&#xff1a; KiKi得到了两个n行m列的矩阵&#xff0c;他想知道两个矩阵是否相等&#xff0c;请你回答他。(当两个矩阵对应数组元素都相等时两个矩阵相等)。 示例1 输入&#xff1a; 2 2 1 2 3 4 1 2 3 4 输出…

HTML5实现好看的中秋节网页源码

HTML5实现好看的中秋节网页源码 前言一、设计来源1.1 网站首页界面1.2 登录注册界面1.3 节日由来界面1.4 节日习俗界面1.5 节日文化界面1.6 节日美食界面1.7 节日故事界面1.8 节日民谣界面1.9 联系我们界面 二、效果和源码2.1 动态效果2.2 源代码 源码下载结束语 HTML5实现好看…

ROS通信编程——服务通信

前言 学完了话题通信其实操作流程基本都已经很熟悉了&#xff0c;因此服务通讯的学习就会流畅许多。 服务通信也是ROS中一种极其常用的通信模式&#xff0c;服务通信是基于请求响应模式的&#xff0c;是一种应答机制。也即: 一个节点A向另一个节点B发送请求&#xff0c;B接收…

零基础微信小程序开发——全局配置之tabBar(保姆级教程+超详细)

&#x1f3a5; 作者简介&#xff1a; CSDN\阿里云\腾讯云\华为云开发社区优质创作者&#xff0c;专注分享大数据、Python、数据库、人工智能等领域的优质内容 &#x1f338;个人主页&#xff1a; 长风清留杨的博客 &#x1f343;形式准则&#xff1a; 无论成就大小&#xff0c;…

2024年12月HarmonyOS应用开发者高级认证全新题库

注意事项&#xff1a;切记在考试之外的设备上打开题库进行搜索&#xff0c;防止切屏三次考试自动结束&#xff0c;题目是乱序&#xff0c;每次考试&#xff0c;选项的顺序都不同&#xff0c;作者已于2024年12月15日又更新了一波题库&#xff0c;题库正确率99%&#xff01; 新版…

【网络协议】IPv4 地址分配 - 第二部分

前言 在第 1 部分中&#xff0c;我们学习了 IPv4 地址的分配方式&#xff0c;了解了各种类型的 IPv4 地址&#xff0c;并进行了基础的子网划分&#xff08;Subnetting&#xff09;。在第 2 部分中&#xff0c;我们将继续学习子网划分&#xff0c;并引入一些新的概念。 【网络…

浙江安吉成新的分布式光伏发电项目应用

摘 要&#xff1a;分布式光伏发电站是指将光伏发电组件安装在用户的建筑物屋顶、空地或其他适合的场地上&#xff0c;利用太阳能进行发电的一种可再生能源利用方式&#xff0c;与传统的大型集中式光伏电站相比&#xff0c;分布式光伏发电具有更灵活的布局、更低的建设成本和更高…

7z 安装与使用指南

文章目录 1. 安装 7z1.1 在 Linux 上安装 7z对于 Debian/Ubuntu 系统&#xff1a;对于 CentOS/RHEL 系统&#xff1a;对于 Fedora 系统&#xff1a;对于 Arch Linux 系统&#xff1a; 1.2 在 Windows 上安装 7z 2. 使用 7z 进行压缩和解压2.1 压缩文件示例&#xff1a;压缩一个…

scanf:数据之舟的摆渡人,静卧输入港湾的诗意守候

大家好啊&#xff0c;我是小象٩(๑ω๑)۶ 我的博客&#xff1a;Xiao Xiangζั͡ޓއއ 很高兴见到大家&#xff0c;希望能够和大家一起交流学习&#xff0c;共同进步。* 这一节我们主要来学习scanf的基本用法&#xff0c;了解scanf返回值&#xff0c;懂得scanf占位符和赋值…

【ROS2】Arduino系列之电机驱动实现

内容学自&#xff1a;赵虚左老师。学后总结&#xff01; 实现机器人移动的一种策略是&#xff1a;控制系统会先发布预期的车辆速度信息&#xff0c;然后驱动系统订阅到该信息&#xff0c;不断调整电机转速直至达到预期速度&#xff0c;调速过程中还需要时时获取实际速度并反馈…

119.使用AI Agent解决问题:Jenkins build Pipeline时,提示npm ERR! errno FETCH_ERROR

目录 1.Jenkins Build时的错误 2.百度文心快码AI智能体帮我解决 提问1&#xff1a;jenkins中如何配置npm的源 提问2&#xff1a;jenkins pipeline 类型为pipeline script from SCM时&#xff0c;如何配置npm源 3.最终解决方法-Jenkinsfile的修改 4.感触 1.Jenkins Build时…