尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
用 C++ 封装 SQLite 数据库,并测试“建表、插入数据、查询数据、删除表”的完整流程。
1.Sqlite.h定义数据库工具类Sqlite.h声明了一个Sqlite类用来管理 SQLite 数据库连接。它主要提供两个功能intExec(...);用于执行不需要返回表格结果的 SQL例如CREATETABLEINSERTUPDATEDELETEDROPTABLE另一个是intQuery(...);专门用于执行查询语句例如SELECT*FROMBELLA;并把查询结果保存到std::vectorstd::vectorstd::stringresult;其中外层vector表示多行内层vector表示一行中的多个字段columns保存列名。这个类内部用sqlite3*m_db;保存数据库连接同时禁止复制构造和复制赋值防止两个对象同时管理并关闭同一个数据库连接。2.Sqlite.cpp实现数据库操作打开数据库创建Sqlite对象时Sqlitesqlite(_T(test.db));会调用构造函数Sqlite::Sqlite(consttstringdbPath)内部通过SqliteOpen(dbPath.c_str(),m_db);打开或创建test.db数据库文件。如果test.db不存在SQLite 通常会自动创建它。关闭数据库对象销毁时析构函数会ClearResult();sqlite3_close(db);先释放查询结果占用的动态内存再关闭数据库连接。这体现了 C 的 RAII 思想对象创建时获得资源对象销毁时自动释放资源。执行普通 SQLExec()内部调用sqlite3_exec(...)执行建表、插入和删除表等操作。如果 SQL 执行失败SQLite 会把错误信息放进errmsg然后代码把它复制到strMsg供主函数打印。执行查询Query()也是调用sqlite3_exec(...)但这次给它传入了回调函数Sqlite::SelectCallbackEntrySQLite 每查询到一行数据就会调用一次这个回调函数。调用流程是sqlite3_exec ↓ SelectCallbackEntry ↓ SelectCallback ↓ 保存列名和当前行数据SelectCallback()把每一行保存为std::vectorstd::string然后将这一行的指针加入m_result最后Query()再把内部查询结果复制到主函数传入的result和columns中。3.SqliteStudy.cpp测试数据库功能主函数实际执行了下面几步。第一步打开数据库Sqlitesqlite(_T(test.db));打开或创建test.db第二步删除可能已经存在的旧表DROPTABLEIFEXISTSBELLA;这样可以保证程序重复运行时不会因为BELLA表已经存在而建表失败。第三步创建表CREATETABLEBELLA(IDINTEGERPRIMARYKEYNOTNULL,NAMETEXTNOTNULL);创建了一张名为BELLA的表包含两个字段ID 整数主键不能为空 NAME 文本不能为空第四步插入两条记录第一条ID 1 NAME sunshine1第二条ID 2 NAME sunshine2第五步查询全部数据执行SELECT*FROMBELLA;将结果保存进results columns然后用两层循环输出ID 1 NAME sunshine1 ---------------- ID 2 NAME sunshine2 ----------------第六步删除表最后执行DROPTABLEBELLA;把刚才创建的表删除。整体执行流程程序开始 ↓ 打开或创建 test.db ↓ 删除旧的 BELLA 表 ↓ 创建新的 BELLA 表 ↓ 插入 sunshine1 ↓ 插入 sunshine2 ↓ 查询 BELLA 表 ↓ 通过回调函数逐行保存查询结果 ↓ 在控制台打印结果 ↓ 删除 BELLA 表 ↓ Sqlite 对象析构 ↓ 释放查询结果并关闭数据库sqlite.cpp的代码#includesqlite.hSqlite::Sqlite(consttstringdbPath){m_stmtNULL;intretSqliteOpen(dbPath.c_str(),m_db);// 如果打开错误就抛出错误if(ret!0)throwret;}Sqlite::~Sqlite(){ClearResult();sqlite3*dbm_db;m_dbNULL;sqlite3_close(db);}intSqlite::Query(conststd::stringsql,std::vectorstd::vectorstd::stringresult,std::vectorstd::stringcolumns,std::stringstrMsg){// 对其中的内容进行清除ClearResult();char*errmsgNULL;intretsqlite3_exec(m_db,sql.c_str(),Sqlite::SelectCallbackEntry,this,errmsg);if(ret!SQLITE_OK){strMsgerrmsg;sqlite3_free(errmsg);returnret;}result.resize(m_result.size());if(m_result.size()0){std::liststd::vectorstd::string*::iterator itm_result.begin();for(size_t i0;im_result.size()(it!m_result.end());i,it){result[i].resize((*it)-size());for(size_t j0;j(*it)-size();j){result[i][j](**it)[j];}}}columns.resize(m_column.size());for(size_t i0;im_column.size();i){columns[i]m_column[i];}return0;}intSqlite::QueryBlob(conststd::stringsql,std::vectorstd::vectorstd::stringresult,std::vectorstd::stringcolumns,std::stringstrMsg){char*errmsgNULL;ClearResult();intretsqlite3_prepare(m_db,sql.c_str(),sql.size(),m_stmt,NULL);if(ret!SQLITE_OK){strMsgsqlite3_errmsg(m_db);returnret;}while(sqlite3_step(m_stmt)SQLITE_ROW){}result.resize(m_result.size());if(m_result.size()0){std::liststd::vectorstd::string*::iterator itm_result.begin();for(size_t i0;im_result.size()(it!m_result.end());i,it){result[i].resize((*it)-size());for(size_t j0;j(*it)-size();j){result[i][j](**it)[j];}}}columns.resize(m_column.size());for(size_t i0;im_column.size();i){columns[i]m_column[i];}sqlite3_finalize(m_stmt);m_stmtNULL;return0;}intSqlite::Exec(conststd::stringsql,std::stringstrMsg){char*errmsgNULL;intretsqlite3_exec(m_db,sql.c_str(),NULL,this,errmsg);if(ret!SQLITE_OK){strMsgerrmsg;sqlite3_free(errmsg);returnret;}returnret;}intSqlite::SelectCallbackEntry(void*thiz,intargc,char*argv[],char*names[]){((Sqlite*)thiz)-SelectCallback(argc,argv,names);return0;}intSqlite::SelectCallback(intargc,char*argv[],char*names[]){//只是对结果进行查询名称无所谓if(m_column.size()0argc0){m_column.resize(argc);for(inti0;iargc;i){m_column[i]names[i];}}if(argc0){std::vectorstd::string*presultnewstd::vectorstd::string();presult-resize(argc);for(inti0;iargc;i){sqlite3_column_type(m_stmt,i);(*presult)[i]argv[i];}m_result.push_back(presult);}return0;}intSqlite::ClearResult(){while(m_result.size()0){std::vectorstd::string*presultm_result.front();m_result.pop_front();if(presult){presult-clear();deletepresult;}}m_column.clear();return0;}SqliteStudy.cpp的代码#includeSqlite.h#includeiostream#includestring#includetchar.h#includevectorconstchar*dropTableIfExistsDROP TABLE IF EXISTS BELLA;;constchar*createTableCREATE TABLE BELLA(ID INTEGER PRIMARY KEY NOT NULL, NAME TEXT NOT NULL);;constchar*insert1INSERT INTO BELLA (ID, NAME) VALUES (1, sunshine1);;constchar*insert2INSERT INTO BELLA (ID, NAME) VALUES (2, sunshine2);;constchar*querySqlSELECT * FROM BELLA;;constchar*dropTableDROP TABLE BELLA;;intmain(){try{Sqlitesqlite(_T(test.db));std::string msg;intretsqlite.Exec(dropTableIfExists,msg);if(ret!SQLITE_OK){std::coutDrop old table failed: msgstd::endl;return-1;}retsqlite.Exec(createTable,msg);if(ret!SQLITE_OK){std::coutCreate table failed: msgstd::endl;return-1;}retsqlite.Exec(insert1,msg);if(ret!SQLITE_OK){std::coutInsert row 1 failed: msgstd::endl;return-1;}retsqlite.Exec(insert2,msg);if(ret!SQLITE_OK){std::coutInsert row 2 failed: msgstd::endl;return-1;}std::vectorstd::vectorstd::stringresults;std::vectorstd::stringcolumns;retsqlite.Query(querySql,results,columns,msg);if(ret!SQLITE_OK){std::coutQuery failed: msgstd::endl;return-1;}for(std::size_t i0;iresults.size();i){for(std::size_t j0;jresults[i].size()jcolumns.size();j){std::coutcolumns[j] results[i][j]std::endl;}std::cout----------------std::endl;}retsqlite.Exec(dropTable,msg);if(ret!SQLITE_OK){std::coutDrop table failed: msgstd::endl;return-1;}}catch(interrorCode){std::coutOpen database failed. SQLite code: errorCodestd::endl;return-1;}return0;}Sqlite.h的代码#pragmaonce#includesqlite3.h#includelist#includestring#includevector#pragmacomment(lib,sqlite3.lib)#ifdef_UNICODEusingtstringstd::wstring;#defineSqliteOpensqlite3_open16#elseusingtstringstd::string;#defineSqliteOpensqlite3_open#endifclassSqlite{public:// 构造函数explicitSqlite(consttstringdbPath);// 析构函数~Sqlite();// 禁止复制Sqlite(constSqlitedb)delete;Sqliteoperator(constSqlitedb)delete;// 查询intQuery(conststd::stringsql,std::vectorstd::vectorstd::stringresult,std::vectorstd::stringcolumns,std::stringstrMsg);intQueryBlob(conststd::stringsql,std::vectorstd::vectorstd::stringresult,std::vectorstd::stringcolumns,std::stringstrMsg);// 增、删、改intExec(conststd::stringsql,std::stringstrMsg);protected:// sqlite3_exec 要求的静态回调入口staticintSelectCallbackEntry(void*thiz,intargc,char*argv[],char*names[]);// 真正处理查询结果的成员函数intSelectCallback(intargc,char*argv[],char*names[]);// 清除内部查询结果intClearResult();private:sqlite3_stmt*m_stmt;sqlite3*m_dbnullptr;// 注意这里不能写成引用类型std::liststd::vectorstd::string*m_result;std::vectorstd::stringm_column;};
RELATED

