📜  SQLite-C C++(1)

📅  最后修改于: 2023-12-03 15:35:07.498000             🧑  作者: Mango

SQLite-C++介绍

简介

SQLite是一种轻型的关系型数据库管理系统,它的设计目标是嵌入式的,即程序和数据库可以在同一个进程中运行,简单易用,完全免费,是一个非常受欢迎的数据库引擎。SQLite-C++是一个基于SQLite的C++封装类库,它提供了比较简洁的API接口,使用起来非常方便。

特点
  • 轻巧:SQLite是一个非常轻量级的数据库,它的核心库只有几百KB,非常适合嵌入式系统或小型应用程序。
  • 易用:SQLite提供了简单易用的API接口,几乎所有的操作都可以通过SQL语言完成。
  • 单用户:SQLite是一种单用户的数据库,只能有一个用户连接数据库。这也就意味着只能在同一个进程中使用,不能通过网络连接。
  • 事务支持:SQLite支持事务,保证数据的一致性和完整性。
  • 跨平台:SQLite可以在几乎所有的操作系统上运行,包括Windows、Linux、MacOS、Android等。
使用
安装SQLite

使用SQLite-C++之前,需要先安装SQLite。SQLite的官方网站提供了很多编译好的版本,可以根据自己的操作系统和平台选择相应的版本进行安装。

引入SQLite-C++头文件

在使用SQLite-C++之前,需要先引入相应的头文件。SQLite-C++提供的头文件是sqlite3.h,在源代码中可以找到这个文件。

#include "sqlite3.h"
打开数据库

在SQLite中,数据库文件就是一个文件,可以通过sqlite3_open函数打开一个数据库文件。这个函数的第一个参数是数据库文件的路径,第二个参数是一个指向sqlite3结构体的指针,用于保存打开的数据库对象。

sqlite3* db;
int ret = sqlite3_open("test.db", &db);
if (ret != SQLITE_OK) {
    fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
    sqlite3_close(db);
    return -1;
}
执行SQL语句

执行SQL语句的方法有两种:一种是使用sqlite3_exec函数,另一种是使用sqlite3_prepare、sqlite3_step和sqlite3_finalize三个函数。sqlite3_exec函数比较简单,它的第一个参数是数据库对象,第二个参数是执行的SQL语句,第三个参数是一个回调函数,用于处理每一行返回的记录,第四个参数是一个指向数据的指针,第五个参数是一个错误信息的指针。

char* err_msg = nullptr;
int ret = sqlite3_exec(db, "CREATE TABLE IF NOT EXISTS USER (ID INT PRIMARY KEY, NAME TEXT, AGE INT)", nullptr, nullptr, &err_msg);
if (ret != SQLITE_OK) {
    fprintf(stderr, "Can't create table: %s\n", err_msg);
    sqlite3_free(err_msg);
    sqlite3_close(db);
    return -1;
}

使用sqlite3_prepare、sqlite3_step和sqlite3_finalize函数执行SQL语句的代码如下:

sqlite3_stmt* stmt = nullptr;
ret = sqlite3_prepare(db, "INSERT INTO USER (ID, NAME, AGE) VALUES (?, ?, ?)", -1, &stmt, nullptr);
if (ret != SQLITE_OK) {
    fprintf(stderr, "Can't prepare statement: %s\n", sqlite3_errmsg(db));
    sqlite3_close(db);
    return -1;
}
sqlite3_bind_int(stmt, 1, 1);
sqlite3_bind_text(stmt, 2, "Tom", -1, nullptr);
sqlite3_bind_int(stmt, 3, 18);
ret = sqlite3_step(stmt);
if (ret != SQLITE_DONE) {
    fprintf(stderr, "Can't insert data: %s\n", sqlite3_errmsg(db));
    sqlite3_finalize(stmt);
    sqlite3_close(db);
    return -1;
}
sqlite3_finalize(stmt);
查询数据

SQLite提供了一些API接口用于查询数据,最简单的方法是使用sqlite3_get_table函数,它可以把查询结果存储在一个二维数组中。

char** results = nullptr;
int rows, cols;
ret = sqlite3_get_table(db, "SELECT * FROM USER WHERE AGE > 10", &results, &rows, &cols, &err_msg);
if (ret != SQLITE_OK) {
    fprintf(stderr, "Can't get data: %s\n", sqlite3_errmsg(db));
    sqlite3_free(err_msg);
    sqlite3_close(db);
    return -1;
}
for (int i = 0; i < rows + 1; i++) {
    for (int j = 0; j < cols; j++) {
        printf("%s\t", results[i*cols + j]);
    }
    printf("\n");
}
sqlite3_free_table(results);
关闭数据库

使用完数据库之后,需要关闭数据库,释放资源。

sqlite3_close(db);
结论

SQLite-C++是一个非常好用的库,使用方便,接口简洁,完美地封装了SQLite的C语言API。由于SQLite本身就是一个非常轻量级的数据库,因此SQLite-C++具有比其他数据库更小的内存占用和更快的访问速度。如果需要在C++中使用数据库,SQLite-C++是一个不错的选择。