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

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.xdnf.cn/news/16095.html

相关文章:

  • 基于Kubernetes的微服务CI/CD:Jenkins Pipeline全流程实践
  • 如何编译RustDesk(Unbuntu 和Android版本)
  • MongoDB数据库详解-针对大型分布式项目采用的原因以及基础原理和发展-卓伊凡|贝贝|莉莉
  • haproxy的负载均衡集群搭建
  • Rust实战:决策树与随机森林实现
  • 微博视觉算法面试30问全景精解
  • MDC(Mapped Diagnostic Context) 的核心介绍与使用教程
  • 【PTA数据结构 | C语言版】爱之匹配
  • 【C++】继承和多态扩展学习
  • 【上市公司变量测量】Python+FactSet Revere全球供应链数据库,测度供应链断裂与重构变量——丁浩员等(2024)《经济研究》复现
  • Docker从入门到精通
  • IPv4枯竭时代:从NAT技术到IPv6的演进之路
  • SpringBoot6-10(黑马)
  • git的版本冲突
  • 【未限制消息消费导致数据库CPU告警问题排查及解决方案】
  • Vue 分析脚手架
  • stm32内存分析
  • 传输层协议
  • 基于MySQL实现分布式调度系统的选举算法
  • C 语言的指针复习笔记
  • Pytorch版本、安装和检验
  • AJAX 概念与 axios 使用
  • 深度解析 HTML `loading` 属性:优化网页性能的秘密武器
  • rancher使用rke在华为云多网卡的服务器上安装k8s集群问题处理
  • 4x4矩阵教程
  • YModem在Android上的实现(四)
  • Oracle数据库索引性能机制深度解析:从数据结构到企业实践的系统性知识体系
  • Android 单编 framework 相关产物输出介绍
  • Unreal ARPG笔记
  • Oracle自治事务——从问题到实践的深度解析