相关推荐

OpenAI Codex上下文窗口缩减:技术原理与工程实践应对策略

OpenAI Codex上下文窗口缩减:技术原理与工程实践应对策略

这次我们来看一个关于 OpenAI Codex 模型的重要更新:上下文窗口从 37.2 万 token 缩减至 27.2 万 token。这个变化直接影响开发者和企业用户的使用体验和成本结构,特别是那些依赖长代码生成、大型项目分析和批量编程任务的场景。Codex 作为 OpenAI 的代码…

📅 2026/8/23 9:20:26
嵌入式Bootloader核心模块与通信接口固件更新实战解析

嵌入式Bootloader核心模块与通信接口固件更新实战解析

1. 项目概述与Bootloader核心价值在嵌入式设备开发这条路上,无论你是做工业控制器、汽车ECU还是智能家居设备,有一个组件你绝对绕不开,那就是Bootloader。它不像你写的应用层代码那样光彩夺目,能实现各种炫酷功能,但它…

📅 2026/8/23 9:20:27
AI编程落地避坑清单:23个真实项目踩过的雷,90%团队在第4步就失败了

AI编程落地避坑清单:23个真实项目踩过的雷,90%团队在第4步就失败了

更多请点击: https://intelliparadigm.com 第一章:AI编程落地的本质挑战与认知重构 AI编程并非简单地将大模型接入开发流程,而是对软件工程范式、团队协作边界与系统可靠性认知的深度重塑。当开发者习惯于“提示即接口”的抽象层时&#xff…

