【C++数据库】SQLite3数据库连接与操作

注意:本文代码均为C++20标准下实现

一、SQLite3库安装

1.1 安装库文件

【工具】跨平台C++包管理利器vcpkg完全指南

vcpkg install sqlite3# 集成至系统目录,之前执行过此命令的无需再次执行
vcpkg integrate install

1.2 验证代码

在VS2022中新建控制台项目,测试代码如下:

#include <iostream>
#include <sqlite3.h>int main() {sqlite3* db;int rc = sqlite3_open(":memory:", &db);if (rc == SQLITE_OK) {std::cout << "SQLite3 initialized successfully!\n";std::cout << "Version: " << sqlite3_libversion() << std::endl;sqlite3_close(db);} else {std::cerr << "Open failed: " << sqlite3_errmsg(db) << std::endl;}return 0;
}

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


二、数据库连接管理

2.1 文件数据库创建

sqlite3* db;
const char* filename = "mydatabase.db";// 使用SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE组合标志
int rc = sqlite3_open_v2(filename, &db, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, nullptr);if (rc != SQLITE_OK) {std::cerr << "Cannot open database: " << sqlite3_errmsg(db);sqlite3_close(db);return -1;
}

连接标志说明

  • SQLITE_OPEN_READONLY:只读模式
  • SQLITE_OPEN_READWRITE:读写模式(需文件存在)
  • SQLITE_OPEN_CREATE:不存在时创建

2.2 连接池配置(基础版)

class DBConnection {
public:static sqlite3* get_connection() {static sqlite3* shared_db = nullptr;if (!shared_db) {int rc = sqlite3_open(":memory:", &shared_db);if (rc != SQLITE_OK) {// 错误处理...}}return shared_db;}
};

2.3 操作类基础版示例(DBConnection.h)

//DBConnection.h
#pragma once#include <iostream>
#include <sqlite3.h>class DBConnection {
public:static sqlite3* get_sqlite3_connection(const char* filename) {static sqlite3* shared_db = nullptr;// 使用SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE组合标志int rc = sqlite3_open_v2(filename, &shared_db,SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE,nullptr);if (rc != SQLITE_OK) {rc = sqlite3_open(":memory:", &shared_db);}if (rc != SQLITE_OK) {std::cout << "获取 Sqlite3 数据库连接创建失败。" << std::endl;}return shared_db;}
};

测试代码修改如下:

#include <iostream>
#include "DBConnection.h"int main() {sqlite3* db = DBConnection::get_sqlite3_connection(nullptr);if (db) {std::cout << "SQLite3 initialized successfully!\n";std::cout << "Version: " << sqlite3_libversion() << std::endl;sqlite3_close(db);}else {std::cerr << "Open failed: " << sqlite3_errmsg(db) << std::endl;}return 0;
}

三、SQL执行基础

3.1 直接执行DDL语句

DDL(Data Definition Language,数据定义语言)​ 是 SQL 中用于定义和管理数据库结构(模式)的语句集合。它不直接操作数据,而是定义数据的存储结构和规则。
简而言之:数据库操作语句

//在数据库中创建一张表
const char* create_table_sql = R"(
CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT,username TEXT NOT NULL UNIQUE,created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);)";char* errMsg = nullptr;
rc = sqlite3_exec(db, create_table_sql, nullptr, nullptr, &errMsg);if (rc != SQLITE_OK) {std::cerr << "SQL error: " << errMsg;sqlite3_free(errMsg);
}

3.2 带参数的表删除

bool drop_table(const char* table_name) {sqlite3_stmt* stmt;const char* sql = "DROP TABLE IF EXISTS ?;";if (sqlite3_prepare_v2(db, sql, -1, &stmt, nullptr) != SQLITE_OK) {return false;}sqlite3_bind_text(stmt, 1, table_name, -1, SQLITE_STATIC);int rc = sqlite3_step(stmt);sqlite3_finalize(stmt);return rc == SQLITE_DONE;
}

3.3 错误代码分类处理

自行处理相关错误信息

switch(rc) {case SQLITE_BUSY:std::cerr << "Database locked";break;case SQLITE_CORRUPT:std::cerr << "Database file damaged";break;case SQLITE_TOOBIG:std::cerr << "Data exceeds limit";break;// 其他错误处理...
}

使用sqlite3库提供的对应API

sqlite3_errstr(rc);

四、完善基础DBConnection

4.1 线程安全的完整代码

