vs2017 c++ 使用sqlite3数据库

发布于:2025-07-23 ⋅ 阅读:(18) ⋅ 点赞:(0)


前言

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开发库


网站公告

今日签到

点亮在社区的每一天
去签到