MST
星途 面试题库

面试题:SQLite核心C API查询封装基础

请简述在SQLite核心C API中,如何封装一个简单的查询函数,该函数接收一个SQL语句字符串作为参数,并返回查询结果集。请写出关键代码段并解释每一步的作用。
50.2万 热度难度
数据库SQLite

知识考点

AI 面试

面试题答案

一键面试

以下以C语言为例:

  1. 包含头文件
#include <sqlite3.h>
#include <stdio.h>
#include <stdlib.h>

这一步包含了SQLite的头文件以及标准输入输出和标准库的头文件,以便使用相关函数。

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

该回调函数用于处理查询结果的每一行数据。data 是传递给回调函数的用户数据(在后续 sqlite3_exec 中会用到),argc 是当前行的列数,argv 是一个字符串数组,包含当前行每一列的值,azColName 是一个字符串数组,包含每一列的名称。在这个例子中,我们简单地将列名和对应的值打印出来。

  1. 封装查询函数
void executeQuery(const char *sql) {
    sqlite3 *db;
    char *zErrMsg = 0;
    int rc;

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

    // 执行SQL查询
    rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
    if(rc != SQLITE_OK) {
        fprintf(stderr, "SQL error: %s\n", zErrMsg);
        sqlite3_free(zErrMsg);
    } else {
        fprintf(stdout, "Operation done successfully\n");
    }

    // 关闭数据库
    sqlite3_close(db);
}
  • sqlite3_open 用于打开一个SQLite数据库,如果数据库不存在则会创建一个新的。test.db 是数据库文件名,打开成功后 db 会指向这个数据库连接。
  • sqlite3_exec 执行传入的SQL语句。sql 是要执行的SQL查询字符串,callback 是处理查询结果的回调函数,0 表示没有传递给回调函数的用户数据,zErrMsg 用于接收执行过程中的错误信息。如果执行失败,打印错误信息并释放错误信息字符串。
  • sqlite3_close 关闭数据库连接,释放相关资源。
  1. 调用查询函数
int main() {
    const char *sql = "SELECT * FROM your_table;";
    executeQuery(sql);
    return 0;
}

main 函数中定义要执行的SQL语句,并调用 executeQuery 函数执行查询。

以上代码实现了一个简单的SQLite查询函数封装,用于执行SQL查询并处理结果集。实际应用中,可能需要更复杂的错误处理和结果集处理逻辑。