引言

SQLite3 是一款轻量级的嵌入式数据库引擎,以其小巧、高效、零配置等特性在众多项目中广泛应用。在使用 SQLite3 进行数据库操作时,掌握其核心函数是关键。本文将详细介绍 SQLite3 中一些常用函数的功能、使用方法及示例,帮助你轻松开启数据库操作之旅。

一、数据库连接与关闭

1. sqlite3_open:打开数据库之门

功能
sqlite3_open 函数的主要作用是打开一个 SQLite 数据库文件。若指定的文件不存在,它会自动创建一个新的数据库文件。
原型
int sqlite3_open(const char *filename, sqlite3 **ppDb);
参数解析
  • filename:这是要打开的数据库文件的路径。你可以传入绝对路径或相对路径。
  • ppDb:这是一个指向 sqlite3 指针的指针。函数会将打开的数据库连接句柄存储在这个指针所指向的位置,后续的数据库操作都将基于这个句柄进行。
返回值

如果操作成功,函数返回 SQLITE_OK;若出现错误,则返回相应的错误码。

示例代码
#include <sqlite3.h>
#include <stdio.h>

int main() {
    sqlite3 *db;
    int rc = sqlite3_open("test.db", &db);
    if (rc) {
        fprintf(stderr, "无法打开数据库: %s\n", sqlite3_errmsg(db));
        return(0);
    } else {
        fprintf(stdout, "成功打开数据库\n");
    }
    // 后续操作...
    sqlite3_close(db);
    return 0;
}

2. sqlite3_close:关闭数据库通道

功能

当你完成对数据库的操作后,需要使用 sqlite3_close 函数关闭已经打开的数据库连接,释放相关资源。

原型
int sqlite3_close(sqlite3 *db);
参数解析

db:即之前使用 sqlite3_open 函数打开的数据库连接句柄。

返回值

操作成功返回 SQLITE_OK,失败则返回错误码。

二、SQL 语句执行

sqlite3_exec:执行 SQL 指令的多面手

功能

sqlite3_exec 是一个非常实用的函数,它可以执行一条或多条 SQL 语句,适用于查询、插入、更新、删除等各种操作。

原型
int sqlite3_exec(
  sqlite3*,                                  /* 数据库连接句柄 */
  const char *sql,                           /* SQL 语句 */
  int (*callback)(void*,int,char**,char**),  /* 回调函数,用于处理查询结果 */
  void *,                                    /* 传递给回调函数的用户数据 */
  char **errmsg                              /* 用于存储错误信息的指针 */
);
参数解析
  • sqlite3*:数据库连接句柄,通过 sqlite3_open 函数获取。
  • sql:要执行的 SQL 语句,可以是简单的单条语句,也可以是多条语句的组合。
  • callback:这是一个回调函数,用于处理查询结果。如果执行的 SQL 语句不需要处理结果,可传入 NULL
  • void *:传递给回调函数的用户数据,可用于在回调函数中传递额外的信息。
  • errmsg:用于存储错误信息的指针。若执行过程中出现错误,错误信息会存储在这个指针所指向的位置。
返回值

操作成功返回 SQLITE_OK,失败返回错误码。

示例代码
#include <sqlite3.h>
#include <stdio.h>

// 回调函数,用于处理查询结果
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;
}

int main() {
    sqlite3 *db;
    char *zErrMsg = 0;
    int rc;
    const char *sql;

    rc = sqlite3_open("test.db", &db);
    if (rc) {
        fprintf(stderr, "无法打开数据库: %s\n", sqlite3_errmsg(db));
        return(0);
    }

    // 创建表
    sql = "CREATE TABLE IF NOT EXISTS COMPANY ("
          "ID INT PRIMARY KEY     NOT NULL,"
          "NAME           TEXT    NOT NULL,"
          "AGE            INT     NOT NULL,"
          "ADDRESS        CHAR(50),"
          "SALARY         REAL );";

    rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
    if (rc != SQLITE_OK) {
        fprintf(stderr, "SQL 错误: %s\n", zErrMsg);
        sqlite3_free(zErrMsg);
    } else {
        fprintf(stdout, "表创建成功\n");
    }

    sqlite3_close(db);
    return 0;
}

三、预处理语句相关

1. sqlite3_prepare_v2:准备 SQL 语句的利器