#pragma once#include <iostream>
#include <string>
#include <vector>
#include <sqlite3.h>
#include <mutex>
#include <memory>class DBConnection {
public:// 获取数据库连接(线程安全版本)static sqlite3* get_connection(const char* filename = "default.db") noexcept {std::lock_guard<std::mutex> lock(s_mutex);if (!s_shared_db) {const char* effective_filename = filename ? filename : "default.db";int flags = SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE;int rc = sqlite3_open_v2(effective_filename, &s_shared_db, flags, nullptr);if (rc != SQLITE_OK) {// 关闭可能的无效连接if (s_shared_db) {sqlite3_close(s_shared_db);s_shared_db = nullptr;}// 尝试内存数据库rc = sqlite3_open_v2(":memory:", &s_shared_db, flags, nullptr);if (rc == SQLITE_OK) {s_current_file = ":memory:";}else {std::cerr << "Failed to open memory database: " << sqlite3_errmsg(s_shared_db) << "\n";s_current_file.clear();}}else {s_current_file = effective_filename

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/42553.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CLion下载安装(Windows11)

目录 CLion工具下载安装其他 CLion CLion-2024.1.4.exe 工具 系统&#xff1a;Windows 11 下载 1.通过百度网盘分享的文件&#xff1a;CLion-2024.1.4.exe 链接&#xff1a;https://pan.baidu.com/s/1-zH0rZPCZtQ60IqdHA7Cew?pwdux5a 提取码&#xff1a;ux5a 安装 打开…

‘无法定位程序输入点kernel32.dll’详细的修复方法,一键快速修复kernel32.dll

在 Windows 系统运行过程中&#xff0c;若程序提示“无法定位程序输入点 kernel32.dll”&#xff0c;往往意味着程序调用了 kernel32.dll 中不存在或已变更的函数接口。作为系统的核心动态链接库&#xff0c;kernel32.dll 承担着内存管理、进程控制、文件操作等底层功能&#x…

二层综合实验

拓扑图 实验要求 1.内网IP地址使用172.16.6.0/16分配 2.sw1和sW2之间互为备份 3.VRRP/STP/VLAN/Eth-trunk均使用 4.所有Pc均通过DHCP获取IP地址 5.ISP只能配置IP地址 6.所有电脑可以正常访问IsP路由器环回 实验思路 这是一个二层综合实验每当拿到一个实验看清楚要求之后都有…

PS 切割图片

选择矩形工具绘制矩形 选中全部矩形&#xff0c;旋转一下角度 鼠标选中最下面的黄色图片&#xff0c;按住 Ctrl 键&#xff0c; 再用鼠标点击矩形的缩略图&#xff0c;选中选区&#xff0c;再按下 ctrlj &#xff0c;复制选区。 同样操作弄好其他的矩形选区&#xff0c;再删除…

项目管理证书 PMP 的含金量高吗?

一、国内PMP的含金量 1. 行业认可度 高需求行业&#xff1a;IT、通信、建筑、制造、金融等行业对PMP认可度较高&#xff0c;尤其是跨国企业、大型国企&#xff08;如华为、阿里、腾讯、中建等&#xff09;常将PMP作为项目经理岗位的优先录用条件。 招聘门槛&#xff1a;部分企…

旅游CMS选型:WordPress、Joomla与Drupal对比

内容概要 在旅游行业数字化转型进程中&#xff0c;内容管理系统&#xff08;CMS&#xff09;的选择直接影响网站运营效率与用户体验。WordPress、Joomla和Drupal作为全球主流的开源CMS平台&#xff0c;其功能特性与行业适配性存在显著差异。本文将从旅游企业核心需求出发&…

LeetCode349两个数组的交集

思路&#xff1a; 这个题目是查找交集&#xff0c;考虑用哈希数组&#xff0c;c语言用数组建立哈希表来解题&#xff0c;题目限定了数组长度在1000以内&#xff0c;那么可以设定一个result数组用于存储交集 1.我们需要将nums1映射到哈希表中 2.遍历nums2查询哈希表中是否存在该…

安装教程:windows上安装oracle详细教程

文章目录 前言一、下载 Oracle 安装包二、安装步骤三、连接ORACLE可视化工具1.1 PL/SQL Developer1.2 navicat 结束语优质源码分享 windows上安装oracle详细教程&#xff0c;在Windows上安装Oracle数据库需遵循以下步骤&#xff1a;首先&#xff0c;从官网下载对应版本的Oracle…

4、网工软考—VLAN配置—hybird配置

