Windows C++调用SQLite

本文介绍SQLite数据库的特点及其在嵌入式领域的应用,详细说明了如何在Windows环境下安装和配置SQLite,并解释了其数据类型及核心API函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

SQLite是一个自包含的、高可用、嵌入式的全功能数据库引擎,在各个领域,尤其是嵌入式领域有官方的使用,官方下载地址:https://www.sqlite.org/download.html,有支持各个操作系统的版本,以及源码,我们可以通过源码自己编译,也可以下载已经编译好的文件,这里以Win32为例,下载https://www.sqlite.org/2017/sqlite-dll-win32-x86-3190300.ziphttps://www.sqlite.org/2017/sqlite-amalgamation-3190300.zip其中32位版本中存在两个文件sqlite3.def和sqlite3.dll,通过VC命令行工具lib /def:sqlite3.def导出sqlite3.lib文件,在sqlite-amalgamation文件中获取sqlite3.h文件,工程中通过包含sqlite3.h和导入sqlite3.lib即可使用sqlite3数据库,可以通过下载https://www.sqlite.org/2017/sqlite-tools-win32-x86-3190300.zip中的sqlite3.exe,使用命令行创建sqlite数据库,也可以通过其他工具来创建,这里推荐sqlite expert pro工具。

SQLite的数据类型

SQLite中只有如下几个内置的数据存储类型
存储类 描述

  • NULL:是一个 NULL 值。
  • INTEGER:是一个带符号的整数,根据值的大小存储在 1、2、3、4、6 或 8 字节中。
  • REAL:是一个浮点值,存储为 8 字节的 IEEE 浮点数字。
  • TEXT:是一个文本字符串,使用数据库编码(UTF-8、UTF-16BE 或 UTF-16LE)存储。
  • BLOB:是一个 blob数据,完全根据它的输入存储。

    SQLite支持列的亲和类型概念。任何列仍然可以存储任何类型的数据,当数据插入时,该字段的数据将会优先采用亲缘类型作为该值的存储方式。下面是创建SQLite数据库时,各种数据类型对应的亲和类型:

    数据类型亲和类型
    INT INTEGER TINYINT SMALLINT MEDIUMINT BIGINT (UNSIGNED BIG INT) INT2 INT8INTEGER
    CHARACTER(20) VARCHAR(255) VARYING CHARACTER(255) NCHAR(55) NATIVE CHARACTER(70) NVARCHAR(100) TEXT CLOBTEXT
    BLOBNONE
    REAL DOUBLE DOUBLE PRECISION FLOATREAL
    NUMERIC DECIMAL(10,5) BOOLEAN DATE DATETIMENUMERIC
注意
  • BOOLEAN类型是以0和1来存储的
  • Date和Time类型可以存储为TEXT、INTEGER、REAL类型,SQLite提供了相应的日期时间API转换函数
  • 自增类型在SQLite中必须定义为INTEGER类型,不能是任何其他亲和类型

    SQLite API

    SQLite提供超过225个API函数,但是对于初始使用者来说,大多数的API都是可选的,关键API函数非常少也很容易使用,这里只描述关键的API函数,所有API函数的描述参考https://www.sqlite.org/c3ref/intro.html
    下面的两个对象和八个方法组成了SQLite接口的基本元素

  • sqlite3:数据库连接对象。通过slite3_open()函数创建,通过sqlite3_close()销毁

  • sqlite3_stmt: 预编译对象。通过sqlite3_prepare()函数创建通过sqlite3_finalize()函数销毁
  • sqlite3_open():创建一个新的或者打开一个已经存在的数据库连接对象
  • sqlite3_prepare():编译一个sql语句到字节码
  • sqlite3_bind():绑定一个值到原始SQL语句中的参数
  • sqlite3_step():执行一个预编译对象到第一条可用的记录结果,要获得第二条记录需要再次调用,对于不返回记录集的SQL语句,则只需要执行一次。
  • sqlite3_column():从预编译结果中获取每行中的每个列的值
  • sqlite3_finalize():销毁之前的预编译对象
  • sqlite3_close():销毁数据库连接对象
  • sqlite3_exec():是sqlite_prepare(), sqlite3_step(),sqlite3_colomn(),sqlite3_finalize()的一个封装,通过一个回调函数来处理返回的记录集。

