Bootstrap

SQLite3(2):常用API

目录

一、sqlite3支持的语言与框架

二、数据库的打开和关闭

2.1 数据库的打开(sqlite3_open函数)

2.2 数据库的关闭(sqlite3_close函数)

三、执行SQL语句(sqlite3_exec函数) 

3.1 sqlite3_exec函数介绍

3.2 sqlite3_exec()函数应用

3.2.1 使用sqlite3_exec()函数创建表

3.2.2 使用sqlite3_exec()函数向表中插入数据 

3.2.3 使用sqlite3_exec()函数查询数据

3.2.4 void *data的作用是什么?


一、sqlite3支持的语言与框架

Python:通过Python的标准库sqlite3,可以在Python中访问SQLite3数据库;
Java:使用Java JDBC接口或者第三方库JDBC SQLite,可以在Java中访问SQLite3数据库;
C++:使用C++的SQLite3 API,可以在C++中访问SQLite3数据库;
.NET:通过ADO.NET提供的SQLite3数据提供程序,可以在.NET平台上访问SQLite3数据库;
Ruby:通过Ruby的sqlite3 gem,可以在Ruby中访问SQLite3数据库;
PHP:使用PHP内置的PDO SQLite类或SQLite扩展,可以在PHP中访问SQLite3数据库;
Node.js:通过node-sqlite3库,在Node.js中访问SQLite3数据库。

以下进行C语言的接口介绍

二、数据库的打开和关闭

2.1 数据库的打开(sqlite3_open函数)

sqlite3_open() 函数用于打开一个 SQLite 数据库文件的函数,函数原型如下:

int sqlite3_open(const char *filename, sqlite3 **ppDb);
  • 第一个参数为数据库文件的文件名,如果为":memory",则表示创建内存中的数据库
  • 第二个参数是一个二级指针,它存储一个指向打开的数据库连接的指针,这个指针在后续地SQLite操作中使用

这个函数使用指定的数据库文件名(或 :memory:)打开一个新的数据库连接,并且把连接句柄返回给调用者如果连接成功,将会返回 SQLITE_OK 编码(0),否则将会返回其他错误代码。
需要注意的是,SQLite 数据库文件不存在时将会自动创建。如果 filename 参数为 NULL ,该函数返回 SQLITE_MISUSE (错用 SQLite 调用)错误。
例如,以下是在 C 语言中打开一个 SQLite 数据库的示例代码:

#include <stdio.h>
#include <sqlite3.h>

int main() {
    sqlite3 *db;
    /*打开数据库*/
    int rc = sqlite3_open("test.db", &db);
    if (rc == SQLITE_OK) {
        printf("已成功打开数据库\n");
        sqlite3_close(db); // 关闭数据库连接
    } else {
        fprintf(stderr, "无法打开数据库: %s\n", sqlite3_errmsg(db));
        sqlite3_close(db);
        return 1;
    }
    return 0;
}

2.2 数据库的关闭(sqlite3_close函数)

sqlite3_close() 函数用于关闭指定数据库连接的函数。函数原型如下:

int sqlite3_close(sqlite3*);

该函数接收一个被打开的数据库连接指针,如果成功关闭返回 SQLITE_OK 编码(0),否则返回其他错误代码。
在使用完SQLite数据库连接之后,应该释放它以避免资源泄漏和内存占用。调用 sqlite3_close() 函数将关闭数据库连接,并释放所有相关的资源,包括已编译的语句等。如果在关闭连接之前还有未完成的事务,则会自动回滚这些事务。
例如,以下是在 C 语言中关闭 SQLite 数据库连接的示例代码:

#include <sqlite3.h>

int main() {
    sqlite3 *db;
    int rc = sqlite3_open("test.db", &db);
    // 执行一些数据库操作
    // ...

    rc = sqlite3_close(db);
    if (rc == SQLITE_OK) {
      printf("Closed database successfully\n");
  } else {
      fprintf(stderr, "Can't close database: %s\n", sqlite3_errmsg(db));
  }

    return 0;
}

三、执行SQL语句(sqlite3_exec函数) 