1、实验环境搭建&#xff1a; 2、实验过程 SW1&#xff1a; 先创建vlan2和vlan3 [Huawei-Ethernet0/0/2]port link-type hybrid //hybird端口 [Huawei-Ethernet0/0/2]port hybrid pvid vlan 2 [Huawei-Ethernet0/0/2]port hybrid untagged vlan 10 //撕掉vlan10的标签 …

平台清洗行动:AI浏览器用户生存率高出传统方案17倍

平台清洗行动&#xff1a;AI 浏览器用户生存率高出传统方案 17 倍 在这个数字化时代&#xff0c;网络环境的复杂性不断增加&#xff0c;用户在浏览网页时面临着各种风险&#xff0c;包括恶意软件、钓鱼攻击和隐私泄露等。为了应对这些挑战&#xff0c;AI 浏览器应运而生&#…

【C++篇】C++入门基础(一)

&#x1f4ac; 欢迎讨论&#xff1a;在阅读过程中有任何疑问&#xff0c;欢迎在评论区留言&#xff0c;我们一起交流学习&#xff01; &#x1f44d; 点赞、收藏与分享&#xff1a;如果你觉得这篇文章对你有帮助&#xff0c;记得点赞、收藏&#xff0c;并分享给更多对C感兴趣的…

MaskFormer语义分割算法测试

MaskFormer是一套基于transformer结构的语义分割代码。 链接地址&#xff1a; https://github.com/facebookresearch/MaskFormer/tree/main 测试用的数据集&#xff1a;ADE20k Dataset MIT Scene Parsing Benchmark 该数据集可通过上述链接下载&#xff0c;其中training含有…

javaWeb vue的简单语法

一、简介 两大核心优势&#xff1a; 声明式渲染&#xff1a;Vue 基于标准 HTML 拓展了一套模板语法&#xff0c;使得我们可以声明式地描述最终输出的 HTML 和 JavaScript 状态之间的关系。 响应性&#xff1a;Vue 会自动跟踪 JavaScript 状态并在其发生变化时响应式地更新 D…

vue create创建 Vue-router 工程

vue create创建 Vue-router 工程 参考 创建vue项目的两种方式&#xff1a;vue-create与vite https://www.cnblogs.com/reverse-x/p/16806534.html Vue2 脚手架 创建工程 测试程序 https://blog.csdn.net/wowocpp/article/details/146590400 在 上面的基础上 cd .\vue2-demo\…

CXL UIO Direct P2P学习

前言&#xff1a; 在CXL协议中&#xff0c;UIO&#xff08;Unordered Input/Output&#xff09; 是一种支持设备间直接通信&#xff08;Peer-to-Peer, P2P&#xff09;的机制&#xff0c;旨在绕过主机CPU或内存的干预&#xff0c;降低延迟并提升效率。以下是UIO的核心概念及UI…

口腔种植全流程AI导航系统及辅助诊疗与耗材智能化编程分析

一、系统架构与编程框架设计 口腔种植全流程人工智能导航系统的开发是一项高度复杂的多学科融合工程,其核心架构需在医学精准性、工程实时性与临床实用性之间实现平衡。系统设计以模块化分层架构为基础,结合高实时性数据流与多模态协同控制理念,覆盖从数据采集、智能决策到…

李宏毅机器学习笔记(1)—机器学习基本概念+深度学习基本概念

机器学习基本概念 1、获取模型 步骤 1.1、假定未知函数 带未知参数的函数 1.2、定义损失函数 真实值&#xff1a;label MAE MSE 几率分布&#xff0c;cross-entropy? 1.3、优化 单独考虑一个参数 让损失函数最小&#xff0c;找导数为零的点 单独考虑w&#xff0c;w…

专注自习室:番茄工作法实践

专注自习室&#xff1a;番茄工作法实践 我需要一个任务管理工具&#xff0c;但在网上找了很多都找不到合适的工具。市面上的大多数产品过于强调任务完成性&#xff0c;给我带来了很强的心理压力&#xff0c;这种压力最终反而降低了我的工作效率。于是我决定自己动手&#xff0…

【银河麒麟高级服务器操作系统 】虚拟机运行数据库存储异常现象分析及处理全流程

更多银河麒麟操作系统产品及技术讨论&#xff0c;欢迎加入银河麒麟操作系统官方论坛 https://forum.kylinos.cn 了解更多银河麒麟操作系统全新产品&#xff0c;请点击访问 麒麟软件产品专区&#xff1a;https://product.kylinos.cn 开发者专区&#xff1a;https://developer…

阿里云数据学习20250327

课堂链接&#xff1a;阿里云培训中心 (aliyun.com) 一、课堂问题 (一)课时3 1.支持字符集的含义是什么