当前位置: 首页 > 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.dtcms.com/a/291625.html

相关文章:

  • Java 邂逅 WebSocket:解锁实时通信的无限可能​
  • Flutter基础(前端教程①⑦-Column竖直-Row水平-Warp包裹-Stack堆叠)
  • 【计算机网络 篇】TCP基本认识和TCP三次握手相关问题
  • ArKTS: DAL,Model,BLL,Interface,Factory using SQLite
  • docker-desktop启动失败
  • 【电影剖析】千钧一发
  • 从 “能用“ 到 “好用“:中小制造企业数字化转型中的 IT 系统优化管理策略
  • 【openbmc6】entity-manager
  • C# 转换(is和as运算符)
  • 【人工智能99问】transformer的编码器和解码器是如何协同工作的?(15/99)
  • 【面经】实习经历
  • Thread 类
  • Java注解家族--`@ResponseBody`
  • 2025杭电多校赛(2)1006 半
  • 微信二维码扫描登录流程详解
  • Pytorch版本、安装和检验
  • 简单讲解HTTPS如何保证安全性和可靠性
  • 网安学习NO.15
  • 树链剖分-苹果树
  • TPS61194PWPRQ1适用于汽车照明低 EMI、高性能 4 通道 LED 驱动器TPS61194
  • Day07_网络编程20250721_大项目
  • sqli-labs靶场通关笔记:第46-53关 order by注入
  • 一文详解REST风格
  • 青少年科学世界名刊分析评介:《生物技术世界》
  • 机器学习中的数据预处理:从入门到实践
  • Spring 对数组和集合类的自动注入
  • 234、回文链表
  • 使用AI把普通的条形柱状图,丰富成“好看高大上”的条形柱状图
  • 解决win10下Vmware虚拟机在笔记本睡眠唤醒后ssh连接不上的问题
  • PyQt5—QInputDialog 学习笔记