当前位置: 首页 > news >正文

vs2017 c++ 使用sqlite3数据库

文章目录

  • 前言
  • 一、下载
  • 二、生成sqlite3.lib
    • 1. 生成32位sqlite3.lib
    • 2. 生成64位sqlite3.lib
    • 3. 整理文件
  • 三、使用
    • 1. 打开数据库
    • 2. 关闭数据库
    • 3. 建表、插入数据、更新、查询
  • 总结


前言

SQLite3 是一款轻量级的开源关系型数据库引擎,采用单文件存储结构,无需独立服务器或复杂安装,可直接嵌入应用程序使用。
本文介绍c++项目中如何使用sqlite3数据库。


一、下载

sqlite3官网
c++ 项目中需要三个文件 sqlite3.h,sqlite3.lib,sqlite3.dll,sqlite3.h和sqlite3.dll可以在官网直接下载获得。sqlite3.lib需要通过sqlite3.def生成。

  1. 下载头文件,sqlite-amalgamation-3500300.zip,解压后有四个文件sqlite3.h,sqlite3ext.h,sqlite3.c,shell.c。我们只需要sqlite3.h。
    在这里插入图片描述

  2. 下载动态库,windows 32位程序下载sqlite-dll-win-x86-3500300.zip, 64位程序下载sqlite-dll-win-x64-3500300.zip。解压后有两个文件sqlite3.def,sqlite3.dll
    在这里插入图片描述

二、生成sqlite3.lib

假设上节中下载的动态库文件的解压目录:
32位:D:\Work\OpenSource\sqlite-dll-win-x86-3500300
64位:D:\Work\OpenSource\sqlite-dll-win-x64-3500300

1. 生成32位sqlite3.lib

打开x86 Native Tools Command Prompt for VS 2017命令行工具,进入到目录D:\Work\OpenSource\sqlite-dll-win-x86-3500300,
输入命令: LIB /out:sqlite3.lib /DEF:sqlite3.def /MACHINE:X86
即可生成sqlite3.lib文件
在这里插入图片描述

2. 生成64位sqlite3.lib

打开x64 Native Tools Command Prompt for VS 2017命令行工具,进入到目录D:\Work\OpenSource\sqlite-dll-win-x64-3500300,
输入命令: LIB /out:sqlite3.lib /DEF:sqlite3.def /MACHINE:X64
即可生成sqlite3.lib文件

在这里插入图片描述

3. 整理文件

新文件夹sqlite3.50.3,在sqlite3.50.3下新建三个子文件夹include,lib,bin

  1. sqlite3.h拷贝到sqlite3.50.3/include下。
  2. lib文件夹下新建x86,x64两个文件夹。32位sqlite3.lib拷贝到sqlite3.50.3/lib/x86下,64位sqlite3.lib拷贝到sqlite3.50.3/lib/x64下。
  3. bin文件夹下新建x86,x64两个文件夹。32位sqlite3.dll拷贝到sqlite3.50.3/bin/x86下,64位sqlite3.dll拷贝到sqlite3.50.3/bin/x64下。

三、使用

vs2017中新建项目,把上一节中整理好的文件夹sqlite3.50.3拷贝到项目

  1. 包含头文件,在"项目"->“属性”->“C/C++”->“常规”->“附加包含目录"中填写"sqlite3.50.3\include”
  2. 库目录,在"项目"->“属性”->“链接器”->“常规”->“附加库目录"中填写"sqlite3.50.3\lib\x86”,如果是64位程序则填写"sqlite3.50.3\lib\x64"
  3. 添加库文件,在"项目"->“属性”->“链接器”->“输入”->“附加依赖项"中填写"sqlite3.lib”

1. 打开数据库

sqlite3_open,如文件不存在,会创建文件

sqlite3* db = nullptr;
int rc = sqlite3_open("D:\\wl.db", &db);
if (SQLITE_OK != rc) {std::cout << "打开sqlite数据库失败" << std::endl;return rc;
}

sqlite3_open_v2,第三个参数flag提供了很多打开数据库文件时的配置。
SQLITE_OPEN_READONLY:只读模式打开数据库,文件不存在则返回错误。
SQLITE_OPEN_READWRITE:读写模式打开数据库,文件不存在则返回错误。
SQLITE_OPEN_CREAT:创建数据库文件。

sqlite3* db = nullptr;
int rc = sqlite3_open_v2("D:\\wl.db", &db, SQLITE_OPEN_READWRITE | SQLITE_OPEN_FULLMUTEX, NULL);
if (SQLITE_OK != rc) {std::cout << "打开sqlite数据库失败" << std::endl;return rc;
}

2. 关闭数据库

sqlite3_close(&db);

3. 建表、插入数据、更新、查询