功能
sqlite3_prepare_v2 函数用于将 SQL 语句编译成内部的字节码形式,便于后续多次执行。对于需要多次执行的 SQL 语句,使用预处理语句可以提高执行效率。
原型
int sqlite3_prepare_v2(
  sqlite3 *db,            /* 数据库连接句柄 */
  const char *zSql,       /* SQL 语句 */
  int nByte,              /* SQL 语句的最大长度(字节),-1 表示自动计算 */
  sqlite3_stmt **ppStmt,  /* 指向 sqlite3_stmt 指针的指针,用于返回预处理语句句柄 */
  const char **pzTail     /* 指向 SQL 语句中未处理部分的指针 */
);
参数解析
  • db:数据库连接句柄。
  • zSql:要准备的 SQL 语句。
  • nByte:SQL 语句的最大长度(字节),传入 -1 表示自动计算。
  • ppStmt:指向 sqlite3_stmt 指针的指针,函数会将预处理语句句柄存储在这个指针所指向的位置。
  • pzTail:指向 SQL 语句中未处理部分的指针。
返回值

操作成功返回 SQLITE_OK,失败返回错误码。

2. sqlite3_step:执行预处理语句的关键

功能

sqlite3_step 用于执行一个预处理语句的下一步操作。对于查询语句,每次调用该函数会返回一行结果;对于插入、更新、删除等语句,调用一次即可完成操作。

原型
int sqlite3_step(sqlite3_stmt*);
参数解析

sqlite3_stmt*:即之前使用 sqlite3_prepare_v2 函数获取的预处理语句句柄。

返回值
  • SQLITE_ROW:表示查询结果还有更多行。
  • SQLITE_DONE:表示操作完成。
  • 其他错误码:表示执行过程中出现错误。

3. sqlite3_finalize:释放预处理资源

功能

在使用完预处理语句后,必须调用 sqlite3_finalize 函数释放预处理语句占用的资源。

原型
int sqlite3_finalize(sqlite3_stmt *pStmt);
参数解析
pStmt:要释放的预处理语句句柄。
返回值

操作成功返回 SQLITE_OK,失败返回错误码。

示例代码
#include <sqlite3.h>
#include <stdio.h>

int main() {
    sqlite3 *db;
    sqlite3_stmt *stmt;
    int rc;

    rc = sqlite3_open("test.db", &db);
    if (rc) {
        fprintf(stderr, "无法打开数据库: %s\n", sqlite3_errmsg(db));
        return(0);
    }

    const char *sql = "SELECT * FROM COMPANY;";
    rc = sqlite3_prepare_v2(db, sql, -1, &stmt, NULL);
    if (rc != SQLITE_OK) {
        fprintf(stderr, "SQL 准备错误: %s\n", sqlite3_errmsg(db));
        sqlite3_close(db);
        return(0);
    }

    while ((rc = sqlite3_step(stmt)) == SQLITE_ROW) {
        // 处理每行结果
        int id = sqlite3_column_int(stmt, 0);
        const char *name = (const char *)sqlite3_column_text(stmt, 1);
        printf("ID: %d, Name: %s\n", id, name);
    }

    if (rc != SQLITE_DONE) {
        fprintf(stderr, "SQL 执行错误: %s\n", sqlite3_errmsg(db));
    }

    sqlite3_finalize(stmt);
    sqlite3_close(db);
    return 0;
}

四、错误处理

sqlite3_errmsg:获取错误信息的法宝

功能

当 SQLite3 操作出现错误时,sqlite3_errmsg 函数可以帮助你获取最近一次操作的错误信息,方便调试和问题排查。

原型
const char *sqlite3_errmsg(sqlite3*);
参数解析

sqlite3*:数据库连接句柄。

返回值

返回一个指向错误信息字符串的指针。

总结

通过本文的介绍,已经了解了 SQLite3 中一些常用函数的基本功能和使用方法。掌握这些函数是进行 SQLite3 数据库操作的基础,无论是简单的单条 SQL 语句执行,还是复杂的预处理语句使用,这些函数都能帮助你高效地完成任务。在实际项目中,合理运用这些函数,结合数据库设计和业务需求,你将能够开发出稳定、高效的数据库应用程序。希望本文能为你学习和使用 SQLite3 提供有价值的参考。

其他优秀博客:

SQLite3 使用文档_sqlite3文档-CSDN博客

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