vs2017 c++ 使用sqlite3数据库

文章目录

  • 前言
  • 一、下载
  • 二、生成sqlite3.lib
    • [1. 生成32位sqlite3.lib](#1. 生成32位sqlite3.lib)
    • [2. 生成64位sqlite3.lib](#2. 生成64位sqlite3.lib)
    • [3. 整理文件](#3. 整理文件)
  • 三、使用
    • [1. 打开数据库](#1. 打开数据库)
    • [2. 关闭数据库](#2. 关闭数据库)
    • [3. 建表、插入数据、更新、查询](#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,如文件不存在,会创建文件

cpp 复制代码
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:创建数据库文件。

cpp 复制代码
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. 关闭数据库

cpp 复制代码
sqlite3_close(&db);

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

sqlite输入输出都使用utf-8编码,输入sql语句utf-8编码,查询输出结果也是utf-8编码,否则只要字符串中有中文,就会导致错误

cpp 复制代码
// 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开发库

相关推荐
依然鸣25 分钟前
PTA团体程序设计天梯赛L2真题讲解L2-005-008
开发语言·数据结构·c++·算法·深度优先·pat考试·图论
欧特克_Glodon2 小时前
OpenCV计算机视觉开发入门与实践<七>:OpenCV 界面编程之窗口
c++·人工智能·opencv·计算机视觉
郝学胜_神的一滴2 小时前
C++20 高级编程 002:夯实现代C++底层基本功
c++·编程语言
老赵的博客3 小时前
可维护性 可扩展性 可复用性
开发语言·c++
不正经学生4 小时前
C语言大小端字节序:内存里字节的排列顺序
c语言·开发语言·arm开发·c++·算法·c#
小则又沐风a5 小时前
负载均衡式在线OJ---------第二幕
linux·c++·后端
a3535413825 小时前
C++项目如何架构优化
java·c++·架构
键盘会跳舞5 小时前
C++:智能指针源码级深度拆解——从 RAII 思想到引用计数的内存安全体系
c++·智能指针·unique_ptr·shared_ptr·weak_ptr
SNAKEpc121385 小时前
OpenGL(十三)- Mip贴图
c语言·c++·图形渲染·贴图
会周易的程序员18 小时前
aiDgePLC — IEC61131-3 ST PLC 虚拟机调试与运行环境
c++·物联网·虚拟机·st·工业协议·iec61131·梯形图