Есть ли способ систематически запрашивать строки sqlite3, чтобы поместить данные в массив C? - PullRequest
0 голосов
/ 21 января 2019

Я пишу легкое, быстрое приложение Gtk, достаточно маленькое для автономной установки Rasberry Pi с воздушным зазором, чтобы мои коллеги по работе могли самостоятельно составить список. Вывод будет CSV-файлов на флэш-накопитель для моего Line Manager, чтобы открыть в Excel. Чтение и запись в файлы .xlsx могут быть для меня слишком далеко, а пока ... ^ _ ~

База данных Sqlite для постоянного хранения.

Мне нужно знать, есть ли функция, позволяющая мне систематически запрашивать строки, чтобы скопировать данные в массивы (возможно, и структуры) для анализа в C (конфликты списков и т. Д.). Я читал, что в Java есть курсоры, что такое эквивалент C?

1 Ответ

0 голосов
/ 21 января 2019

Мне нужно знать, есть ли функция, позволяющая мне систематически запрашивать строки для копирования данных в массивы (возможно, и структуры) для анализа в C

Нет функции длясвязать весь массив или структуру со строкой SQLite в SQLite C API .Вам нужно будет извлечь каждый элемент вашей структуры или массива, используя 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; 
}

Примечания

  • Переменные в вашей программе могут быть связаны с заполнителями в вашем SQL, используя sqlite3_bind_xxx().
  • Даже при том, что это делает кодГораздо более многословно, действительно стоит проверить возвращаемые значения функций SQLite.
  • Индексы массива для sqlite3_bind_xxx() начинаются с 1, а для sqlite3_column_xxx() начинаются с 0 (несколько запутанно).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...