3.1 sqlite3_exec函数介绍

sqlite3_exec() 函数用于在 SQLite 数据库连接上执行一条或多条 SQL 语句,并调用一个回调函数处理执行结果。该函数的原型如下:

int sqlite3_exec(
    sqlite3*,                                  /* 执行 SQL 命令的数据库连接 */
    const char *sql,                           /* 待执行的 SQL 命令 */
    int (*callback)(void*,int,char**,char**),  /* 在执行命令时的回调函数 */
    void *,                                    /* 作为第一个参数传递给回调函数的指针 */
    char **errmsg                              /* 用于存储错误消息的指针 */
);

该函数接收一个打开的数据库连接 sqlite3*

待执行的 SQL 命令 sql

以及一个回调函数 callback

回调函数的参数列表决定了该函数在被调用时应接收哪些参数,并指定了它们的数据类型和顺序。

回调函数必须符合以下格式:

int (*callback)(void*, int, char**, char**);
  • 第一个参数 void*,是使用者传递给 sqlite3_exec() 调用的 void* 参数。
  • 第二个参数 int,是查询结果所返回的列数。
  • 第三个参数 char**,是包含每个结果集元素值的字符串数组。
  • 第四个参数 char**,是包含每个结果集元素的列名称的字符串数组。这通常会在 SELECT 语句中返回。

回调函数的返回值应为整数,并且通常全部返回0表示执行成功。如果需要提前终止查询或在回调函数过程中发现错误,可以返回非零值。
errmsg 是用于保存 sqlite3_exec() 返回的错误消息的指针。
当函数成功执行 SQL 命令时,将会返回 SQLITE_OK 编码(0),否则将会返回其他错误代码。如果在执行命令时发生错误,则 errmsg 将被设置为一个非空值,其中包含有关错误的详细信息。如果 errmsg 未被设置,则表示该函数执行成功。

3.2 sqlite3_exec()函数应用

3.2.1 使用sqlite3_exec()函数创建表

以下是一个使用 sqlite3_exec() 函数执行 SQL 命令的示例代码:

#include <sqlite3.h>
#include <stdio.h>

int main(int argc, char* argv[]) {
    sqlite3 *db;
    char *zErrMsg = 0;
    int rc;
    /*打开数据库*/
    rc = sqlite3_open("test.db", &db);
    if (rc) {
        fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
        sqlite3_close(db);
        return 1;
    } else {
        fprintf(stdout, "Opened database successfully\n");
    }

    /*创建表的SQL语句*/
    char *sql = "CREATE TABLE COMPANY("
        "ID INT PRIMARY KEY     NOT NULL,"
        "NAME           TEXT    NOT NULL,"
        "AGE            INT     NOT NULL);";

    /*执行SQL语句*/
    rc = sqlite3_exec(db, sql, 0, 0, &zErrMsg);
    if (rc != SQLITE_OK) {
        fprintf(stderr, "SQL error: %s\n", zErrMsg);
        sqlite3_free(zErrMsg);
    } else {
        printf("Table created successfully\n");
    }

    /*关闭数据库文件*/
    sqlite3_close(db);
    return 0;
}

编译命令

gcc -o CreateTable CreateTable.c -lsqlite3

测试

3.2.2 使用sqlite3_exec()函数向表中插入数据 

创建好表格以后我们就可以向其添加数据了:

#include <sqlite3.h>
#include <stdio.h>

