c++中使用sqlite3需调用c风格api并结合raii管理资源;sqlite3无原生c++接口,但因轻量嵌入式特性适合本地应用;初始化通过sqlite3_open打开数据库连接。

在 C++ 中使用 SQLite3 进行增删改查,核心是调用其 C 风格的 API,配合 C++ 的资源管理(如 RAII)来避免内存泄漏和句柄未关闭。SQLite3 本身不提供原生 C++ 接口,但轻量、嵌入式、无需服务端的特点让它非常适合桌面工具、本地缓存或小型应用。
1. 初始化数据库连接与基本准备
SQLite3 使用 sqlite3* 指针表示数据库连接。需包含头文件并链接库:
- Windows 下:包含
sqlite3.h,链接sqlite3.lib(或直接把sqlite3.c加入工程) - Linux/macOS:用
g++ -o app app.cpp -lsqlite3
打开数据库示例:
C++sqlite3* db;
int rc = sqlite3_open("example.db", &db);
if (rc != SQLITE_OK) {
std::cerr <h3>2. 执行建表与插入(CREATE / INSERT)</h3><p>用 <code>sqlite3_exec()</code> 可执行 DDL 和简单 DML;若需绑定参数防 SQL 注入或提升性能,推荐用 <code>sqlite3_prepare_v2()</code> + <code>sqlite3_bind_*</code>。</p><p>建表示例:</p><font color="#888">C++</font><pre class="brush:php;toolbar:false;">const char* sql = "CREATE TABLE IF NOT EXISTS users(id INTEGER PRIMARY KEY, name TEXT, age INTEGER);";
char* errMsg;
if (sqlite3_exec(db, sql, nullptr, nullptr, &errMsg) != SQLITE_OK) {
std::cerr <p>安全插入(带参数绑定):</p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill9022" title="Windows-Android_SSH_Remote_Control"><img
src="https://img.php.cn/upload/skill/000/000/081/179238424271266.jpg" alt="Windows-Android_SSH_Remote_Control" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill9022" title="Windows-Android_SSH_Remote_Control" class="overflowclass">Windows-Android_SSH_Remote_Control</a>
<p class="overflowclass">通过 SSH 隧道从 Android 设备在互联网上对 Windows PC 实现完整远程控制的设置与使用指南,适用于远程桌面访问、安全 RDP 等。</p>
</div>
<a rel="nofollow" href="/xiazai/skill9022" title="Windows-Android_SSH_Remote_Control" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div><font color="#888">C++</font><pre class="brush:php;toolbar:false;">const char* insertSql = "INSERT INTO users(name, age) VALUES(?, ?);";
sqlite3_stmt* stmt;
if (sqlite3_prepare_v2(db, insertSql, -1, &stmt, nullptr) == SQLITE_OK) {
sqlite3_bind_text(stmt, 1, "Alice", -1, SQLITE_STATIC);
sqlite3_bind_int(stmt, 2, 28);
if (sqlite3_step(stmt) != SQLITE_DONE) {
std::cerr <h3>3. 查询数据(SELECT)并遍历结果</h3><p>查询必须用预编译语句 + 回调或逐行获取。推荐后者(<code>sqlite3_step()</code>),控制更灵活:</p><font color="#888">C++</font><pre class="brush:php;toolbar:false;">const char* selectSql = "SELECT id, name, age FROM users WHERE age > ?;";
sqlite3_stmt* stmt;
if (sqlite3_prepare_v2(db, selectSql, -1, &stmt, nullptr) == SQLITE_OK) {
sqlite3_bind_int(stmt, 1, 18);
while (sqlite3_step(stmt) == SQLITE_ROW) {
int id = sqlite3_column_int(stmt, 0);
const char* name = reinterpret_cast<const char>(sqlite3_column_text(stmt, 1));
int age = sqlite3_column_int(stmt, 2);
std::cout <p>注意:<code>sqlite3_column_text()</code> 返回的是 UTF-8 字符串指针,生命周期仅在当前 <code>sqlite3_step()</code> 调用期间有效,如需长期保存应拷贝。</p>
<h3>4. 删除与更新(DELETE / UPDATE)</h3>
<p>同样建议用参数化语句防止误操作和注入:</p>
<font color="#888">C++</font><pre class="brush:php;toolbar:false;">// 删除
const char* delSql = "DELETE FROM users WHERE name = ?;";
if (sqlite3_prepare_v2(db, delSql, -1, &stmt, nullptr) == SQLITE_OK) {
sqlite3_bind_text(stmt, 1, "Bob", -1, SQLITE_STATIC);
sqlite3_step(stmt);
sqlite3_finalize(stmt);
}
<p>// 更新
const char* updSql = "UPDATE users SET age = ? WHERE id = ?;";
if (sqlite3_prepare_v2(db, updSql, -1, &stmt, nullptr) == SQLITE_OK) {
sqlite3_bind_int(stmt, 1, 30);
sqlite3_bind_int(stmt, 2, 1);
sqlite3_step(stmt);
sqlite3_finalize(stmt);
}
</p>
执行成功后,可用 sqlite3_changes(db) 获取影响行数。
实际项目中建议封装一个轻量类(如 Database、Statement),自动管理 sqlite3* 和 sqlite3_stmt* 的生命周期,避免裸指针和重复错误处理。SQLite3 官方文档清晰,API 稳定,掌握这几十行核心调用,就能支撑绝大多数本地数据操作需求。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










