Мне нужно знать, есть ли функция, позволяющая мне систематически запрашивать строки для копирования данных в массивы (возможно, и структуры) для анализа в 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 (несколько запутанно).