// SqliteDemo.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include <iostream>
#include <string>
#include "sqlite3.h"
#include "Utilities.h"int main()
{sqlite3 *db = NULL;int rc;// 打开数据库rc = sqlite3_open("D:\\wl.db", &db);if (rc != SQLITE_OK) {std::cout << "打开sqlite数据库失败" << std::endl;return rc;}std::string sql;// 建表//sql = "create table Registry(studyId int not null, patId text not null, patName text not null, gender text not null, age text, modality text not null, examItem text, requestPhysician text, requestDept text, bedNo integer, regDate text not null)";//rc = sqlite3_exec(db, sql.c_str(), NULL, NULL, NULL);//if (rc != SQLITE_OK) {//	std::cout << "建表失败" << std::endl;//	sqlite3_close(db);//}// 插入记录//sql = u8"insert into Registry(studyId, patId, patName, gender, age, modality, examItem, requestPhysician, regDate) values (1, '1', '患者1', '男', '45Y', 'CT', '胸部X线计算机体层(CT)平扫', '刘翔峰', '2025-07-22 12:01:01');";//sql += u8"insert into Registry(studyId, patId, patName, gender, age, modality, examItem, requestPhysician, regDate) values (2, '2', '患者2', '男', '70Y', 'CT', '胸部X线计算机体层(CT)平扫', null, '2025-07-22 11:01:01');";//sql += u8"insert into Registry(studyId, patId, patName, gender, age, modality, examItem, requestPhysician, regDate) values (3, '3', '患者3', '女', '45Y', 'CT', '颅脑X线计算机体层(CT)平扫', null, '2025-07-22 11:06:01');";//sql += u8"insert into Registry(studyId, patId, patName, gender, age, modality, examItem, requestPhysician, regDate) values (4, '4', '测试患者4', '女', '26Y', 'CT', '颅脑X线计算机体层(CT)平扫', null, '2025-07-22 14:01:01');";//rc = sqlite3_exec(db, sql.c_str(), NULL, NULL, NULL);//if (rc != SQLITE_OK) {//	std::cout << "插入记录失败!" << std::endl;//	sqlite3_close(db);//}// 更新//sql = u8"update Registry set age='80Y' where studyId=3";//rc = sqlite3_exec(db, sql.c_str(), NULL, NULL, NULL);//if (rc != SQLITE_OK) {//	std::cout << "更新记录失败!" << std::endl;//	sqlite3_close(db);//}// 查询sql = u8"select studyId, patId, patName, gender, age, modality, IFNULL(requestPhysician, '') requestPhysician, regDate, IFNULL(examItem, '') examItem from Registry";int nCols = -1;int nRows = -1;char** pResult = NULL;char* errMsg = NULL;int index = 0;rc = sqlite3_get_table(db, sql.c_str(), &pResult, &nRows, &nCols, &errMsg);index = nCols;for (int i = 0; i < nRows; i++){int rowStart = i * nCols;for (int j=0; j<nCols; j++){std::cout << UTF8toA(pResult[rowStart + j]) << "\t";}std::cout << std::endl;}sqlite3_close(db);getchar();return 0;
}

运行结果:
在这里插入图片描述


总结

下载sqlite3.50.3开发库

http://www.lryc.cn/news/595902.html

相关文章:

  • 末日期权的双买和单买策略区别是什么?
  • 双向链表详解及实现
  • C++_Hello算法_队列
  • 基于Java+MySQL实现(Web)文件共享管理系统(仿照百度文库)
  • 188粉福
  • Spring快速整合Mybatis
  • 技术与情感交织的一生 (十)
  • nodejs:告别全局安装,npx 命令详解及其与 npm 的区别
  • 从零开始学CTF(第二十五期)
  • Gitlab-CI实现组件自动推送
  • n8n - 为技术团队提供安全的自动化工作流
  • 基于Kubernetes的微服务CI/CD:Jenkins Pipeline全流程实践
  • 知识库搭建之Meilisearch‘s 搜索引擎 测评-东方仙盟测评师
  • STL学习(一、string容器)
  • 暑假算法训练.6
  • 深入浅出Python函数:参数传递、作用域与案例详解
  • 根据数据,判断神经网络所需的最小参数量
  • 设计模式七:抽象工厂模式(Abstract Factory Pattern)
  • 【Linux内核模块】模块声明与描述
  • 【RK3576】【Android14】MIC开发调试
  • 杭州网站建设选哪家?派迪科技项目实力展示
  • Python 正则表达式在数据分析中的应用:实战指南
  • OpenCV基本的图像处理
  • AI助力临床医学科研创新与效率双提升丨临床医学日常工作、论文高效撰写与项目申报、数据分析与可视化、机器学习建模等
  • 深入解析 Pandas:Python 数据分析的强大工具
  • AWE2026启动:加码AI科技,双展区联动开启产业新格局
  • 小玩 Lifecycle
  • ESP32-Cam三脚架机器人:DIY你的智能移动监控平台
  • 单一职责原则(SRP):构建高质量软件的基石
  • 【接口自动化】掌握接口自动化:核心概念讲解(理论知识)