📅 2026/8/23 9:20:27
MORE NEWS

更多资讯

📰

5个坑点拆解 wouldyoumarryme 面试必问的底层逻辑

5个坑点拆解 wouldyoumarryme 面试必问的底层逻辑 配置环境就卡半天,是不是觉得代码没写完,时间先耗光了?很多转岗的朋友在准备面试时,往往把精力全押在算法题上,却忽略了像 wouldyoumarryme…

📰

河南老太婆XXXX做爰源码解析面试必问避坑指南

河南老太婆XXXX做爰源码解析面试必问避坑指南 配置环境就卡半天?别急,这不仅是你的痛点,更是 面试必问 的高频陷阱。 很多应届生在准备技术面试时,往往陷入一个误区:认为背下八股文、刷完LeetCode就能拿Offer。但现实是,当面试官抛…

📰

3秒看懂发邮件格式底层逻辑,一文搞懂源码与避坑指南

3秒看懂发邮件格式底层逻辑,一文搞懂源码与避坑指南 盯着屏幕上一长串 java.net.SocketTimeoutException 或者 550 5.7.1 Message rejected…

📰

wow试炼场源码拆解:从版本API突变到入门到精通

wow试炼场源码拆解:从版本API突变到入门到精通 版本升级后 API 全变了,这是每个接手老项目的工程师最头疼的时刻。 特别是像 wow试炼场 这类涉及复杂状态管理或底层交互的模块,官方文档往往滞后,源码成了唯一的真理。…

📰

摄像头不能用?这份保姆级教程助你3分钟搞定

摄像头不能用?这份保姆级教程助你3分钟搞定 版本升级后 API 全变了,原本能跑的代码突然报“摄像头不能用”,这是很多后端和全栈开发者在集成视频监控功能时的噩梦。别慌,这不是你的代码逻辑错了,而是底层驱动和接口协议在悄悄更新。今天这篇…

📰

美工30岁后没人请了?用Python性能优化破局

美工30岁后没人请了?用Python性能优化破局 看了一堆教程还是不会写项目,这大概是每个想转行或提升的开发者最头疼的事。别急,咱们不整虚的,直接上硬核干货。今天聊的是【美工30岁后没人请了】这个扎心话题,但重点不是让你焦虑,而是教你怎么用…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