有没有办法系统地查询sqlite3行以将数据放入C数组中?

时间:2019-01-21 10:54:00

标签: c sqlite

我正在编写一个轻巧,快速的Gtk应用程序,它的大小应足够小,以供空白的独立Rasberry Pi安装程序使用,以供我的工作同事进行自我排练。输出将是拇指驱动器上的CSV文件,供我的Line Manager在Excel中打开。对我来说,读写.xlsx文件可能是一个太遥远的步骤……^ _〜

用于永久存储的Sqlite数据库。

我需要知道是否存在使我能够系统地查询行以将数据复制到数组(也许也为结构)中以便在C中进行分析(名册冲突等)的函数。我读过Java具有游标,C等效什么?

1 个答案:

答案 0 :(得分:1)

  

我需要知道是否存在使我能够系统地查询行以将数据复制到数组(也许也是结构)中以进行C语言分析的功能

在SQLite的C API中没有将整个数组或结构与SQLite行关联的功能。您将需要使用sqlite3_column_xxx()来检索结构或数组的每个元素(例如sqlite3_column_int()来获取整数值)。

例如,假设您有一个struct,例如:

typedef struct {
    int employee_id;
    int day_of_month;
    int shift_no;
} roster_entry_t;

和具有匹配模式的SQLite表,您将使用以下函数检索这些结构的数组:

int get_roster_entries(sqlite3 *db, roster_entry_t *roster, int max,
                       int *count) {
    sqlite3_stmt *stmt = NULL;
    int rc = 0;
    int i = 0;

    rc = sqlite3_prepare_v2(
        db, "SELECT employee_id, day_of_month, shift_no FROM roster LIMIT ?",
        -1, &stmt, NULL);
    if (rc != SQLITE_OK) {
        fprintf(stderr, "Failed to prepare SQL: %s\n", sqlite3_errmsg(db));
        return 1; 
    }
    rc = sqlite3_bind_int(stmt, 1, max);
    if (rc != SQLITE_OK) {
        fprintf(stderr, "Problem setting limit: %s\n", sqlite3_errmsg(db));
        return 1;
    }

    do {
        roster_entry_t *entry = &roster[i++];
        rc = sqlite3_step(stmt);
        if (rc == SQLITE_DONE) {
            printf("No more rows ...\n");
            break;
        } else if (rc != SQLITE_ROW) {
            fprintf(stderr, "Problem: %s\n", sqlite3_errmsg(db)); 
            sqlite3_finalize(stmt);
            return 1;
        }
        entry->employee_id = sqlite3_column_int(stmt, 0);
        entry->day_of_month = sqlite3_column_int(stmt, 1);
        entry->shift_no = sqlite3_column_int(stmt, 2);
    } while (i < max);
    *count = i - 1;

    sqlite3_finalize(stmt);
    return 0; 
}

注释

  • 可以使用sqlite3_bind_xxx()将程序中的变量与SQL中的占位符相关联。
  • 即使它使代码更加冗长,但确实值得检查SQLite函数的返回值。
  • sqlite3_bind_xxx()的数组索引从1开始,而sqlite3_column_xxx()的数组索引从0开始(有点令人困惑)。