int main(int argc, char* argv[]) {
    sqlite3 *db;
    char *zErrMsg = 0;
    int rc;

    /*打开数据库*/
    rc = sqlite3_open("test.db", &db);
    if (rc) {
        fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
        sqlite3_close(db);
        return 1;
    } else {
        fprintf(stdout, "Opened database successfully\n");
    }

    /*创建表的SQL语句*/
    char *sql = "INSERT INTO COMPANY (ID,NAME,AGE) VALUES (1, '张三', 32);"
        "INSERT INTO COMPANY (ID,NAME,AGE) VALUES (2, '李四', 33);"
        "INSERT INTO COMPANY (ID,NAME,AGE) VALUES (3, '王五', 30);"
        "INSERT INTO COMPANY (ID,NAME,AGE) VALUES (4, '王博', 32);"
        "INSERT INTO COMPANY (ID,NAME,AGE) VALUES (5, '李为', 33);"
        "INSERT INTO COMPANY (ID,NAME,AGE) VALUES (6, '赵倩', 30);";

    /*执行SQL语句*/
    rc = sqlite3_exec(db, sql, 0, 0, &zErrMsg);
    if (rc != SQLITE_OK) {
        fprintf(stderr, "SQL error: %s\n", zErrMsg);
        sqlite3_free(zErrMsg);
    } else {
        fprintf(stdout, "Records created successfully\n");
    }

    /*关闭数据库文件*/
    sqlite3_close(db);
    return 0;
}

在上述代码中,需要先调用sqlite3_open()函数打开数据库连接。然后,使用INSERT INTO语句将一条记录插入到"COMPANY"表格中。该记录包含三个字段,分别是"id"、"name"和"age",对应的值分别为1、'张三'和32。最后,通过sqlite3_exec()函数执行SQL语句,并根据返回值判断操作是否成功。

编译命令

gcc -o InsertTable InsertTable.c -lsqlite3

测试 

 

3.2.3 使用sqlite3_exec()函数查询数据
#include <sqlite3.h>
#include <stdio.h>

// 回调函数
int callback(void *data, int argc, char **argv, char **azColName) {
    int i;
    printf("callback:\n");
    for(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;

    rc = sqlite3_open("test.db", &db);
    if (rc != SQLITE_OK) {
       fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
       sqlite3_close(db);
       return 1;
   }

    const char* sql = "SELECT * from COMPANY";
    rc = sqlite3_exec(db, sql, callback, NULL, &zErrMsg);

    if (rc != SQLITE_OK) {
       fprintf(stderr, "SQL error: %s\n", zErrMsg);
       sqlite3_free(zErrMsg);
   } else {
       printf("Operation done successfully\n");
   }

    sqlite3_close(db);
    return rc;
}

在此示例中,我们定义了一个回调函数 callback(),该函数用于处理 sqlite3_exec() 执行结果。
接下来,我们打开一个名为 "test.db" 的 SQLite 数据库连接,并执行 SELECT 命令。
最后,我们通过检查 rczErrMsg 的返回值,判断查询是否成功并处理执行结果。

编译命令

gcc -o SearchTable SearchTable.c -lsqlite3

测试 

3.2.4 void *data的作用是什么?

void *data是sqlite3_exec()函数的第四个参数,它是一个用户定义的指针类型,提供了一个通用的方法来传递额外的数据给回调函数。sqlite3_exec()函数的高级用法
示例代码:

#include <sqlite3.h>
#include <stdio.h>

// 回调函数
int callback(void *data, int argc, char **argv, char **azColName) {
    int i;
    if(argv[0][0] == '1')
        printf("%s\n", (char *)data);
    for(i = 0; i < argc; i++) {
        printf("%s\t", argv[i] ? argv[i] : "NULL");
    }
    printf("\n");

    return 0;
}

int main () {
    sqlite3 *db;
    char *zErrMsg = 0; // 存储错误消息的指针
    int rc;

    rc = sqlite3_open("test.db", &db);
    if (rc != SQLITE_OK) {
        fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
        sqlite3_close(db);
        return 1;
    }

    char *str = "ID\t名字\t年龄";
    char *sql = "SELECT * from COMPANY";
    rc = sqlite3_exec(db, sql, callback, str, &zErrMsg);

    if (rc != SQLITE_OK) {
        fprintf(stderr, "SQL error: %s\n", zErrMsg);
        sqlite3_free(zErrMsg);
    } else {
        printf("Operation done successfully\n");
    }

    sqlite3_close(db);
    return rc;
}

编译命令

gcc -o SearchTable2 SearchTable2.c -lsqlite3

测试

四、总结

本文介绍了SQLite3地相关接口并进行了函数示例。

;