SQLiteCPP

SQLiteCPP是SQLite数据库接口的一个封装,下载地址https://github.com/SRombauts/SQLiteCpp,使用时只需要将include文件夹中的头文件和src文件夹中的cpp文件包含到工程中来即可使用(当然也需要sqlite.h、sqlite.lib、sqlite.dll文件),example文件夹中包含了使用该库的代码实例,可以参考该实例,结合sqlitecpp源码来学校sqlite3接口的使用

### C++ 调用 SQLite 数据库的方法 为了在 C++调用 SQLite 数据库,通常需要遵循一系列特定的操作流程。这包括初始化数据库连接、执行 SQL 命令以及处理查询结果。 #### 初始化数据库连接 要建立与 SQLite 数据库的连接,需先引入必要的头文件并定义相应的变量: ```cpp #include <iostream> #include <sqlite3.h> int main() { sqlite3* db; char* errorMessage; // 打开或创建名为 test.db 的数据库 if (sqlite3_open("test.db", &db)) { std::cerr << "Can't open database: " << sqlite3_errmsg(db) << std::endl; return(EXIT_FAILURE); } } ``` 这段代码展示了如何打开现有的 `test.db` 文件或者如果不存在则创建一个新的数据库实例[^5]。 #### 定义回调函数用于获取查询结果 当从数据库读取数据时,可以设置一个回调函数来接收每一行的结果。下面是一个简单的例子说明怎样定义这样的回调函数: ```cpp static int callback(void* NotUsed, int argc, char** argv, char** azColName){ for(int i = 0; i<argc; i++){ printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL"); } printf("\n"); return 0; } ``` 此部分实现了对于每条记录打印列名及其对应值的功能[^1]。 #### 执行 SQL 查询语句 有了上述准备工作之后就可以编写实际想要运行的 SQL 指令了。这里给出一段完整的示例程序片段展示如何插入新纪录到表中,并随后检索这些信息: ```cpp // 插入一条新的记录 const char* sqlInsert = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" "VALUES (1, 'Paul', 32, 'California', 20000.00 ); " "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" "VALUES (2, 'Allen', 25, 'Texas', 15000.00 );"; if (sqlite3_exec(db, sqlInsert, nullptr, nullptr, &errorMessage) != SQLITE_OK ) { fprintf(stderr, "SQL error: %s\n", errorMessage); sqlite3_free(errorMessage); } // 使用预处理语句准备查询命令 std::string selectSql = "SELECT id,name FROM company;"; sqlite3_stmt *stmt; if(sqlite3_prepare_v2(db,selectSql.c_str(),-1,&stmt,nullptr)!=SQLITE_OK){ throw std::runtime_error(std::string("Failed to prepare statement")+sqlite3_errmsg(db)); } while(sqlite3_step(stmt)==SQLITE_ROW){ // 遍历所有匹配项 int id=sqlite3_column_int(stmt,0); // 获取第一个字段(整数) const unsigned char *name=sqlite3_column_text(stmt,1);// 获取第二个字段(字符串) cout<<"id:"<<id<<"; name:"<<reinterpret_cast<const char*>(name)<<'\n'; } sqlitte3_finalize(stmt); // 关闭数据库连接 sqlite3_close(db); return EXIT_SUCCESS; ``` 上面的例子不仅包含了向表格内添加两条记录的过程,同时也示范了利用 `sqlite3_prepare_v2()` 和 `sqlite3_step()` 方法来进行安全高效的参数化查询操作[^2][^3].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值