Windows C++调用SQLite

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

简介

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数据库的详细介绍: #### 数据库初始化与错误处理 为了获取可能发生的错误信息,可以使用 `sqlite3_errcode` 和 `sqlite3_errmsg` 函数。这些函数允许开发者捕获和显示来自 SQLite 的错误码以及对应的描述信息[^1]。 ```cpp #include <iostream> #include <sqlite3.h> int main() { sqlite3* db; int rc = sqlite3_open("example.db", &db); if (rc != SQLITE_OK) { std::cerr << "Error opening database: " << sqlite3_errmsg(db) << "\n"; return 1; } } ``` 上述代码展示了打开一个名为 `"example.db"` 的数据库文件的过程,并通过 `sqlite3_errmsg` 输出任何潜在的错误消息。 #### 编译链接设置 当在一个嵌入式环境中开发时,比如ARM架构下编译针对Linux系统的应用程序,需要指定交叉编译器及其相应的库路径。例如,下面这条命令演示了如何利用特定工具链完成编译工作[^2]: ```bash arm-linux-gnueabihf-gcc main.c -o sql -L./lib -lsqlite3 ``` 这里 `-L./lib` 表明查找动态或静态库的位置位于当前目录下的 lib 子目录;而 `-lsqlite3` 则告诉链接器要连接 sqlite3 库。 #### SQL查询准备与执行 对于复杂的SQL语句或者参数化查询来说,通常会先准备好该语句再绑定变量最后逐步执行之。这可以通过一系列API如 `sqlite3_prepare_v2`, `sqlite3_bind_*`, 及其配对清理资源的方法 `sqlite3_step` 来达成目的[^4]。 ```cpp const char* query = "SELECT name FROM users WHERE age >= ?"; sqlite3_stmt* stmt; if (sqlite3_prepare_v2(db, query, -1, &stmt, nullptr) == SQLITE_OK){ sqlite3_bind_int(stmt, 1, 18); while( sqlite3_step(stmt) == SQLITE_ROW ){ const unsigned char* col0 = sqlite3_column_text(stmt, 0); std::cout << "User Name: " << col0 << "\n"; } sqlite3_finalize(stmt); // 清理已分配给stmt的对象内存空间[^3] } else{ fprintf(stderr,"Failed to prepare statement\n"); } sqlite3_close(db); return 0; ``` 以上片段说明了一个完整的流程——从构建带占位符的 SELECT 查询到实际运行它直至结束后的资源释放过程。 #### 总结 SQLite 提供了一套简洁有效的 API 接口用于 C/C++ 开发者在其应用里集成小型的关系型数据存储解决方案。遵循官方文档中的指导原则能够帮助快速上手并充分利用这个强大的轻量级引擎所提供的各项特性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值